[PATCH v2 0/8] Add Variable Flash Info HOB
Michael Kubacki
From: Michael Kubacki <michael.kubacki@...>
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3D3479 The UEFI variable drivers such as VariableRuntimeDxe, VariableSmm, VariableStandaloneMm, etc. (and their dependent protocol/library stack), typically acquire UEFI variable store flash information with PCDs declared in MdeModulePkg. For example: [Pcd] gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize These PCDs work as-is in the StandaloneMm driver if they are not dynamic such as Dynamic or DynamicEx because PCD services are not readily available in the Standalone MM environment. Platforms that use Standalone MM today, must define these PCDs as FixedAtBuild in their platform build. However, the PCDs do allow platforms to treat the PCDs as Dynamic/DynamicEx and being able to support that is currently a gap for Standalone MM. This patch series introduces a HOB that can be produced by the platform to provide the same information. The HOB list is available to Standalone MM. The PCD declarations are left as-is in MdeModulePkg for backward compatibility. This means unless a platform wants to use the HOB, their code will continue to work with no change (they do not need to produce the HOB). Only if the HOB is found, is its value used instead of the PCDs. Due to the large number of consumers of this information, access to the base address and size values is abstracted in a new library class (as requested in the v1 series) called VariableFlashInfoLib. The API of VariableFlashInfoLib does not bind the underlying data structure to the information returned to library users to allow flexibility in the library implementation in the future. V2 changes: 1. Abstracted flash info data access with VariableFlashInfoLib. 2. Updated package builds in the repo that build the variable and FTW drivers to include VariableFlashInfoLib. 3. Removed a redundant variable assignment in VariableSmm.c. 4. Updated comments in FtwMisc.c and FaultTolerantWritePei.c to indicate driver assumption is UINTN (not UINT32) 5. Added a version field to the VARIABLE_FLASH_INFO structure. Cc: Abner Chang <abner.chang@...> Cc: Andrew Fish <afish@...> Cc: Anthony Perard <anthony.perard@...> Cc: Ard Biesheuvel <ardb+tianocore@...> Cc: Benjamin You <benjamin.you@...> Cc: Brijesh Singh <brijesh.singh@...> Cc: Erdem Aktas <erdemaktas@...> Cc: Gerd Hoffmann <kraxel@...> Cc: Guo Dong <guo.dong@...> Cc: Hao A Wu <hao.a.wu@...> Cc: James Bottomley <jejb@...> Cc: Jian J Wang <jian.j.wang@...> Cc: Jiewen Yao <jiewen.yao@...> Cc: Jordan Justen <jordan.l.justen@...> Cc: Julien Grall <julien@...> Cc: Leif Lindholm <quic_llindhol@...> Cc: Liming Gao <gaoliming@...> Cc: Maurice Ma <maurice.ma@...> Cc: Min Xu <min.m.xu@...> Cc: Nickle Wang <nickle.wang@...> Cc: Peter Grehan <grehan@...> Cc: Ray Ni <ray.ni@...> Cc: Rebecca Cran <rebecca@...> Cc: Sami Mujawar <sami.mujawar@...> Cc: Sean Rhodes <sean@...> Cc: Sebastien Boeuf <sebastien.boeuf@...> Cc: Tom Lendacky <thomas.lendacky@...> Signed-off-by: Michael Kubacki <michael.kubacki@...> Michael Kubacki (8): MdeModulePkg: Add Variable Flash Info HOB MdeModulePkg/VariableFlashInfoLib: Add initial library MdeModulePkg/Variable: Consume Variable Flash Info MdeModulePkg/FaultTolerantWrite: Consume Variable Flash Info ArmVirtPkg/ArmVirt.dsc.inc: Add VariableFlashInfoLib EmulatorPkg: Add VariableFlashInfoLib OvmfPkg: Add VariableFlashInfoLib UefiPayloadPkg: Add VariableFlashInfoLib MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.c= | 178 ++++++++++++++++++++ MdeModulePkg/Universal/FaultTolerantWriteDxe/FtwMisc.c = | 41 +++-- MdeModulePkg/Universal/FaultTolerantWriteDxe/UpdateWorkingBlock.c = | 7 +- MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.c = | 28 +-- MdeModulePkg/Universal/Variable/Pei/Variable.c = | 14 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableDxe.c = | 16 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableNonVolatile.c = | 14 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.c = | 17 +- ArmVirtPkg/ArmVirt.dsc.inc = | 1 + EmulatorPkg/EmulatorPkg.dsc = | 1 + MdeModulePkg/Include/Guid/VariableFlashInfo.h = | 39 +++++ MdeModulePkg/Include/Library/VariableFlashInfoLib.h = | 68 ++++++++ MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.i= nf | 48 ++++++ MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.u= ni | 12 ++ MdeModulePkg/MdeModulePkg.dec = | 8 + MdeModulePkg/MdeModulePkg.dsc = | 2 + MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWrite.h = | 7 +- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf = | 10 +- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteSmm.inf = | 10 +- MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteStandalon= eMm.inf | 10 +- MdeModulePkg/Universal/FaultTolerantWritePei/FaultTolerantWritePei.inf = | 10 +- MdeModulePkg/Universal/Variable/Pei/Variable.h = | 2 + MdeModulePkg/Universal/Variable/Pei/VariablePei.inf = | 5 +- MdeModulePkg/Universal/Variable/RuntimeDxe/Variable.h = | 7 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf = | 5 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableSmm.inf = | 5 +- MdeModulePkg/Universal/Variable/RuntimeDxe/VariableStandaloneMm.inf = | 5 +- OvmfPkg/AmdSev/AmdSevX64.dsc = | 1 + OvmfPkg/Bhyve/BhyveX64.dsc = | 1 + OvmfPkg/CloudHv/CloudHvX64.dsc = | 1 + OvmfPkg/IntelTdx/IntelTdxX64.dsc = | 1 + OvmfPkg/Microvm/MicrovmX64.dsc = | 1 + OvmfPkg/OvmfPkgIa32.dsc = | 1 + OvmfPkg/OvmfPkgIa32X64.dsc = | 1 + OvmfPkg/OvmfPkgX64.dsc = | 1 + OvmfPkg/OvmfXen.dsc = | 1 + UefiPayloadPkg/UefiPayloadPkg.dsc = | 1 + 37 files changed, 486 insertions(+), 94 deletions(-) create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar= iableFlashInfoLib.c create mode 100644 MdeModulePkg/Include/Guid/VariableFlashInfo.h create mode 100644 MdeModulePkg/Include/Library/VariableFlashInfoLib.h create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar= iableFlashInfoLib.inf create mode 100644 MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVar= iableFlashInfoLib.uni --=20 2.28.0.windows.1
|
|
Re: [PATCH v2] OvmfPkg/BhyveBhfPkg: add support for QemuFwCfg
Pedro Falcato
Is this a laptop? Things may not work there because video output is done through the Intel GPU, even when using the Nvidia GPU, although I'm not sure.
On Fri, Apr 8, 2022 at 6:49 PM Mario Marietto <marietto2008@...> wrote:
-- Pedro Falcato
|
|
Re: GSoC 2022: Add S3 resume support to MinPlatform
Benjamin Doron
Hi Nate,
Thanks! I've looked at the basics of I2C, but I've seen from the iGFX PRM that GMBUS implements some registers and error handling the NAKs differently, but I guess that I'll be dealing with that later. Yeah, I was thinking that if we wanted debug up as soon as possible, then the iGFX BAR and P2SB GPIOs would have to be programmed, so that sounds about right. Synchronising with the FSP's config is probably important too, but I suppose you implemented that/we'll see? For now, I have a proposal at https://docs.google.com/document/d/1CyyerMfPwvZxkBjfE_-H1OlkZPxH98uqpmb9tBAV_ps. Best regards, Benjamin
|
|
Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment
Michael D Kinney
Thanks JP.
toggle quoted messageShow quoted text
That makes sense. Bypass all the OS specific services in UEFI environment and generate UUID using time and random number. Reviewed-by: Michael D Kinney <michael.d.kinney@...> Mike
-----Original Message-----
|
|
[edk2-non-osi] [PATCH V2] ElkhartlakeSiliconBinPkg: Update EHL microcode
kokweich <kok.wei.chan@...>
Updated "production" microcode version m0190661_00000016
Signed-off-by: kokweich <kok.wei.chan@...> Cc: Nate DeSimone <nathaniel.l.desimone@...> Cc: Sai Chaganty <rangasai.v.chaganty@...> Cc: jinjhuli <jin.jhu.lim@...> --- .../Microcode/IntelMicrocodeLicense.txt | 8 ++++---- .../Microcode/MicrocodeUpdates.inf | 4 ++-- .../Microcode/m0190661_00000015.mcb | Bin 20480 -> 0 bytes .../Microcode/m0190661_00000016.mcb | Bin 0 -> 20480 bytes 4 files changed, 6 insertions(+), 6 deletions(-) delete mode 100644 Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb create mode 100644 Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt index 78536ba..cd2b6bc 100644 --- a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt +++ b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/IntelMicrocodeLicense.txt @@ -1,7 +1,7 @@ -Copyright (c) 2018 - 2021 Intel Corporation. -All rights reserved. - -Redistribution. +Copyright (c) 2018 - 2022 Intel Corporation. +All rights reserved. + +Redistribution. Redistribution and use in binary form, without modification, are permitted, provided that the following conditions are met: diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf index f99f0a5..2c03f79 100644 --- a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf +++ b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/MicrocodeUpdates.inf @@ -1,7 +1,7 @@ ### @file # Component information file for AcpiPlatform module # -# Copyright (c) 2019 - 2021, Intel Corporation. All rights reserved.<BR> +# Copyright (c) 2019 - 2022, Intel Corporation. All rights reserved.<BR> # # SPDX-License-Identifier: BSD-2-Clause-Patent # @@ -15,4 +15,4 @@ MODULE_TYPE = USER_DEFINED [Sources] - m0190661_00000015.mcb + m0190661_00000016.mcb diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000015.mcb deleted file mode 100644 index 06548466d37a06c1342c79f66f149d648dccf40e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 20480 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 diff --git a/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb b/Silicon/Intel/ElkhartlakeSiliconBinPkg/Microcode/m0190661_00000016.mcb new file mode 100644 index 0000000000000000000000000000000000000000..3a8b78a3938fa17a65aed11e2878980cd6cf204e GIT binary patch literal 20480 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
w2{`H{H;} zUMC8N9e<`wCD@xAN)8Z?kXk?Fx~ll;$K21lisueh`hEuUboaI&g;1gXAQKDhvNSBr zJ}cCqb@a-mBy!N=wAyt9!-iXnSlLB;9Ki2d6gTIu@2Y}Hvr6qqu^TnJ;ZUQ=tU}3U zTEf5B8wbium9E(w6QiO8C_De34uxkPJ{#1*7D=k&2<T!bjuAu8<b;!(w<<ZdoD<?+ z1D*-C1E;EFP)-g@&o_xv0^<<ZmNA^(qu<NECQ}<+{J+DBGFR~v&-1OgfXI^{I4lOP zwn`wOnmloCAyNuG^fWy<vvxdsqK0ZCLkD(pun}PI*K)~i_XJVi63Cq8FU@=pC^)42 zJ-c(^9r~@a2tX)X7csxq+evn37FsS``UAk^J1&%fd8$g>T)Y(L^`tSXeG1%7ORU-4 zw(pXP#fm8f3rlvc9dS_sgNwF>`Yl?2vWPiQk%7vMZK6^OfiCoXwa~z>y-pVd@U{YT z35+Ry*_FtZ?v_FUDr@i4>*1)l?)Fg`Kxt|XmcntwT2DWsK$|emnLDP0g@UxCbxlJH zfKWCT4H;H8`=5Uc6zc>@O88bkc<2_5QYJTE@zj6CCX8*K7onLayckz!a=Tm>%7L*G zItmg(;=#}yA0jCz0%_NB<RZ7@s!#h8B2b;}R<$KI`Q65ZE*v>-+>IDS0W}?@jE!V2 zzu~u3AxSC3O$W~_&a{@#;frGs+$78)reY#ompldbB<)*1Nc4tza4Z!0y%fAdmn=Zf zX8i*pMzh8^XrQjgi?JJG5SK8Nh&AUt-cDENDKd}R7oSN1yvZ|=bO%4!vmA$A{mZy= z0I^YaJlLSY!*hDnypmagf~J-7UK)D{>?h1|sm4%3&d<LKv0E2&nMnfTj!zMWLWq^i z6|%7hMWwz1`VeJXJSQL>cB+^f%O>&yWqV#{cGr-zdC+ZqJy>P^opu;Nl=0i|0{s9x z{?=ekBlBb%D&%fXe#!GrYK#URx^r2`KF+MOJZ8Q>KSax}9O??Jx8dS5vT#H3DvjW| zGNkWJGIj5ewMhVR?Epf?SZ2343eTn~pHC^GGnzTzc?!dSW!55VoGT-&_7WO~;L?1J z+N*5Re~tGa&hk12!vwytb}ARE*AL|~jMi+C*MJ7JWU;z2D;XE8^DBYEfrl4JbklF7 zh5QXYfI6C8U&U4zGPkaT%d2Z-d~!y4O;ZQPTUAH{ey1EO>L<8!B4Hs~-`YD{)Gz=| z=|h}Lww`sCzSOX+XSAE1ucAsq2%uMDT>NQj#1VqFI}lpzdD8+}HM3EmyD4WqP#x+D ziNs;{4wVy(BHRsRW>gZ&jlm2P>9W~JW^a#Tnr=j8C@F)Se@&c;MAWtV)Sj^ws@WLB z?=PjoR)<4tqYCQkkF4<v^YkeVW7c^=g9|zns^2c;#ONZlqs~bKo!gdU+13u%c0tQq zWh&sCEUXn_N2r`thumxXu<?ib24OZEct=*e+uu7q_OS+E5od*V&{M1{XR@*I(smFn zoM&9mLD+p5JY9LDXz^BI&%L`8ID^FP#5T&7{%}a+y#bZ7BNQ|RTv+~#$c(I8&kFql z1|D#}iDr;N0?Up|hAs^R{a6{OlZ4`k(uOgN%CmH(wg=(hHj#Bbu*3LrRj(G!AWL5( zq6T`S5CM!Y-Nz95_+C>rAqmp#t@4&h8j%z$=mwLh`I!CO&B)>|yo(A~QNY_2Z{2&^ zB!kH`0N^;b41*v@0R^J#PEH@EZhVTDsRTA1JTe4J5ey-o=ohAn1=sD_$Zfd3!gUF| zC`IHKHU8&ef1Odnk$X!WJ+y08A(*|7x9B}Cjm)SVxgG2UP{m+^939sLu(XbrmyFmG byB4RnsqA!TKd5=^3m)~EvF?I2upS}~hGlw| literal 0 HcmV?d00001 -- 2.33.0.windows.1
|
|
[PATCH] MdeModulePkg/dec: update the PcdCpuStackGuard property
Chen, Gang C
Update the PcdCpuStackGuard from PcdsFixedAtBuild to PcdsDynamicEx.
Meanwhile, remove the duplicate check for PcdCpuStackGuard for some limitation, which has been checked at the entry of InitializeMpExceptionStackSwitchHandlers. REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3897 Cc: Jian J Wang <jian.j.wang@...> Cc: Liming Gao <gaoliming@...> Cc: devel@edk2.groups.io Cc: Eric Dong <eric.dong@...> Cc: Ray Ni <ray.ni@...> Signed-off-by: Gang Chen <gang.c.chen@...> --- MdeModulePkg/MdeModulePkg.dec | 14 +++++++------- .../CpuExceptionHandlerLib/PeiCpuException.c | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/MdeModulePkg/MdeModulePkg.dec b/MdeModulePkg/MdeModulePkg.dec index 463e889e9a..72e7e2eced 100644 --- a/MdeModulePkg/MdeModulePkg.dec +++ b/MdeModulePkg/MdeModulePkg.dec @@ -1070,13 +1070,6 @@ # @Prompt The Heap Guard feature mask gEfiMdeModulePkgTokenSpaceGuid.PcdHeapGuardPropertyMask|0x0|UINT8|0x30001054 - ## Indicates if UEFI Stack Guard will be enabled. - # If enabled, stack overflow in UEFI can be caught, preventing chaotic consequences.<BR><BR> - # TRUE - UEFI Stack Guard will be enabled.<BR> - # FALSE - UEFI Stack Guard will be disabled.<BR> - # @Prompt Enable UEFI Stack Guard. - gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x30001055 - [PcdsFixedAtBuild, PcdsPatchableInModule] ## Dynamic type PCD can be registered callback function for Pcd setting action. # PcdMaxPeiPcdCallBackNumberPerPcdEntry indicates the maximum number of callback function @@ -2079,6 +2072,13 @@ # @Prompt Enable PCIe Resizable BAR Capability support. gEfiMdeModulePkgTokenSpaceGuid.PcdPcieResizableBarSupport|FALSE|BOOLEAN|0x10000024 + ## Indicates if UEFI Stack Guard will be enabled. + # If enabled, stack overflow in UEFI can be caught, preventing chaotic consequences.<BR><BR> + # TRUE - UEFI Stack Guard will be enabled.<BR> + # FALSE - UEFI Stack Guard will be disabled.<BR> + # @Prompt Enable UEFI Stack Guard. + gEfiMdeModulePkgTokenSpaceGuid.PcdCpuStackGuard|FALSE|BOOLEAN|0x00010025 + [PcdsPatchableInModule] ## Specify memory size with page number for PEI code when # Loading Module at Fixed Address feature is enabled. diff --git a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c index 687fc4177f..bcd4175ffa 100644 --- a/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c +++ b/UefiCpuPkg/Library/CpuExceptionHandlerLib/PeiCpuException.c @@ -254,7 +254,7 @@ InitializeCpuExceptionHandlersEx ( // // Initializing stack switch is only necessary for Stack Guard functionality. // - if (PcdGetBool (PcdCpuStackGuard) && (InitData != NULL)) { + if (InitData != NULL) { Status = ArchSetupExceptionStack (InitData); } } -- 2.35.1
|
|
Re: [PATCH v2] OvmfPkg/BhyveBhfPkg: add support for QemuFwCfg
Mario Marietto <marietto2008@...>
im trying to test the patch on my pc,that has two graphic cards,the intel coffee lake and the nvidia. i tried to start the pc from the nvidia card and ive configured the xorg.conf file giving the proper bus id value. in addition ive loaded the kernel.ko file from the boot loader.conf i have removed the intel and the drm drivers used by the Intel graphic card. unfortunately my pc wont boot from the nvidia card. my mouse and keyboard freezes just before the desktop manager (xfce and kde5) starts.
Il gio 7 apr 2022, 18:46 Rebecca Cran <rebecca@...> ha scritto: I've just looked at the patch and it looks good, though I haven't tested it.
|
|
Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment
Jayaprakash, N
+ Aaron
toggle quoted messageShow quoted text
Regards, JP
-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Jayaprakash, N Sent: 08 April 2022 22:12 To: Kinney, Michael D <michael.d.kinney@...>; devel@edk2.groups.io Subject: Re: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment The UUID generation is done through the random number generation & time unix time stamp features available through the built-in python modules 'random' and 'time' respectively. The random number & time (unix time stamp or epoch) based method of generating the UUID is already there in uuid.py module, with this patch request enabled this path to take effect for UEFI invocation of this module. There are some OS specific ways to generate the UUID's such as by using the libuuid on Linux kind of OS, windll.rpcrt4 library on windows. These will not work for UEFI and hence added appropriate platform check to ensure that this path is not taken for UEFI invocation. Besides this there are MAC address based algorithms available in uuid.py module. These algorism are based on reading MAC address through various OS supported methods such as ipconfig command processing, NetBIOS calls on Windows, using netstat command in Linux, lanscan in Unix, from arp - address resolution protocol in Linux, NetBSD and other flavours of Linux. These are currently not enabled for UEFI invocation of the uuid module. This has been done through platform check added at appropriate place in the uuid.py module code. Regards, JP -----Original Message----- From: Kinney, Michael D <michael.d.kinney@...> Sent: 08 April 2022 21:14 To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...> Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator? Can you add a description of the technique to the BZ and the commit message? Thanks, Mike -----Original Message-----
|
|
Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment
Jayaprakash, N
The UUID generation is done through the random number generation & time unix time stamp features available through the built-in python modules 'random' and 'time' respectively.
toggle quoted messageShow quoted text
The random number & time (unix time stamp or epoch) based method of generating the UUID is already there in uuid.py module, with this patch request enabled this path to take effect for UEFI invocation of this module. There are some OS specific ways to generate the UUID's such as by using the libuuid on Linux kind of OS, windll.rpcrt4 library on windows. These will not work for UEFI and hence added appropriate platform check to ensure that this path is not taken for UEFI invocation. Besides this there are MAC address based algorithms available in uuid.py module. These algorism are based on reading MAC address through various OS supported methods such as ipconfig command processing, NetBIOS calls on Windows, using netstat command in Linux, lanscan in Unix, from arp - address resolution protocol in Linux, NetBSD and other flavours of Linux. These are currently not enabled for UEFI invocation of the uuid module. This has been done through platform check added at appropriate place in the uuid.py module code. Regards, JP
-----Original Message-----
From: Kinney, Michael D <michael.d.kinney@...> Sent: 08 April 2022 21:14 To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...> Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator? Can you add a description of the technique to the BZ and the commit message? Thanks, Mike -----Original Message-----
|
|
[PATCH] ShellPkg: Update smbiosview type 41 with SMBIOS 3.5 fields
Bo Chang Ke
REF:https://bugzilla.tianocore.org/show_bug.cgi?id=3900
update smbiosview type 41 related fileds. Signed-off-by: Bo Chang Ke <bo-changx.ke@...> Cc: Dandan Bi <dandan.bi@...> Cc: Star Zeng <star.zeng@...> --- .../SmbiosView/QueryTable.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c index c4a6acb167..7ec6d2b5f1 100644 --- a/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c +++ b/ShellPkg/Library/UefiShellDebug1CommandsLib/SmbiosView/QueryTable.c @@ -1766,6 +1766,30 @@ TABLE_ITEM OnboardDeviceTypesTable[] = { 0x0A, L" Sas Controller" }, + { + 0x0B, + L" Wireless LAN" + }, + { + 0x0C, + L" Bluetooth" + }, + { + 0x0D, + L" WWAN" + }, + { + 0x0E, + L" embedded Multi-Media Controller" + }, + { + 0x0F, + L" NVMe Controller" + }, + { + 0x10, + L" UFS Controller" + } }; TABLE_ITEM SELTypesTable[] = { -- 2.32.0.windows.1
|
|
Re: [GSoC 2022] Introducing myself & seeking for project ideas
Hello Nate,
Thanks a lot for your answer ! I got myself a copy of "Beyond BIOS" to understand how UEFI works. The project sound very interesting, so if I understand correctly, OVMF only implements some of the services needed for QEMU support, porting what's present to MinPlatform and then improving it with the required services will result in QemuOpenBoardPkg, is that right? So the goal is to allow MinPlatform testing inside QEMU instead of getting a specific board supported by MinPlatform? I'll use the upcoming months to get up to pace with UEFI with the ressources you gave me 😄 Before starting to write my application I have a few questions, especially on the prerequisites, on the project page the only one listed is C knowledge, is anything else required or recommended ? In case I need to get up to pace with something specific :) And thanks for welcoming me in the project ! Best regards, Théo
|
|
Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment
Michael D Kinney
How is a UUID generated in UEFI env? Is there a dependency on MAC address or random number generator?
toggle quoted messageShow quoted text
Can you add a description of the technique to the BZ and the commit message? Thanks, Mike
-----Original Message-----
|
|
Re: Applying for GSoC 2022: Add Rust Support to EDK II
Hi Nate Thanks for the response. For the std implementation, I do have some idea how to go about implementing it now. The most important thing I realized is that most of the std isn't actually std. For example, std::collection, Vector, Box, Rc, etc are all actually part of alloc and not std. The things that really are part of std include threads, i/o, etc. I have taken a look at some other people's projects who have tried implementing libstd for other targets and it seems it is possible to write an implementation without libc. It's just very difficult since in most OS besides Linux, the syscall ABI is not stable enough and using libc is just easier and recommended. As for my earlier patches, Jiewen told me that edkii-rust branch is no longer maintained and that they are now using a different uefi rust implementation for their work. I did also find that it will be possible to make the std with stable Rust even though if internals use nightly, so that's cool. Some useful projects about writing libstd for new platform that I found are below: Ayush Singh
On Fri, 8 Apr, 2022, 2:33 am Desimone, Nathaniel L, <nathaniel.l.desimone@...> wrote: Hi Ayush,
|
|
Re: [PATCH v2 7/8] CryptoPkg/CrtLibSupport: fix strcpy
Yao, Jiewen
Can we remove inline keyword?
toggle quoted messageShow quoted text
I don't think it is really needed in EDKII project. Thank you Yao Jiewen
-----Original Message-----
|
|
Re: [PATCH v2 0/8] CryptoPkg updates for openssl 3.0
Yao, Jiewen
With inline keyword removed in patch-7/8,
toggle quoted messageShow quoted text
Series reviewed-by: Jiewen Yao <Jiewen.yao@...>
-----Original Message-----
|
|
[edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment
Jayaprakash, N
REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3899
This is commit contains the UEFI port of uuid.py module. Made necessary changes required to uuid.py module to support UEFI environment. Porting of this module to UEFI is required for open source tools such as Chipsec to function properly. Cc: Rebecca Cran <rebecca@...> Cc: Michael D Kinney <michael.d.kinney@...> Signed-off-by: Jayaprakash N <n.jayaprakash@...> --- .../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++--------- 1 file changed, 50 insertions(+), 44 deletions(-) diff --git a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py index db8b2ef..84ed0b8 100644 --- a/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py +++ b/AppPkg/Applications/Python/Python-3.6.8/Lib/uuid.py @@ -471,57 +471,61 @@ def _netbios_getnode(): continue return int.from_bytes(bytes, 'big') + # Thanks to Thomas Heller for ctypes and for his help with its use here. # If ctypes is available, use it to find system routines for UUID generation. # XXX This makes the module non-thread-safe! _uuid_generate_time = _UuidCreate = None -try: - import ctypes, ctypes.util - import sys - - # The uuid_generate_* routines are provided by libuuid on at least - # Linux and FreeBSD, and provided by libc on Mac OS X. - _libnames = ['uuid'] - if not sys.platform.startswith('win'): - _libnames.append('c') - for libname in _libnames: - try: - lib = ctypes.CDLL(ctypes.util.find_library(libname)) - except Exception: - continue - if hasattr(lib, 'uuid_generate_time'): - _uuid_generate_time = lib.uuid_generate_time - break - del _libnames - - # The uuid_generate_* functions are broken on MacOS X 10.5, as noted - # in issue #8621 the function generates the same sequence of values - # in the parent process and all children created using fork (unless - # those children use exec as well). - # - # Assume that the uuid_generate functions are broken from 10.5 onward, - # the test can be adjusted when a later version is fixed. - if sys.platform == 'darwin': - if int(os.uname().release.split('.')[0]) >= 9: - _uuid_generate_time = None - - # On Windows prior to 2000, UuidCreate gives a UUID containing the - # hardware address. On Windows 2000 and later, UuidCreate makes a - # random UUID and UuidCreateSequential gives a UUID containing the - # hardware address. These routines are provided by the RPC runtime. - # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last - # 6 bytes returned by UuidCreateSequential are fixed, they don't appear - # to bear any relationship to the MAC address of any network device - # on the box. +if os.name != 'edk2': + # This code is not meant to run on UEFI environment try: - lib = ctypes.windll.rpcrt4 + import ctypes, ctypes.util + import sys + + # The uuid_generate_* routines are provided by libuuid on at least + # Linux and FreeBSD, and provided by libc on Mac OS X. + _libnames = ['uuid'] + if not sys.platform.startswith('win'): + _libnames.append('c') + for libname in _libnames: + try: + lib = ctypes.CDLL(ctypes.util.find_library(libname)) + except Exception: + continue + if hasattr(lib, 'uuid_generate_time'): + _uuid_generate_time = lib.uuid_generate_time + break + del _libnames + + # The uuid_generate_* functions are broken on MacOS X 10.5, as noted + # in issue #8621 the function generates the same sequence of values + # in the parent process and all children created using fork (unless + # those children use exec as well). + # + # Assume that the uuid_generate functions are broken from 10.5 onward, + # the test can be adjusted when a later version is fixed. + if sys.platform == 'darwin': + if int(os.uname().release.split('.')[0]) >= 9: + _uuid_generate_time = None + + # On Windows prior to 2000, UuidCreate gives a UUID containing the + # hardware address. On Windows 2000 and later, UuidCreate makes a + # random UUID and UuidCreateSequential gives a UUID containing the + # hardware address. These routines are provided by the RPC runtime. + # NOTE: at least on Tim's WinXP Pro SP2 desktop box, while the last + # 6 bytes returned by UuidCreateSequential are fixed, they don't appear + # to bear any relationship to the MAC address of any network device + # on the box. + try: + lib = ctypes.windll.rpcrt4 + except: + lib = None + _UuidCreate = getattr(lib, 'UuidCreateSequential', + getattr(lib, 'UuidCreate', None)) except: - lib = None - _UuidCreate = getattr(lib, 'UuidCreateSequential', - getattr(lib, 'UuidCreate', None)) -except: - pass + pass + def _unixdll_getnode(): """Get the hardware address on Unix using ctypes.""" @@ -563,6 +567,8 @@ def getnode(): import sys if sys.platform == 'win32': getters = _NODE_GETTERS_WIN32 + elif sys.platform == 'uefi': + getters = [] else: getters = _NODE_GETTERS_UNIX -- 2.32.0.windows.2
|
|
[edk2-libc Patch 0/1] added support for uuid.py module for uefi environment
Jayaprakash, N
This patch contains the uuid.py updated module with the changes required to
support it working on uefi environment. Jayaprakash Nevara (1): AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment .../Python/Python-3.6.8/Lib/uuid.py | 94 ++++++++++--------- 1 file changed, 50 insertions(+), 44 deletions(-) -- 2.32.0.windows.2
|
|
Re: [PATCH 1/1] UEFI-SCT: SctPkg: Updated the check for monotonic count after restart
Hi Barton,
toggle quoted messageShow quoted text
Thank you for the review. Could you please upstream the patch. With Warm Regards, Edhay
-----Original Message-----IMPORTANT NOTICE: The contents of this email and any attachments are confidential and may also be privileged. If you are not the intended recipient, please notify the sender immediately and do not disclose the contents to any other person, use it for any purpose, or store or copy the information in any medium. Thank you.
|
|
Re: [staging/LoongArch RESEND PATCH v1 25/33] MdePkg/BaseCpuLib: LoongArch Base CPU library implementation.
Recently there is a work to migrate UefiCpuLib to CpuLib (patch attached), you may want to sync up your changes with that patch set. RISC-V will do the same work later.
toggle quoted messageShow quoted text
Thanks Abner
-----Original Message-----
|
|
Re: [staging/LoongArch RESEND PATCH v1 32/33] BaseTools: Add LoongArch64 binding.
toggle quoted messageShow quoted text
-----Original Message-----Please remove the leading "__" and keep only one trailing "_". Abner +
|
|