From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail.byosoft.com.cn (mail.byosoft.com.cn [58.240.74.242]) by mx.groups.io with SMTP id smtpd.web08.5177.1611292524601092987 for ; Thu, 21 Jan 2021 21:15:27 -0800 Authentication-Results: mx.groups.io; dkim=missing; spf=none, err=permanent DNS error (domain: byosoft.com.cn, ip: 58.240.74.242, mailfrom: gaoliming@byosoft.com.cn) Received: from DESKTOPS6D0PVI ([58.246.60.130]) (envelope-sender ) by 192.168.6.13 with ESMTP for ; Fri, 22 Jan 2021 13:15:14 +0800 X-WM-Sender: gaoliming@byosoft.com.cn X-WM-AuthFlag: YES X-WM-AuthUser: gaoliming@byosoft.com.cn From: "gaoliming" To: , , "'Ma, Maurice'" , "'Kinney, Michael D'" , "'Gao, Liming'" , Cc: "'Dong, Guo'" , "'You, Benjamin'" , "'Liu, Zhiguang'" References: <20210120155203.3342035-1-patrick.rudolph@9elements.com> In-Reply-To: Subject: =?UTF-8?B?5Zue5aSNOiBbZWRrMi1kZXZlbF0gW1BBVENIXSBVZWZpUGF5bG9hZFBrZzogQWRkIFJORyBzdXBwb3J0?= Date: Fri, 22 Jan 2021 13:15:16 +0800 Message-ID: <017801d6f07d$92761a00$b7624e00$@byosoft.com.cn> MIME-Version: 1.0 X-Mailer: Microsoft Outlook 16.0 Thread-Index: AQDbm98QX0mpdEL4LjII5zIHnAvtRgLl9KRBAbBnghYCsAPuXAIn9BNRq95PQ+A= Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Content-Language: zh-cn Patrick: You can enhance MdePkg BaseRngLib with runtime detection. But, your curr= ent change may not work on PEI phase, because PEIM may run in flash, its gl= obal variable can't be updated.=20 I suggest you add new DxeRngLib.inf for DXE/SMM/UEFI modules with new co= nstructor function. It supports runtime detection. Original BaseRngLib stil= l uses current constructor function, and keeps current functionality.=20 Thanks Liming > -----=E9=82=AE=E4=BB=B6=E5=8E=9F=E4=BB=B6----- > =E5=8F=91=E4=BB=B6=E4=BA=BA: bounce+27952+70656+4905953+8761045@groups.i= o > =E4=BB=A3=E8=A1=A8 Yao, J= iewen > =E5=8F=91=E9=80=81=E6=97=B6=E9=97=B4: 2021=E5=B9=B41=E6=9C=8822=E6=97=A5= 7:32 > =E6=94=B6=E4=BB=B6=E4=BA=BA: devel@edk2.groups.io; Ma, Maurice ; > Kinney, Michael D ; Gao, Liming > ; patrick.rudolph@9elements.com > =E6=8A=84=E9=80=81: Dong, Guo ; You, Benjamin > ; Liu, Zhiguang > =E4=B8=BB=E9=A2=98: Re: [edk2-devel] [PATCH] UefiPayloadPkg: Add RNG sup= port >=20 > Duplicating code is not the best idea. >=20 > I recommend we just add support to MdePkg. >=20 > Thank you > Yao Jiewen >=20 > > -----Original Message----- > > From: devel@edk2.groups.io On Behalf Of Ma, > > Maurice > > Sent: Thursday, January 21, 2021 11:39 PM > > To: Kinney, Michael D ; Gao, Liming > > ; patrick.rudolph@9elements.com > > Cc: Dong, Guo ; You, Benjamin > > ; devel@edk2.groups.io; Liu, Zhiguang > > > > Subject: Re: [edk2-devel] [PATCH] UefiPayloadPkg: Add RNG support > > > > Hi, Patrick > > Let us add MdePkg maintainers into the discussion to see what could be= the > best > > approach for this. > > > > Hi, Mike and Liming, > > Any recommendation from your side ? > > > > Thanks > > Maurice > > > > > -----Original Message----- > > > From: devel@edk2.groups.io On Behalf Of > Patrick > > > Rudolph > > > Sent: Thursday, January 21, 2021 1:05 > > > To: Ma, Maurice > > > Cc: devel@edk2.groups.io; Dong, Guo ; You, > Benjamin > > > > > > Subject: Re: [edk2-devel] [PATCH] UefiPayloadPkg: Add RNG support > > > > > > Hi Maurice, > > > it's a copy of the MdeModulePkg's BaseRngLib with runtime detection > support. > > > > > > Are the MdeModulePkg maintainers OK with adding runtime detection > support? > > > I had the impression that it should only be used on platforms suppor= ting > rdrand > > > for sure, and therefore must not be used on platforms not supporting > rdrand. > > > > > > Kind Regards, > > > Patrick Rudolph > > > > > > On Thu, Jan 21, 2021 at 1:42 AM Ma, Maurice > wrote: > > > > > > > > Hi, Patrick > > > > > > > > There is a BaseRngLib in MdePkg package already. I am wondering > why a > > new > > > instance was created under UefiPayloadPkg in the patch. > > > > Could we just reuse the same library in MdePkg? > > > > If not, what is the reason? Can we try to enhance the library in > MdePkg to > > > address it if required? > > > > > > > > Thanks > > > > Maurice > > > > > -----Original Message----- > > > > > From: Patrick Rudolph > > > > > Sent: Wednesday, January 20, 2021 7:52 > > > > > To: devel@edk2.groups.io > > > > > Cc: Ma, Maurice ; Dong, Guo > > > > > ; You, Benjamin > > > > > Subject: [PATCH] UefiPayloadPkg: Add RNG support > > > > > > > > > > Uses the RDRAND instruction if available and install EfiRngProto= col. > > > > > The protocol may be used by iPXE or the Linux kernel to gather > entropy. > > > > > > > > > > Signed-off-by: Patrick Rudolph > > > > > --- > > > > > UefiPayloadPkg/Library/BaseRngLib/BaseRng.c | 199 > > > > > ++++++++++++++++++++ > > > > > UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.inf | 32 ++++ > > > > > UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.uni | 17 ++ > > > > > UefiPayloadPkg/UefiPayloadPkg.dsc | 8 + > > > > > UefiPayloadPkg/UefiPayloadPkg.fdf | 4 + > > > > > 5 files changed, 260 insertions(+) > > > > > > > > > > diff --git a/UefiPayloadPkg/Library/BaseRngLib/BaseRng.c > > > > > b/UefiPayloadPkg/Library/BaseRngLib/BaseRng.c > > > > > new file mode 100644 > > > > > index 0000000000..1fe9e1dbe0 > > > > > --- /dev/null > > > > > +++ b/UefiPayloadPkg/Library/BaseRngLib/BaseRng.c > > > > > @@ -0,0 +1,199 @@ > > > > > +/** @file+ Random number generator services that uses RdRand > > > > > +instruction > > > > > access+ to provide high-quality random numbers.++Copyright (c) > > > > > access+ 2015, Intel > > > > > Corporation. All rights reserved.
+SPDX-License-Identifier: > > > > > BSD-2-Clause- > > > > > Patent++**/++#include +#include > > > > > +#include ++STATIC > > > > > BOOLEAN mHasRdRand;++//+// Bit mask used to determine if RdRand > > > instruction is > > > > > supported.+//+#define RDRAND_MASK > BIT30++//+// Limited > > retry > > > > > number when valid random data is returned.+// Uses the > recommended > > > > > value defined in Section 7.3.17 of "Intel 64 and IA-32+// Archit= ectures > > > Software > > > > > Developer's Mannual".+//+#define RDRAND_RETRY_LIMIT > 10++/**+ > > > The > > > > > constructor function checks whether or not RDRAND instruction is > > > > > supported+ by the host hardware.++ The constructor function > checks > > > > > whether or not RDRAND instruction is supported.+ It will always > return > > > RETURN_SUCCESS.++ > > > > > @retval RETURN_SUCCESS The constructor always returns > > > > > EFI_SUCCESS.++**/+RETURN_STATUS+EFIAPI+BaseRngLibConstructor > (+ > > > > > VOID+ )+{+ UINT32 RegEax;+ UINT32 RegEcx;++ AsmCpuid > > > > > (CPUID_SIGNATURE, &RegEax, NULL, NULL, NULL);+ if (RegEax < 1) > {+ > > > > > mHasRdRand =3D FALSE;+ return RETURN_SUCCESS;+ }++ //+ > // > > Determine > > > > > RDRAND support by examining bit 30 of the ECX register returned = by+ > // > > > CPUID. > > > > > A value of 1 indicates that processor support RDRAND instruction= .+ > > > > > //+ AsmCpuid (CPUID_VERSION_INFO, 0, 0, &RegEcx, 0);++ > mHasRdRand > > =3D > > > > > ((RegEcx & RDRAND_MASK) =3D=3D RDRAND_MASK);++ return > > > > > RETURN_SUCCESS;+}++/**+ Generates a 16-bit random number.++ > if > > Rand > > > is > > > > > NULL, then ASSERT().++ @param[out] Rand Buffer pointer to > store the > > > 16-bit > > > > > random value.++ @retval TRUE Random number > generated > > > successfully.+ > > > > > @retval FALSE Failed to generate the random > > > > > number.++**/+BOOLEAN+EFIAPI+GetRandomNumber16 (+ OUT > UINT16 > > > > > *Rand+ )+{+ UINT32 Index;++ ASSERT (Rand !=3D NULL);++ if > > (mHasRdRand) > > > {+ > > > > > //+ // A loop to fetch a 16 bit random value with a retry cou= nt > limit.+ > > //+ > > > > > for (Index =3D 0; Index < RDRAND_RETRY_LIMIT; Index++) {+ i= f > > > (AsmRdRand16 > > > > > (Rand)) {+ return TRUE;+ }+ }+ }++ return > FALSE;+}++/**+ > > > Generates a > > > > > 32-bit random number.++ if Rand is NULL, then ASSERT().++ > @param[out] > > > > > Rand Buffer pointer to store the 32-bit random value.++ > @retval TRUE > > > > > Random number generated successfully.+ @retval FALSE > Failed to > > > generate > > > > > the random number.++**/+BOOLEAN+EFIAPI+GetRandomNumber32 > (+ > > > OUT > > > > > UINT32 *Rand+ )+{+ UINT32 Index;++ > ASSERT (Rand !=3D > > > NULL);++ if > > > > > (mHasRdRand) {+ //+ // A loop to fetch a 32 bit random val= ue > with a > > retry > > > > > count limit.+ //+ for (Index =3D 0; Index < > RDRAND_RETRY_LIMIT; Index++) > > > {+ > > > > > if (AsmRdRand32 (Rand)) {+ return > TRUE;+ }+ }+ }++ return > > > > > FALSE;+}++/**+ Generates a 64-bit random number.++ if Rand is > NULL, > > > then > > > > > ASSERT().++ @param[out] Rand Buffer pointer to store the > 64-bit > > > random > > > > > value.++ @retval TRUE Random number generated > successfully.+ > > > @retval > > > > > FALSE Failed to generate the random > > > > > number.++**/+BOOLEAN+EFIAPI+GetRandomNumber64 (+ OUT > UINT64 > > > > > *Rand+ )+{+ UINT32 Index;++ ASSERT (Rand !=3D NULL);++ if > > (mHasRdRand) > > > {+ > > > > > //+ // A loop to fetch a 64 bit random value with a retry cou= nt > limit.+ > > //+ > > > > > for (Index =3D 0; Index < RDRAND_RETRY_LIMIT; Index++) {+ i= f > > > (AsmRdRand64 > > > > > (Rand)) {+ return TRUE;+ }+ }+ }++ return > FALSE;+}++/**+ > > > Generates a > > > > > 128-bit random number.++ if Rand is NULL, then ASSERT().++ > @param[out] > > > > > Rand Buffer pointer to store the 128-bit random value.++ > @retval TRUE > > > > > Random number generated successfully.+ @retval FALSE > Failed to > > > generate > > > > > the random number.++**/+BOOLEAN+EFIAPI+GetRandomNumber128 > (+ > > > OUT > > > > > UINT64 *Rand+ )+{+ ASSERT (Rand !=3D > NULL);++ //+ // Read > > first > > > 64 > > > > > bits+ //+ if (!GetRandomNumber64 (Rand)) {+ return > FALSE;+ }++ //+ // > > > > > Read second 64 bits+ //+ return GetRandomNumber64 > (++Rand);+}diff > > > > > --git a/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.inf > > > > > b/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.inf > > > > > new file mode 100644 > > > > > index 0000000000..67a91ccfff > > > > > --- /dev/null > > > > > +++ b/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.inf > > > > > @@ -0,0 +1,32 @@ > > > > > +## @file+# Instance of RNG (Random Number Generator) > Library.+#+# > > > > > Copyright (c) 2020 9elements Agency GmbH.
+#+# > SPDX-License- > > > Identifier: > > > > > BSD-2-Clause-Patent+#+##++[Defines]+ INF_VERSION > =3D > > > > > 0x00010005+ BASE_NAME =3D > BaseRngLib+ MODULE_UNI_FILE > > > > > =3D BaseRngLib.uni+ FILE_GUID =3D > 05C48431-DE18-4550-931A- > > > > > 3350E8551498+ MODULE_TYPE =3D BASE+ > VERSION_STRING > > > > > =3D 1.0+ LIBRARY_CLASS =3D RngLib+ > CONSTRUCTOR =3D > > > > > BaseRngLibConstructor++#+# VALID_ARCHITECTURES > =3D IA32 > > > > > X64+#++[Sources.Ia32, Sources.X64]+ BaseRng.c++[Packages]+ > > > > > MdePkg/MdePkg.dec++[LibraryClasses]+ BaseLib+ DebugLibdiff > --git > > > > > a/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.uni > > > > > b/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.uni > > > > > new file mode 100644 > > > > > index 0000000000..f3ed954c52 > > > > > --- /dev/null > > > > > +++ b/UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.uni > > > > > @@ -0,0 +1,17 @@ > > > > > +// /** @file+// Instance of RNG (Random Number Generator) > > > > > +Library.+//+// > > > > > BaseRng Library that uses CPU RdRand instruction access to > > > > > provide+// high- quality random numbers.+//+// Copyright (c) 201= 5, > > > > > Intel Corporation. All rights reserved.
+//+// > SPDX-License-Identifier: > > > BSD-2-Clause-Patent+//+// > > > > > **/+++#string STR_MODULE_ABSTRACT #language > en-US "Instance > > > of > > > > > RNG Library"++#string STR_MODULE_DESCRIPTION > #language en-US > > > > > "BaseRng Library that uses CPU RdRand instruction access to prov= ide > > > > > high- quality random numbers"+diff --git > > > > > a/UefiPayloadPkg/UefiPayloadPkg.dsc > > > > > b/UefiPayloadPkg/UefiPayloadPkg.dsc > > > > > index ae62a9c4d6..78a475ea02 100644 > > > > > --- a/UefiPayloadPkg/UefiPayloadPkg.dsc > > > > > +++ b/UefiPayloadPkg/UefiPayloadPkg.dsc > > > > > @@ -494,6 +494,14 @@ > > > > > !endif > UefiPayloadPkg/GraphicsOutputDxe/GraphicsOutputDxe.inf + #+ > > # > > > > > Random Number Generator+ #+ > > > > > SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf {+ > > > > > + > > > > > RngLib|UefiPayloadPkg/Library/BaseRngLib/BaseRngLib.inf+ }+ > #---------- > > -- > > > ----- > > > > > ------------- # Build the shell #--------------------------= ----diff --git > > > > > a/UefiPayloadPkg/UefiPayloadPkg.fdf > > > > > b/UefiPayloadPkg/UefiPayloadPkg.fdf > > > > > index a97ace7395..57c06c8621 100644 > > > > > --- a/UefiPayloadPkg/UefiPayloadPkg.fdf > > > > > +++ b/UefiPayloadPkg/UefiPayloadPkg.fdf > > > > > @@ -169,6 +169,10 @@ INF > > > > > MdeModulePkg/Bus/Usb/UsbBusDxe/UsbBusDxe.inf > > > > > INF MdeModulePkg/Bus/Usb/UsbKbDxe/UsbKbDxe.inf INF > > > > > > MdeModulePkg/Bus/Usb/UsbMassStorageDxe/UsbMassStorageDxe.inf > > > +#+# > > > > > Random Number Generator+#+INF > > > > > SecurityPkg/RandomNumberGenerator/RngDxe/RngDxe.inf # # > Shell-- > > > > > 2.26.2 > > > > > > > > > > > > > > > > > > > > > > > > > > >=20 >=20 >=20 >=20 >=20