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 <stdint.h>
|
||||
|
||||
#define IF_FLAG (1 << 9)
|
||||
|
||||
u32 exception_stack[0x400] __attribute__((aligned(8)));
|
||||
|
||||
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.");
|
||||
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_dispatch(void);
|
||||
void enable_interrupts(void);
|
||||
void disable_interrupts(void);
|
||||
/** Returns 1 if interrupts are enabled. */
|
||||
int interrupts_enabled(void);
|
||||
|
||||
struct exception_state
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue