From 108666ffe90f402005a5b9b1e30dc883f4618f98 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Dec 2021 18:24:02 -0500 Subject: [PATCH 1/6] Fix some EFI_MEMORY_FOO definitions Signed-off-by: Peter Jones --- inc/efidef.h | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/inc/efidef.h b/inc/efidef.h index 5953b69..3f3bedf 100644 --- a/inc/efidef.h +++ b/inc/efidef.h @@ -190,12 +190,13 @@ typedef enum { #define EFI_MEMORY_WC 0x0000000000000002 #define EFI_MEMORY_WT 0x0000000000000004 #define EFI_MEMORY_WB 0x0000000000000008 -#define EFI_MEMORY_UCE 0x0000000000000010 - -// physical memory protection on range +#define EFI_MEMORY_UCE 0x0000000000000010 #define EFI_MEMORY_WP 0x0000000000001000 + +// physical memory protection on range #define EFI_MEMORY_RP 0x0000000000002000 #define EFI_MEMORY_XP 0x0000000000004000 +#define EFI_MEMORY_RO 0x0000000000020000 // range requires a runtime mapping #define EFI_MEMORY_RUNTIME 0x8000000000000000 From ce625f353e86c953a5f1cd83bec96fa884d01751 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 2 Dec 2021 17:03:26 -0500 Subject: [PATCH 2/6] Add EFI_MEMORY_ATTRIBUTE_PROTOCOL Signed-off-by: Peter Jones --- inc/efiprot.h | 35 +++++++++++++++++++++++++++++++++++ 1 file changed, 35 insertions(+) diff --git a/inc/efiprot.h b/inc/efiprot.h index 3e4d60b..c4457de 100644 --- a/inc/efiprot.h +++ b/inc/efiprot.h @@ -1428,4 +1428,39 @@ typedef struct _EFI_EBC_PROTOCOL { EFI_EBC_GET_VERSION GetVersion; } EFI_EBC_PROTOCOL; +INTERFACE_DECL(_EFI_MEMORY_ATTRIBUTE_PROTOCOL); + +typedef +EFI_STATUS +(EFIAPI *EFI_GET_MEMORY_ATTRIBUTES)( + IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length, + OUT UINT64 *Attributes + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_SET_MEMORY_ATTRIBUTES)( + IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length, + IN UINT64 Attributes + ); + +typedef +EFI_STATUS +(EFIAPI *EFI_CLEAR_MEMORY_ATTRIBUTES)( + IN struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL *This, + IN EFI_PHYSICAL_ADDRESS BaseAddress, + IN UINT64 Length, + IN UINT64 Attributes + ); + +typedef struct _EFI_MEMORY_ATTRIBUTE_PROTOCOL { + EFI_GET_MEMORY_ATTRIBUTES GetMemoryAttributes; + EFI_SET_MEMORY_ATTRIBUTES SetMemoryAttributes; + EFI_CLEAR_MEMORY_ATTRIBUTES ClearMemoryAttributes; +} EFI_MEMORY_ATTRIBUTE_PROTOCOL; + #endif From deb8a7f267d96299b9aa41300539f617db54c2a9 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Wed, 4 Aug 2021 12:52:13 -0400 Subject: [PATCH 3/6] Make CopyMem() and SetMem() be EFIAPI For wildly unknown reasons, EFI Boot Services includes CopyMem() and SetMem() functions, and they are marked as EFIAPI functions. This patch marks gnu-efi's CopyMem() and SetMem() as EFIAPI functions, and makes their exposed API match the misguided nonsense in the EFI spec, so that they can be used there in a test environment. Signed-off-by: Peter Jones --- inc/efilib.h | 6 +++--- lib/misc.c | 6 +++--- lib/str.c | 2 +- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/inc/efilib.h b/inc/efilib.h index a42453a..f35d2ed 100644 --- a/inc/efilib.h +++ b/inc/efilib.h @@ -287,17 +287,17 @@ ZeroMem ( IN UINTN Size ); -VOID +VOID EFIAPI SetMem ( IN VOID *Buffer, IN UINTN Size, IN UINT8 Value ); -VOID +VOID EFIAPI CopyMem ( IN VOID *Dest, - IN CONST VOID *Src, + IN VOID *Src, IN UINTN len ); diff --git a/lib/misc.c b/lib/misc.c index 78d61fc..1d2e241 100644 --- a/lib/misc.c +++ b/lib/misc.c @@ -98,7 +98,7 @@ ZeroMem ( RtZeroMem (Buffer, Size); } -VOID +VOID EFIAPI SetMem ( IN VOID *Buffer, IN UINTN Size, @@ -108,10 +108,10 @@ SetMem ( RtSetMem (Buffer, Size, Value); } -VOID +VOID EFIAPI CopyMem ( IN VOID *Dest, - IN CONST VOID *Src, + IN VOID *Src, IN UINTN len ) { diff --git a/lib/str.c b/lib/str.c index b9b156b..a2f8750 100644 --- a/lib/str.c +++ b/lib/str.c @@ -205,7 +205,7 @@ StrDuplicate ( Size = StrSize(Src); Dest = AllocatePool (Size); if (Dest) { - CopyMem (Dest, Src, Size); + CopyMem (Dest, (void *)Src, Size); } return Dest; } From 93b2524a968d145d611b9c7dab3738950a7155c4 Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Wed, 4 Aug 2021 12:19:38 -0400 Subject: [PATCH 4/6] Add some missing definitions for system table revisions Signed-off-by: Peter Jones --- inc/efiapi.h | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/inc/efiapi.h b/inc/efiapi.h index 01a0938..f51c0cd 100644 --- a/inc/efiapi.h +++ b/inc/efiapi.h @@ -771,6 +771,8 @@ typedef struct _EFI_TABLE_HEADER { // #define EFI_RUNTIME_SERVICES_SIGNATURE 0x56524553544e5552 +#define EFI_1_10_RUNTIME_SERVICES_REVISION ((1<<16) | (10)) +#define EFI_2_00_RUNTIME_SERVICES_REVISION ((2<<16) | (0)) #define EFI_RUNTIME_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) typedef struct { @@ -818,6 +820,8 @@ typedef struct { // #define EFI_BOOT_SERVICES_SIGNATURE 0x56524553544f4f42 +#define EFI_1_10_BOOT_SERVICES_REVISION ((1<<16) | (10)) +#define EFI_2_00_BOOT_SERVICES_REVISION ((2<<16) | (0)) #define EFI_BOOT_SERVICES_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) typedef struct _EFI_BOOT_SERVICES { @@ -960,6 +964,9 @@ typedef struct _EFI_CONFIGURATION_TABLE { #define EFI_SYSTEM_TABLE_SIGNATURE 0x5453595320494249 +#define EFI_1_02_SYSTEM_TABLE_REVISION ((1<<16) | (02)) +#define EFI_1_10_SYSTEM_TABLE_REVISION ((1<<16) | (10)) +#define EFI_2_00_SYSTEM_TABLE_REVISION ((2<<16) | (0)) #define EFI_SYSTEM_TABLE_REVISION (EFI_SPECIFICATION_MAJOR_REVISION<<16) | (EFI_SPECIFICATION_MINOR_REVISION) typedef struct _EFI_SYSTEM_TABLE { From 6ba063ff00b77ac1d3451e46f200ff6826efa5ac Mon Sep 17 00:00:00 2001 From: Peter Jones Date: Thu, 22 Jul 2021 09:24:05 -0400 Subject: [PATCH 5/6] Add missing EFI_VARIABLE_... definition. This adds the definition for EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS. Signed-off-by: Peter Jones --- inc/efiapi.h | 1 + 1 file changed, 1 insertion(+) diff --git a/inc/efiapi.h b/inc/efiapi.h index f51c0cd..1f2f479 100644 --- a/inc/efiapi.h +++ b/inc/efiapi.h @@ -229,6 +229,7 @@ VOID #define EFI_VARIABLE_AUTHENTICATED_WRITE_ACCESS 0x00000010 #define EFI_VARIABLE_TIME_BASED_AUTHENTICATED_WRITE_ACCESS 0x00000020 #define EFI_VARIABLE_APPEND_WRITE 0x00000040 +#define EFI_VARIABLE_ENHANCED_AUTHENTICATED_ACCESS 0x00000080 // Variable size limitation #define EFI_MAXIMUM_VARIABLE_SIZE 1024 From cd78649395a16692d5bac0faaa91ac1aa2dca908 Mon Sep 17 00:00:00 2001 From: Callum Farmer Date: Thu, 6 Jul 2023 19:16:32 +0100 Subject: [PATCH 6/6] ARM32: Only use 4K pages Turns out some linkers have set page size to 64K on ARM32 aswell so apply the same fix as ARM64 Signed-off-by: Callum Farmer --- Make.defaults | 2 +- gnuefi/elf_arm_efi.lds | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Make.defaults b/Make.defaults index 5e6d2a0..f424b79 100755 --- a/Make.defaults +++ b/Make.defaults @@ -172,7 +172,7 @@ ifeq ($(ARCH),arm) CFLAGS += -marm endif -ifeq ($(ARCH),aarch64) +ifneq (,$(filter $(ARCH),aarch64 arm)) LDFLAGS += -z common-page-size=4096 LDFLAGS += -z max-page-size=4096 endif diff --git a/gnuefi/elf_arm_efi.lds b/gnuefi/elf_arm_efi.lds index cae55ea..ec09eb0 100644 --- a/gnuefi/elf_arm_efi.lds +++ b/gnuefi/elf_arm_efi.lds @@ -27,7 +27,7 @@ SECTIONS } =0 _reloc_vsize = _evreloc - _reloc; _reloc_size = _ereloc - _reloc; - . = ALIGN(4096); + . = ALIGN(65536); _data = .; .dynamic : { *(.dynamic) } . = ALIGN(4096);