Commit abc93f8e authored by Daniel Kiper's avatar Daniel Kiper Committed by Matt Fleming

efi: Use early_mem*() instead of early_io*()

Use early_mem*() instead of early_io*() because all mapped EFI regions
are memory (usually RAM but they could also be ROM, EPROM, EEPROM, flash,
etc.) not I/O regions. Additionally, I/O family calls do not work correctly
under Xen in our case. early_ioremap() skips the PFN to MFN conversion
when building the PTE. Using it for memory will attempt to map the wrong
machine frame. However, all artificial EFI structures created under Xen
live in dom0 memory and should be mapped/unmapped using early_mem*() family
calls which map domain memory.
Signed-off-by: default avatarDaniel Kiper <daniel.kiper@oracle.com>
Cc: Leif Lindholm <leif.lindholm@linaro.org>
Cc: Mark Salter <msalter@redhat.com>
Signed-off-by: default avatarMatt Fleming <matt.fleming@intel.com>
parent 4fa62481
...@@ -256,7 +256,7 @@ void __init efi_unmap_memmap(void) ...@@ -256,7 +256,7 @@ void __init efi_unmap_memmap(void)
{ {
clear_bit(EFI_MEMMAP, &efi.flags); clear_bit(EFI_MEMMAP, &efi.flags);
if (memmap.map) { if (memmap.map) {
early_iounmap(memmap.map, memmap.nr_map * memmap.desc_size); early_memunmap(memmap.map, memmap.nr_map * memmap.desc_size);
memmap.map = NULL; memmap.map = NULL;
} }
} }
...@@ -273,12 +273,12 @@ static int __init efi_systab_init(void *phys) ...@@ -273,12 +273,12 @@ static int __init efi_systab_init(void *phys)
if (!data) if (!data)
return -ENOMEM; return -ENOMEM;
} }
systab64 = early_ioremap((unsigned long)phys, systab64 = early_memremap((unsigned long)phys,
sizeof(*systab64)); sizeof(*systab64));
if (systab64 == NULL) { if (systab64 == NULL) {
pr_err("Couldn't map the system table!\n"); pr_err("Couldn't map the system table!\n");
if (data) if (data)
early_iounmap(data, sizeof(*data)); early_memunmap(data, sizeof(*data));
return -ENOMEM; return -ENOMEM;
} }
...@@ -310,9 +310,9 @@ static int __init efi_systab_init(void *phys) ...@@ -310,9 +310,9 @@ static int __init efi_systab_init(void *phys)
systab64->tables; systab64->tables;
tmp |= data ? data->tables : systab64->tables; tmp |= data ? data->tables : systab64->tables;
early_iounmap(systab64, sizeof(*systab64)); early_memunmap(systab64, sizeof(*systab64));
if (data) if (data)
early_iounmap(data, sizeof(*data)); early_memunmap(data, sizeof(*data));
#ifdef CONFIG_X86_32 #ifdef CONFIG_X86_32
if (tmp >> 32) { if (tmp >> 32) {
pr_err("EFI data located above 4GB, disabling EFI.\n"); pr_err("EFI data located above 4GB, disabling EFI.\n");
...@@ -322,7 +322,7 @@ static int __init efi_systab_init(void *phys) ...@@ -322,7 +322,7 @@ static int __init efi_systab_init(void *phys)
} else { } else {
efi_system_table_32_t *systab32; efi_system_table_32_t *systab32;
systab32 = early_ioremap((unsigned long)phys, systab32 = early_memremap((unsigned long)phys,
sizeof(*systab32)); sizeof(*systab32));
if (systab32 == NULL) { if (systab32 == NULL) {
pr_err("Couldn't map the system table!\n"); pr_err("Couldn't map the system table!\n");
...@@ -343,7 +343,7 @@ static int __init efi_systab_init(void *phys) ...@@ -343,7 +343,7 @@ static int __init efi_systab_init(void *phys)
efi_systab.nr_tables = systab32->nr_tables; efi_systab.nr_tables = systab32->nr_tables;
efi_systab.tables = systab32->tables; efi_systab.tables = systab32->tables;
early_iounmap(systab32, sizeof(*systab32)); early_memunmap(systab32, sizeof(*systab32));
} }
efi.systab = &efi_systab; efi.systab = &efi_systab;
...@@ -369,7 +369,7 @@ static int __init efi_runtime_init32(void) ...@@ -369,7 +369,7 @@ static int __init efi_runtime_init32(void)
{ {
efi_runtime_services_32_t *runtime; efi_runtime_services_32_t *runtime;
runtime = early_ioremap((unsigned long)efi.systab->runtime, runtime = early_memremap((unsigned long)efi.systab->runtime,
sizeof(efi_runtime_services_32_t)); sizeof(efi_runtime_services_32_t));
if (!runtime) { if (!runtime) {
pr_err("Could not map the runtime service table!\n"); pr_err("Could not map the runtime service table!\n");
...@@ -384,7 +384,7 @@ static int __init efi_runtime_init32(void) ...@@ -384,7 +384,7 @@ static int __init efi_runtime_init32(void)
efi_phys.set_virtual_address_map = efi_phys.set_virtual_address_map =
(efi_set_virtual_address_map_t *) (efi_set_virtual_address_map_t *)
(unsigned long)runtime->set_virtual_address_map; (unsigned long)runtime->set_virtual_address_map;
early_iounmap(runtime, sizeof(efi_runtime_services_32_t)); early_memunmap(runtime, sizeof(efi_runtime_services_32_t));
return 0; return 0;
} }
...@@ -393,7 +393,7 @@ static int __init efi_runtime_init64(void) ...@@ -393,7 +393,7 @@ static int __init efi_runtime_init64(void)
{ {
efi_runtime_services_64_t *runtime; efi_runtime_services_64_t *runtime;
runtime = early_ioremap((unsigned long)efi.systab->runtime, runtime = early_memremap((unsigned long)efi.systab->runtime,
sizeof(efi_runtime_services_64_t)); sizeof(efi_runtime_services_64_t));
if (!runtime) { if (!runtime) {
pr_err("Could not map the runtime service table!\n"); pr_err("Could not map the runtime service table!\n");
...@@ -408,7 +408,7 @@ static int __init efi_runtime_init64(void) ...@@ -408,7 +408,7 @@ static int __init efi_runtime_init64(void)
efi_phys.set_virtual_address_map = efi_phys.set_virtual_address_map =
(efi_set_virtual_address_map_t *) (efi_set_virtual_address_map_t *)
(unsigned long)runtime->set_virtual_address_map; (unsigned long)runtime->set_virtual_address_map;
early_iounmap(runtime, sizeof(efi_runtime_services_64_t)); early_memunmap(runtime, sizeof(efi_runtime_services_64_t));
return 0; return 0;
} }
...@@ -439,7 +439,7 @@ static int __init efi_runtime_init(void) ...@@ -439,7 +439,7 @@ static int __init efi_runtime_init(void)
static int __init efi_memmap_init(void) static int __init efi_memmap_init(void)
{ {
/* Map the EFI memory map */ /* Map the EFI memory map */
memmap.map = early_ioremap((unsigned long)memmap.phys_map, memmap.map = early_memremap((unsigned long)memmap.phys_map,
memmap.nr_map * memmap.desc_size); memmap.nr_map * memmap.desc_size);
if (memmap.map == NULL) { if (memmap.map == NULL) {
pr_err("Could not map the memory map!\n"); pr_err("Could not map the memory map!\n");
...@@ -487,14 +487,14 @@ void __init efi_init(void) ...@@ -487,14 +487,14 @@ void __init efi_init(void)
/* /*
* Show what we know for posterity * Show what we know for posterity
*/ */
c16 = tmp = early_ioremap(efi.systab->fw_vendor, 2); c16 = tmp = early_memremap(efi.systab->fw_vendor, 2);
if (c16) { if (c16) {
for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i) for (i = 0; i < sizeof(vendor) - 1 && *c16; ++i)
vendor[i] = *c16++; vendor[i] = *c16++;
vendor[i] = '\0'; vendor[i] = '\0';
} else } else
pr_err("Could not map the firmware vendor!\n"); pr_err("Could not map the firmware vendor!\n");
early_iounmap(tmp, 2); early_memunmap(tmp, 2);
pr_info("EFI v%u.%.02u by %s\n", pr_info("EFI v%u.%.02u by %s\n",
efi.systab->hdr.revision >> 16, efi.systab->hdr.revision >> 16,
......
...@@ -298,7 +298,7 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables) ...@@ -298,7 +298,7 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables)
if (table64 >> 32) { if (table64 >> 32) {
pr_cont("\n"); pr_cont("\n");
pr_err("Table located above 4GB, disabling EFI.\n"); pr_err("Table located above 4GB, disabling EFI.\n");
early_iounmap(config_tables, early_memunmap(config_tables,
efi.systab->nr_tables * sz); efi.systab->nr_tables * sz);
return -EINVAL; return -EINVAL;
} }
...@@ -314,7 +314,7 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables) ...@@ -314,7 +314,7 @@ int __init efi_config_init(efi_config_table_type_t *arch_tables)
tablep += sz; tablep += sz;
} }
pr_cont("\n"); pr_cont("\n");
early_iounmap(config_tables, efi.systab->nr_tables * sz); early_memunmap(config_tables, efi.systab->nr_tables * sz);
set_bit(EFI_CONFIG_TABLES, &efi.flags); set_bit(EFI_CONFIG_TABLES, &efi.flags);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment