libpayload/arch/x86: Add support for initializing the APIC

This is just the bare minimum required to initialize the APIC. I only
support xAPIC and chose not to support x2APIC. We can add that
functionality later when it's required.

I also made the exception dispatcher call apic_eoi so that the callbacks
won't forget to call it.

BUG=b:109749762
TEST=Booted grunt and verified that depthcharge continued to function
and that linux booted correctly. Also verified GDB still works.

Change-Id: I420a4eadae84df088525e727b481089ef615183f
Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Reviewed-on: https://review.coreboot.org/28241
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Martin Roth <martinroth@google.com>
This commit is contained in:
Raul E Rangel
2018-08-20 11:14:44 -06:00
committed by Martin Roth
parent 3d398ad37a
commit ac8ebd0e73
6 changed files with 255 additions and 0 deletions

View File

@ -31,8 +31,16 @@
#include <exception.h>
#include <libpayload.h>
#include <stdint.h>
#include <arch/apic.h>
#define IF_FLAG (1 << 9)
/*
* Local and I/O APICs support 240 vectors (in the range of 16 to 255) as valid
* interrupts. The Intel 64 and IA-32 architectures reserve vectors 16
* through 31 for predefined interrupts, exceptions, and Intel-reserved
* encodings.
*/
#define FIRST_USER_DEFINED_VECTOR 32
u32 exception_stack[0x400] __attribute__((aligned(8)));
@ -171,6 +179,9 @@ void exception_dispatch(void)
if (handlers[vec]) {
handlers[vec](vec);
if (IS_ENABLED(CONFIG_LP_ENABLE_APIC)
&& vec >= FIRST_USER_DEFINED_VECTOR)
apic_eoi();
return;
}