1#ifndef _CPU_H 2#define _CPU_H 3 4#include <stdbool.h> 5#include <stdint.h> 6#include <klibc/compiler.h> 7 8#if __SIZEOF_POINTER__ == 4 9#include <i386/cpu.h> 10#elif __SIZEOF_POINTER__ == 8 11#include <x86_64/cpu.h> 12#else 13#error "unsupported architecture" 14#endif 15 16typedef unsigned long irq_state_t; 17 18static inline irq_state_t irq_state(void) 19{ 20 irq_state_t __st; 21 22 asm volatile("pushf ; pop %0" : "=rm" (__st) : : "memory"); 23 return __st; 24} 25 26static inline irq_state_t irq_save(void) 27{ 28 irq_state_t __st = irq_state(); 29 cli(); 30 return __st; 31} 32 33static inline void irq_restore(irq_state_t __st) 34{ 35 asm volatile("push %0 ; popf" : : "rm" (__st) : "memory"); 36} 37 38/* Standard macro to see if a specific flag is changeable */ 39static inline __constfunc bool cpu_has_eflag(unsigned long flag) 40{ 41 unsigned long f0, f1; 42 asm("pushf ; " 43 "pushf ; " 44 "pop %0 ; " 45 "mov %0,%1 ; " 46 "xor %2,%1 ; " 47 "push %1 ; " 48 "popf ; " 49 "pushf ; " 50 "pop %1 ; " 51 "popf" 52 : "=&r" (f0), "=&r" (f1) 53 : "ri" (flag)); 54 return !!((f0^f1) & flag); 55} 56 57#endif 58