|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH v4] EFI: always map EfiRuntimeServices{Code,Data}
From: Sergey Temerkhanov <s.temerkhanov@xxxxxxxxx>
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>
---
v4: Drop EFI_MEMORY_CACHEABILITY_MASK. Fold with pre-existing if() (into
switch()). Style.
---
I guess "map_bs" would also want honoring in efi_exit_boot(), but that's
yet another patch then I suppose.
--- a/xen/common/efi/boot.c
+++ b/xen/common/efi/boot.c
@@ -1094,7 +1094,13 @@ static void __init efi_exit_boot(EFI_HAN
{
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);
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |