public inbox for devel@edk2.groups.io
 help / color / mirror / Atom feed
* [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

* [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 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

* 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