aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/boot
diff options
context:
space:
mode:
authorBart Kuivenhoven <bemk@redhat.com>2013-09-23 05:45:28 -0400
committerMatt Fleming <matt.fleming@intel.com>2013-09-30 05:23:11 -0400
commit0ce6cda2c75d64175394341ef60e6e1d27dd9c10 (patch)
treeed589e47d86362a651ef1cf7427edc0dbb988480 /arch/x86/boot
parentd2078d5adbe227d64d7963d93f13479c890a9a16 (diff)
x86 efi: bugfix interrupt disabling sequence
The problem in efi_main was that the idt was cleared before the interrupts were disabled. The UEFI spec states that interrupts aren't used so this shouldn't be too much of a problem. Peripherals however don't necessarily know about this and thus might cause interrupts to happen anyway. Even if ExitBootServices() has been called. This means there is a risk of an interrupt being triggered while the IDT register is nullified and the interrupt bit hasn't been cleared, allowing for a triple fault. This patch disables the interrupt flag, while leaving the existing IDT in place. The CPU won't care about the IDT at all as long as the interrupt bit is off, so it's safe to leave it in place as nothing will ever happen to it. [ Removed the now unused 'idt' variable - Matt ] Signed-off-by: Bart Kuivenhoven <bemk@redhat.com> Signed-off-by: Matt Fleming <matt.fleming@intel.com>
Diffstat (limited to 'arch/x86/boot')
-rw-r--r--arch/x86/boot/compressed/eboot.c17
1 files changed, 2 insertions, 15 deletions
diff --git a/arch/x86/boot/compressed/eboot.c b/arch/x86/boot/compressed/eboot.c
index 5c0dc55f2387..a7677babf946 100644
--- a/arch/x86/boot/compressed/eboot.c
+++ b/arch/x86/boot/compressed/eboot.c
@@ -748,7 +748,7 @@ free_mem_map:
748struct boot_params *efi_main(void *handle, efi_system_table_t *_table, 748struct boot_params *efi_main(void *handle, efi_system_table_t *_table,
749 struct boot_params *boot_params) 749 struct boot_params *boot_params)
750{ 750{
751 struct desc_ptr *gdt, *idt; 751 struct desc_ptr *gdt;
752 efi_loaded_image_t *image; 752 efi_loaded_image_t *image;
753 struct setup_header *hdr = &boot_params->hdr; 753 struct setup_header *hdr = &boot_params->hdr;
754 efi_status_t status; 754 efi_status_t status;
@@ -780,17 +780,6 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table,
780 goto fail; 780 goto fail;
781 } 781 }
782 782
783 status = efi_call_phys3(sys_table->boottime->allocate_pool,
784 EFI_LOADER_DATA, sizeof(*idt),
785 (void **)&idt);
786 if (status != EFI_SUCCESS) {
787 efi_printk(sys_table, "Failed to alloc mem for idt structure\n");
788 goto fail;
789 }
790
791 idt->size = 0;
792 idt->address = 0;
793
794 /* 783 /*
795 * If the kernel isn't already loaded at the preferred load 784 * If the kernel isn't already loaded at the preferred load
796 * address, relocate it. 785 * address, relocate it.
@@ -865,10 +854,8 @@ struct boot_params *efi_main(void *handle, efi_system_table_t *_table,
865 desc->base2 = 0x00; 854 desc->base2 = 0x00;
866#endif /* CONFIG_X86_64 */ 855#endif /* CONFIG_X86_64 */
867 856
868 asm volatile ("lidt %0" : : "m" (*idt));
869 asm volatile ("lgdt %0" : : "m" (*gdt));
870
871 asm volatile("cli"); 857 asm volatile("cli");
858 asm volatile ("lgdt %0" : : "m" (*gdt));
872 859
873 return boot_params; 860 return boot_params;
874fail: 861fail: