* [edk2-platforms][PATCH V1 1/4] Platform/Loongson: add bootmode support. [not found] <cover.1672801654.git.lixianglai@loongson.cn> @ 2023-01-04 3:10 ` xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 2/4] Platform/Loongson:add nvme device driver for loongarch xianglai ` (2 subsequent siblings) 3 siblings, 0 replies; 6+ messages in thread From: xianglai @ 2023-01-04 3:10 UTC (permalink / raw) To: devel Cc: Bibo Mao, Ard Biesheuvel, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney From: Bibo Mao <maobibo@loongson.cn> add bootmode support in PEI phase. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Bibo Mao <maobibo@loongson.cn> Cc: Chao Li <lichao@loongson.cn> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: xianglai li <lixianglai@loongson.cn> --- Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c index 32b6518f8f..84bb8e8a6d 100644 --- a/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c +++ b/Platform/Loongson/LoongArchQemuPkg/PlatformPei/Platform.c @@ -53,6 +53,8 @@ CONST EFI_PEI_PPI_DESCRIPTOR mPpiListBootMode = { NULL }; +STATIC EFI_BOOT_MODE mBootMode = BOOT_WITH_FULL_CONFIGURATION; + /** Create Reserved type memory range hand off block. @@ -417,6 +419,9 @@ InitializePlatform ( DEBUG ((DEBUG_INFO, "Platform PEIM Loaded\n")); + Status = PeiServicesSetBootMode (mBootMode); + ASSERT_EFI_ERROR (Status); + Status = PeiServicesInstallPpi (&mPpiListBootMode); ASSERT_EFI_ERROR (Status); -- 2.31.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [edk2-platforms][PATCH V1 2/4] Platform/Loongson:add nvme device driver for loongarch. [not found] <cover.1672801654.git.lixianglai@loongson.cn> 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 1/4] Platform/Loongson: add bootmode support xianglai @ 2023-01-04 3:10 ` xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash " xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation xianglai 3 siblings, 0 replies; 6+ messages in thread From: xianglai @ 2023-01-04 3:10 UTC (permalink / raw) To: devel Cc: Bibo Mao, Ard Biesheuvel, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney From: Bibo Mao <maobibo@loongson.cn> add nvme device driver support loongarch qemu virt machine. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Bibo Mao <maobibo@loongson.cn> Cc: Chao Li <lichao@loongson.cn> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: Bibo Mao <maobibo@loongson.cn> Signed-off-by: xianglai li <lixianglai@loongson.cn> --- Platform/Loongson/LoongArchQemuPkg/Loongson.dsc | 5 +++++ Platform/Loongson/LoongArchQemuPkg/Loongson.fdf | 5 +++++ 2 files changed, 10 insertions(+) diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc index 2d63f7d168..a9b5c8c514 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc @@ -550,6 +550,11 @@ MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf + # + # NVME Driver + # + MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf + # # SMBIOS Support # diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf index 784f255910..ee89097344 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf @@ -180,6 +180,11 @@ INF OvmfPkg/SataControllerDxe/SataControllerDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf +# +# NVME +# +INF MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpressDxe.inf + # # Usb Support # -- 2.31.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash for loongarch. [not found] <cover.1672801654.git.lixianglai@loongson.cn> 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 1/4] Platform/Loongson: add bootmode support xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 2/4] Platform/Loongson:add nvme device driver for loongarch xianglai @ 2023-01-04 3:10 ` xianglai 2023-01-04 3:57 ` maobibo 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation xianglai 3 siblings, 1 reply; 6+ messages in thread From: xianglai @ 2023-01-04 3:10 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Bibo Mao, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney Add pflash driver for loongarch. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Bibo Mao <maobibo@loongson.cn> Cc: Chao Li <lichao@loongson.cn> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: xianglai li <lixianglai@loongson.cn> --- .../Library/NorFlashQemuLib/NorFlashQemuLib.c | 138 ++++++++++++++++++ .../NorFlashQemuLib/NorFlashQemuLib.inf | 43 ++++++ .../Loongson/LoongArchQemuPkg/Loongson.dsc | 19 ++- .../Loongson/LoongArchQemuPkg/Loongson.fdf | 4 +- .../LoongArchQemuPkg/VarStore.fdf.inc | 67 +++++++++ 5 files changed, 260 insertions(+), 11 deletions(-) create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf create mode 100644 Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c new file mode 100644 index 0000000000..2565e5ae70 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c @@ -0,0 +1,138 @@ +/** @file + + Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> + + SPDX-License-Identifier: BSD-2-Clause-Patent + +**/ + + +#include <Library/BaseLib.h> +#include <Library/DebugLib.h> +#include <Library/UefiBootServicesTableLib.h> +#include <Library/VirtNorFlashPlatformLib.h> + +#include <Protocol/FdtClient.h> + +#define QEMU_NOR_BLOCK_SIZE SIZE_128KB + +#define MAX_FLASH_BANKS 1 + +EFI_STATUS +VirtNorFlashPlatformInitialization ( + VOID + ) +{ + return EFI_SUCCESS; +} + +STATIC VIRT_NOR_FLASH_DESCRIPTION mNorFlashDevices[MAX_FLASH_BANKS]; + +EFI_STATUS +VirtNorFlashPlatformGetDevices ( + OUT VIRT_NOR_FLASH_DESCRIPTION **NorFlashDescriptions, + OUT UINT32 *Count + ) +{ + FDT_CLIENT_PROTOCOL *FdtClient; + INT32 Node; + EFI_STATUS Status; + EFI_STATUS FindNodeStatus; + CONST UINT32 *Reg; + UINT32 PropSize; + UINT32 Num; + UINT64 Base; + UINT64 Size; + + Status = gBS->LocateProtocol ( + &gFdtClientProtocolGuid, + NULL, + (VOID **)&FdtClient + ); + ASSERT_EFI_ERROR (Status); + + Num = 0; + for (FindNodeStatus = FdtClient->FindCompatibleNode ( + FdtClient, + "cfi-flash", + &Node + ); + !EFI_ERROR (FindNodeStatus) && Num < MAX_FLASH_BANKS; + FindNodeStatus = FdtClient->FindNextCompatibleNode ( + FdtClient, + "cfi-flash", + Node, + &Node + )) + { + Status = FdtClient->GetNodeProperty ( + FdtClient, + Node, + "reg", + (CONST VOID **)&Reg, + &PropSize + ); + if (EFI_ERROR (Status)) { + DEBUG (( + DEBUG_ERROR, + "%a: GetNodeProperty () failed (Status == %r)\n", + __FUNCTION__, + Status + )); + continue; + } + + ASSERT ((PropSize % (4 * sizeof (UINT32))) == 0); + + while (PropSize >= (4 * sizeof (UINT32)) && Num < MAX_FLASH_BANKS) { + Base = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[0])); + Size = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[2])); + Reg += 4; + + PropSize -= 4 * sizeof (UINT32); + + mNorFlashDevices[Num].DeviceBaseAddress = (UINTN)Base; + mNorFlashDevices[Num].RegionBaseAddress = (UINTN)Base; + mNorFlashDevices[Num].Size = (UINTN)Size; + mNorFlashDevices[Num].BlockSize = QEMU_NOR_BLOCK_SIZE; + Num++; + } + + Status = PcdSet32S (PcdFlashNvStorageVariableBase, Base); + ASSERT_EFI_ERROR (Status); + + Base += PcdGet32 (PcdFlashNvStorageVariableSize); + Status = PcdSet32S (PcdFlashNvStorageFtwWorkingBase, Base); + ASSERT_EFI_ERROR (Status); + + Base += PcdGet32 (PcdFlashNvStorageFtwWorkingSize); + Status = PcdSet32S (PcdFlashNvStorageFtwSpareBase, Base); + ASSERT_EFI_ERROR (Status); + + // + // UEFI takes ownership of the NOR flash, and exposes its functionality + // through the UEFI Runtime Services GetVariable, SetVariable, etc. This + // means we need to disable it in the device tree to prevent the OS from + // attaching its device driver as well. + // Note that this also hides other flash banks, but the only other flash + // bank we expect to encounter is the one that carries the UEFI executable + // code, which is not intended to be guest updatable, and is usually backed + // in a readonly manner by QEMU anyway. + // + Status = FdtClient->SetNodeProperty ( + FdtClient, + Node, + "status", + "disabled", + sizeof ("disabled") + ); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "Failed to set NOR flash status to 'disabled'\n")); + } + } + + *NorFlashDescriptions = mNorFlashDevices; + *Count = Num; + + return EFI_SUCCESS; +} diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf new file mode 100644 index 0000000000..da05ca0898 --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf @@ -0,0 +1,43 @@ +## @file +# +# Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = NorFlashQemuLib + FILE_GUID = 339B7829-4C5F-4EFC-B2DD-5050E530DECE + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + LIBRARY_CLASS = VirtNorFlashPlatformLib + +[Sources.common] + NorFlashQemuLib.c + +[Packages] + MdePkg/MdePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + OvmfPkg/OvmfPkg.dec + MdeModulePkg/MdeModulePkg.dec + +[LibraryClasses] + BaseLib + DebugLib + UefiBootServicesTableLib + +[Protocols] + gFdtClientProtocolGuid ## CONSUMES + +[Depex] + gFdtClientProtocolGuid + +[Pcd] +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc index a9b5c8c514..650042662d 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc @@ -175,6 +175,7 @@ DebugLib | MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf PeiServicesLib | MdePkg/Library/PeiServicesLib/PeiServicesLib.inf VariableFlashInfoLib | MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf + VirtNorFlashPlatformLib | Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf [LibraryClasses.common.SEC] PcdLib | MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf @@ -360,9 +361,9 @@ # !include NetworkPkg/NetworkPcds.dsc.inc - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize | 0x10000 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x20000 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x10000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize | 0x40000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x40000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x40000 ################################################################################ # @@ -370,10 +371,11 @@ # ################################################################################ [PcdsDynamicDefault] - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase | 0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase | 0x1d080000 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 | 0 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 | 0 - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase | 0 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase | 0x1d000000 + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase | 0x1d040000 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 | 0 gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved | 0 gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration | FALSE @@ -471,15 +473,12 @@ # # Variable # - - OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { - <LibraryClasses> - PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf - } + OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { <LibraryClasses> NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf + NULL|EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf } diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf index ee89097344..ec47d96325 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf @@ -30,6 +30,8 @@ $(DXEFV_OFFSET)|$(DXEFV_SIZE) gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvBase|gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvSize FV = FVMAIN_COMPACT + +!include VarStore.fdf.inc ##################################################################################################### [FV.SECFV] FvNameGuid = 587d4265-5e71-41da-9c35-4258551f1e22 @@ -135,7 +137,7 @@ INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf # # Variable # -INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf +INF OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf # diff --git a/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc b/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc new file mode 100644 index 0000000000..c86255f3ca --- /dev/null +++ b/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc @@ -0,0 +1,67 @@ +## @file +# +# Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> +# +# SPDX-License-Identifier: BSD-2-Clause-Patent +# +## + +[FD.QEMU_VARS] +BaseAddress = 0x1d000000 +Size = 0x1000000 +ErasePolarity = 1 +BlockSize = 0x20000 +NumBlocks = 128 + +0x00000000|0x00040000 +#NV_VARIABLE_STORE +DATA = { + ## This is the EFI_FIRMWARE_VOLUME_HEADER + # ZeroVector [] + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + # FileSystemGuid: gEfiSystemNvDataFvGuid = + # { 0xFFF12B8D, 0x7696, 0x4C8B, + # { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }} + 0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C, + 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50, + # FvLength: 0xC0000 + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, + # Signature "_FVH" # Attributes + 0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00, + # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision + 0x48, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x02, + # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block + 0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, + # Blockmap[1]: End + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + ## This is the VARIABLE_STORE_HEADER + # It is compatible with SECURE_BOOT_ENABLE == FALSE as well. + # Signature: gEfiAuthenticatedVariableGuid = + # { 0xaaf32c78, 0x947b, 0x439a, + # { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }} + 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, + 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92, + # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) - + # 0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0x3ffb8 + # This can speed up the Variable Dispatch a bit. + 0xB8, 0xFF, 0x03, 0x00, + # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32 + 0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 +} + +0x00040000|0x00040000 +#NV_FTW_WORKING +DATA = { + # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid = + # { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95 }} + 0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49, + 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95, + # Crc:UINT32 #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved + 0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF, + # WriteQueueSize: UINT64 + 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 +} + +0x00080000|0x00040000 +#NV_FTW_SPARE -- 2.31.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash for loongarch. 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash " xianglai @ 2023-01-04 3:57 ` maobibo 0 siblings, 0 replies; 6+ messages in thread From: maobibo @ 2023-01-04 3:57 UTC (permalink / raw) To: xianglai li, devel Cc: Ard Biesheuvel, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney 在 2023/1/4 11:10, xianglai li 写道: > Add pflash driver for loongarch. > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > Cc: Bibo Mao <maobibo@loongson.cn> > Cc: Chao Li <lichao@loongson.cn> > Cc: Leif Lindholm <quic_llindhol@quicinc.com> > Cc: Liming Gao <gaoliming@byosoft.com.cn> > Cc: Michael D Kinney <michael.d.kinney@intel.com> > Signed-off-by: xianglai li <lixianglai@loongson.cn> > --- > .../Library/NorFlashQemuLib/NorFlashQemuLib.c | 138 ++++++++++++++++++ > .../NorFlashQemuLib/NorFlashQemuLib.inf | 43 ++++++ > .../Loongson/LoongArchQemuPkg/Loongson.dsc | 19 ++- > .../Loongson/LoongArchQemuPkg/Loongson.fdf | 4 +- > .../LoongArchQemuPkg/VarStore.fdf.inc | 67 +++++++++ > 5 files changed, 260 insertions(+), 11 deletions(-) > create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c > create mode 100644 Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf > create mode 100644 Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc > > diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c > new file mode 100644 > index 0000000000..2565e5ae70 > --- /dev/null > +++ b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.c > @@ -0,0 +1,138 @@ > +/** @file > + > + Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > + > +#include <Library/BaseLib.h> > +#include <Library/DebugLib.h> > +#include <Library/UefiBootServicesTableLib.h> > +#include <Library/VirtNorFlashPlatformLib.h> > + > +#include <Protocol/FdtClient.h> > + > +#define QEMU_NOR_BLOCK_SIZE SIZE_128KB > + > +#define MAX_FLASH_BANKS 1 > + > +EFI_STATUS > +VirtNorFlashPlatformInitialization ( > + VOID > + ) > +{ > + return EFI_SUCCESS; > +} > + > +STATIC VIRT_NOR_FLASH_DESCRIPTION mNorFlashDevices[MAX_FLASH_BANKS]; > + > +EFI_STATUS > +VirtNorFlashPlatformGetDevices ( > + OUT VIRT_NOR_FLASH_DESCRIPTION **NorFlashDescriptions, > + OUT UINT32 *Count > + ) > +{ > + FDT_CLIENT_PROTOCOL *FdtClient; > + INT32 Node; > + EFI_STATUS Status; > + EFI_STATUS FindNodeStatus; > + CONST UINT32 *Reg; > + UINT32 PropSize; > + UINT32 Num; > + UINT64 Base; > + UINT64 Size; > + > + Status = gBS->LocateProtocol ( > + &gFdtClientProtocolGuid, > + NULL, > + (VOID **)&FdtClient > + ); > + ASSERT_EFI_ERROR (Status); > + > + Num = 0; > + for (FindNodeStatus = FdtClient->FindCompatibleNode ( > + FdtClient, > + "cfi-flash", > + &Node > + ); > + !EFI_ERROR (FindNodeStatus) && Num < MAX_FLASH_BANKS; > + FindNodeStatus = FdtClient->FindNextCompatibleNode ( > + FdtClient, > + "cfi-flash", > + Node, > + &Node > + )) > + { > + Status = FdtClient->GetNodeProperty ( > + FdtClient, > + Node, > + "reg", > + (CONST VOID **)&Reg, > + &PropSize > + ); > + if (EFI_ERROR (Status)) { > + DEBUG (( > + DEBUG_ERROR, > + "%a: GetNodeProperty () failed (Status == %r)\n", > + __FUNCTION__, > + Status > + )); > + continue; > + } > + > + ASSERT ((PropSize % (4 * sizeof (UINT32))) == 0); > + > + while (PropSize >= (4 * sizeof (UINT32)) && Num < MAX_FLASH_BANKS) { > + Base = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[0])); > + Size = SwapBytes64 (ReadUnaligned64 ((VOID *)&Reg[2])); > + Reg += 4; > + > + PropSize -= 4 * sizeof (UINT32); > + > + mNorFlashDevices[Num].DeviceBaseAddress = (UINTN)Base; > + mNorFlashDevices[Num].RegionBaseAddress = (UINTN)Base; > + mNorFlashDevices[Num].Size = (UINTN)Size; > + mNorFlashDevices[Num].BlockSize = QEMU_NOR_BLOCK_SIZE; > + Num++; > + } Why is there while-loop? There is only one emulated plash device instead, and variable Base will be overwritten during the loop. > + > + Status = PcdSet32S (PcdFlashNvStorageVariableBase, Base); > + ASSERT_EFI_ERROR (Status); > + Can you add some notation as bellowing? /* * Base is the value of PcdFlashNvStorageVariableBase, * PcdFlashNvStorageFtwWorkingBase can be got by * PcdFlashNvStorageVariableBase + PcdFlashNvStorageVariableSize */ > + Base += PcdGet32 (PcdFlashNvStorageVariableSize); > + Status = PcdSet32S (PcdFlashNvStorageFtwWorkingBase, Base); > + ASSERT_EFI_ERROR (Status); > + ditto > + Base += PcdGet32 (PcdFlashNvStorageFtwWorkingSize); > + Status = PcdSet32S (PcdFlashNvStorageFtwSpareBase, Base); > + ASSERT_EFI_ERROR (Status); > + > + // > + // UEFI takes ownership of the NOR flash, and exposes its functionality > + // through the UEFI Runtime Services GetVariable, SetVariable, etc. This > + // means we need to disable it in the device tree to prevent the OS from > + // attaching its device driver as well. > + // Note that this also hides other flash banks, but the only other flash > + // bank we expect to encounter is the one that carries the UEFI executable > + // code, which is not intended to be guest updatable, and is usually backed > + // in a readonly manner by QEMU anyway. > + // > + Status = FdtClient->SetNodeProperty ( > + FdtClient, > + Node, > + "status", > + "disabled", > + sizeof ("disabled") > + ); > + if (EFI_ERROR (Status)) { > + DEBUG ((DEBUG_WARN, "Failed to set NOR flash status to 'disabled'\n")); > + } > + } > + > + *NorFlashDescriptions = mNorFlashDevices; > + *Count = Num; > + > + return EFI_SUCCESS; > +} > diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf > new file mode 100644 > index 0000000000..da05ca0898 > --- /dev/null > +++ b/Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf > @@ -0,0 +1,43 @@ > +## @file > +# > +# Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[Defines] > + INF_VERSION = 0x00010005 > + BASE_NAME = NorFlashQemuLib > + FILE_GUID = 339B7829-4C5F-4EFC-B2DD-5050E530DECE > + MODULE_TYPE = DXE_DRIVER > + VERSION_STRING = 1.0 > + LIBRARY_CLASS = VirtNorFlashPlatformLib > + > +[Sources.common] > + NorFlashQemuLib.c > + > +[Packages] > + MdePkg/MdePkg.dec > + EmbeddedPkg/EmbeddedPkg.dec > + OvmfPkg/OvmfPkg.dec > + MdeModulePkg/MdeModulePkg.dec > + > +[LibraryClasses] > + BaseLib > + DebugLib > + UefiBootServicesTableLib > + > +[Protocols] > + gFdtClientProtocolGuid ## CONSUMES > + > +[Depex] > + gFdtClientProtocolGuid > + > +[Pcd] > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase > +gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase > diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > index a9b5c8c514..650042662d 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > @@ -175,6 +175,7 @@ > DebugLib | MdePkg/Library/BaseDebugLibSerialPort/BaseDebugLibSerialPort.inf > PeiServicesLib | MdePkg/Library/PeiServicesLib/PeiServicesLib.inf > VariableFlashInfoLib | MdeModulePkg/Library/BaseVariableFlashInfoLib/BaseVariableFlashInfoLib.inf > + VirtNorFlashPlatformLib | Platform/Loongson/LoongArchQemuPkg/Library/NorFlashQemuLib/NorFlashQemuLib.inf > > [LibraryClasses.common.SEC] > PcdLib | MdePkg/Library/BasePcdLibNull/BasePcdLibNull.inf > @@ -360,9 +361,9 @@ > # > !include NetworkPkg/NetworkPcds.dsc.inc > > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize | 0x10000 > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x20000 > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x10000 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize | 0x40000 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x40000 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x40000 > > ################################################################################ > # > @@ -370,10 +371,11 @@ > # > ################################################################################ > [PcdsDynamicDefault] > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase | 0 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase | 0x1d080000 Since PcdFlashNvStorageFtwSpareBase can be parsed from fdt, why there is hardcoding value? > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareBase64 | 0 > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase64 | 0 > - gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase | 0 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableBase | 0x1d000000 > + gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase | 0x1d040000 Can we remove these hardcoding value? > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingBase64 | 0 > gEfiMdeModulePkgTokenSpaceGuid.PcdEmuVariableNvStoreReserved | 0 > gEfiMdeModulePkgTokenSpaceGuid.PcdPciDisableBusEnumeration | FALSE > @@ -471,15 +473,12 @@ > # > # Variable > # > - > - OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf { > - <LibraryClasses> > - PlatformFvbLib|OvmfPkg/Library/EmuVariableFvbLib/EmuVariableFvbLib.inf > - } > + OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf > MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf > MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf { > <LibraryClasses> > NULL|MdeModulePkg/Library/VarCheckUefiLib/VarCheckUefiLib.inf > + NULL|EmbeddedPkg/Library/NvVarStoreFormattedLib/NvVarStoreFormattedLib.inf > BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf > } > > diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf > index ee89097344..ec47d96325 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf > +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.fdf > @@ -30,6 +30,8 @@ $(DXEFV_OFFSET)|$(DXEFV_SIZE) > gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvBase|gLoongArchQemuPkgTokenSpaceGuid.PcdFlashDxeFvSize > FV = FVMAIN_COMPACT > > + > +!include VarStore.fdf.inc > ##################################################################################################### > [FV.SECFV] > FvNameGuid = 587d4265-5e71-41da-9c35-4258551f1e22 > @@ -135,7 +137,7 @@ INF MdeModulePkg/Universal/CapsuleRuntimeDxe/CapsuleRuntimeDxe.inf > # > # Variable > # > -INF OvmfPkg/EmuVariableFvbRuntimeDxe/Fvb.inf > +INF OvmfPkg/VirtNorFlashDxe/VirtNorFlashDxe.inf > INF MdeModulePkg/Universal/FaultTolerantWriteDxe/FaultTolerantWriteDxe.inf > INF MdeModulePkg/Universal/Variable/RuntimeDxe/VariableRuntimeDxe.inf > # > diff --git a/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc b/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc > new file mode 100644 > index 0000000000..c86255f3ca > --- /dev/null > +++ b/Platform/Loongson/LoongArchQemuPkg/VarStore.fdf.inc > @@ -0,0 +1,67 @@ > +## @file > +# > +# Copyright (c) 2023 Loongson Technology Corporation Limited. All rights reserved.<BR> > +# > +# SPDX-License-Identifier: BSD-2-Clause-Patent > +# > +## > + > +[FD.QEMU_VARS] > +BaseAddress = 0x1d000000 Can we remove these hardcoding value here? regards bibo,mao > +Size = 0x1000000 > +ErasePolarity = 1 > +BlockSize = 0x20000 > +NumBlocks = 128 > + > +0x00000000|0x00040000 > +#NV_VARIABLE_STORE > +DATA = { > + ## This is the EFI_FIRMWARE_VOLUME_HEADER > + # ZeroVector [] > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + # FileSystemGuid: gEfiSystemNvDataFvGuid = > + # { 0xFFF12B8D, 0x7696, 0x4C8B, > + # { 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50 }} > + 0x8D, 0x2B, 0xF1, 0xFF, 0x96, 0x76, 0x8B, 0x4C, > + 0xA9, 0x85, 0x27, 0x47, 0x07, 0x5B, 0x4F, 0x50, > + # FvLength: 0xC0000 > + 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x00, > + # Signature "_FVH" # Attributes > + 0x5f, 0x46, 0x56, 0x48, 0xff, 0xfe, 0x04, 0x00, > + # HeaderLength # CheckSum # ExtHeaderOffset #Reserved #Revision > + 0x48, 0x00, 0x28, 0x09, 0x00, 0x00, 0x00, 0x02, > + # Blockmap[0]: 0x3 Blocks * 0x40000 Bytes / Block > + 0x3, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, > + # Blockmap[1]: End > + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > + ## This is the VARIABLE_STORE_HEADER > + # It is compatible with SECURE_BOOT_ENABLE == FALSE as well. > + # Signature: gEfiAuthenticatedVariableGuid = > + # { 0xaaf32c78, 0x947b, 0x439a, > + # { 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92 }} > + 0x78, 0x2c, 0xf3, 0xaa, 0x7b, 0x94, 0x9a, 0x43, > + 0xa1, 0x80, 0x2e, 0x14, 0x4e, 0xc3, 0x77, 0x92, > + # Size: 0x40000 (gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageVariableSize) - > + # 0x48 (size of EFI_FIRMWARE_VOLUME_HEADER) = 0x3ffb8 > + # This can speed up the Variable Dispatch a bit. > + 0xB8, 0xFF, 0x03, 0x00, > + # FORMATTED: 0x5A #HEALTHY: 0xFE #Reserved: UINT16 #Reserved1: UINT32 > + 0x5A, 0xFE, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 > +} > + > +0x00040000|0x00040000 > +#NV_FTW_WORKING > +DATA = { > + # EFI_FAULT_TOLERANT_WORKING_BLOCK_HEADER->Signature = gEdkiiWorkingBlockSignatureGuid = > + # { 0x9e58292b, 0x7c68, 0x497d, { 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95 }} > + 0x2b, 0x29, 0x58, 0x9e, 0x68, 0x7c, 0x7d, 0x49, > + 0xa0, 0xce, 0x65, 0x0, 0xfd, 0x9f, 0x1b, 0x95, > + # Crc:UINT32 #WorkingBlockValid:1, WorkingBlockInvalid:1, Reserved > + 0x5b, 0xe7, 0xc6, 0x86, 0xFE, 0xFF, 0xFF, 0xFF, > + # WriteQueueSize: UINT64 > + 0xE0, 0xFF, 0x03, 0x00, 0x00, 0x00, 0x00, 0x00 > +} > + > +0x00080000|0x00040000 > +#NV_FTW_SPARE ^ permalink raw reply [flat|nested] 6+ messages in thread
* [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation. [not found] <cover.1672801654.git.lixianglai@loongson.cn> ` (2 preceding siblings ...) 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash " xianglai @ 2023-01-04 3:10 ` xianglai 2023-01-04 4:14 ` maobibo 3 siblings, 1 reply; 6+ messages in thread From: xianglai @ 2023-01-04 3:10 UTC (permalink / raw) To: devel Cc: Ard Biesheuvel, Bibo Mao, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney 1.Open the NULL pointer protection policy. 2.Fixed the bug of converting huge page to page entry. 3.Adjust the access level of page entry. 4.Optimize the existence of page entry judgment functions. Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> Cc: Bibo Mao <maobibo@loongson.cn> Cc: Chao Li <lichao@loongson.cn> Cc: Leif Lindholm <quic_llindhol@quicinc.com> Cc: Liming Gao <gaoliming@byosoft.com.cn> Cc: Michael D Kinney <michael.d.kinney@intel.com> Signed-off-by: xianglai li <lixianglai@loongson.cn> --- .../Library/MmuLib/MmuLibCore.c | 123 +++++++++++++----- .../Library/MmuLib/MmuLibCorePei.c | 1 + .../LoongArchQemuPkg/Library/MmuLib/page.h | 5 +- .../Loongson/LoongArchQemuPkg/Loongson.dsc | 2 + 4 files changed, 99 insertions(+), 32 deletions(-) diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c index b932e3d568..42f92745be 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c @@ -449,6 +449,29 @@ GetPteAddress ( return PteOffset (Pmd, Address); } +/** + Gets the Attributes of Huge Page. + + @param Pmd A pointer to the page middle directory. + + @retval Value of Attributes. +**/ +UINTN +GetHugePageAttributes ( + IN PMD *Pmd + ) +{ + UINTN Attributes; + UINTN GlobalFlag; + UINTN HugeVal = PMD_VAL(*Pmd); + + Attributes = HugeVal & (~HUGEP_PAGE_MASK); + GlobalFlag = ((Attributes & (1 << PAGE_HGLOBAL_SHIFT)) >> PAGE_HGLOBAL_SHIFT) << PAGE_GLOBAL_SHIFT; + Attributes &= ~(1 << PAGE_HGLOBAL_SHIFT); + Attributes |= GlobalFlag; + return Attributes; +} + /** Establishes a page table entry based on the specified memory region. @@ -477,13 +500,13 @@ MemoryMapPteRange ( return EFI_OUT_OF_RESOURCES; } + DEBUG ((DEBUG_VERBOSE, + "%a %d Address %p End %p Attributes %llx\n", + __func__, __LINE__, Address, End, Attributes)); + do { UpDate = FALSE; PteVal = MAKE_PTE (Address, Attributes); - DEBUG ((DEBUG_VERBOSE, - "%a %d Address %p PGD_INDEX %p PUD_INDEX %p PMD_INDEX %p PTE_INDEX %p MAKE_PTE %p\n", - __func__, __LINE__, Address, PGD_INDEX (Address), PUD_INDEX (Address), PMD_INDEX (Address), - PTE_INDEX (Address), PteVal)); if ((!pte_none (*Pte)) && (PTE_VAL(*Pte) != PTE_VAL(PteVal))) @@ -500,6 +523,61 @@ MemoryMapPteRange ( return EFI_SUCCESS; } +/** + Convert Huge Page to Page. + + @param Pmd A pointer to the page middle directory. + @param Address The memory space start address. + @param End The end address of the memory space. + @param Attributes Memory space Attributes. + + @retval EFI_SUCCESS The page table entry was created successfully. + @retval EFI_OUT_OF_RESOURCES Page table entry establishment failed due to resource exhaustion. +**/ +EFI_STATUS +ConvertHugePageToPage ( + IN PMD *Pmd, + IN UINTN Address, + IN UINTN End, + IN UINTN Attributes + ) +{ + UINTN OldAttributes; + UINTN AddressEnd_HugePage; + UINTN AddressStart_HugePage; + EFI_STATUS Status; + + if ((pmd_none (*Pmd)) || + ((!pmd_none (*Pmd)) && + (!IS_HUGE_PAGE (Pmd->PmdVal)))) + { + Status |= MemoryMapPteRange (Pmd, Address, End, Attributes); + } else { + OldAttributes = GetHugePageAttributes(Pmd); + SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); + AddressStart_HugePage = Address & PMD_MASK; + AddressEnd_HugePage = AddressStart_HugePage + HUGE_PAGE_SIZE; + if (End >= AddressEnd_HugePage) { + if (Address > AddressStart_HugePage) { + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, Address, OldAttributes); + Status |= MemoryMapPteRange (Pmd, Address, AddressEnd_HugePage, Attributes); + } else { + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, AddressEnd_HugePage, Attributes); + } + } else { + if (Address > AddressStart_HugePage) { + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, Address, OldAttributes); + Status |= MemoryMapPteRange (Pmd, Address, End, Attributes); + } else { + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, End, Attributes); + } + Status |= MemoryMapPteRange (Pmd, End, AddressEnd_HugePage, OldAttributes); + } + } + + return Status; +} + /** Establishes a page middle directory based on the specified memory region. @@ -520,10 +598,7 @@ MemoryMapPmdRange ( ) { PMD *Pmd; - PTE *Pte; UINTN Next; - UINTN AddressStart_HugePage; - UINTN AddressEnd_HugePage; Pmd = PmdAllocGet (Pud, Address); if (!Pmd) { @@ -543,28 +618,7 @@ MemoryMapPmdRange ( SetPmd (Pmd, (PTE *)MAKE_HUGE_PTE (Address, Attributes)); } else { - if ((pmd_none (*Pmd)) || - ((!pmd_none (*Pmd)) && - (!IS_HUGE_PAGE (Pmd->PmdVal)))) - { - if (MemoryMapPteRange (Pmd, Address, Next, Attributes)) { - return EFI_OUT_OF_RESOURCES; - } - } else { - SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); - AddressStart_HugePage = Address & PMD_MASK; - AddressEnd_HugePage = AddressStart_HugePage + HUGE_PAGE_SIZE; - if (MemoryMapPteRange (Pmd, AddressStart_HugePage, AddressEnd_HugePage, Attributes)) { - return EFI_OUT_OF_RESOURCES; - } - Pte = GetPteAddress (AddressStart_HugePage); - if (Pte == NULL) { - continue ; - } - if (AddressEnd_HugePage > End) { - Next = End; - } - } + ConvertHugePageToPage (Pmd, Address, Next, Attributes); } } while (Pmd++, Address = Next, Address != End); @@ -671,7 +725,7 @@ EfiAttributeToLoongArchAttribute ( IN UINTN EfiAttributes ) { - UINTN LoongArchAttributes = PAGE_VALID | PAGE_DIRTY | CACHE_CC | PAGE_USER | PAGE_GLOBAL; + UINTN LoongArchAttributes = PAGE_VALID | PAGE_DIRTY | CACHE_CC | PLV_KERNEL | PAGE_GLOBAL; switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) { case EFI_MEMORY_UC: LoongArchAttributes |= CACHE_SUC; @@ -687,10 +741,16 @@ EfiAttributeToLoongArchAttribute ( } // Write protection attributes - if ((EfiAttributes & EFI_MEMORY_RO) != 0) { + if (((EfiAttributes & EFI_MEMORY_RO) != 0) || + ((EfiAttributes & EFI_MEMORY_WP) != 0)) + { LoongArchAttributes &= ~PAGE_DIRTY; } + if (EfiAttributes & EFI_MEMORY_RP) { + LoongArchAttributes |= PAGE_NO_READ; + } + //eXecute protection attribute if ((EfiAttributes & EFI_MEMORY_XP) != 0) { LoongArchAttributes |= PAGE_NO_EXEC; @@ -788,6 +848,7 @@ LoongArchSetMemoryAttributes ( Attributes = EfiAttributeToLoongArchAttribute (Attributes); DEBUG ((DEBUG_VERBOSE, "%a %d %p %p %p.\n", __func__, __LINE__, BaseAddress , Length, Attributes)); MemoryMapPageRange (BaseAddress, BaseAddress + Length, Attributes); + DEBUG ((DEBUG_VERBOSE, "%a %d end.\n", __func__, __LINE__)); return EFI_SUCCESS; } diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c index 32a7fc0beb..491b75552c 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c @@ -21,6 +21,7 @@ #include <Library/QemuFwCfgLib.h> #include "MmuLibCore.h" #include <Library/CacheMaintenanceLib.h> +#include <Library/MmuLib.h> /** Return the Virtual Memory Map of your platform diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h index 6ab07e7900..927aeb018d 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h @@ -42,6 +42,9 @@ #define PFN_MASK (~(((UINTN)(1) << (EFI_PAGE_SHIFT)) - 1) & \ (((UINTN)(1) << (PAGE_PFN_END_SHIFT)) - 1)) +#define HUGEP_PAGE_MASK (~(((UINTN)(1) << (PMD_SHIFT)) - 1) & \ + (((UINTN)(1) << (PAGE_PFN_END_SHIFT)) - 1)) + typedef struct { UINTN PgdVal; } PGD; typedef struct { UINTN PudVal; } PUD; typedef struct { UINTN PmdVal; } PMD; @@ -275,6 +278,6 @@ pte_none ( IN PTE pte ) { - return (!(PTE_VAL(pte) & (~PAGE_GLOBAL))); + return (!(PTE_VAL(pte) & (~PAGE_VALID))); } #endif // PAGE_H_ diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc index 650042662d..45be8d146d 100644 --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc @@ -365,6 +365,8 @@ gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x40000 gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x40000 + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask | 1 + ################################################################################ # # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform -- 2.31.1 ^ permalink raw reply related [flat|nested] 6+ messages in thread
* Re: [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation. 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation xianglai @ 2023-01-04 4:14 ` maobibo 0 siblings, 0 replies; 6+ messages in thread From: maobibo @ 2023-01-04 4:14 UTC (permalink / raw) To: xianglai li, devel Cc: Ard Biesheuvel, Chao Li, Leif Lindholm, Liming Gao, Michael D Kinney 在 2023/1/4 11:10, xianglai li 写道: > 1.Open the NULL pointer protection policy. > 2.Fixed the bug of converting huge page to page entry. > 3.Adjust the access level of page entry. > 4.Optimize the existence of page entry judgment functions. Can we split the patch into 4 small patches? All the fixes are mixed together is hard to review :) regards bibo,mao > > Cc: Ard Biesheuvel <ardb+tianocore@kernel.org> > Cc: Bibo Mao <maobibo@loongson.cn> > Cc: Chao Li <lichao@loongson.cn> > Cc: Leif Lindholm <quic_llindhol@quicinc.com> > Cc: Liming Gao <gaoliming@byosoft.com.cn> > Cc: Michael D Kinney <michael.d.kinney@intel.com> > Signed-off-by: xianglai li <lixianglai@loongson.cn> > --- > .../Library/MmuLib/MmuLibCore.c | 123 +++++++++++++----- > .../Library/MmuLib/MmuLibCorePei.c | 1 + > .../LoongArchQemuPkg/Library/MmuLib/page.h | 5 +- > .../Loongson/LoongArchQemuPkg/Loongson.dsc | 2 + > 4 files changed, 99 insertions(+), 32 deletions(-) > > diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c > index b932e3d568..42f92745be 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c > +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCore.c > @@ -449,6 +449,29 @@ GetPteAddress ( > return PteOffset (Pmd, Address); > } > > +/** > + Gets the Attributes of Huge Page. > + > + @param Pmd A pointer to the page middle directory. > + > + @retval Value of Attributes. > +**/ > +UINTN > +GetHugePageAttributes ( > + IN PMD *Pmd > + ) > +{ > + UINTN Attributes; > + UINTN GlobalFlag; > + UINTN HugeVal = PMD_VAL(*Pmd); > + > + Attributes = HugeVal & (~HUGEP_PAGE_MASK); > + GlobalFlag = ((Attributes & (1 << PAGE_HGLOBAL_SHIFT)) >> PAGE_HGLOBAL_SHIFT) << PAGE_GLOBAL_SHIFT; > + Attributes &= ~(1 << PAGE_HGLOBAL_SHIFT); > + Attributes |= GlobalFlag; > + return Attributes; > +} > + > /** > Establishes a page table entry based on the specified memory region. > > @@ -477,13 +500,13 @@ MemoryMapPteRange ( > return EFI_OUT_OF_RESOURCES; > } > > + DEBUG ((DEBUG_VERBOSE, > + "%a %d Address %p End %p Attributes %llx\n", > + __func__, __LINE__, Address, End, Attributes)); > + > do { > UpDate = FALSE; > PteVal = MAKE_PTE (Address, Attributes); > - DEBUG ((DEBUG_VERBOSE, > - "%a %d Address %p PGD_INDEX %p PUD_INDEX %p PMD_INDEX %p PTE_INDEX %p MAKE_PTE %p\n", > - __func__, __LINE__, Address, PGD_INDEX (Address), PUD_INDEX (Address), PMD_INDEX (Address), > - PTE_INDEX (Address), PteVal)); > > if ((!pte_none (*Pte)) && > (PTE_VAL(*Pte) != PTE_VAL(PteVal))) > @@ -500,6 +523,61 @@ MemoryMapPteRange ( > return EFI_SUCCESS; > } > > +/** > + Convert Huge Page to Page. > + > + @param Pmd A pointer to the page middle directory. > + @param Address The memory space start address. > + @param End The end address of the memory space. > + @param Attributes Memory space Attributes. > + > + @retval EFI_SUCCESS The page table entry was created successfully. > + @retval EFI_OUT_OF_RESOURCES Page table entry establishment failed due to resource exhaustion. > +**/ > +EFI_STATUS > +ConvertHugePageToPage ( > + IN PMD *Pmd, > + IN UINTN Address, > + IN UINTN End, > + IN UINTN Attributes > + ) > +{ > + UINTN OldAttributes; > + UINTN AddressEnd_HugePage; > + UINTN AddressStart_HugePage; > + EFI_STATUS Status; > + > + if ((pmd_none (*Pmd)) || > + ((!pmd_none (*Pmd)) && > + (!IS_HUGE_PAGE (Pmd->PmdVal)))) > + { > + Status |= MemoryMapPteRange (Pmd, Address, End, Attributes); > + } else { > + OldAttributes = GetHugePageAttributes(Pmd); > + SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); > + AddressStart_HugePage = Address & PMD_MASK; > + AddressEnd_HugePage = AddressStart_HugePage + HUGE_PAGE_SIZE; > + if (End >= AddressEnd_HugePage) { > + if (Address > AddressStart_HugePage) { > + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, Address, OldAttributes); > + Status |= MemoryMapPteRange (Pmd, Address, AddressEnd_HugePage, Attributes); > + } else { > + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, AddressEnd_HugePage, Attributes); > + } > + } else { > + if (Address > AddressStart_HugePage) { > + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, Address, OldAttributes); > + Status |= MemoryMapPteRange (Pmd, Address, End, Attributes); > + } else { > + Status |= MemoryMapPteRange (Pmd, AddressStart_HugePage, End, Attributes); > + } > + Status |= MemoryMapPteRange (Pmd, End, AddressEnd_HugePage, OldAttributes); > + } > + } > + > + return Status; > +} > + > /** > Establishes a page middle directory based on the specified memory region. > > @@ -520,10 +598,7 @@ MemoryMapPmdRange ( > ) > { > PMD *Pmd; > - PTE *Pte; > UINTN Next; > - UINTN AddressStart_HugePage; > - UINTN AddressEnd_HugePage; > > Pmd = PmdAllocGet (Pud, Address); > if (!Pmd) { > @@ -543,28 +618,7 @@ MemoryMapPmdRange ( > > SetPmd (Pmd, (PTE *)MAKE_HUGE_PTE (Address, Attributes)); > } else { > - if ((pmd_none (*Pmd)) || > - ((!pmd_none (*Pmd)) && > - (!IS_HUGE_PAGE (Pmd->PmdVal)))) > - { > - if (MemoryMapPteRange (Pmd, Address, Next, Attributes)) { > - return EFI_OUT_OF_RESOURCES; > - } > - } else { > - SetPmd (Pmd, (PTE *)PcdGet64 (PcdInvalidPte)); > - AddressStart_HugePage = Address & PMD_MASK; > - AddressEnd_HugePage = AddressStart_HugePage + HUGE_PAGE_SIZE; > - if (MemoryMapPteRange (Pmd, AddressStart_HugePage, AddressEnd_HugePage, Attributes)) { > - return EFI_OUT_OF_RESOURCES; > - } > - Pte = GetPteAddress (AddressStart_HugePage); > - if (Pte == NULL) { > - continue ; > - } > - if (AddressEnd_HugePage > End) { > - Next = End; > - } > - } > + ConvertHugePageToPage (Pmd, Address, Next, Attributes); > } > } while (Pmd++, Address = Next, Address != End); > > @@ -671,7 +725,7 @@ EfiAttributeToLoongArchAttribute ( > IN UINTN EfiAttributes > ) > { > - UINTN LoongArchAttributes = PAGE_VALID | PAGE_DIRTY | CACHE_CC | PAGE_USER | PAGE_GLOBAL; > + UINTN LoongArchAttributes = PAGE_VALID | PAGE_DIRTY | CACHE_CC | PLV_KERNEL | PAGE_GLOBAL; > switch (EfiAttributes & EFI_MEMORY_CACHETYPE_MASK) { > case EFI_MEMORY_UC: > LoongArchAttributes |= CACHE_SUC; > @@ -687,10 +741,16 @@ EfiAttributeToLoongArchAttribute ( > } > > // Write protection attributes > - if ((EfiAttributes & EFI_MEMORY_RO) != 0) { > + if (((EfiAttributes & EFI_MEMORY_RO) != 0) || > + ((EfiAttributes & EFI_MEMORY_WP) != 0)) > + { > LoongArchAttributes &= ~PAGE_DIRTY; > } > > + if (EfiAttributes & EFI_MEMORY_RP) { > + LoongArchAttributes |= PAGE_NO_READ; > + } > + > //eXecute protection attribute > if ((EfiAttributes & EFI_MEMORY_XP) != 0) { > LoongArchAttributes |= PAGE_NO_EXEC; > @@ -788,6 +848,7 @@ LoongArchSetMemoryAttributes ( > Attributes = EfiAttributeToLoongArchAttribute (Attributes); > DEBUG ((DEBUG_VERBOSE, "%a %d %p %p %p.\n", __func__, __LINE__, BaseAddress , Length, Attributes)); > MemoryMapPageRange (BaseAddress, BaseAddress + Length, Attributes); > + DEBUG ((DEBUG_VERBOSE, "%a %d end.\n", __func__, __LINE__)); > > return EFI_SUCCESS; > } > diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c > index 32a7fc0beb..491b75552c 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c > +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/MmuLibCorePei.c > @@ -21,6 +21,7 @@ > #include <Library/QemuFwCfgLib.h> > #include "MmuLibCore.h" > #include <Library/CacheMaintenanceLib.h> > +#include <Library/MmuLib.h> > > /** > Return the Virtual Memory Map of your platform > diff --git a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h > index 6ab07e7900..927aeb018d 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h > +++ b/Platform/Loongson/LoongArchQemuPkg/Library/MmuLib/page.h > @@ -42,6 +42,9 @@ > #define PFN_MASK (~(((UINTN)(1) << (EFI_PAGE_SHIFT)) - 1) & \ > (((UINTN)(1) << (PAGE_PFN_END_SHIFT)) - 1)) > > +#define HUGEP_PAGE_MASK (~(((UINTN)(1) << (PMD_SHIFT)) - 1) & \ > + (((UINTN)(1) << (PAGE_PFN_END_SHIFT)) - 1)) > + > typedef struct { UINTN PgdVal; } PGD; > typedef struct { UINTN PudVal; } PUD; > typedef struct { UINTN PmdVal; } PMD; > @@ -275,6 +278,6 @@ pte_none ( > IN PTE pte > ) > { > - return (!(PTE_VAL(pte) & (~PAGE_GLOBAL))); > + return (!(PTE_VAL(pte) & (~PAGE_VALID))); > } > #endif // PAGE_H_ > diff --git a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > index 650042662d..45be8d146d 100644 > --- a/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > +++ b/Platform/Loongson/LoongArchQemuPkg/Loongson.dsc > @@ -365,6 +365,8 @@ > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwSpareSize | 0x40000 > gEfiMdeModulePkgTokenSpaceGuid.PcdFlashNvStorageFtwWorkingSize | 0x40000 > > + gEfiMdeModulePkgTokenSpaceGuid.PcdNullPointerDetectionPropertyMask | 1 > + > ################################################################################ > # > # Pcd Dynamic Section - list of all EDK II PCD Entries defined by this Platform ^ permalink raw reply [flat|nested] 6+ messages in thread
end of thread, other threads:[~2023-01-04 4:14 UTC | newest] Thread overview: 6+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- [not found] <cover.1672801654.git.lixianglai@loongson.cn> 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 1/4] Platform/Loongson: add bootmode support xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 2/4] Platform/Loongson:add nvme device driver for loongarch xianglai 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 3/4] Platform/Loongson: Support pflash " xianglai 2023-01-04 3:57 ` maobibo 2023-01-04 3:10 ` [edk2-platforms][PATCH V1 4/4] Platform/Loongson: Fixed the bug during page table creation xianglai 2023-01-04 4:14 ` maobibo
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox