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:
parent
47d61a7c14
commit
d7542cb338
|
@ -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,
|
||||||
|
|
|
@ -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 */
|
||||||
|
|
Loading…
Reference in New Issue