提交 8b2cb7a8 编写于 作者: H Huang, Ying 提交者: Ingo Molnar

x86: 32-bit EFI runtime service support: fixes in sync with 64-bit support

support according to fixes of x86_64 support.

- Delete efi_rt_lock because it is used during system early boot,
  before SMP is initialized.

- Change local_flush_tlb() to __flush_tlb_all() to flush global page
  mapping.

- Clean up includes.

- Revise Kconfig description.

- Enable noefi kernel parameter on i386.
Signed-off-by: NHuang Ying <ying.huang@intel.com>
Cc: Andi Kleen <ak@suse.de>
Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
Signed-off-by: NIngo Molnar <mingo@elte.hu>
Signed-off-by: NThomas Gleixner <tglx@linutronix.de>
上级 bfd074e0
...@@ -1169,6 +1169,8 @@ and is between 256 and 4096 characters. It is defined in the file ...@@ -1169,6 +1169,8 @@ and is between 256 and 4096 characters. It is defined in the file
nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects. nodisconnect [HW,SCSI,M68K] Disables SCSI disconnects.
noefi [X86-32,X86-64] Disable EFI runtime services support.
noexec [IA-64] noexec [IA-64]
noexec [X86-32,X86-64] noexec [X86-32,X86-64]
......
...@@ -306,8 +306,4 @@ Debugging ...@@ -306,8 +306,4 @@ Debugging
newfallback: use new unwinder but fall back to old if it gets newfallback: use new unwinder but fall back to old if it gets
stuck (default) stuck (default)
EFI
noefi Disable EFI support
Miscellaneous Miscellaneous
...@@ -961,21 +961,18 @@ config MTRR ...@@ -961,21 +961,18 @@ config MTRR
config EFI config EFI
def_bool n def_bool n
prompt "Boot from EFI support" prompt "EFI runtime service support"
depends on ACPI depends on ACPI
---help--- ---help---
This enables the kernel to boot on EFI platforms using This enables the kernel to use EFI runtime services that are
system configuration information passed to it from the firmware.
This also enables the kernel to use any EFI runtime services that are
available (such as the EFI variable services). available (such as the EFI variable services).
This option is only useful on systems that have EFI firmware This option is only useful on systems that have EFI firmware.
and will result in a kernel image that is ~8k larger. In addition, In addition, you should use the latest ELILO loader available
you must use the latest ELILO loader available at at <http://elilo.sourceforge.net> in order to take advantage
<http://elilo.sourceforge.net> in order to take advantage of of EFI runtime services. However, even with this option, the
kernel initialization using EFI information (neither GRUB nor LILO know resultant kernel should continue to boot on existing non-EFI
anything about EFI). However, even with this option, the resultant platforms.
kernel should continue to boot on existing non-EFI platforms.
config IRQBALANCE config IRQBALANCE
def_bool y def_bool y
......
...@@ -55,6 +55,13 @@ struct efi_memory_map memmap; ...@@ -55,6 +55,13 @@ struct efi_memory_map memmap;
struct efi efi_phys __initdata; struct efi efi_phys __initdata;
static efi_system_table_t efi_systab __initdata; static efi_system_table_t efi_systab __initdata;
static int __init setup_noefi(char *arg)
{
efi_enabled = 0;
return 0;
}
early_param("noefi", setup_noefi);
static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc) static efi_status_t virt_efi_get_time(efi_time_t *tm, efi_time_cap_t *tc)
{ {
return efi_call_virt2(get_time, tm, tc); return efi_call_virt2(get_time, tm, tc);
......
...@@ -20,27 +20,15 @@ ...@@ -20,27 +20,15 @@
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/init.h>
#include <linux/mm.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/time.h>
#include <linux/spinlock.h>
#include <linux/bootmem.h>
#include <linux/ioport.h> #include <linux/ioport.h>
#include <linux/module.h>
#include <linux/efi.h> #include <linux/efi.h>
#include <linux/kexec.h>
#include <asm/setup.h>
#include <asm/io.h> #include <asm/io.h>
#include <asm/page.h> #include <asm/page.h>
#include <asm/pgtable.h> #include <asm/pgtable.h>
#include <asm/processor.h>
#include <asm/desc.h>
#include <asm/tlbflush.h> #include <asm/tlbflush.h>
#define PFX "EFI: "
/* /*
* To make EFI call EFI runtime service in physical addressing mode we need * To make EFI call EFI runtime service in physical addressing mode we need
* prelog/epilog before/after the invocation to disable interrupt, to * prelog/epilog before/after the invocation to disable interrupt, to
...@@ -49,16 +37,14 @@ ...@@ -49,16 +37,14 @@
*/ */
static unsigned long efi_rt_eflags; static unsigned long efi_rt_eflags;
static DEFINE_SPINLOCK(efi_rt_lock);
static pgd_t efi_bak_pg_dir_pointer[2]; static pgd_t efi_bak_pg_dir_pointer[2];
void efi_call_phys_prelog(void) __acquires(efi_rt_lock) void efi_call_phys_prelog(void)
{ {
unsigned long cr4; unsigned long cr4;
unsigned long temp; unsigned long temp;
struct desc_ptr gdt_descr; struct desc_ptr gdt_descr;
spin_lock(&efi_rt_lock);
local_irq_save(efi_rt_eflags); local_irq_save(efi_rt_eflags);
/* /*
...@@ -88,14 +74,14 @@ void efi_call_phys_prelog(void) __acquires(efi_rt_lock) ...@@ -88,14 +74,14 @@ void efi_call_phys_prelog(void) __acquires(efi_rt_lock)
/* /*
* After the lock is released, the original page table is restored. * After the lock is released, the original page table is restored.
*/ */
local_flush_tlb(); __flush_tlb_all();
gdt_descr.address = __pa(get_cpu_gdt_table(0)); gdt_descr.address = __pa(get_cpu_gdt_table(0));
gdt_descr.size = GDT_SIZE - 1; gdt_descr.size = GDT_SIZE - 1;
load_gdt(&gdt_descr); load_gdt(&gdt_descr);
} }
void efi_call_phys_epilog(void) __releases(efi_rt_lock) void efi_call_phys_epilog(void)
{ {
unsigned long cr4; unsigned long cr4;
struct desc_ptr gdt_descr; struct desc_ptr gdt_descr;
...@@ -119,10 +105,9 @@ void efi_call_phys_epilog(void) __releases(efi_rt_lock) ...@@ -119,10 +105,9 @@ void efi_call_phys_epilog(void) __releases(efi_rt_lock)
/* /*
* After the lock is released, the original page table is restored. * After the lock is released, the original page table is restored.
*/ */
local_flush_tlb(); __flush_tlb_all();
local_irq_restore(efi_rt_eflags); local_irq_restore(efi_rt_eflags);
spin_unlock(&efi_rt_lock);
} }
/* /*
...@@ -135,7 +120,7 @@ void __init efi_map_memmap(void) ...@@ -135,7 +120,7 @@ void __init efi_map_memmap(void)
memmap.map = bt_ioremap((unsigned long) memmap.phys_map, memmap.map = bt_ioremap((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)
printk(KERN_ERR PFX "Could not remap the EFI memmap!\n"); printk(KERN_ERR "Could not remap the EFI memmap!\n");
memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size); memmap.map_end = memmap.map + (memmap.nr_map * memmap.desc_size);
} }
...@@ -40,13 +40,6 @@ ...@@ -40,13 +40,6 @@
static pgd_t save_pgd __initdata; static pgd_t save_pgd __initdata;
static unsigned long efi_flags __initdata; static unsigned long efi_flags __initdata;
static int __init setup_noefi(char *arg)
{
efi_enabled = 0;
return 0;
}
early_param("noefi", setup_noefi);
static void __init early_mapping_set_exec(unsigned long start, static void __init early_mapping_set_exec(unsigned long start,
unsigned long end, unsigned long end,
int executable) int executable)
......
...@@ -648,9 +648,6 @@ void __init setup_arch(char **cmdline_p) ...@@ -648,9 +648,6 @@ void __init setup_arch(char **cmdline_p)
printk(KERN_INFO "BIOS-provided physical RAM map:\n"); printk(KERN_INFO "BIOS-provided physical RAM map:\n");
print_memory_map(memory_setup()); print_memory_map(memory_setup());
if (efi_enabled)
efi_init();
copy_edd(); copy_edd();
if (!boot_params.hdr.root_flags) if (!boot_params.hdr.root_flags)
...@@ -677,6 +674,9 @@ void __init setup_arch(char **cmdline_p) ...@@ -677,6 +674,9 @@ void __init setup_arch(char **cmdline_p)
strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE); strlcpy(command_line, boot_command_line, COMMAND_LINE_SIZE);
*cmdline_p = command_line; *cmdline_p = command_line;
if (efi_enabled)
efi_init();
max_low_pfn = setup_memory(); max_low_pfn = setup_memory();
#ifdef CONFIG_VMI #ifdef CONFIG_VMI
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册