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:
parent
052b5317da
commit
cf79c8344d
|
@ -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);
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue