|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] EFI: always map EfiRuntimeServices{Code,Data}
commit e3abdc626a732c780f54c783075694c3f951edae
Author: Sergey Temerkhanov <s.temerkhanov@xxxxxxxxx>
AuthorDate: Wed Feb 2 10:24:56 2022 +0100
Commit: Jan Beulich <jbeulich@xxxxxxxx>
CommitDate: Wed Feb 2 10:24:56 2022 +0100
EFI: always map EfiRuntimeServices{Code,Data}
This helps overcome problems observed with some UEFI implementations
which don't set the Attributes field in memery descriptors properly.
Signed-off-by: Sergey Temerkhanov <s.temerkhanov@xxxxxxxxx>
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
Reviewed-by: Luca Fancellu <luca.fancellu@xxxxxxx>
Tested-by: Luca Fancellu <luca.fancellu@xxxxxxx>
Reviewed-by: Julien Grall <jgrall@xxxxxxxxxx>
---
xen/common/efi/boot.c | 41 +++++++++++++++++++++++++++++++++++------
1 file changed, 35 insertions(+), 6 deletions(-)
diff --git a/xen/common/efi/boot.c b/xen/common/efi/boot.c
index 5ceb535ad0..12fd0844bd 100644
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -1094,7 +1094,13 @@ static void __init efi_exit_boot(EFI_HANDLE ImageHandle,
EFI_SYSTEM_TABLE *Syste
{
EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
- if ( desc->Attribute & EFI_MEMORY_RUNTIME )
+ /*
+ * Runtime services regions are always mapped here.
+ * Attributes may be adjusted in efi_init_memory().
+ */
+ if ( (desc->Attribute & EFI_MEMORY_RUNTIME) ||
+ desc->Type == EfiRuntimeServicesCode ||
+ desc->Type == EfiRuntimeServicesData )
desc->VirtualStart = desc->PhysicalStart;
else
desc->VirtualStart = INVALID_VIRTUAL_ADDRESS;
@@ -1545,13 +1551,36 @@ void __init efi_init_memory(void)
ROUNDUP(desc->PhysicalStart + len, PAGE_SIZE));
}
- if ( !efi_enabled(EFI_RS) ||
- (!(desc->Attribute & EFI_MEMORY_RUNTIME) &&
- (!map_bs ||
- (desc->Type != EfiBootServicesCode &&
- desc->Type != EfiBootServicesData))) )
+ if ( !efi_enabled(EFI_RS) )
continue;
+ if ( !(desc->Attribute & EFI_MEMORY_RUNTIME) )
+ {
+ switch ( desc->Type )
+ {
+ default:
+ continue;
+
+ /*
+ * Adjust runtime services regions. Keep in sync with
+ * efi_exit_boot().
+ */
+ case EfiRuntimeServicesCode:
+ case EfiRuntimeServicesData:
+ printk(XENLOG_WARNING
+ "Setting RUNTIME attribute for %013" PRIx64 "-%013"
PRIx64 "\n",
+ desc->PhysicalStart, desc->PhysicalStart + len - 1);
+ desc->Attribute |= EFI_MEMORY_RUNTIME;
+ break;
+
+ case EfiBootServicesCode:
+ case EfiBootServicesData:
+ if ( !map_bs )
+ continue;
+ break;
+ }
+ }
+
desc->VirtualStart = INVALID_VIRTUAL_ADDRESS;
smfn = PFN_DOWN(desc->PhysicalStart);
--
generated by git-patchbot for /home/xen/git/xen.git#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |