static SIMPLE_TEXT_OUTPUT_INTERFACE *__initdata StdErr;
static UINT32 __initdata mdesc_ver;
+static bool_t __initdata map_bs;
static struct file __initdata cfg;
static struct file __initdata kernel;
{
if ( wstrcmp(ptr + 1, L"basevideo") == 0 )
base_video = 1;
+ else if ( wstrcmp(ptr + 1, L"mapbs") == 0 )
+ map_bs = 1;
else if ( wstrncmp(ptr + 1, L"cfg=", 4) == 0 )
cfg_file_name = ptr + 5;
else if ( i + 1 < argc && wstrcmp(ptr + 1, L"cfg") == 0 )
{
PrintStr(L"Xen EFI Loader options:\r\n");
PrintStr(L"-basevideo retain current video mode\r\n");
+ PrintStr(L"-mapbs map EfiBootServices{Code,Data}\r\n");
PrintStr(L"-cfg=<file> specify configuration file\r\n");
PrintStr(L"-help, -? display this help\r\n");
blexit(NULL);
} *extra, *extra_head = NULL;
#endif
- printk(XENLOG_INFO "EFI memory map:\n");
+ printk(XENLOG_INFO "EFI memory map:%s\n",
+ map_bs ? " (mapping BootServices)" : "");
for ( i = 0; i < efi_memmap_size; i += efi_mdesc_size )
{
EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
desc->PhysicalStart, desc->PhysicalStart + len - 1,
desc->Type, desc->Attribute);
- if ( !efi_rs_enable || !(desc->Attribute & EFI_MEMORY_RUNTIME) )
+ if ( !efi_rs_enable ||
+ (!(desc->Attribute & EFI_MEMORY_RUNTIME) &&
+ (!map_bs ||
+ (desc->Type != EfiBootServicesCode &&
+ desc->Type != EfiBootServicesData))) )
continue;
desc->VirtualStart = INVALID_VIRTUAL_ADDRESS;
{
const EFI_MEMORY_DESCRIPTOR *desc = efi_memmap + i;
- if ( (desc->Attribute & EFI_MEMORY_RUNTIME) &&
+ if ( ((desc->Attribute & EFI_MEMORY_RUNTIME) ||
+ (map_bs &&
+ (desc->Type == EfiBootServicesCode ||
+ desc->Type == EfiBootServicesData))) &&
desc->VirtualStart != INVALID_VIRTUAL_ADDRESS &&
desc->VirtualStart != desc->PhysicalStart )
copy_mapping(PFN_DOWN(desc->PhysicalStart),