diff --git a/cmd/efi_common.c b/cmd/efi_common.c index 904747c5b32..e57835d3bae 100644 --- a/cmd/efi_common.c +++ b/cmd/efi_common.c @@ -58,6 +58,7 @@ static const struct efi_mem_attrs { {EFI_MEMORY_SP, "SP"}, {EFI_MEMORY_CPU_CRYPTO, "CRYPT"}, {EFI_MEMORY_HOT_PLUGGABLE, "HOTPL"}, + {EFI_MEMORY_ISA_VALID, "ISA_VALID"}, {EFI_MEMORY_RUNTIME, "RT"}, }; @@ -91,13 +92,16 @@ static const char *efi_mem_type_name(u32 type) * efi_print_mem_attrs() - print the names of set EFI memory attributes * * Prints the set attribute bits as a '|'-separated list of mnemonics, - * e.g. ' UC|WB|RT', preceded by a space. Prints nothing if no known - * attribute bit is set. + * e.g. ' UC|WB|RT', preceded by a space. When EFI_MEMORY_ISA_VALID is + * set, the EFI_MEMORY_ISA_MASK field is printed as ISA=. Bits + * that have no mnemonic are printed as a hexadecimal value so that + * invalid or not yet known attributes are never dropped silently. * * @attributes: memory attributes (EFI_MEMORY_...) */ static void efi_print_mem_attrs(u64 attributes) { + u64 unknown = attributes; int sep, i; for (sep = 0, i = 0; i < ARRAY_SIZE(efi_mem_attrs); i++) @@ -109,7 +113,19 @@ static void efi_print_mem_attrs(u64 attributes) sep = 1; } puts(efi_mem_attrs[i].text); + unknown &= ~efi_mem_attrs[i].bit; } + + if (attributes & EFI_MEMORY_ISA_VALID) { + printf("%sISA=0x%llx", sep ? "|" : " ", + (attributes & EFI_MEMORY_ISA_MASK) >> + EFI_MEMORY_ISA_SHIFT); + sep = 1; + unknown &= ~EFI_MEMORY_ISA_MASK; + } + + if (unknown) + printf("%s0x%llx", sep ? "|" : " ", unknown); } void efi_show_memmap(struct efi_mem_desc *map, efi_uintn_t map_size, diff --git a/doc/usage/cmd/efi.rst b/doc/usage/cmd/efi.rst index 3ccdbe9410c..62a2638feca 100644 --- a/doc/usage/cmd/efi.rst +++ b/doc/usage/cmd/efi.rst @@ -45,7 +45,10 @@ Start, End Attributes The attributes of the region as a '|'-separated list of mnemonics, - e.g. UC for EFI_MEMORY_UC and RT for EFI_MEMORY_RUNTIME. + e.g. UC for EFI_MEMORY_UC and RT for EFI_MEMORY_RUNTIME. When the + region carries ISA-specific attributes (EFI_MEMORY_ISA_VALID is set), + the ISA-specific field is shown as ISA=. Attribute bits without + a mnemonic are shown as a hexadecimal value. efi tables ~~~~~~~~~~ diff --git a/include/efi.h b/include/efi.h index 71234d1b6fe..a4c21d7681d 100644 --- a/include/efi.h +++ b/include/efi.h @@ -268,6 +268,9 @@ enum efi_memory_type { #define EFI_MEMORY_CPU_CRYPTO ((u64)0x0000000000080000ULL) /* cryptographically protectable */ #define EFI_MEMORY_HOT_PLUGGABLE \ ((u64)0x0000000000100000ULL) /* hot pluggable */ +#define EFI_MEMORY_ISA_MASK ((u64)0x0FFFF00000000000ULL) /* ISA-specific attributes */ +#define EFI_MEMORY_ISA_SHIFT 44 +#define EFI_MEMORY_ISA_VALID ((u64)0x4000000000000000ULL) /* ISA_MASK field is valid */ #define EFI_MEMORY_RUNTIME ((u64)0x8000000000000000ULL) /* range requires runtime mapping */ #define EFI_MEM_DESC_VERSION 1 @@ -686,7 +689,9 @@ void efi_show_tables(struct efi_system_table *systab); * * Prints one line per descriptor with the memory type name, the physical * start and end address and the attributes as a '|'-separated list of - * mnemonics. + * mnemonics. The ISA-specific attribute field is printed as ISA= + * when EFI_MEMORY_ISA_VALID is set, and any remaining bits without a + * mnemonic are printed as a hexadecimal value. * * The virtual addresses of the descriptors are not shown: the map is * identity mapped before SetVirtualAddressMap() is called, so the field