Hi Chao, I see that you're adding a header, CpuMmuLib.h, but this header is not generic - it includes a bunch of Loongson arch-specific "stuff".
I agree in principle that there's room for a generic CpuMmuLib, and I don't think you ought to be on the hook to refactor ArmMmuLib, but I suggest moving the architecture-specific PTE #defines into MdePkg/Include similar to ./MdePkg/Include/Register/RiscV64. (it would, though, be nice to at least record the idea of moving ArmMmuLib to CpuMmuLib.... raise a BZ for that or something!) This will avoid the #ifdef MDE_CPU_LOONGARCH64 inside a generic Library header. A > -----Original Message----- > From: Chao Li <lic...@loongson.cn> > Sent: Sunday, November 5, 2023 9:28 PM > To: devel@edk2.groups.io > Cc: Dong, Eric <eric.d...@intel.com>; Ni, Ray <ray...@intel.com>; Kumar, > Rahul R <rahul.r.ku...@intel.com>; Gerd Hoffmann <kra...@redhat.com>; > Leif Lindholm <quic_llind...@quicinc.com>; Ard Biesheuvel > <ardb+tianoc...@kernel.org>; Sami Mujawar <sami.muja...@arm.com>; > Sunil V L <suni...@ventanamicro.com>; Warkentin, Andrei > <andrei.warken...@intel.com> > Subject: [PATCH v2 11/30] UefiCpuPkg: Add CpuMmuLib.h to UefiCpuPkg > > Add a new header file CpuMmuLib.h, whitch is referenced from > ArmPkg/Include/Library/ArmMmuLib.h. Currently, only support for > LoongArch64 is added, and more architectures can be accommodated in the > future. > > BZ: https://bugzilla.tianocore.org/show_bug.cgi?id=4584 > > Cc: Eric Dong <eric.d...@intel.com> > Cc: Ray Ni <ray...@intel.com> > Cc: Rahul Kumar <rahul1.ku...@intel.com> > Cc: Gerd Hoffmann <kra...@redhat.com> > Cc: Leif Lindholm <quic_llind...@quicinc.com> > Cc: Ard Biesheuvel <ardb+tianoc...@kernel.org> > Cc: Sami Mujawar <sami.muja...@arm.com> > Cc: Sunil V L <suni...@ventanamicro.com> > Cc: Andrei Warkentin <andrei.warken...@intel.com> > Signed-off-by: Chao Li <lic...@loongson.cn> > --- > UefiCpuPkg/Include/Library/CpuMmuLib.h | 194 > +++++++++++++++++++++++++ > UefiCpuPkg/UefiCpuPkg.dec | 4 + > 2 files changed, 198 insertions(+) > create mode 100644 UefiCpuPkg/Include/Library/CpuMmuLib.h > > diff --git a/UefiCpuPkg/Include/Library/CpuMmuLib.h > b/UefiCpuPkg/Include/Library/CpuMmuLib.h > new file mode 100644 > index 0000000000..8f524d31d4 > --- /dev/null > +++ b/UefiCpuPkg/Include/Library/CpuMmuLib.h > @@ -0,0 +1,194 @@ > +/** @file > + > + Copyright (c) 2023 Loongson Technology Corporation Limited. All > + rights reserved.<BR> > + > + SPDX-License-Identifier: BSD-2-Clause-Patent > + > +**/ > + > +#ifndef CPU_MMU_LIB_H_ > +#define CPU_MMU_LIB_H_ > + > +#include <Uefi/UefiBaseType.h> > + > +#ifdef MDE_CPU_LOONGARCH64 > + > +/* Page table property definitions */ > +#define PAGE_VALID_SHIFT 0 > +#define PAGE_DIRTY_SHIFT 1 > +#define PAGE_PLV_SHIFT 2 // 2~3, two bits > +#define CACHE_SHIFT 4 // 4~5, two bits > +#define PAGE_GLOBAL_SHIFT 6 > +#define PAGE_HUGE_SHIFT 6 // HUGE is a PMD bit > + > +#define PAGE_HGLOBAL_SHIFT 12 // HGlobal is a PMD bit > +#define PAGE_PFN_SHIFT 12 > +#define PAGE_PFN_END_SHIFT 48 > +#define PAGE_NO_READ_SHIFT 61 > +#define PAGE_NO_EXEC_SHIFT 62 > +#define PAGE_RPLV_SHIFT 63 > + > +/* Used by TLB hardware (placed in EntryLo*) */ > +#define PAGE_VALID ((UINTN)(1) << PAGE_VALID_SHIFT) > +#define PAGE_DIRTY ((UINTN)(1) << PAGE_DIRTY_SHIFT) > +#define PAGE_PLV ((UINTN)(3) << PAGE_PLV_SHIFT) > +#define PAGE_GLOBAL ((UINTN)(1) << PAGE_GLOBAL_SHIFT) > +#define PAGE_HUGE ((UINTN)(1) << PAGE_HUGE_SHIFT) > +#define PAGE_HGLOBAL ((UINTN)(1) << PAGE_HGLOBAL_SHIFT) #define > +PAGE_NO_READ ((UINTN)(1) << PAGE_NO_READ_SHIFT) #define > PAGE_NO_EXEC > +((UINTN)(1) << PAGE_NO_EXEC_SHIFT) > +#define PAGE_RPLV ((UINTN)(1) << PAGE_RPLV_SHIFT) > +#define CACHE_MASK ((UINTN)(3) << CACHE_SHIFT) > +#define PFN_SHIFT (EFI_PAGE_SHIFT - 12 + PAGE_PFN_SHIFT) > + > +#define PLV_KERNEL 0 > +#define PLV_USER 3 > + > +#define PAGE_USER (PLV_USER << PAGE_PLV_SHIFT) > +#define PAGE_KERNEL (PLV_KERN << PAGE_PLV_SHIFT) > + > +#define CACHE_SUC (0 << CACHE_SHIFT) // Strong-ordered UnCached > +#define CACHE_CC (1 << CACHE_SHIFT) // Coherent Cached > +#define CACHE_WUC (2 << CACHE_SHIFT) // Weak-ordered UnCached > + > +#define EFI_MEMORY_CACHETYPE_MASK (EFI_MEMORY_UC | \ > + EFI_MEMORY_WC | \ > + EFI_MEMORY_WT | \ > + EFI_MEMORY_WB | \ > + EFI_MEMORY_UCE \ > + ) > +#endif > + > +typedef struct { > + EFI_PHYSICAL_ADDRESS PhysicalBase; > + EFI_VIRTUAL_ADDRESS VirtualBase; > + UINTN Length; > + UINTN Attributes; > +} MEMORY_REGION_DESCRIPTOR; > + > +/** > + Converts EFI Attributes to corresponding architecture Attributes. > + > + @param[in] EfiAttributes Efi Attributes. > + > + @retval Corresponding architecture attributes. > +**/ > +UINTN > +EfiAttributeConverse ( > + IN UINTN EfiAttributes > + ); > + > +/** > + Finds the length and memory properties of the memory region > corresponding to the specified base address. > + > + @param[in] BaseAddress To find the base address of the memory > region. > + @param[in] EndAddress To find the end address of the memory region. > + @param[out] RegionLength The length of the memory region found. > + @param[out] RegionAttributes Properties of the memory region found. > + > + @retval EFI_SUCCESS The corresponding memory area was successfully > found > + EFI_NOT_FOUND No memory area found > +**/ > +EFI_STATUS > +GetMemoryRegionAttribute ( > + IN UINTN BaseAddress, > + IN UINTN EndAddress, > + OUT UINTN *RegionLength, > + OUT UINTN *RegionAttributes > + ); > + > +/** > + Sets the Attributes of the specified memory region > + > + @param[in] BaseAddress The base address of the memory region to set > the Attributes. > + @param[in] Length The length of the memory region to set the > Attributes. > + @param[in] Attributes The Attributes to be set. > + > + @retval EFI_SUCCESS The Attributes was set successfully > +**/ > +EFI_STATUS > +SetMemoryAttributes ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINTN Length, > + IN UINTN Attributes > + ); > + > +/** > + Sets the non-executable Attributes for the specified memory region > + > + @param[in] BaseAddress The base address of the memory region to set > the Attributes. > + @param[in] Length The length of the memory region to set the > Attributes. > + > + @retval EFI_SUCCESS The Attributes was set successfully > +**/ > +EFI_STATUS > +SetMemoryRegionNoExec ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINTN Length > + ); > + > +/** > + Clears the non-executable Attributes for the specified memory region > + > + @param[in] BaseAddress The base address of the memory region to clear > the Attributes. > + @param[in] Length The length of the memory region to clear the > Attributes. > + > + @retval EFI_SUCCESS The Attributes was clear successfully > +**/ > +EFI_STATUS > +EFIAPI > +ClearMemoryRegionNoExec ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ); > + > +/** > + Sets the read-only Attributes for the specified memory region > + > + @param[in] BaseAddress The base address of the memory region to set > the Attributes. > + @param[in] Length The length of the memory region to set the > Attributes. > + > + @retval EFI_SUCCESS The Attributes was set successfully > +**/ > +EFI_STATUS > +EFIAPI > +SetMemoryRegionReadOnly ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ); > + > +/** > + Clears the read-only Attributes for the specified memory region > + > + @param[in] BaseAddress The base address of the memory region to clear > the Attributes. > + @param[in] Length The length of the memory region to clear the > Attributes. > + > + @retval EFI_SUCCESS The Attributes was clear successfully > +**/ > +EFI_STATUS > +EFIAPI > +ClearMemoryRegionReadOnly ( > + IN EFI_PHYSICAL_ADDRESS BaseAddress, > + IN UINT64 Length > + ); > + > +/** > + Create a page table and initialize the memory management unit(MMU). > + > + @param[in] MemoryTable A pointer to a memory ragion table. > + @param[out] TranslationTableBase A pointer to a translation table base > address. > + @param[in out] TranslationTableSize A pointer to a translation table base > size. > + > + @retval EFI_SUCCESS Configure MMU successfully. > + EFI_INVALID_PARAMETER MemoryTable is NULL. > + EFI_UNSUPPORTED Out of memory space or size not > aligned. > +**/ > +EFI_STATUS > +EFIAPI > +ConfigureMemoryManagementUint ( > + IN MEMORY_REGION_DESCRIPTOR *MemoryTable, > + OUT VOID **TranslationTableBase OPTIONAL, > + IN OUT UINTN *TranslationTableSize OPTIONAL > + ); > + > +#endif // CPU_MMU_LIB_H_ > diff --git a/UefiCpuPkg/UefiCpuPkg.dec b/UefiCpuPkg/UefiCpuPkg.dec index > 154b1d06fe..150beae981 100644 > --- a/UefiCpuPkg/UefiCpuPkg.dec > +++ b/UefiCpuPkg/UefiCpuPkg.dec > @@ -62,6 +62,10 @@ > ## @libraryclass Provides function for manipulating x86 paging > structures. > CpuPageTableLib|Include/Library/CpuPageTableLib.h > > +[LibraryClasses.LoongArch64] > + ## @libraryclass Provides macros and functions for the memory > management unit. > + CpuMmuLib|Include/Library/CpuMmuLib.h > + > ## @libraryclass Provides functions for manipulating smram savestate > registers. > MmSaveStateLib|Include/Library/MmSaveStateLib.h > > -- > 2.27.0 -=-=-=-=-=-=-=-=-=-=-=- Groups.io Links: You receive all messages sent to this group. View/Reply Online (#110936): https://edk2.groups.io/g/devel/message/110936 Mute This Topic: https://groups.io/mt/102413866/21656 Group Owner: devel+ow...@edk2.groups.io Unsubscribe: https://edk2.groups.io/g/devel/unsub [arch...@mail-archive.com] -=-=-=-=-=-=-=-=-=-=-=-