libpayload/x86/exception: Add methods to enable/disable interrupts

Will be used by the APIC.

BUG=b:109749762
TEST=Verified by the other cls in the stack.

Change-Id: Id86f2719d98a90318ac625e09601e5dbb06e3765
Signed-off-by: Raul E Rangel <rrangel@chromium.org>
Reviewed-on: https://review.coreboot.org/28239
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-22 10:03:05 -06:00 committed by Patrick Georgi
parent 052b5317da
commit cf79c8344d
2 changed files with 36 additions and 0 deletions

View File

@ -32,6 +32,8 @@
#include <libpayload.h> #include <libpayload.h>
#include <stdint.h> #include <stdint.h>
#define IF_FLAG (1 << 9)
u32 exception_stack[0x400] __attribute__((aligned(8))); u32 exception_stack[0x400] __attribute__((aligned(8)));
static exception_hook hook; static exception_hook hook;
@ -182,3 +184,33 @@ void exception_install_hook(exception_hook h)
die_if(hook, "Implement support for a list of hooks if you need it."); die_if(hook, "Implement support for a list of hooks if you need it.");
hook = h; hook = h;
} }
static uint32_t eflags(void)
{
uint32_t eflags;
asm volatile(
"pushf\n\t"
"pop %0\n\t"
: "=rm" (eflags));
return eflags;
}
void enable_interrupts(void)
{
asm volatile (
"sti\n"
: : : "cc"
);
}
void disable_interrupts(void)
{
asm volatile (
"cli\n"
: : : "cc"
);
}
int interrupts_enabled(void)
{
return !!(eflags() & IF_FLAG);
}

View File

@ -34,6 +34,10 @@
void exception_init_asm(void); void exception_init_asm(void);
void exception_dispatch(void); void exception_dispatch(void);
void enable_interrupts(void);
void disable_interrupts(void);
/** Returns 1 if interrupts are enabled. */
int interrupts_enabled(void);
struct exception_state struct exception_state
{ {