Received: by 10.213.65.68 with SMTP id h4csp218548imn; Mon, 12 Mar 2018 11:34:37 -0700 (PDT) X-Google-Smtp-Source: AG47ELtSOtbYmI7JCtcdDB/YwTCdbAwqZDJ+/T81/36l6sA3FQMwevXfFO7HYBQt5lkxjX7nh2B0 X-Received: by 2002:a17:902:9045:: with SMTP id w5-v6mr3840213plz.104.1520879677687; Mon, 12 Mar 2018 11:34:37 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520879677; cv=none; d=google.com; s=arc-20160816; b=wNW7xqkvolMsfjQa8gfXPBI4OrcQrK3GbNGk6VJsycSjD3qsYiJouKd11RsGrp25WV HKMlPQ2HD9jusFPxaGE/0wPe5wCWA9dSkzLGYMA40dhKIuEGeBwato1gwVPxPu3MmG3C 3xN9WjzrgkBkjlQnm+0qpv2EWnagzUrh7fhN/nwTmUJONtU0TS6DW7qudhGLe28Nx6zV 212R55qYSJq+JSsUtINJjZi5VrIn9ZpNKkD/yLnEMgIR7MIzY7q/UsNn/lY/b/WbWXHM ioAjv+Foiiqqyz4+nKpuQ8NF8+470nWDsN12gxrLiH2p5A35BNVM3fmr0bb/rywloF9E JEtA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:feedback-id:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:cc:to:subject:dkim-signature :dkim-signature:arc-authentication-results; bh=8T5rPvpu4Y8beu8IURVsF8LKe0J3BnhV/RSYRCyADFg=; b=DN5uUsiZkOKtHnN8ndKwB2K93BkSTvYBKlcgUhThXHESXP/ZMnoMpkGD2ienVvIMJV /FrzSCN9/PpwDsXr3NY1pEcde1rbAZ4/BDwQPRG6dW/0MOeJR6LYwW/sq6VNS3uQNj74 CSfm4p1GqjNhgfVooLJzAQLlwOBXRGx9QaQxXqmE/2f7rANrxGtyiijy8/7Ln+lbXava FJR909oUltkIom/wI9I8AuoftCSYYndKHVgKFkn+exrKjjOJBtor6DbKdPD3saRsUPrC MfLBLD9G186SGqApfj39xW+oealj09MvEkCYNvoqhD8OaA/g31IN1zFaf6Xdb2Sgqn09 lLHA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@jcline.org header.s=rdybrs3533vx7mghocfwl3vdwgpl2v5u header.b=YcAlrTmO; dkim=pass header.i=@amazonses.com header.s=224i4yxa5dv7c2xz3womw6peuasteono header.b=UWI7dTq/; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h125si6186277pfc.133.2018.03.12.11.34.23; Mon, 12 Mar 2018 11:34:37 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@jcline.org header.s=rdybrs3533vx7mghocfwl3vdwgpl2v5u header.b=YcAlrTmO; dkim=pass header.i=@amazonses.com header.s=224i4yxa5dv7c2xz3womw6peuasteono header.b=UWI7dTq/; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751443AbeCLSdQ (ORCPT + 99 others); Mon, 12 Mar 2018 14:33:16 -0400 Received: from a8-57.smtp-out.amazonses.com ([54.240.8.57]:35682 "EHLO a8-57.smtp-out.amazonses.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751282AbeCLSdO (ORCPT ); Mon, 12 Mar 2018 14:33:14 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=rdybrs3533vx7mghocfwl3vdwgpl2v5u; d=jcline.org; t=1520879593; h=Subject:To:Cc:References:From:Message-ID:Date:MIME-Version:In-Reply-To:Content-Type:Content-Transfer-Encoding; bh=2MAEmCRP0qsS7U8hXJzvCCFlZeGn/FFZJ0YfGMLa6L4=; b=YcAlrTmOqX9r2bLoxzYwlJHIFJ6/6MWay62pf9RDo7wcte0gDlOhaviguXP3BDE1 r8F1CTA7juUpI/lsA8akoxg1c1WmV+kfMGDv3DcsXIcw6S07lZsGrjcna9yI6/EFp0J /Wz3KAyU8MeQ0PgH2y8FilAxB0B9Tin+RAa858rc= DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/simple; s=224i4yxa5dv7c2xz3womw6peuasteono; d=amazonses.com; t=1520879593; h=Subject:To:Cc:References:From:Message-ID:Date:MIME-Version:In-Reply-To:Content-Type:Content-Transfer-Encoding:Feedback-ID; bh=2MAEmCRP0qsS7U8hXJzvCCFlZeGn/FFZJ0YfGMLa6L4=; b=UWI7dTq/pfMHulDK+JJbp7cP/ZfbedTcs82PNBT5g0exQtiYupoKLR5fNXhI3WKJ aHUf2qdk1Q9F6fOtBCnwpITgDLONdPLL5AT5TEOe4JWDyKekPiZVm59f0lTX2/Qcq/K IMAzixB8hN0z8OELtgOob0OHvSPfXHz3Izi4ACVg= X-Virus-Scanned: amavisd-new at jcline.org Subject: Re: Regression from efi: call get_event_log before ExitBootServices To: Thiebaud Weksteen Cc: hdegoede@redhat.com, Ard Biesheuvel , Javier Martinez Canillas , Jarkko Sakkinen , linux-efi@vger.kernel.org, linux-integrity@vger.kernel.org, tpmdd-devel@lists.sourceforge.net, linux-kernel@vger.kernel.org References: <01000161fc0b4755-df0621f4-ab5d-479a-b425-adf98427a308-000000@email.amazonses.com> <0100016206a68850-bd5c96b3-f275-46ea-98b1-1317e02a5d6e-000000@email.amazonses.com> <29c1640a-cf19-ca19-7de9-96f202edfb5a@redhat.com> <010001620bafa06b-41525407-603e-40a9-ba11-6033b2f5dcc7-000000@email.amazonses.com> <010001621a9e5069-0b1a6328-97e4-4396-9438-b90f5b8c82a4-000000@email.amazonses.com> <010001621b287e42-58955302-cc14-4212-b7b0-e6e358633dab-000000@email.amazonses.com> From: Jeremy Cline Message-ID: <010001621b7ce5a3-b80c55b8-be68-4b44-ab52-4949e8ddb8d0-000000@email.amazonses.com> Date: Mon, 12 Mar 2018 18:33:13 +0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.6.0 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-SES-Outgoing: 2018.03.12-54.240.8.57 Feedback-ID: 1.us-east-1.z18Isoc/FaoPOvCyJyi1mnTt8STwoRuibXVNoUcvG6g=:AmazonSES Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 03/12/2018 02:29 PM, Thiebaud Weksteen wrote: > On Mon, Mar 12, 2018 at 6:30 PM Ard Biesheuvel > wrote: > >> On 12 March 2018 at 17:01, Jeremy Cline wrote: >>> On 03/12/2018 10:56 AM, Ard Biesheuvel wrote: >>>> On 12 March 2018 at 14:30, Jeremy Cline wrote: >>>>> On 03/12/2018 07:08 AM, Ard Biesheuvel wrote: >>>>>> On 10 March 2018 at 10:45, Thiebaud Weksteen > wrote: >>>>>>> On Fri, Mar 9, 2018 at 5:54 PM Jeremy Cline > wrote: >>>>>>> >>>>>>>> On Fri, Mar 09, 2018 at 10:43:50AM +0000, Thiebaud Weksteen wrote: >>>>>>>>> Thanks a lot for trying out the patch! >>>>>>>>> >>>>>>>>> Please don't modify your install at this stage, I think we are > hitting a >>>>>>>>> firmware bug and that would be awesome if we can fix how we are >>>>>>> handling it. >>>>>>>>> So, if we reach that stage in the function it could either be > that: >>>>>>>>> * The allocation did not succeed, somehow, but the firmware still >>>>>>> returned >>>>>>>>> EFI_SUCCEED. >>>>>>>>> * The size requested is incorrect (I'm thinking something like a > 1G of >>>>>>>>> log). This would be due to either a miscalculation of log_size >>>>>>> (possible) >>>>>>>>> or; the returned values of GetEventLog are not correct. >>>>>>>>> I'm sending a patch to add checks for these. Could you please > apply and >>>>>>>>> retest? >>>>>>>>> Again, thanks for helping debugging this. >>>>>>> >>>>>>>> No problem, thanks for the help :) >>>>>>> >>>>>>>> With the new patch: >>>>>>> >>>>>>>> Locating the TCG2Protocol >>>>>>>> Calling GetEventLog on TCG2Protocol >>>>>>>> Log returned >>>>>>>> log_location is not empty >>>>>>>> log_size != 0 >>>>>>>> log_size < 1M >>>>>>>> Allocating memory for storing the logs >>>>>>>> Returned from memory allocation >>>>>>>> Copying log to new location >>>>>>> >>>>>>>> And then it hangs. I added a couple more print statements: >>>>>>> >>>>>>>> diff --git a/drivers/firmware/efi/libstub/tpm.c >>>>>>> b/drivers/firmware/efi/libstub/tpm.c >>>>>>>> index ee3fac109078..1ab5638bc50e 100644 >>>>>>>> --- a/drivers/firmware/efi/libstub/tpm.c >>>>>>>> +++ b/drivers/firmware/efi/libstub/tpm.c >>>>>>>> @@ -148,8 +148,11 @@ void >>>>>>> efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) >>>>>>>> efi_printk(sys_table_arg, "Copying log to new > location\n"); >>>>>>> >>>>>>>> memset(log_tbl, 0, sizeof(*log_tbl) + log_size); >>>>>>>> + efi_printk(sys_table_arg, "Successfully memset log_tbl to > 0\n"); >>>>>>>> log_tbl->size = log_size; >>>>>>>> + efi_printk(sys_table_arg, "Set log_tbl->size\n"); >>>>>>>> log_tbl->version = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2; >>>>>>>> + efi_printk(sys_table_arg, "Set log_tbl-version\n"); >>>>>>>> memcpy(log_tbl->log, (void *) first_entry_addr, log_size); >>>>>>> >>>>>>>> efi_printk(sys_table_arg, "Installing the log into the >>>>>>> configuration table\n"); >>>>>>> >>>>>>>> and it's hanging at "memset(log_tbl, 0, sizeof(*log_tbl) + > log_size);" >>>>>>> >>>>>>> Thanks. Well, it looks like the memory that is supposedly allocated > is not >>>>>>> usable. I'm thinking this is a firmware bug. >>>>>>> Ard, would you agree on this assumption? Thoughts on how to proceed? >>>>>>> >>>>>> >>>>>> I am rather puzzled why the allocate_pool() should succeed and the >>>>>> subsequent memset() should fail. This does not look like an issue > that >>>>>> is intimately related to TPM2 support, rather an issue in the > firmware >>>>>> that happens to get tickled after the change. >>>>>> >>>>>> Would you mind trying replacing EFI_LOADER_DATA with >>>>>> EFI_BOOT_SERVICES_DATA in the allocate_pool() call? >>>>> >>>>> Replacing EFI_LOADER_DATA with EFI_BOOT_SERVICES_DATA still hangs at > the >>>>> memset() call. >>>>> >>>> >>>> Could you try the following please? (attached as well in case gmail > mangles it) >>>> >>>> diff --git a/drivers/firmware/efi/libstub/tpm.c >>>> b/drivers/firmware/efi/libstub/tpm.c >>>> index 2298560cea72..30d960a344b7 100644 >>>> --- a/drivers/firmware/efi/libstub/tpm.c >>>> +++ b/drivers/firmware/efi/libstub/tpm.c >>>> @@ -70,6 +70,8 @@ void >>>> efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) >>>> size_t log_size, last_entry_size; >>>> efi_bool_t truncated; >>>> void *tcg2_protocol; >>>> + unsigned long num_pages; >>>> + efi_physical_addr_t log_tbl_alloc; >>>> >>>> status = efi_call_early(locate_protocol, &tcg2_guid, NULL, >>>> &tcg2_protocol); >>>> @@ -104,9 +106,12 @@ void >>>> efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) >>>> } >>>> >>>> /* Allocate space for the logs and copy them. */ >>>> - status = efi_call_early(allocate_pool, EFI_LOADER_DATA, >>>> - sizeof(*log_tbl) + log_size, >>>> - (void **) &log_tbl); >>>> + num_pages = DIV_ROUND_UP(sizeof(*log_tbl) + log_size, > EFI_PAGE_SIZE); >>>> + status = efi_call_early(allocate_pages, >>>> + EFI_ALLOCATE_ANY_PAGES, >>>> + EFI_LOADER_DATA, >>>> + num_pages, >>>> + &log_tbl_alloc); >>>> >>>> if (status != EFI_SUCCESS) { >>>> efi_printk(sys_table_arg, >>>> @@ -114,6 +119,7 @@ void >>>> efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) >>>> return; >>>> } >>>> >>>> + log_tbl = (struct linux_efi_tpm_eventlog *)(unsigned > long)log_tbl_alloc; >>>> memset(log_tbl, 0, sizeof(*log_tbl) + log_size); >>>> log_tbl->size = log_size; >>>> log_tbl->version = EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2; >>>> @@ -126,7 +132,7 @@ void >>>> efi_retrieve_tpm2_eventlog_1_2(efi_system_table_t *sys_table_arg) >>>> return; >>>> >>>> err_free: >>>> - efi_call_early(free_pool, log_tbl); >>>> + efi_call_early(free_pages, log_tbl_alloc, num_pages); >>>> } >>>> >>>> void efi_retrieve_tpm2_eventlog(efi_system_table_t *sys_table_arg) >>>> >>> >>> Hi Ard, >>> >>> When I apply this, it starts hanging at >>> >>> status = efi_call_proto(efi_tcg2_protocol, get_event_log, tcg2_protocol, >>> EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2, >>> &log_location, &log_last_entry, &truncated); >>> >>> rather than at the memset() call. >>> > >> That is *very* surprising, given that the change only affects code >> that executes after that. > >> I understand how annoying this is for you, and I think we should try >> to fix this, but reverting the patches outright isn't the solution >> either. > >> Which UEFI vendor and version does your system report? > > You should be able to find this info using the "ver" command in the UEFI > shell. > The UEFI vendor is Insyde (see first message). > Ah, thanks! EFI Specification Revision : 2.40 EFI Vendor : INSYDE Corp. EFI Revision : 21573.83 Regards, Jeremy