From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (sender SPF authorized) identity=mailfrom; client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=chao.b.zhang@intel.com; receiver=edk2-devel@lists.01.org Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 60B9C21E256A2 for ; Wed, 24 Jan 2018 22:49:49 -0800 (PST) X-Amp-Result: SKIPPED(no attachment in message) X-Amp-File-Uploaded: False Received: from orsmga005.jf.intel.com ([10.7.209.41]) by fmsmga101.fm.intel.com with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Jan 2018 22:55:17 -0800 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.46,409,1511856000"; d="scan'208";a="196123480" Received: from fmsmsx105.amr.corp.intel.com ([10.18.124.203]) by orsmga005.jf.intel.com with ESMTP; 24 Jan 2018 22:55:17 -0800 Received: from fmsmsx123.amr.corp.intel.com (10.18.125.38) by FMSMSX105.amr.corp.intel.com (10.18.124.203) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 24 Jan 2018 22:55:16 -0800 Received: from shsmsx104.ccr.corp.intel.com (10.239.4.70) by fmsmsx123.amr.corp.intel.com (10.18.125.38) with Microsoft SMTP Server (TLS) id 14.3.319.2; Wed, 24 Jan 2018 22:55:16 -0800 Received: from shsmsx102.ccr.corp.intel.com ([169.254.2.189]) by SHSMSX104.ccr.corp.intel.com ([169.254.5.152]) with mapi id 14.03.0319.002; Thu, 25 Jan 2018 14:55:14 +0800 From: "Zhang, Chao B" To: "Yao, Jiewen" , "edk2-devel@lists.01.org" CC: Ronald Aigner Thread-Topic: [edk2] [PATCH] SecurityPkg: Tcg2Smm: Enable TPM2.0 interrupt support Thread-Index: AQHTlaVINX0C1kT5OE6xcIKbjQC2XaODnNiAgACH3HA= Date: Thu, 25 Jan 2018 06:55:13 +0000 Message-ID: References: <20180125062459.14532-1-chao.b.zhang@intel.com> <74D8A39837DF1E4DA445A8C0B3885C503AA8B387@shsmsx102.ccr.corp.intel.com> In-Reply-To: <74D8A39837DF1E4DA445A8C0B3885C503AA8B387@shsmsx102.ccr.corp.intel.com> Accept-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-ctpclassification: CTP_NT x-titus-metadata-40: eyJDYXRlZ29yeUxhYmVscyI6IiIsIk1ldGFkYXRhIjp7Im5zIjoiaHR0cDpcL1wvd3d3LnRpdHVzLmNvbVwvbnNcL0ludGVsMyIsImlkIjoiYmE2MTFhNjYtODA3Yi00YzQxLWEzMzgtNzYyMWJiZGI2Mzc1IiwicHJvcHMiOlt7Im4iOiJDVFBDbGFzc2lmaWNhdGlvbiIsInZhbHMiOlt7InZhbHVlIjoiQ1RQX05UIn1dfV19LCJTdWJqZWN0TGFiZWxzIjpbXSwiVE1DVmVyc2lvbiI6IjE3LjIuNS4xOCIsIlRydXN0ZWRMYWJlbEhhc2giOiJRZGhVZCt2U20zYWtEQWI4TTFoWkIyaDQyV2hkVU1HYnE1Nlo4UDNLRlNhY1lUS2pYUm14RnN0cTJkMDArSzdTIn0= dlp-product: dlpe-windows dlp-version: 11.0.0.116 dlp-reaction: no-action x-originating-ip: [10.239.127.40] MIME-Version: 1.0 Subject: Re: [PATCH] SecurityPkg: Tcg2Smm: Enable TPM2.0 interrupt support X-BeenThere: edk2-devel@lists.01.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: EDK II Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 25 Jan 2018 06:49:49 -0000 Content-Language: en-US Content-Type: text/plain; charset="iso-2022-jp" Content-Transfer-Encoding: quoted-printable Jiewen:=20 Thank you for the comment. I agree with 1=1B$B!A=1B(B3. Will update patch accordingly=20 For 4. We verified short format Possible Interrupt with PcdTpm2PossibleIr= qNumBuf set to {(UINT32) 0x01} Short formed resource buffer=20 {(UINT32)0x01, ~ (UINT32)0x0A} Short formed resource buffe= r {UINT32)0x01 ~ (UINT32) 0x0B} long formed resource buffe= r { UINT32)0x01 ~ (UINT32) 0x0F} long formed resource buff= er All of them can be patched successfully. -----Original Message----- From: Yao, Jiewen=20 Sent: Thursday, January 25, 2018 2:39 PM To: Zhang, Chao B ; edk2-devel@lists.01.org Cc: Zhang, Chao B ; Ronald Aigner Subject: RE: [edk2] [PATCH] SecurityPkg: Tcg2Smm: Enable TPM2.0 interrupt s= upport Thanks Chao. In general this patch is good. Some minor suggestion for your consideration: 1) Can we rename PcdTpm2IrqNum to PcdTpm2CurrentIrqNum ? (To match PcdTpm2P= ossibleIrqNumBuf) 2) I suggest we output debug message if below condition is NOT satisfied. A= s such people know what happens. Silence failure is not the best way. > + if (PossibleIrqNumBufSize <=3D MAX_PRS_INT_BUF_SIZE && > (PossibleIrqNumBufSize % sizeof(UINT32)) =3D=3D 0) { > + Status =3D UpdatePossibleResource(Table, PossibleIrqNumBuf, > PossibleIrqNumBufSize); > + DEBUG (( > + DEBUG_INFO, > + "UpdatePossibleResource status - %x\n", > + Status > + )); > + } 3) Do we use UINT32 to IrqNumber? If so, you can use {(UINT32)0x12} for tha= t. > + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf|{0x12, 0x00, > 0x00, 0x00}|VOID*|0x0001001D 4) Would you please clarify what test has been done for the PCD patch? Since you support flexible format (short v.s. long), please make sure all p= ath is covered. Thank you Yao Jiewen > -----Original Message----- > From: edk2-devel [mailto:edk2-devel-bounces@lists.01.org] On Behalf Of=20 > Zhang, Chao B > Sent: Thursday, January 25, 2018 2:25 PM > To: edk2-devel@lists.01.org > Cc: Yao, Jiewen ; Zhang, Chao B=20 > ; Ronald Aigner > Subject: [edk2] [PATCH] SecurityPkg: Tcg2Smm: Enable TPM2.0 interrupt=20 > support >=20 > 1. Expose _CRS, _SRS, _PRS control method to support TPM interrupt 2.=20 > Provide 2 PCDs to configure _CRS and _PRS returned data >=20 > Cc: Yao Jiewen > Cc: Ronald Aigner > Contributed-under: TianoCore Contribution Agreement 1.1 > Signed-off-by: Chao Zhang > --- > SecurityPkg/SecurityPkg.dec | 12 +- > SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c | 268 > +++++++++++++++++++++++++++++++++++- > SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h | 24 +++- > SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf | 5 +- > SecurityPkg/Tcg/Tcg2Smm/Tpm.asl | 96 ++++++++++--- > 5 files changed, 383 insertions(+), 22 deletions(-) >=20 > diff --git a/SecurityPkg/SecurityPkg.dec b/SecurityPkg/SecurityPkg.dec=20 > index 50dbe95..a2b3191 100644 > --- a/SecurityPkg/SecurityPkg.dec > +++ b/SecurityPkg/SecurityPkg.dec > @@ -5,7 +5,7 @@ > # It also provides the definitions(including PPIs/PROTOCOLs/GUIDs=20 > and library > classes) > # and libraries instances, which are used for those features. > # > -# Copyright (c) 2009 - 2017, Intel Corporation. All rights=20 > reserved.
> +# Copyright (c) 2009 - 2018, Intel Corporation. All rights=20 > +reserved.
> # (C) Copyright 2015 Hewlett Packard Enterprise Development LP
=20 > # Copyright (c) 2017, Microsoft Corporation. All rights reserved.=20 >
# This program and the accompanying materials are licensed and=20 > made available under @@ -450,6 +450,16 @@ > # @Prompt Initial setting of TCG2 Persistent Firmware Management=20 > Flags >=20 > gEfiSecurityPkgTokenSpaceGuid.PcdTcg2PhysicalPresenceFlags|0x300E2|UIN > T3 > 2|0x0001001B >=20 > + ## Indicate current TPM2 Interrupt Number reported by _CRS control > method.

> + # TPM2 Interrupt feature is disabled If the pcd is set to 0.
#=20 > + @Prompt Current TPM2 Interrupt Number > + > gEfiSecurityPkgTokenSpaceGuid.PcdTpm2IrqNum|0x12|UINT32|0x0001001C > + > + ## Indicate platform possible TPM2 Interrupt Number reported by=20 > + _PRS > control method.

> + # Possible TPM2 Interrupt Number Buffer will not be reported if=20 > + TPM2 > Interrupt feature is disabled.
> + # @Prompt Possible TPM2 Interrupt Number buffer =20 > + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf|{0x12, 0x00, > 0x00, 0x00}|VOID*|0x0001001D > + > [PcdsDynamic, PcdsDynamicEx] >=20 > ## This PCD indicates Hash mask for TPM 2.0. Bit definition=20 > strictly follows TCG Algorithm Registry.

diff --git=20 > a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c > b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c > index 5a1fd3e..5ad042e 100644 > --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c > +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.c > @@ -9,7 +9,7 @@ >=20 > PhysicalPresenceCallback() and MemoryClearCallback() will receive=20 > untrusted input and do some check. >=20 > -Copyright (c) 2015 - 2017, Intel Corporation. All rights=20 > reserved.
> +Copyright (c) 2015 - 2018, Intel Corporation. All rights=20 > +reserved.
> This program and the accompanying materials are licensed and made=20 > available under the terms and conditions of the BSD License which=20 > accompanies this distribution. The full text of the license may be=20 > found at @@ -304,6 +304,251 @@ UpdatePPVersion ( } >=20 > /** > + Patch interrupt resources returned by TPM _PRS. ResourceTemplate to=20 > + patch > is determined by input > + interrupt buffer size. BufferSize, PkgLength and interrupt=20 > + descirptor in > ByteList need to be patched > + > + @param[in, out] Table The TPM item in ACPI table. > + @param[in] IrqBuffer Input new IRQ buffer. > + @param[in] IrqBuffserSize Input new IRQ buffer size. > + > + @return patch status. > + > +**/ > +EFI_STATUS > +UpdatePossibleResource ( > + EFI_ACPI_DESCRIPTION_HEADER *Table, > + UINT32 *IrqBuffer, > + UINT32 IrqBuffserSize > + ) > +{ > + UINT8 *DataPtr; > + UINT8 *DataEndPtr; > + UINT32 NewPkgLength; > + UINT32 OrignalPkgLength; > + > + NewPkgLength =3D 0; > + OrignalPkgLength =3D 0; > + DataEndPtr =3D NULL; > + > + // > + // Follow ACPI spec > + // 6.4.3 Extend Interrupt Descriptor. > + // 19.3.3 ASL Resource Template > + // 20 AML specification > + // to patch TPM ACPI object _PRS returned ResourceTemplate()=20 > + containing 2 > resource descriptors and an auto appended End Tag > + // > + // AML data is organized by following rule. > + // Code need to patch BufferSize and PkgLength and interrupt=20 > + descirptor in > ByteList > + // > + // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Buffer =3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + // DefBuffer :=3D BufferOp PkgLength BufferSize ByteList > + // BufferOp :=3D 0x11 > + // > + // =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DPkgLength=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + // PkgLength :=3D PkgLeadByte | > + // | > + // | > + // ByteData> > + // > + // PkgLeadByte :=3D > + // 63 > > + // length nybble> > + // > + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DBufferSize=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + // BufferSize :=3D Integar > + // Integar :=3D ByteConst|WordConst|DwordConst.... > + // > + // ByteConst :=3D BytePrefix ByteData > + // > + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3DByteList=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + // ByteList :=3D ByteData ByteList > + // > + //=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D > + > + // > + // 1. Check TPM_PRS_RESS with PkgLength <=3D63 can hold the input=20 > + interrupt > number buffer for patching > + // > + for (DataPtr =3D (UINT8 *)(Table + 1); > + DataPtr < (UINT8 *) ((UINT8 *) Table + Table->Length - > (TPM_PRS_RES_NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE)); > + DataPtr +=3D 1) { > + if (CompareMem(DataPtr, TPM_PRS_RESS, TPM_PRS_RES_NAME_SIZE) > =3D=3D 0) { > + // > + // Jump over object name & BufferOp > + // > + DataPtr +=3D TPM_PRS_RES_NAME_SIZE + 1; > + > + if ((*DataPtr & (BIT7|BIT6)) =3D=3D 0) { > + OrignalPkgLength =3D (UINT32)*DataPtr; > + DataEndPtr =3D DataPtr + OrignalPkgLength; > + > + // > + // Jump over PkgLength =3D PkgLeadByte only > + // > + NewPkgLength++; > + > + // > + // Jump over BufferSize > + // > + if (*(DataPtr + 1) =3D=3D AML_BYTE_PREFIX) { > + NewPkgLength +=3D 2; > + } else if (*(DataPtr + 1) =3D=3D AML_WORD_PREFIX) { > + NewPkgLength +=3D 3; > + } else if (*(DataPtr + 1) =3D=3D AML_DWORD_PREFIX) { > + NewPkgLength +=3D 5; > + } else { > + ASSERT(FALSE); > + return EFI_UNSUPPORTED; > + } > + } else { > + ASSERT(FALSE); > + return EFI_UNSUPPORTED; > + } > + > + // > + // Include Memory32Fixed Descritor (12 Bytes) + Interrupt=20 > + Descriptor > header(5 Bytes) + End Tag(2 Bytes) > + // > + NewPkgLength +=3D 19 + IrqBuffserSize; > + if (NewPkgLength > 63) { > + break; > + } > + > + if (NewPkgLength > OrignalPkgLength) { > + ASSERT(FALSE); > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // 1.1 Patch PkgLength > + // > + *DataPtr =3D (UINT8)NewPkgLength; > + > + // > + // 1.2 Patch BufferSize =3D sizeof(Memory32Fixed Descritor +=20 > + Interrupt > Descriptor + End Tag). > + // It is Little endian. So only patch lowest byte of BufferSi= ze due to > current interrupt number limit. > + // > + *(DataPtr + 2) =3D (UINT8)(IrqBuffserSize + 19); > + > + // > + // Notify _PRS to report short formed ResourceTemplate > + // > + mTcgNvs->IsShortFormPkgLength =3D TRUE; > + > + break; > + } > + } > + > + // > + // 2. Use TPM_PRS_RESL with PkgLength > 63 to hold longer input=20 > + interrupt > number buffer for patching > + // > + if (NewPkgLength > 63) { > + NewPkgLength =3D 0; > + OrignalPkgLength =3D 0; > + for (DataPtr =3D (UINT8 *)(Table + 1); > + DataPtr < (UINT8 *) ((UINT8 *) Table + Table->Length - > (TPM_PRS_RES_NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE)); > + DataPtr +=3D 1) { > + if (CompareMem(DataPtr, TPM_PRS_RESL, TPM_PRS_RES_NAME_SIZE) > =3D=3D 0) { > + // > + // Jump over object name & BufferOp > + // > + DataPtr +=3D TPM_PRS_RES_NAME_SIZE + 1; > + > + if ((*DataPtr & (BIT7|BIT6)) !=3D 0) { > + OrignalPkgLength =3D (UINT32)(*(DataPtr + 1) << 4) +=20 > + (*DataPtr & > 0x0F); > + DataEndPtr =3D DataPtr + OrignalPkgLength; > + // > + // Jump over PkgLength =3D PkgLeadByte + ByteData length > + // > + NewPkgLength +=3D 1 + ((*DataPtr & (BIT7|BIT6)) >> 6); > + > + // > + // Jump over BufferSize > + // > + if (*(DataPtr + NewPkgLength) =3D=3D AML_BYTE_PREFIX) { > + NewPkgLength +=3D 2; > + } else if (*(DataPtr + NewPkgLength) =3D=3D AML_WORD_PREFIX) { > + NewPkgLength +=3D 3; > + } else if (*(DataPtr + NewPkgLength) =3D=3D AML_DWORD_PREFIX) = { > + NewPkgLength +=3D 5; > + } else { > + ASSERT(FALSE); > + return EFI_UNSUPPORTED; > + } > + } else { > + ASSERT(FALSE); > + return EFI_UNSUPPORTED; > + } > + > + // > + // Include Memory32Fixed Descritor (12 Bytes) + Interrupt=20 > + Descriptor > header(5 Bytes) + End Tag(2 Bytes) > + // > + NewPkgLength +=3D 19 + IrqBuffserSize; > + > + if (NewPkgLength > OrignalPkgLength) { > + ASSERT(FALSE); > + return EFI_INVALID_PARAMETER; > + } > + > + // > + // 2.1 Patch PkgLength. Only patch PkgLeadByte and first ByteDat= a > + // > + *DataPtr =3D (UINT8)((*DataPtr) & 0xF0) | (NewPkgLength & 0x0F); > + *(DataPtr + 1) =3D (UINT8)((NewPkgLength & 0xFF0) >> 4); > + > + // > + // 2.2 Patch BufferSize =3D sizeof(Memory32Fixed Descritor +=20 > + Interrupt > Descriptor + End Tag). > + // It is Little endian. Only patch lowest byte of BufferSize= due to > current interrupt number limit. > + // > + *(DataPtr + 2 + ((*DataPtr & (BIT7|BIT6)) >> 6)) =3D > (UINT8)(IrqBuffserSize + 19); > + > + // > + // Notify _PRS to report short formed ResourceTemplate > + // > + mTcgNvs->IsShortFormPkgLength =3D FALSE; > + break; > + } > + } > + } > + > + if (DataPtr >=3D (UINT8 *) ((UINT8 *) Table + Table->Length - > (TPM_PRS_RES_NAME_SIZE + TPM_POS_RES_TEMPLATE_MIN_SIZE))) { > + return EFI_NOT_FOUND; > + } > + > + // > + // 3. Move DataPtr to Interrupt descriptor header and patch=20 > + interrupt > descriptor. > + // 5 bytes for interrupt descriptor header, 2 bytes for End Tag > + // > + DataPtr +=3D NewPkgLength - (5 + IrqBuffserSize + 2); // > + // 3.1 Patch Length bit[7:0] of Interrupt descirptor patch interrupt > descriptor > + // > + *(DataPtr + 1) =3D (UINT8)(2 + IrqBuffserSize); // > + // 3.2 Patch Interrupt Table Length > + // > + *(DataPtr + 4) =3D (UINT8)(IrqBuffserSize / sizeof(UINT32)); // > + // 3.3 Copy patched InterruptNumBuffer > + // > + CopyMem(DataPtr + 5, IrqBuffer, IrqBuffserSize); > + > + // > + // 4. Jump over Interrupt descirptor and Patch END Tag, set Checksum f= ield > to 0 > + // > + DataPtr +=3D 5 + IrqBuffserSize; > + *DataPtr =3D ACPI_END_TAG_DESCRIPTOR; > + *(DataPtr + 1) =3D 0; > + > + // > + // 5. Jump over whole ResourceTemplate. Stuff rest bytes to NOOP > + // > + for (DataPtr +=3D 2; DataPtr < DataEndPtr; DataPtr++) { > + *DataPtr =3D AML_NOOP_OP; > + } > + > + return EFI_SUCCESS; > +} > + > +/** > Patch TPM2 device HID string. The initial string tag in TPM2 ACPI tab= le is > "NNN0000". >=20 > @param[in, out] Table The TPM2 SSDT ACPI table. > @@ -424,6 +669,8 @@ PublishAcpiTable ( > UINTN TableKey; > EFI_ACPI_DESCRIPTION_HEADER *Table; > UINTN TableSize; > + UINT32 *PossibleIrqNumBuf; > + UINT32 PossibleIrqNumBufSize; >=20 > Status =3D GetSectionFromFv ( > &gEfiCallerIdGuid, > @@ -454,6 +701,23 @@ PublishAcpiTable ( > return Status; > } >=20 > + if (PcdGet32(PcdTpm2IrqNum) !=3D 0) { > + // > + // Patch _PRS interrupt resource only when TPM interrupt is supporte= d > + // > + PossibleIrqNumBuf =3D (UINT32 > *)PcdGetPtr(PcdTpm2PossibleIrqNumBuf); > + PossibleIrqNumBufSize =3D > (UINT32)PcdGetSize(PcdTpm2PossibleIrqNumBuf); > + > + if (PossibleIrqNumBufSize <=3D MAX_PRS_INT_BUF_SIZE && > (PossibleIrqNumBufSize % sizeof(UINT32)) =3D=3D 0) { > + Status =3D UpdatePossibleResource(Table, PossibleIrqNumBuf, > PossibleIrqNumBufSize); > + DEBUG (( > + DEBUG_INFO, > + "UpdatePossibleResource status - %x\n", > + Status > + )); > + } > + } > + > // > // Measure to PCR[0] with event EV_POST_CODE ACPI DATA > // > @@ -471,6 +735,8 @@ PublishAcpiTable ( > CopyMem (Table->OemId, PcdGetPtr (PcdAcpiDefaultOemId), sizeof > (Table->OemId) ); > mTcgNvs =3D AssignOpRegion (Table, SIGNATURE_32 ('T', 'N', 'V', 'S'), = (UINT16) > sizeof (TCG_NVS)); > ASSERT (mTcgNvs !=3D NULL); > + mTcgNvs->TpmIrqNum =3D PcdGet32(PcdTpm2IrqNum); > + mTcgNvs->IsShortFormPkgLength =3D FALSE; >=20 > // > // Publish the TPM ACPI table. Table is re-checksumed. > diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h > b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h > index 100804c..732452c 100644 > --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h > +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.h > @@ -1,7 +1,7 @@ > /** @file > The header file for Tcg2 SMM driver. >=20 > -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
> +Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> This program and the accompanying materials > are licensed and made available under the terms and conditions of the BS= D > License > which accompanies this distribution. The full text of the license may b= e found > at > @@ -39,6 +39,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY > KIND, EITHER EXPRESS OR IMPLIED. > #include > #include > #include > +#include >=20 > #include >=20 > @@ -64,6 +65,8 @@ typedef struct { > PHYSICAL_PRESENCE_NVS PhysicalPresence; > MEMORY_CLEAR_NVS MemoryClear; > UINT32 PPRequestUserConfirm; > + UINT32 TpmIrqNum; > + BOOLEAN IsShortFormPkgLength; > } TCG_NVS; >=20 > typedef struct { > @@ -102,4 +105,23 @@ typedef struct { > #define TPM_HID_PNP_SIZE > 8 > #define TPM_HID_ACPI_SIZE > 9 >=20 > +#define TPM_PRS_RESL > "RESL" > +#define TPM_PRS_RESS > "RESS" > +#define TPM_PRS_RES_NAME_SIZE > 4 > +// > +// Minimum PRS resource template size > +// 1 byte for BufferOp > +// 1 byte for PkgLength > +// 2 bytes for BufferSize > +// 12 bytes for Memory32Fixed descriptor > +// 5 bytes for Interrupt descriptor > +// 2 bytes for END Tag > +// > +#define TPM_POS_RES_TEMPLATE_MIN_SIZE > (1 + 1 + 2 + 12 + 5 + 2) > + > +// > +// Max Interrupt buffer size for PRS interrupt resource > +// Now support 15 interrupts in maxmum > +// > +#define MAX_PRS_INT_BUF_SIZE > (15*4) > #endif // __TCG_SMM_H__ > diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf > b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf > index c709743..86e1816 100644 > --- a/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf > +++ b/SecurityPkg/Tcg/Tcg2Smm/Tcg2Smm.inf > @@ -16,7 +16,7 @@ > # This driver will have external input - variable and ACPINvs data in S= MM > mode. > # This external input must be validated carefully to avoid security iss= ue. > # > -# Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
> +# Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> # This program and the accompanying materials > # are licensed and made available under the terms and conditions of the = BSD > License > # which accompanies this distribution. The full text of the license may = be found > at > @@ -58,6 +58,7 @@ > Tpm2CommandLib > Tcg2PhysicalPresenceLib > IoLib > + PcdLib >=20 > [Guids] > ## SOMETIMES_PRODUCES ## > Variable:L"MemoryOverwriteRequestControl" > @@ -82,6 +83,8 @@ > gEfiSecurityPkgTokenSpaceGuid.PcdTcgPhysicalPresenceInterfaceVer ## > CONSUMES > gEfiSecurityPkgTokenSpaceGuid.PcdTpm2AcpiTableRev > ## CONSUMES > gEfiSecurityPkgTokenSpaceGuid.PcdTpmPlatformClass ## > SOMETIMES_CONSUMES > + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2IrqNum ## > CONSUMES > + gEfiSecurityPkgTokenSpaceGuid.PcdTpm2PossibleIrqNumBuf ## > CONSUMES >=20 > [Depex] > gEfiAcpiTableProtocolGuid AND > diff --git a/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl > b/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl > index f528305..f58efca 100644 > --- a/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl > +++ b/SecurityPkg/Tcg/Tcg2Smm/Tpm.asl > @@ -2,7 +2,7 @@ > The TPM2 definition block in ACPI table for TCG2 physical presence > and MemoryClear. >=20 > -Copyright (c) 2015 - 2017, Intel Corporation. All rights reserved.
> +Copyright (c) 2015 - 2018, Intel Corporation. All rights reserved.
> (c)Copyright 2016 HP Development Company, L.P.
> Copyright (c) 2017, Microsoft Corporation. All rights reserved.
> This program and the accompanying materials > @@ -92,20 +92,59 @@ DefinitionBlock ( > MCIP, 32, // Used for save the Mor paramter > MORD, 32, // Memory Overwrite Request Data > MRET, 32, // Memory Overwrite function return code > - UCRQ, 32 // Phyical Presence request operation to Get User > Confirmation Status > + UCRQ, 32, // Phyical Presence request operation to Get User > Confirmation Status > + IRQN, 32, // IRQ Number for _CRS > + SFRB, 8 // Is shortformed Pkglength for resource buffer > } >=20 > - Name(RESO, ResourceTemplate () { > - Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REGS) > + // > + // Possible resource settings returned by _PRS method > + // RESS : ResourceTemplate with PkgLength <=3D63 > + // RESL : ResourceTemplate with PkgLength > 63 > + // > + // The format of the data has to follow the same format as > + // _CRS (according to ACPI spec). > + // > + Name (RESS, ResourceTemplate() { > + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) > + Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) > {1,2,3,4,5,6,7,8,9,10} > + }) > + > + Name (RESL, ResourceTemplate() { > + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) > + Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , ) > {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} > + }) > + > + // > + // Current resource settings for _CRS method > + // > + Name(RES0, ResourceTemplate () { > + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG0) > Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , INTR) = {12} > }) >=20 > + Name(RES1, ResourceTemplate () { > + Memory32Fixed (ReadWrite, 0xfed40000, 0x5000, REG1) > + }) > + > + > // > // Return the resource consumed by TPM device. > // > Method(_CRS,0,Serialized) > { > - Return(RESO) > + // > + // IRQNum =3D 0 means disable IRQ support > + // > + If (LEqual(IRQN, 0)) { > + Return (RES1) > + } > + Else > + { > + CreateDWordField(RES0, ^INTR._INT, LIRQ) > + Store(IRQN, LIRQ) > + Return (RES0) > + } > } >=20 > // > @@ -113,23 +152,34 @@ DefinitionBlock ( > // assign an interrupt number to the device. The input byte stream > // has to be the same as returned by _CRS (according to ACPI spec)= . > // > + // Platform may choose to override this function with specific int= errupt > + // programing logic to replace FIFO/TIS SIRQ registers programing > + // > Method(_SRS,1,Serialized) > { > // > + // Do not configure Interrupt if IRQ Num is configured 0 by defa= ult > + // > + If (LEqual(IRQN, 0)) { > + Return (0) > + } > + > + // > // Update resource descriptor > // Use the field name to identify the offsets in the argument > - // buffer and RESO buffer. > + // buffer and RES0 buffer. > // > CreateDWordField(Arg0, ^INTR._INT, IRQ0) > - CreateDWordField(RESO, ^INTR._INT, LIRQ) > + CreateDWordField(RES0, ^INTR._INT, LIRQ) > Store(IRQ0, LIRQ) > + Store(IRQ0, IRQN) >=20 > CreateBitField(Arg0, ^INTR._HE, ITRG) > - CreateBitField(RESO, ^INTR._HE, LTRG) > + CreateBitField(RES0, ^INTR._HE, LTRG) > Store(ITRG, LTRG) >=20 > CreateBitField(Arg0, ^INTR._LL, ILVL) > - CreateBitField(RESO, ^INTR._LL, LLVL) > + CreateBitField(RES0, ^INTR._LL, LLVL) > Store(ILVL, LLVL) >=20 > // > @@ -176,15 +226,25 @@ DefinitionBlock ( > } > } >=20 > - // > - // Possible resource settings. > - // The format of the data has to follow the same format as > - // _CRS (according to ACPI spec). > - // > - Name (_PRS, ResourceTemplate() { > - Memory32Fixed (ReadWrite, 0xfed40000, 0x5000) > - Interrupt(ResourceConsumer, Level, ActiveLow, Shared, , , SIRQ) > {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15} > - }) > + Method(_PRS,0,Serialized) > + { > + // > + // IRQNum =3D 0 means disable IRQ support > + // > + If (LEqual(IRQN, 0)) { > + Return (RES1) > + } ElseIf(LEqual(SFRB, 0)) { > + // > + // Long format. Possible resources PkgLength > 63 > + // > + Return (RESL) > + } Else { > + // > + // Short format. Possible resources PkgLength <=3D63 > + // > + Return (RESS) > + } > + } >=20 > Method (PTS, 1, Serialized) > { > -- > 1.9.5.msysgit.1 >=20 > _______________________________________________ > edk2-devel mailing list > edk2-devel@lists.01.org > https://lists.01.org/mailman/listinfo/edk2-devel