Received: by 10.213.65.68 with SMTP id h4csp184578imn; Mon, 12 Mar 2018 10:32:43 -0700 (PDT) X-Google-Smtp-Source: AG47ELs9ZBdIicQarIlgrtuSLOBRkNrBVgSGxJojG8PVtGBT7xpurpVGm0KOpFlaN6yHIWVQoyDR X-Received: by 2002:a17:902:8f96:: with SMTP id z22-v6mr8904698plo.169.1520875963863; Mon, 12 Mar 2018 10:32:43 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1520875963; cv=none; d=google.com; s=arc-20160816; b=wiQriJgAt5bRymz8oib4+0z+vU8HiszxH3rmEcbeH0nYsy6Gb2EwjDVc5QLbXUSEqM /O6TBWMquZv1sCxbhQ4LlAN7j+hpqLvpP+jIWCCyFgPr33PyjTveVAFgpzErTat8W67M Cyt+DX79g7MnMUeecTNtPY2B6KFtQuqiZoGbt7nhc0LO5tm7e6RVVnRpoqNTP+iO//Nb ddZdBzHqA+vmYNtBGVK4VQJnMODb/S+YZBBfZmiii7An/UDj7BcjuS+3sONLqn4/Frop rJHsnAwF3SjNmxFyHHJIoOaJeUf+bBtWJLDVcwl3K84I/kmDopfOmLfqA4mp19C//9qv smtw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:cc:to:subject:message-id:date:from :references:in-reply-to:mime-version:dkim-signature :arc-authentication-results; bh=TV5rvWC5LcnW19B/ytfzZC5Kj9WbCvUStgVp2V1UhPU=; b=oDurtK4/FY3frdR8rw61P1VvQf3MC3jFJGGEJXSANoK/STvrWUjot3WzBoR0oZ8uO6 P+OnT2X/zFgfuxLOXObLOVu9Q2VF6p1p6e0KN3Y1m4h5fukT319fuZHuWiH1vzPGoX6M n9A5WES/FaC8BlQoRsTRr3Y9mb5b/SFoHakVpNoMlQySUss59IITKX7wGSU7EbucxNPy ymYx3n1K4kd7NUgCVRZ4MawDDgBB4mSyS/GALvJ0lVt+PHvnSQfJHkSc+QFNEIOeE/jD OKzVBiJd9ddRBhRiZhSACE++BDAINIJEvQupFnpsv96LCIchU5ntrUTlf5Nldd9aFohE S22g== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@linaro.org header.s=google header.b=EFTv9+mE; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id a12si5231954pgu.501.2018.03.12.10.32.29; Mon, 12 Mar 2018 10:32:43 -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=@linaro.org header.s=google header.b=EFTv9+mE; 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; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=linaro.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S932691AbeCLRai (ORCPT + 99 others); Mon, 12 Mar 2018 13:30:38 -0400 Received: from mail-io0-f175.google.com ([209.85.223.175]:37045 "EHLO mail-io0-f175.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S932548AbeCLRah (ORCPT ); Mon, 12 Mar 2018 13:30:37 -0400 Received: by mail-io0-f175.google.com with SMTP id d71so12397425iog.4 for ; Mon, 12 Mar 2018 10:30:37 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; h=mime-version:in-reply-to:references:from:date:message-id:subject:to :cc; bh=TV5rvWC5LcnW19B/ytfzZC5Kj9WbCvUStgVp2V1UhPU=; b=EFTv9+mEG00WL8DS2zuuS5vuJqvhal7np9Yu9zIj7aTm/eJKbtlZVLbE6S9f1qILVl RFQ9kcRUJ1kvM+BiXmCjfp1ElURTpH6WEHizaT3auz5Z39k2GyRMNtmPX0Ht64JGSluj ONkes0ELH8OsrMSVoHTdVAPydC34ADchm7AZk= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:mime-version:in-reply-to:references:from:date :message-id:subject:to:cc; bh=TV5rvWC5LcnW19B/ytfzZC5Kj9WbCvUStgVp2V1UhPU=; b=FxNgPH+NaH+3yHuqUrQVgzUjkrMLuXOBWKLIVmRQBL3XfNyYrtWAw8D40hQTpx7WOc aU48bnOzxDY3b+Ouygy/fNFuUOFA4zn8wEvsfLwAC/Olxg0u5eYy50nNwhGQ8Zw/CT7V 3kmrNom50tM77g6tHAGPbUoMaIBFeLxo2pf/rOx4UnCswo1ErOfRzcVwjBD/sran+uGq awpfeY1pjnQY/bmSToUY95VNI5SIhkFKuEfR2aU0cXD14wkhNmz7mdXBIOBlua3X4NJL gFlZkGrxmzNdqYu1qrVfZXWrwozsO3fFNyotvznwW/wuSdyEjMq6FKMd2oc7zMLIlnv1 8EVw== X-Gm-Message-State: AElRT7HmlOtZSES04qUYqxIJiHWcU5pj8LzR0xIyOG/U7GC7i2TI9SBQ INjtqVKSzbQGq/oQQqyyRpkyrT1xGByMxwvRTB1ADQ== X-Received: by 10.107.5.199 with SMTP id 190mr10103999iof.107.1520875836356; Mon, 12 Mar 2018 10:30:36 -0700 (PDT) MIME-Version: 1.0 Received: by 10.107.138.209 with HTTP; Mon, 12 Mar 2018 10:30:35 -0700 (PDT) In-Reply-To: <010001621b287e42-58955302-cc14-4212-b7b0-e6e358633dab-000000@email.amazonses.com> 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: Ard Biesheuvel Date: Mon, 12 Mar 2018 17:30:35 +0000 Message-ID: Subject: Re: Regression from efi: call get_event_log before ExitBootServices To: Jeremy Cline Cc: Thiebaud Weksteen , Hans de Goede , Javier Martinez Canillas , Jarkko Sakkinen , linux-efi@vger.kernel.org, linux-integrity@vger.kernel.org, tpmdd-devel@lists.sourceforge.net, Linux Kernel Mailing List Content-Type: text/plain; charset="UTF-8" Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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?