arch/x86: Ensure LAPIC mode for exception handler

Attempting to use X2APIC MSRs before the call to enable_lapic()
is made raises exception and double-faults.

Change-Id: Ib97889466af0fbe639bec2be730784acc015b525
Signed-off-by: Kyösti Mälkki <kyosti.malkki@gmail.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/76194
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Elyes Haouas <ehaouas@noos.fr>
This commit is contained in:
Kyösti Mälkki 2023-06-28 06:16:11 +03:00 committed by Shelley Chen
parent 47d61a7c14
commit d7542cb338
2 changed files with 14 additions and 3 deletions

View File

@ -488,7 +488,6 @@ void x86_exception(struct eregs *info)
#else /* !CONFIG_GDB_STUB */ #else /* !CONFIG_GDB_STUB */
int logical_processor = 0; int logical_processor = 0;
u32 apic_id = CONFIG(SMP) ? lapicid() : 0;
if (info->vector == DEBUG_VECTOR) { if (info->vector == DEBUG_VECTOR) {
if (breakpoint_dispatch_handler(info) == 0) if (breakpoint_dispatch_handler(info) == 0)
@ -513,7 +512,7 @@ void x86_exception(struct eregs *info)
"r10: %016llx r11: %016llx\n" "r10: %016llx r11: %016llx\n"
"r12: %016llx r13: %016llx\n" "r12: %016llx r13: %016llx\n"
"r14: %016llx r15: %016llx\n", "r14: %016llx r15: %016llx\n",
logical_processor, apic_id, logical_processor, early_lapicid(),
info->vector, info->cs, info->rip, info->vector, info->cs, info->rip,
info->error_code, info->rflags, read_cr2(), info->error_code, info->rflags, read_cr2(),
info->rax, info->rbx, info->rcx, info->rdx, info->rax, info->rbx, info->rcx, info->rdx,
@ -530,7 +529,7 @@ void x86_exception(struct eregs *info)
"Code: %d eflags: %08x cr2: %08x\n" "Code: %d eflags: %08x cr2: %08x\n"
"eax: %08x ebx: %08x ecx: %08x edx: %08x\n" "eax: %08x ebx: %08x ecx: %08x edx: %08x\n"
"edi: %08x esi: %08x ebp: %08x esp: %08x\n", "edi: %08x esi: %08x ebp: %08x esp: %08x\n",
logical_processor, apic_id, logical_processor, early_lapicid(),
info->vector, info->cs, info->eip, info->vector, info->cs, info->eip,
info->error_code, info->eflags, read_cr2(), info->error_code, info->eflags, read_cr2(),
info->eax, info->ebx, info->ecx, info->edx, info->eax, info->ebx, info->ecx, info->edx,

View File

@ -184,4 +184,16 @@ void enable_lapic_mode(bool try_set_x2apic);
void disable_lapic(void); void disable_lapic(void);
void setup_lapic_interrupts(void); void setup_lapic_interrupts(void);
static inline unsigned int early_lapicid(void)
{
if (!CONFIG(SMP))
return 0;
if (!ENV_RAMSTAGE)
return 0;
enable_lapic();
return lapicid();
}
#endif /* CPU_X86_LAPIC_H */ #endif /* CPU_X86_LAPIC_H */