Date   

[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:
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.

So yes, please add:


Acked-by: Rebecca Cran <rebecca@...>


On 4/6/22 23:24, Corvin Köhne wrote:
> Hi Peter and Rebecca,
>
> thanks for your feedback. This patch is backward compatible. It checks
> if QemuFwCfg is available and if QemuFwCfg is missing it falls
> back to BhyveFwCtl.
>
> So, should I add Reviewed-by (or Acked-by?) Peter and Rebecca to the
> commit message?
>
>
> Thanks
> Corvin
>
> Beckhoff Automation GmbH & Co. KG | Managing Director: Dipl. Phys. Hans Beckhoff
> Registered office: Verl, Germany | Register court: Guetersloh HRA 7075
>
>
>



--
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.

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-----
From: Jayaprakash, N <n.jayaprakash@...>
Sent: Friday, April 8, 2022 10:19 AM
To: devel@edk2.groups.io; Jayaprakash, N <n.jayaprakash@...>; Kinney, Michael D <michael.d.kinney@...>
Cc: Frinzell, Aaron <aaron.frinzell@...>
Subject: RE: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

+ Aaron

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-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

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-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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
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.

So yes, please add:


Acked-by: Rebecca Cran <rebecca@...>


On 4/6/22 23:24, Corvin Köhne wrote:
> Hi Peter and Rebecca,
>
> thanks for your feedback. This patch is backward compatible. It checks
> if QemuFwCfg is available and if QemuFwCfg is missing it falls
> back to BhyveFwCtl.
>
> So, should I add Reviewed-by (or Acked-by?) Peter and Rebecca to the
> commit message?
>
>
> Thanks
> Corvin
>
> Beckhoff Automation GmbH & Co. KG | Managing Director: Dipl. Phys. Hans Beckhoff
> Registered office: Verl, Germany | Register court: Guetersloh HRA 7075
>
>
>


Re: [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI environment

Jayaprakash, N
 

+ Aaron

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-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

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





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.
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-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of
Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1]
AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for
UEFI environment

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





[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

Théo Jehl
 

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?

Can you add a description of the technique to the BZ and the commit message?

Thanks,

Mike

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Jayaprakash, N
Sent: Friday, April 8, 2022 4:52 AM
To: devel@edk2.groups.io
Subject: [edk2-devel] [edk2-libc Patch 1/1] AppPkg\Applications\Python\Python-3.6.8\Lib: uuid.py module port for UEFI
environment

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





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,

Great to meet you and welcome to the TianoCore project! Great to hear you are interested! Apologize for the tardiness in my response. Implementing Rust support sounds like a wonderful project and one that would really help advance the state of the art for UEFI firmware development! I am looking for someone with Rust experience that can help mentor this project. My usage of Rust at time of writing has not advanced very far beyond "Hello World." While I can give a great deal of knowledge and background on UEFI and EDK II, my ability to recommend how that be applied to a Rust binding is limited. However, I do know enough to suspect the vast majority of the work will be figuring out how to integrate the vast array of libraries that EDK II provides into a coherent and clean Rust binding. The one aspect of this project that I think will be interesting is figuring out is what to do about std:: in Rust. From what I have seen of the functionality there more or less assumes the existence of a libc implementation for the platform, which is not necessarily true for DXE and is absolutely not true for PEI. I would be interested in hearing your thought on how to handle that elegantly.

I'm sorry that your patches haven't gotten much attention thus far. Once I find mentor(s) for the Rust project I'll make sure they pick those up and take a look at the work you have done thus far.

Hope this helps and welcome to the project!

With Best Regards,
Nate

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Ayush Singh
Sent: Monday, April 4, 2022 10:18 AM
To: devel@edk2.groups.io
Cc: Bret.Barkelew@...; Desimone, Nathaniel L <nathaniel.l.desimone@...>; mhaeuser@...
Subject: [edk2-devel] Applying for GSoC 2022: Add Rust Support to EDK II

Hello everyone, I am a 2nd-year University Student from India. I am interested in applying for adding Rust support to EDK2. I have already introduced myself to the mailing list earlier
(https://edk2.groups.io/g/devel/message/87637) and have even submitted some patches for the edkii-rust branch in edk2-staging (which were not merged since that branch seems to be abandoned now).
- https://edk2.groups.io/g/devel/message/87753
- https://edk2.groups.io/g/devel/message/87754
- https://edk2.groups.io/g/devel/message/87755
- https://edk2.groups.io/g/devel/message/87756

Anyway, since no mentor has been listed for this project, I was wondering who should I discuss the proposal with? Normally, I think one is supposed to discuss the proposal details with a mentor in form of a google doc or something before submitting an application. So should I directly start by submitting a proposal through the GSoC application portal? Or is there someone I should contact first?

Ayush Singh






Re: [PATCH v2 7/8] CryptoPkg/CrtLibSupport: fix strcpy

Yao, Jiewen
 

Can we remove inline keyword?

I don't think it is really needed in EDKII project.

Thank you
Yao Jiewen

-----Original Message-----
From: Gerd Hoffmann <kraxel@...>
Sent: Friday, April 8, 2022 7:16 PM
To: devel@edk2.groups.io
Cc: Oliver Steffen <osteffen@...>; Yao, Jiewen
<jiewen.yao@...>; Jiang, Guomin <guomin.jiang@...>; Wang, Jian
J <jian.j.wang@...>; Xiaoyu Lu <xiaoyux.lu@...>; Pawel Polawski
<ppolawsk@...>; Gerd Hoffmann <kraxel@...>
Subject: [PATCH v2 7/8] CryptoPkg/CrtLibSupport: fix strcpy

strcpy() returns a pointer to the destination string, AsciiStrCpyS()
does not. So a simple #define does not work. Create a inline function
instead.

Signed-off-by: Gerd Hoffmann <kraxel@...>
---
CryptoPkg/Library/Include/CrtLibSupport.h | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/CryptoPkg/Library/Include/CrtLibSupport.h
b/CryptoPkg/Library/Include/CrtLibSupport.h
index 287d7f76bfb3..7c1bc7755b1c 100644
--- a/CryptoPkg/Library/Include/CrtLibSupport.h
+++ b/CryptoPkg/Library/Include/CrtLibSupport.h
@@ -395,6 +395,16 @@ inet_pton (
void *
);

+static inline char *
+strcpy (
+ char *restrict strDest,
+ const char *strSource
+ )
+{
+ AsciiStrCpyS (strDest, MAX_STRING_SIZE, strSource);
+ return strDest;
+}
+
//
// Macros that directly map functions to BaseLib, BaseMemoryLib, and
DebugLib functions
//
@@ -404,7 +414,6 @@ inet_pton (
#define memcmp(buf1, buf2, count)
(int)(CompareMem(buf1,buf2,(UINTN)(count)))
#define memmove(dest, source, count)
CopyMem(dest,source,(UINTN)(count))
#define strlen(str) (size_t)(AsciiStrnLenS(str,MAX_STRING_SIZE))
-#define strcpy(strDest, strSource)
AsciiStrCpyS(strDest,MAX_STRING_SIZE,strSource)
#define strncpy(strDest, strSource, count)
AsciiStrnCpyS(strDest,MAX_STRING_SIZE,strSource,(UINTN)count)
#define strcat(strDest, strSource)
AsciiStrCatS(strDest,MAX_STRING_SIZE,strSource)
#define strncmp(string1, string2, count)
(int)(AsciiStrnCmp(string1,string2,(UINTN)(count)))
--
2.35.1


Re: [PATCH v2 0/8] CryptoPkg updates for openssl 3.0

Yao, Jiewen
 

With inline keyword removed in patch-7/8,
Series reviewed-by: Jiewen Yao <Jiewen.yao@...>

-----Original Message-----
From: Gerd Hoffmann <kraxel@...>
Sent: Friday, April 8, 2022 7:16 PM
To: devel@edk2.groups.io
Cc: Oliver Steffen <osteffen@...>; Yao, Jiewen
<jiewen.yao@...>; Jiang, Guomin <guomin.jiang@...>; Wang, Jian
J <jian.j.wang@...>; Xiaoyu Lu <xiaoyux.lu@...>; Pawel Polawski
<ppolawsk@...>; Gerd Hoffmann <kraxel@...>
Subject: [PATCH v2 0/8] CryptoPkg updates for openssl 3.0

First batch of patches which update CrtLibSupport so it has everything
needed to build openssl3. Also a testcase update for openssl3.

This does not update the openssl submodule, that'll happen in a
followup patch series.

v2:
- rebase to latest master.
- add codestyle exception for fcntl.h.

Gerd Hoffmann (8):
CryptoPkg/CrtLibSupport: add fcntl.h
CryptoPkg/CrtLibSupport: add strstr()
CryptoPkg/CrtLibSupport: add INT_MIN
CryptoPkg/CrtLibSupport: add UINT_MAX
CryptoPkg/CrtLibSupport: add MODULESDIR
CryptoPkg/CrtLibSupport: add off_t
CryptoPkg/CrtLibSupport: fix strcpy
CryptoPkg/UnitTest: fix DH testcase

CryptoPkg/Library/Include/CrtLibSupport.h | 16 +++++++++++++++-
CryptoPkg/Library/Include/fcntl.h | 9 +++++++++
.../Test/UnitTest/Library/BaseCryptLib/DhTests.c | 6 +++---
CryptoPkg/CryptoPkg.ci.yaml | 1 +
4 files changed, 28 insertions(+), 4 deletions(-)
create mode 100644 CryptoPkg/Library/Include/fcntl.h

--
2.35.1


[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

G Edhaya Chandran
 

Hi Barton,

Thank you for the review.
Could you please upstream the patch.

With Warm Regards,
Edhay

-----Original Message-----
From: Gao Jie <gaojie@...>
Sent: 08 April 2022 12:03
To: devel@edk2.groups.io; G Edhaya Chandran <Edhaya.Chandran@...>
Subject: 回复: [edk2-devel] [PATCH 1/1] UEFI-SCT: SctPkg: Updated the check
for monotonic count after restart

Hi Eday,

The patch looks good to me.

Reviewed-by: Barton Gao <gaojie@...>

Thanks
Barton

-----邮件原件-----
发件人: devel@edk2.groups.io <devel@edk2.groups.io> 代表 G Edhaya
Chandran
发送时间: 2022年3月3日 16:59
收件人: devel@edk2.groups.io
主题: [edk2-devel] [PATCH 1/1] UEFI-SCT: SctPkg: Updated the check for
monotonic count after restart

Updated the check for montonic count in the case of after restart

From the UEFI Spec:
"The platform’s monotonic counter is comprised of two parts: the high 32 bits
and the low 32 bits.
The low 32-bit value is volatile and is reset to zero on every system reset.
It is increased by 1 on every call to GetNextMonotonicCount().
The high 32-bit value is nonvolatile and is increased by one on whenever the
system resets or the low 32-bit counter overflows."

It was found in one case where the higher 32-bit increased by 2 presumably
due to the overflow of lower 32-bit counter.
Update the logic to handle this case and to print a warning.

Please find more details in the ticket:
https://bugzilla.tianocore.org/show_bug.cgi?id=2774

Cc: Barton Gao <gaojie@...>
Cc: Carolyn Gjertsen <Carolyn.Gjertsen@...>
Cc: Heinrich Schuchardt <heinrich.schuchardt@...>
Cc: Samer El-Haj-Mahmoud <samer.el-haj-mahmoud@...>

Signed-off-by: G Edhaya Chandran<edhaya.chandran@...>
---
.../MiscBootServicesBBTestFunction.c | 20 +++++++++++++------
1 file changed, 14 insertions(+), 6 deletions(-)

diff --git a/uefi-
sct/SctPkg/TestCase/UEFI/EFI/BootServices/MiscBootServices/BlackBoxTest/Mi
scBootServicesBBTestFunction.c b/uefi-
sct/SctPkg/TestCase/UEFI/EFI/BootServices/MiscBootServices/BlackBoxTest/Mi
scBootServicesBBTestFunction.c
index 5d631c16d58b..12703d46f98c 100644
--- a/uefi-
sct/SctPkg/TestCase/UEFI/EFI/BootServices/MiscBootServices/BlackBoxTest/Mi
scBootServicesBBTestFunction.c
+++ b/uefi-sct/SctPkg/TestCase/UEFI/EFI/BootServices/MiscBootServices/Bl
+++ ackBoxTest/MiscBootServicesBBTestFunction.c
@@ -1707,12 +1707,20 @@ GetNextMonotonicCountStep2:
TplArray[Index]
);

- if (SctRShiftU64 (Count2, 32) == SctRShiftU64 (Count, 32) + 1) {
- AssertionType = EFI_TEST_ASSERTION_PASSED;
- } else {
- AssertionType = EFI_TEST_ASSERTION_FAILED;
- }
- StandardLib->RecordAssertion (
+ //The new count of upper 32 bits must be atleast 1 more than the old count.
+ //Pass case: new count is equal to old count + 1
+ if (SctRShiftU64 (Count2, 32) <= SctRShiftU64 (Count, 32)) {
+ AssertionType = EFI_TEST_ASSERTION_FAILED;
+ } else {
+ //If new count is more that old count + 1, then print warning.
+ if (SctRShiftU64 (Count2, 32) > SctRShiftU64 (Count, 32) + 1) {
+ AssertionType = EFI_TEST_ASSERTION_WARNING;
+ } else {
+ //new count == old count + 1
+ AssertionType = EFI_TEST_ASSERTION_PASSED;
+ }
+ }
+ StandardLib->RecordAssertion (
StandardLib,
AssertionType,
Index==0? \
--
2.17.1






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.

Abner Chang
 

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.

Thanks
Abner

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chao Li
Sent: Wednesday, February 9, 2022 2:56 PM
To: devel@edk2.groups.io
Cc: Michael D Kinney <michael.d.kinney@...>; Liming Gao
<gaoliming@...>; Zhiguang Liu <zhiguang.liu@...>
Subject: [edk2-devel] [staging/LoongArch RESEND PATCH v1 25/33]
MdePkg/BaseCpuLib: LoongArch Base CPU library implementation.

Implement LoongArch CPU related functions in BaseCpuLib.

Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Liming Gao <gaoliming@...>
Cc: Zhiguang Liu <zhiguang.liu@...>

Signed-off-by: Chao Li <lichao@...>
---
MdePkg/Library/BaseCpuLib/BaseCpuLib.inf | 7 ++++++-
MdePkg/Library/BaseCpuLib/BaseCpuLib.uni | 5 +++--
MdePkg/Library/BaseCpuLib/LoongArch/CpuFlushTlb.S | 15
+++++++++++++++
MdePkg/Library/BaseCpuLib/LoongArch/CpuSleep.S | 15
+++++++++++++++
4 files changed, 39 insertions(+), 3 deletions(-)
create mode 100644 MdePkg/Library/BaseCpuLib/LoongArch/CpuFlushTlb.S
create mode 100644 MdePkg/Library/BaseCpuLib/LoongArch/CpuSleep.S

diff --git a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
index 950f5229b2..3101fc656e 100644
--- a/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
+++ b/MdePkg/Library/BaseCpuLib/BaseCpuLib.inf
@@ -8,6 +8,7 @@
# Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
# Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights
reserved.<BR>
+# Portions Copyright (c) 2022, Loongson Technology Corporation Limited. All
rights reserved.<BR>
#
# SPDX-License-Identifier: BSD-2-Clause-Patent
#
@@ -25,7 +26,7 @@


#
-# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64
+# VALID_ARCHITECTURES = IA32 X64 EBC ARM AARCH64 RISCV64
LOONGARCH64
#

[Sources.IA32]
@@ -63,6 +64,10 @@
[Sources.RISCV64]
RiscV/Cpu.S

+[Sources.LOONGARCH64]
+ LoongArch/CpuFlushTlb.S | GCC
+ LoongArch/CpuSleep.S | GCC
+
[Packages]
MdePkg/MdePkg.dec

diff --git a/MdePkg/Library/BaseCpuLib/BaseCpuLib.uni
b/MdePkg/Library/BaseCpuLib/BaseCpuLib.uni
index 80dc495786..7c5c8dfb37 100644
--- a/MdePkg/Library/BaseCpuLib/BaseCpuLib.uni
+++ b/MdePkg/Library/BaseCpuLib/BaseCpuLib.uni
@@ -1,13 +1,14 @@
// /** @file
// Instance of CPU Library for various architecture.
//
-// CPU Library implemented using ASM functions for IA-32, X64 and RISCV64,
+// CPU Library implemented using ASM functions for IA-32, X64, RISCV64
and LoongArch64,
// PAL CALLs for IPF, and empty functions for EBC.
//
// Copyright (c) 2007 - 2014, Intel Corporation. All rights reserved.<BR>
// Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
// Portions copyright (c) 2011 - 2013, ARM Ltd. All rights reserved.<BR>
// Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights
reserved.<BR>
+// Portions Copyright (c) 2022, Loongson Technology Corporation Limited.
All rights reserved.<BR>
//
// SPDX-License-Identifier: BSD-2-Clause-Patent
//
@@ -16,5 +17,5 @@

#string STR_MODULE_ABSTRACT #language en-US "Instance of CPU
Library for various architectures"

-#string STR_MODULE_DESCRIPTION #language en-US "CPU Library
implemented using ASM functions for IA-32, X64 and RISCV64, PAL CALLs for
IPF, and empty functions for EBC."
+#string STR_MODULE_DESCRIPTION #language en-US "CPU Library
implemented using ASM functions for IA-32, X64, RISCV64 and LoongArch64,
PAL CALLs for IPF, and empty functions for EBC."

diff --git a/MdePkg/Library/BaseCpuLib/LoongArch/CpuFlushTlb.S
b/MdePkg/Library/BaseCpuLib/LoongArch/CpuFlushTlb.S
new file mode 100644
index 0000000000..8b792f0a37
--- /dev/null
+++ b/MdePkg/Library/BaseCpuLib/LoongArch/CpuFlushTlb.S
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+#
+# CpuFlushTlb() for LoongArch64
+#
+# Copyright (c) 2022, Loongson Technology Corporation Limited. All rights
reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#------------------------------------------------------------------------------
+ASM_GLOBAL ASM_PFX(CpuFlushTlb)
+
+ASM_PFX(CpuFlushTlb):
+ tlbflush
+ jirl $zero, $ra, 0
+ .end
diff --git a/MdePkg/Library/BaseCpuLib/LoongArch/CpuSleep.S
b/MdePkg/Library/BaseCpuLib/LoongArch/CpuSleep.S
new file mode 100644
index 0000000000..eb31b10714
--- /dev/null
+++ b/MdePkg/Library/BaseCpuLib/LoongArch/CpuSleep.S
@@ -0,0 +1,15 @@
+#------------------------------------------------------------------------------
+#
+# CpuSleep() for LoongArch64
+#
+# Copyright (c) 2022, Loongson Technology Corporation Limited. All rights
reserved.<BR>
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+#------------------------------------------------------------------------------
+ASM_GLOBAL ASM_PFX(CpuSleep)
+
+ASM_PFX(CpuSleep):
+ idle 0
+ jirl $zero, $ra, 0
+ .end
--
2.27.0





Re: [staging/LoongArch RESEND PATCH v1 32/33] BaseTools: Add LoongArch64 binding.

Abner Chang
 

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Chao Li
Sent: Wednesday, February 9, 2022 4:02 PM
To: devel@edk2.groups.io
Cc: Bob Feng <bob.c.feng@...>; Liming Gao
<gaoliming@...>; Yuwei Chen <yuwei.chen@...>; Baoqi
Zhang <zhangbaoqi@...>
Subject: [edk2-devel] [staging/LoongArch RESEND PATCH v1 32/33]
BaseTools: Add LoongArch64 binding.

Add LoongArch64 ProcessorBin.h and add LoongArch to Makefiles.

Cc: Bob Feng <bob.c.feng@...>
Cc: Liming Gao <gaoliming@...>
Cc: Yuwei Chen <yuwei.chen@...>

Signed-off-by: Chao Li <lichao@...>
Co-authored-by: Baoqi Zhang <zhangbaoqi@...>
---
BaseTools/Source/C/GNUmakefile | 3 +
.../C/Include/LoongArch64/ProcessorBind.h | 80 +++++++++++++++++++
2 files changed, 83 insertions(+)
create mode 100644
BaseTools/Source/C/Include/LoongArch64/ProcessorBind.h

diff --git a/BaseTools/Source/C/GNUmakefile
b/BaseTools/Source/C/GNUmakefile
index 8c191e0c38..5275f657ef 100644
--- a/BaseTools/Source/C/GNUmakefile
+++ b/BaseTools/Source/C/GNUmakefile
@@ -29,6 +29,9 @@ ifndef HOST_ARCH
ifneq (,$(findstring riscv64,$(uname_m)))
HOST_ARCH=RISCV64
endif
+ ifneq (,$(findstring loongarch64,$(uname_m)))
+ HOST_ARCH=LOONGARCH64
+ endif
ifndef HOST_ARCH
$(info Could not detected HOST_ARCH from uname results)
$(error HOST_ARCH is not defined!)
diff --git a/BaseTools/Source/C/Include/LoongArch64/ProcessorBind.h
b/BaseTools/Source/C/Include/LoongArch64/ProcessorBind.h
new file mode 100644
index 0000000000..84c6b8ea7a
--- /dev/null
+++ b/BaseTools/Source/C/Include/LoongArch64/ProcessorBind.h
@@ -0,0 +1,80 @@
+/** @file
+ Processor or Compiler specific defines and types for LoongArch
+
+ Copyright (c) 2022, Loongson Technology Corporation Limited. All rights
reserved.<BR>
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+#ifndef __PROCESSOR_BIND_H__
+#define __PROCESSOR_BIND_H__
Please remove the leading "__" and keep only one trailing "_".

Abner
+
+//
+// Define the processor type so other code can make processor based
choices
+//
+#define MDE_CPU_LOONGARCH64
+
+#define EFIAPI
+
+//
+// Make sure we are using the correct packing rules per EFI specification
+//
+#ifndef __GNUC__
+#pragma pack()
+#endif
+
+//
+// Use ANSI C 2000 stdint.h integer width declarations
+//
+#include <stdint.h>
+typedef uint8_t BOOLEAN;
+typedef int8_t INT8;
+typedef uint8_t UINT8;
+typedef int16_t INT16;
+typedef uint16_t UINT16;
+typedef int32_t INT32;
+typedef uint32_t UINT32;
+typedef int64_t INT64;
+typedef uint64_t UINT64;
+typedef char CHAR8;
+typedef uint16_t CHAR16;
+
+//
+// Signed value of native width. (4 bytes on supported 32-bit processor
instructions,
+// 8 bytes on supported 64-bit processor instructions)
+//
+typedef INT64 INTN;
+
+//
+// Unsigned value of native width. (4 bytes on supported 32-bit processor
instructions,
+// 8 bytes on supported 64-bit processor instructions)
+//
+typedef UINT64 UINTN;
+
+//
+// Processor specific defines
+//
+
+//
+// A value of native width with the highest bit set.
+//
+#define MAX_BIT 0x8000000000000000ULL
+//
+// A value of native width with the two highest bits set.
+//
+#define MAX_2_BITS 0xC000000000000000ULL
+
+#if defined(__GNUC__)
+ //
+ // For GNU assembly code, .global or .globl can declare global symbols.
+ // Define this macro to unify the usage.
+ //
+ #define ASM_GLOBAL .globl
+#endif
+
+//
+// The stack alignment required for LoongArch
+//
+#define CPU_STACK_ALIGNMENT 16
+
+#endif
--
2.27.0




3661 - 3680 of 92219