diff options
| author | Mathias Krause <minipli@googlemail.com> | 2014-09-07 13:42:17 -0400 |
|---|---|---|
| committer | Matt Fleming <matt.fleming@intel.com> | 2014-10-03 13:41:03 -0400 |
| commit | 4e78eb056136b002ecdfbbf61436fedfb8a3c76b (patch) | |
| tree | 7e54b0cc762ebb12ae3d79830803f21be205383c | |
| parent | 0ce4605c9aa7b9c25bb4d117eb07db67cd7f1991 (diff) | |
x86/efi: Mark initialization code as such
The 32 bit and 64 bit implementations differ in their __init annotations
for some functions referenced from the common EFI code. Namely, the 32
bit variant is missing some of the __init annotations the 64 bit variant
has.
To solve the colliding annotations, mark the corresponding functions in
efi_32.c as initialization code, too -- as it is such.
Actually, quite a few more functions are only used during initialization
and therefore can be marked __init. They are therefore annotated, too.
Also add the __init annotation to the prototypes in the efi.h header so
users of those functions will see it's meant as initialization code
only.
This patch also fixes the "prelog" typo. ("prologue" / "epilogue" might
be more appropriate but this is C code after all, not an opera! :D)
Signed-off-by: Mathias Krause <minipli@googlemail.com>
Signed-off-by: Matt Fleming <matt.fleming@intel.com>
| -rw-r--r-- | arch/x86/include/asm/efi.h | 20 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi.c | 4 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_32.c | 12 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_64.c | 6 | ||||
| -rw-r--r-- | arch/x86/platform/efi/efi_stub_32.S | 4 |
5 files changed, 24 insertions, 22 deletions
diff --git a/arch/x86/include/asm/efi.h b/arch/x86/include/asm/efi.h index ce7b1c5ff78d..abba1fe1db5e 100644 --- a/arch/x86/include/asm/efi.h +++ b/arch/x86/include/asm/efi.h | |||
| @@ -81,25 +81,25 @@ extern u64 asmlinkage efi_call(void *fp, ...); | |||
| 81 | */ | 81 | */ |
| 82 | #define __efi_call_virt(f, args...) efi_call_virt(f, args) | 82 | #define __efi_call_virt(f, args...) efi_call_virt(f, args) |
| 83 | 83 | ||
| 84 | extern void __iomem *efi_ioremap(unsigned long addr, unsigned long size, | 84 | extern void __iomem *__init efi_ioremap(unsigned long addr, unsigned long size, |
| 85 | u32 type, u64 attribute); | 85 | u32 type, u64 attribute); |
| 86 | 86 | ||
| 87 | #endif /* CONFIG_X86_32 */ | 87 | #endif /* CONFIG_X86_32 */ |
| 88 | 88 | ||
| 89 | #define efi_in_nmi() in_nmi() | 89 | #define efi_in_nmi() in_nmi() |
| 90 | 90 | ||
| 91 | extern struct efi_scratch efi_scratch; | 91 | extern struct efi_scratch efi_scratch; |
| 92 | extern void efi_set_executable(efi_memory_desc_t *md, bool executable); | 92 | extern void __init efi_set_executable(efi_memory_desc_t *md, bool executable); |
| 93 | extern int efi_memblock_x86_reserve_range(void); | 93 | extern int __init efi_memblock_x86_reserve_range(void); |
| 94 | extern void efi_call_phys_prelog(void); | 94 | extern void __init efi_call_phys_prolog(void); |
| 95 | extern void efi_call_phys_epilog(void); | 95 | extern void __init efi_call_phys_epilog(void); |
| 96 | extern void efi_unmap_memmap(void); | 96 | extern void __init efi_unmap_memmap(void); |
| 97 | extern void efi_memory_uc(u64 addr, unsigned long size); | 97 | extern void __init efi_memory_uc(u64 addr, unsigned long size); |
| 98 | extern void __init efi_map_region(efi_memory_desc_t *md); | 98 | extern void __init efi_map_region(efi_memory_desc_t *md); |
| 99 | extern void __init efi_map_region_fixed(efi_memory_desc_t *md); | 99 | extern void __init efi_map_region_fixed(efi_memory_desc_t *md); |
| 100 | extern void efi_sync_low_kernel_mappings(void); | 100 | extern void efi_sync_low_kernel_mappings(void); |
| 101 | extern int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages); | 101 | extern int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages); |
| 102 | extern void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages); | 102 | extern void __init efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages); |
| 103 | extern void __init old_map_region(efi_memory_desc_t *md); | 103 | extern void __init old_map_region(efi_memory_desc_t *md); |
| 104 | extern void __init runtime_code_page_mkexec(void); | 104 | extern void __init runtime_code_page_mkexec(void); |
| 105 | extern void __init efi_runtime_mkexec(void); | 105 | extern void __init efi_runtime_mkexec(void); |
diff --git a/arch/x86/platform/efi/efi.c b/arch/x86/platform/efi/efi.c index 1bc2c878e42e..dbc8627a5cdf 100644 --- a/arch/x86/platform/efi/efi.c +++ b/arch/x86/platform/efi/efi.c | |||
| @@ -86,7 +86,7 @@ static efi_status_t __init phys_efi_set_virtual_address_map( | |||
| 86 | { | 86 | { |
| 87 | efi_status_t status; | 87 | efi_status_t status; |
| 88 | 88 | ||
| 89 | efi_call_phys_prelog(); | 89 | efi_call_phys_prolog(); |
| 90 | status = efi_call_phys(efi_phys.set_virtual_address_map, | 90 | status = efi_call_phys(efi_phys.set_virtual_address_map, |
| 91 | memory_map_size, descriptor_size, | 91 | memory_map_size, descriptor_size, |
| 92 | descriptor_version, virtual_map); | 92 | descriptor_version, virtual_map); |
| @@ -530,7 +530,7 @@ void __init runtime_code_page_mkexec(void) | |||
| 530 | } | 530 | } |
| 531 | } | 531 | } |
| 532 | 532 | ||
| 533 | void efi_memory_uc(u64 addr, unsigned long size) | 533 | void __init efi_memory_uc(u64 addr, unsigned long size) |
| 534 | { | 534 | { |
| 535 | unsigned long page_shift = 1UL << EFI_PAGE_SHIFT; | 535 | unsigned long page_shift = 1UL << EFI_PAGE_SHIFT; |
| 536 | u64 npages; | 536 | u64 npages; |
diff --git a/arch/x86/platform/efi/efi_32.c b/arch/x86/platform/efi/efi_32.c index 9ee3491e31fb..40e7cda52936 100644 --- a/arch/x86/platform/efi/efi_32.c +++ b/arch/x86/platform/efi/efi_32.c | |||
| @@ -33,7 +33,7 @@ | |||
| 33 | 33 | ||
| 34 | /* | 34 | /* |
| 35 | * To make EFI call EFI runtime service in physical addressing mode we need | 35 | * To make EFI call EFI runtime service in physical addressing mode we need |
| 36 | * prelog/epilog before/after the invocation to disable interrupt, to | 36 | * prolog/epilog before/after the invocation to disable interrupt, to |
| 37 | * claim EFI runtime service handler exclusively and to duplicate a memory in | 37 | * claim EFI runtime service handler exclusively and to duplicate a memory in |
| 38 | * low memory space say 0 - 3G. | 38 | * low memory space say 0 - 3G. |
| 39 | */ | 39 | */ |
| @@ -41,11 +41,13 @@ static unsigned long efi_rt_eflags; | |||
| 41 | 41 | ||
| 42 | void efi_sync_low_kernel_mappings(void) {} | 42 | void efi_sync_low_kernel_mappings(void) {} |
| 43 | void __init efi_dump_pagetable(void) {} | 43 | void __init efi_dump_pagetable(void) {} |
| 44 | int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | 44 | int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) |
| 45 | { | 45 | { |
| 46 | return 0; | 46 | return 0; |
| 47 | } | 47 | } |
| 48 | void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) {} | 48 | void __init efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) |
| 49 | { | ||
| 50 | } | ||
| 49 | 51 | ||
| 50 | void __init efi_map_region(efi_memory_desc_t *md) | 52 | void __init efi_map_region(efi_memory_desc_t *md) |
| 51 | { | 53 | { |
| @@ -55,7 +57,7 @@ void __init efi_map_region(efi_memory_desc_t *md) | |||
| 55 | void __init efi_map_region_fixed(efi_memory_desc_t *md) {} | 57 | void __init efi_map_region_fixed(efi_memory_desc_t *md) {} |
| 56 | void __init parse_efi_setup(u64 phys_addr, u32 data_len) {} | 58 | void __init parse_efi_setup(u64 phys_addr, u32 data_len) {} |
| 57 | 59 | ||
| 58 | void efi_call_phys_prelog(void) | 60 | void __init efi_call_phys_prolog(void) |
| 59 | { | 61 | { |
| 60 | struct desc_ptr gdt_descr; | 62 | struct desc_ptr gdt_descr; |
| 61 | 63 | ||
| @@ -69,7 +71,7 @@ void efi_call_phys_prelog(void) | |||
| 69 | load_gdt(&gdt_descr); | 71 | load_gdt(&gdt_descr); |
| 70 | } | 72 | } |
| 71 | 73 | ||
| 72 | void efi_call_phys_epilog(void) | 74 | void __init efi_call_phys_epilog(void) |
| 73 | { | 75 | { |
| 74 | struct desc_ptr gdt_descr; | 76 | struct desc_ptr gdt_descr; |
| 75 | 77 | ||
diff --git a/arch/x86/platform/efi/efi_64.c b/arch/x86/platform/efi/efi_64.c index 290d397e1dd9..35aecb6042fb 100644 --- a/arch/x86/platform/efi/efi_64.c +++ b/arch/x86/platform/efi/efi_64.c | |||
| @@ -79,7 +79,7 @@ static void __init early_code_mapping_set_exec(int executable) | |||
| 79 | } | 79 | } |
| 80 | } | 80 | } |
| 81 | 81 | ||
| 82 | void __init efi_call_phys_prelog(void) | 82 | void __init efi_call_phys_prolog(void) |
| 83 | { | 83 | { |
| 84 | unsigned long vaddress; | 84 | unsigned long vaddress; |
| 85 | int pgd; | 85 | int pgd; |
| @@ -139,7 +139,7 @@ void efi_sync_low_kernel_mappings(void) | |||
| 139 | sizeof(pgd_t) * num_pgds); | 139 | sizeof(pgd_t) * num_pgds); |
| 140 | } | 140 | } |
| 141 | 141 | ||
| 142 | int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | 142 | int __init efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) |
| 143 | { | 143 | { |
| 144 | unsigned long text; | 144 | unsigned long text; |
| 145 | struct page *page; | 145 | struct page *page; |
| @@ -192,7 +192,7 @@ int efi_setup_page_tables(unsigned long pa_memmap, unsigned num_pages) | |||
| 192 | return 0; | 192 | return 0; |
| 193 | } | 193 | } |
| 194 | 194 | ||
| 195 | void efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) | 195 | void __init efi_cleanup_page_tables(unsigned long pa_memmap, unsigned num_pages) |
| 196 | { | 196 | { |
| 197 | pgd_t *pgd = (pgd_t *)__va(real_mode_header->trampoline_pgd); | 197 | pgd_t *pgd = (pgd_t *)__va(real_mode_header->trampoline_pgd); |
| 198 | 198 | ||
diff --git a/arch/x86/platform/efi/efi_stub_32.S b/arch/x86/platform/efi/efi_stub_32.S index fbe66e626c09..040192b50d02 100644 --- a/arch/x86/platform/efi/efi_stub_32.S +++ b/arch/x86/platform/efi/efi_stub_32.S | |||
| @@ -27,13 +27,13 @@ ENTRY(efi_call_phys) | |||
| 27 | * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found | 27 | * set to 0x0010, DS and SS have been set to 0x0018. In EFI, I found |
| 28 | * the values of these registers are the same. And, the corresponding | 28 | * the values of these registers are the same. And, the corresponding |
| 29 | * GDT entries are identical. So I will do nothing about segment reg | 29 | * GDT entries are identical. So I will do nothing about segment reg |
| 30 | * and GDT, but change GDT base register in prelog and epilog. | 30 | * and GDT, but change GDT base register in prolog and epilog. |
| 31 | */ | 31 | */ |
| 32 | 32 | ||
| 33 | /* | 33 | /* |
| 34 | * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET. | 34 | * 1. Now I am running with EIP = <physical address> + PAGE_OFFSET. |
| 35 | * But to make it smoothly switch from virtual mode to flat mode. | 35 | * But to make it smoothly switch from virtual mode to flat mode. |
| 36 | * The mapping of lower virtual memory has been created in prelog and | 36 | * The mapping of lower virtual memory has been created in prolog and |
| 37 | * epilog. | 37 | * epilog. |
| 38 | */ | 38 | */ |
| 39 | movl $1f, %edx | 39 | movl $1f, %edx |
