From 4b032e457f1377fc06d12214b0450eae48653565 Mon Sep 17 00:00:00 2001 From: Aaron Durbin Date: Fri, 20 Apr 2018 01:39:30 -0600 Subject: arch/x86: allow idt to be available to link in all stages Add Kconfig IDT_IN_EVERY_STAGE to optionally specify having the interrupt handling code available to all stages. In order to do this the idt setup is moved to a C module. The vecX entries are made global so that a table of references to all the interrupt vector entry points can be used to dynamically initialize the idt. The ramification for ramstage is that exceptions are initialized later (lib/hardwaremain.c). Not all stages initialize exceptions when this Kconfig variable is selected, but bootblock for the C, stages using assembly_entry.S, and of course ramstage do. Anything left out just needs a call to exception_init() at the right location. BUG=b:72728953 Change-Id: I4146a040e5e43bed7ccc6cb0a7dc2271f1e7b7fa Signed-off-by: Aaron Durbin Reviewed-on: https://review.coreboot.org/25761 Tested-by: build bot (Jenkins) Reviewed-by: Furquan Shaikh --- src/arch/x86/c_start.S | 32 +------------------------------- 1 file changed, 1 insertion(+), 31 deletions(-) (limited to 'src/arch/x86/c_start.S') diff --git a/src/arch/x86/c_start.S b/src/arch/x86/c_start.S index 6cea5c3167..6426ef3693 100644 --- a/src/arch/x86/c_start.S +++ b/src/arch/x86/c_start.S @@ -81,28 +81,6 @@ _start: push $0 push $0 - /* Initialize the Interrupt Descriptor table */ - leal _idt, %edi - leal vec0, %ebx - movl $(0x10 << 16), %eax /* cs selector */ - -1: movw %bx, %ax - movl %ebx, %edx - movw $0x8E00, %dx /* Interrupt gate - dpl=0, present */ - movl %eax, 0(%edi) - movl %edx, 4(%edi) - addl $6, %ebx - addl $8, %edi - cmpl $_idt_end, %edi - jne 1b - - /* Load the Interrupt descriptor table */ -#ifndef __x86_64__ - lidt idtarg -#else - // FIXME port table to x64 - lidt idtarg -#endif - /* * Now we are finished. Memory is up, data is copied and * bss is cleared. Now we call the main routine and @@ -145,7 +123,7 @@ gdb_stub_breakpoint: jmp int_hand #endif - .globl gdt, gdt_end, idtarg + .globl gdt, gdt_end gdtaddr: .word gdt_end - gdt - 1 @@ -227,14 +205,6 @@ gdt: #endif gdt_end: -idtarg: - .word _idt_end - _idt - 1 /* limit */ - .long _idt - .word 0 -_idt: - .fill 20, 8, 0 # idt is uninitialized -_idt_end: - .section ".text._start", "ax", @progbits #ifdef __x86_64__ SetCodeSelector: -- cgit v1.2.3