diff options
Diffstat (limited to 'arch/x86/platform/efi')
| -rw-r--r-- | arch/x86/platform/efi/efi-bgrt.c | 12 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 25 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_32.c | 6 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_64.c | 9 |
4 files changed, 44 insertions, 8 deletions
diff --git a/arch/x86/platform/efi/efi-bgrt.c b/arch/x86/platform/efi/efi-bgrt.c index 7145ec63c520..f15103dff4b4 100644 --- a/arch/x86/platform/efi/efi-bgrt.c +++ b/arch/x86/platform/efi/efi-bgrt.c | |||
| @@ -42,14 +42,15 @@ void __init efi_bgrt_init(void) | |||
| 42 | 42 | ||
| 43 | if (bgrt_tab->header.length < sizeof(*bgrt_tab)) | 43 | if (bgrt_tab->header.length < sizeof(*bgrt_tab)) |
| 44 | return; | 44 | return; |
| 45 | if (bgrt_tab->version != 1) | 45 | if (bgrt_tab->version != 1 || bgrt_tab->status != 1) |
| 46 | return; | 46 | return; |
| 47 | if (bgrt_tab->image_type != 0 || !bgrt_tab->image_address) | 47 | if (bgrt_tab->image_type != 0 || !bgrt_tab->image_address) |
| 48 | return; | 48 | return; |
| 49 | 49 | ||
| 50 | image = efi_lookup_mapped_addr(bgrt_tab->image_address); | 50 | image = efi_lookup_mapped_addr(bgrt_tab->image_address); |
| 51 | if (!image) { | 51 | if (!image) { |
| 52 | image = ioremap(bgrt_tab->image_address, sizeof(bmp_header)); | 52 | image = early_memremap(bgrt_tab->image_address, |
| 53 | sizeof(bmp_header)); | ||
| 53 | ioremapped = true; | 54 | ioremapped = true; |
| 54 | if (!image) | 55 | if (!image) |
| 55 | return; | 56 | return; |
| @@ -57,7 +58,7 @@ void __init efi_bgrt_init(void) | |||
| 57 | 58 | ||
| 58 | memcpy_fromio(&bmp_header, image, sizeof(bmp_header)); | 59 | memcpy_fromio(&bmp_header, image, sizeof(bmp_header)); |
| 59 | if (ioremapped) | 60 | if (ioremapped) |
| 60 | iounmap(image); | 61 | early_iounmap(image, sizeof(bmp_header)); |
| 61 | bgrt_image_size = bmp_header.size; | 62 | bgrt_image_size = bmp_header.size; |
| 62 | 63 | ||
| 63 | bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL); | 64 | bgrt_image = kmalloc(bgrt_image_size, GFP_KERNEL); |
| @@ -65,7 +66,8 @@ void __init efi_bgrt_init(void) | |||
| 65 | return; | 66 | return; |
| 66 | 67 | ||
| 67 | if (ioremapped) { | 68 | if (ioremapped) { |
| 68 | image = ioremap(bgrt_tab->image_address, bmp_header.size); | 69 | image = early_memremap(bgrt_tab->image_address, |
| 70 | bmp_header.size); | ||
| 69 | if (!image) { | 71 | if (!image) { |
| 70 | kfree(bgrt_image); | 72 | kfree(bgrt_image); |
| 71 | bgrt_image = NULL; | 73 | bgrt_image = NULL; |
| @@ -75,5 +77,5 @@ void __init efi_bgrt_init(void) | |||
| 75 | 77 | ||
| 76 | memcpy_fromio(bgrt_image, image, bgrt_image_size); | 78 | memcpy_fromio(bgrt_image, image, bgrt_image_size); |
| 77 | if (ioremapped) | 79 | if (ioremapped) |
| 78 | iounmap(image); | 80 | early_iounmap(image, bmp_header.size); |
| 79 | } | 81 | } |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index d62ec87a2b26..b97acecf3fd9 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -52,6 +52,7 @@ | |||
| 52 | #include <asm/tlbflush.h> | 52 | #include <asm/tlbflush.h> |
| 53 | #include <asm/x86_init.h> | 53 | #include <asm/x86_init.h> |
| 54 | #include <asm/rtc.h> | 54 | #include <asm/rtc.h> |
| 55 | #include <asm/uv/uv.h> | ||
| 55 | 56 | ||
| 56 | #define EFI_DEBUG | 57 | #define EFI_DEBUG |
| 57 | 58 | ||
| @@ -792,7 +793,7 @@ void __init efi_set_executable(efi_memory_desc_t *md, bool executable) | |||
| 792 | set_memory_nx(addr, npages); | 793 | set_memory_nx(addr, npages); |
| 793 | } | 794 | } |
| 794 | 795 | ||
| 795 | static void __init runtime_code_page_mkexec(void) | 796 | void __init runtime_code_page_mkexec(void) |
| 796 | { | 797 | { |
| 797 | efi_memory_desc_t *md; | 798 | efi_memory_desc_t *md; |
| 798 | void *p; | 799 | void *p; |
| @@ -1069,8 +1070,7 @@ void __init efi_enter_virtual_mode(void) | |||
| 1069 | efi.update_capsule = virt_efi_update_capsule; | 1070 | efi.update_capsule = virt_efi_update_capsule; |
| 1070 | efi.query_capsule_caps = virt_efi_query_capsule_caps; | 1071 | efi.query_capsule_caps = virt_efi_query_capsule_caps; |
| 1071 | 1072 | ||
| 1072 | if (efi_enabled(EFI_OLD_MEMMAP) && (__supported_pte_mask & _PAGE_NX)) | 1073 | efi_runtime_mkexec(); |
| 1073 | runtime_code_page_mkexec(); | ||
| 1074 | 1074 | ||
| 1075 | kfree(new_memmap); | 1075 | kfree(new_memmap); |
| 1076 | 1076 | ||
| @@ -1211,3 +1211,22 @@ static int __init parse_efi_cmdline(char *str) | |||
| 1211 | return 0; | 1211 | return 0; |
| 1212 | } | 1212 | } |
| 1213 | early_param("efi", parse_efi_cmdline); | 1213 | early_param("efi", parse_efi_cmdline); |
| 1214 | |||
| 1215 | void __init efi_apply_memmap_quirks(void) | ||
| 1216 | { | ||
| 1217 | /* | ||
| 1218 | * Once setup is done earlier, unmap the EFI memory map on mismatched | ||
| 1219 | * firmware/kernel architectures since there is no support for runtime | ||
| 1220 | * services. | ||
| 1221 | */ | ||
| 1222 | if (!efi_is_native()) { | ||
| 1223 | pr_info("efi: Setup done, disabling due to 32/64-bit mismatch\n"); | ||
| 1224 | efi_unmap_memmap(); | ||
| 1225 | } | ||
| 1226 | |||
| 1227 | /* | ||
| 1228 | * UV doesn't support the new EFI pagetable mapping yet. | ||
| 1229 | */ | ||
| 1230 | if (is_uv_system()) | ||
| 1231 | set_bit(EFI_OLD_MEMMAP, &x86_efi_facility); | ||
| 1232 | } | ||
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index 249b183cf417..0b74cdf7f816 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
| @@ -77,3 +77,9 @@ void efi_call_phys_epilog(void) | |||
| 77 | 77 | ||
| 78 | local_irq_restore(efi_rt_eflags); | 78 | local_irq_restore(efi_rt_eflags); |
| 79 | } | 79 | } |
| 80 | |||
| 81 | void __init efi_runtime_mkexec(void) | ||
| 82 | { | ||
| 83 | if (__supported_pte_mask & _PAGE_NX) | ||
| 84 | runtime_code_page_mkexec(); | ||
| 85 | } | ||
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 6284f158a47d..0c2a234fef1e 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -233,3 +233,12 @@ void __init parse_efi_setup(u64 phys_addr, u32 data_len) | |||
| 233 | { | 233 | { |
| 234 | efi_setup = phys_addr + sizeof(struct setup_data); | 234 | efi_setup = phys_addr + sizeof(struct setup_data); |
| 235 | } | 235 | } |
| 236 | |||
| 237 | void __init efi_runtime_mkexec(void) | ||
| 238 | { | ||
| 239 | if (!efi_enabled(EFI_OLD_MEMMAP)) | ||
| 240 | return; | ||
| 241 | |||
| 242 | if (__supported_pte_mask & _PAGE_NX) | ||
| 243 | runtime_code_page_mkexec(); | ||
| 244 | } | ||
