public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
From: "Stefan Berger" <stefanb@linux.ibm.com>
To: Jason Andryuk <jandryuk@gmail.com>
Cc: devel@edk2.groups.io, imammedo@redhat.com
Subject: Re: [edk2-devel] TPM2 EventLog EFI vs. ACPI
Date: Mon, 19 Sep 2022 13:39:19 -0400	[thread overview]
Message-ID: <76ef6453-78b6-c1de-809e-4bca6009078e@linux.ibm.com> (raw)
In-Reply-To: <CAKf6xpsxWCYnL=MSTSRx+sT47Rtn=cCfDpyR7DqvQtuwYyDyzA@mail.gmail.com>



On 9/19/22 12:55, Jason Andryuk wrote:
> Hi, Stefan,
> 
> On Mon, Sep 19, 2022 at 8:22 AM Stefan Berger <stefanb@linux.ibm.com> wrote:
>>
>>
>>
>> On 9/19/22 05:17, Igor Mammedov wrote:
>>> On Fri, 16 Sep 2022 15:45:38 -0400
>>> "Jason Andryuk" <jandryuk@gmail.com> wrote:
>>>
>>> CCing Stefan as he is probably the best person to talk about qemu
>>> impl. of TPM
>>>
>>>> Hi,
>>>>
>>>> I've noticed an issue with the TPM2 EventLog.  OVMF exposes the TPM
>>>> Event Log via EFI and ACPI, but they have different addresses.  The
>>>> EFI one retrievable by GetEventLog() is populated.  The ACPI is empty.
>>
>> The ACPI one is for SeaBIOS.
> 
> Yes, ACPI is the only option for SeaBIOS.  Still, I expect GetEventLog
> and the ACPI table to point at the same location.
> 
>>>> Oh, there are actually two EFI Event Logs for the two formats:
>>>> EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2
>>>> EFI_TCG2_EVENT_LOG_FORMAT_TCG_2
>>>>
>>>> The debug log from the Fedora 36 OVMF shows:
>>>> Tcg2GetEventLog (EventLogLocation - 7EEB2000)
>>>> which matches the address retrieved with GetEventLog().
>>>> And hexdump-ing the TPM2 ACPI table shows 0x7fbe6000.
>>>>
>>>> On a different build, I added output for both EFI logs, and the addresses are:
>>>> 0x7ec3d000 - EFI_TCG2_EVENT_LOG_FORMAT_TCG_1_2
>>>> 0x7ec1b000 - EFI_TCG2_EVENT_LOG_FORMAT_TCG_2
>>
>> I am also not familiar with the origin of the EDK2 code as to why it was
>> done this way. Maybe typical builds for EDK2 don't include TPM 1.2 and
>> TPM 2 and OVMF is an outlier here...
> 
> The two log formats are both in the TPM 2 code, so it's independent
> from including TPM 1.2 and 2 hardware support.
> 
>>>> 0x7fbe6000 - ACPI
>>>>
>>>> The ACPI one is a little more user friendly as its address is
>>>> available through the table during runtime.  The EFI addresses can
>>>> only be grabbed before exiting boot services.
>>>>
>>>> I think the issue is that the ACPI tables are created from Qemu fw_cfg
>>>> data, which allocates memory for the log and places the address in
>>>> ACPI tables.  Meanwhile,
>>
>> That's because of SeaBIOS iirc.
> 
> I looked at SeaBIOS, and it finds the address in the ACPI TPM2 table
> and uses it as its log area.
> 
>>>> SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c:SetupEventLog() allocates its own
>>>> event log memory.  SetupEventLog() saves the size and address in
>>>> PcdTpm2AcpiTableLaml & PcdTpm2AcpiTableLasa, but nothing puts those
>>>> values in the actual ACPI tables.
>>>>
>>>> It seems like SetupEventLog would be better structured to check
>>>> existing ACPI tables and look for a log in a TPM2 section.  If found,
>>>> use that, otherwise create a new log area.
>>>>
>>>> The other wrinkle is that the Tcg2 code is keeping two event logs in
>>>> the two formats.  It seems to me that for TPM2, it would be easier to
>>
>> Does it log everything twice?
> 
> Yes, it logs everything twice.  The sha1 hashes match between the two
> logs.  For the newer format, it generates sha1, sha256, sha384 &
> sha512 digests for each entry.
> 
> So there are 3 ~64k memory regions set aside from logs.  OVMF code
> populates the 2 EFI ones.  Linux only grabs the EFI logs when entered
> via EFI stub - a direct UEFI load of the kernel.  Booting via grub-efi
> doesn't grab the EFI log addresses, so only the empty ACPI entry is
> discovered.  Being empty, Linux doesn't expost a TPM event log through
> sysfs.
> 
> I tried searching for the TPM2 table in SetupEventLog(), but it wasn't
> found.  SetupEventLog() runs before InstallQemuFwCfgTables(), which
> makes sense given the existing code to supply the log addresses to
> Tpm2Acpi.  OVMF has already logged things into the event log by the
> time InstallQemuFwCfgTables() is called.
> 
> Thanks for taking a look../SecurityPkg/Tcg/TcgDxe/TcgDxe.c:707:SetupEventLog (


I did take a look and it surprises me that we have 2 logs for TPM 1.2 
and TPM 2 each plus the ACPI one. There are setup functions for TPM 1.2 
and TPM 2 each:

./SecurityPkg/Tcg/Tcg2Dxe/Tcg2Dxe.c:1546:SetupEventLog
./SecurityPkg/Tcg/TcgDxe/TcgDxe.c:707:SetupEventLog (

Though only one of them should initialize the log because calls to them 
are gated by DriverEntry checking which TPM version is in use (also my 
logs seems to say this that only TPM 2's setup is done).

   Status = Tpm2RequestUseTpm ();
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "TPM2 not detected!\n"));
     return Status;
   }


   Status = Tpm12RequestUseTpm ();
   if (EFI_ERROR (Status)) {
     DEBUG ((DEBUG_ERROR, "TPM not detected!\n"));
     return Status;
   }

I have tried to skip over the allocation of memory based on the ability 
to find the TPM2 table in the SetupEventLog function for TPM 2:

   tpm2 = EfiLocateFirstAcpiTable (SIGNATURE_32('T', 'P, 'M', '2'));

It doesn't find the table at this point. So maybe that's the wrong 
function to call?

Another idea may be to search for the TPM2 table at the end and copy the 
log into the ACPI log area allocated by QEMU, if there is one (with QEMU 
there will be one), and use that address then also for the TPM2 log and 
free the UEFI log area that currently seems to be a duplicate. I don't 
know where that should be done, though.


I always run into the following issue with EDK2 these days...


Reserved variable store memory: 0x7FE7C000; size: 528kb
NvVarStore Variable header State was invalid.
ASSERT 
/home/stefanb/dev/edk2/OvmfPkg/Library/PlatformInitLib/Platform.c(807): 
((BOOLEAN)(0==1))

Regards,
    Stefan

> 
> Regards,
> Jason

  reply	other threads:[~2022-09-19 17:39 UTC|newest]

Thread overview: 9+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2022-09-16 19:45 TPM2 EventLog EFI vs. ACPI Jason Andryuk
2022-09-17  2:28 ` [edk2-devel] " Andrew Fish
2022-09-17 18:30   ` Jason Andryuk
2022-09-18  0:10     ` Andrew Fish
2022-09-19  9:17 ` Igor Mammedov
2022-09-19 12:22   ` Stefan Berger
2022-09-19 16:55     ` Jason Andryuk
2022-09-19 17:39       ` Stefan Berger [this message]
2022-09-19 18:19         ` Jason Andryuk

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-list from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=76ef6453-78b6-c1de-809e-4bca6009078e@linux.ibm.com \
    --to=devel@edk2.groups.io \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox