58 lines
1.0 KiB
C
58 lines
1.0 KiB
C
#ifndef _CPU_H
|
|
#define _CPU_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <klibc/compiler.h>
|
|
|
|
#if __SIZEOF_POINTER__ == 4
|
|
#include <i386/cpu.h>
|
|
#elif __SIZEOF_POINTER__ == 8
|
|
#include <x86_64/cpu.h>
|
|
#else
|
|
#error "unsupported architecture"
|
|
#endif
|
|
|
|
typedef unsigned long irq_state_t;
|
|
|
|
static inline irq_state_t irq_state(void)
|
|
{
|
|
irq_state_t __st;
|
|
|
|
asm volatile("pushf ; pop %0" : "=rm" (__st) : : "memory");
|
|
return __st;
|
|
}
|
|
|
|
static inline irq_state_t irq_save(void)
|
|
{
|
|
irq_state_t __st = irq_state();
|
|
cli();
|
|
return __st;
|
|
}
|
|
|
|
static inline void irq_restore(irq_state_t __st)
|
|
{
|
|
asm volatile("push %0 ; popf" : : "rm" (__st) : "memory");
|
|
}
|
|
|
|
/* Standard macro to see if a specific flag is changeable */
|
|
static inline __constfunc bool cpu_has_eflag(unsigned long flag)
|
|
{
|
|
unsigned long f0, f1;
|
|
asm("pushf ; "
|
|
"pushf ; "
|
|
"pop %0 ; "
|
|
"mov %0,%1 ; "
|
|
"xor %2,%1 ; "
|
|
"push %1 ; "
|
|
"popf ; "
|
|
"pushf ; "
|
|
"pop %1 ; "
|
|
"popf"
|
|
: "=&r" (f0), "=&r" (f1)
|
|
: "ri" (flag));
|
|
return !!((f0^f1) & flag);
|
|
}
|
|
|
|
#endif
|