176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#ifndef _CPU_H 276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define _CPU_H 376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdbool.h> 576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <stdint.h> 676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <klibc/compiler.h> 776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#if __SIZEOF_POINTER__ == 4 976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <i386/cpu.h> 1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#elif __SIZEOF_POINTER__ == 8 1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#include <x86_64/cpu.h> 1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#else 1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#error "unsupported architecture" 1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmantypedef unsigned long irq_state_t; 1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline irq_state_t irq_state(void) 1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman irq_state_t __st; 2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("pushf ; pop %0" : "=rm" (__st) : : "memory"); 2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return __st; 2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline irq_state_t irq_save(void) 2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman irq_state_t __st = irq_state(); 2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman cli(); 3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return __st; 3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline void irq_restore(irq_state_t __st) 3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm volatile("push %0 ; popf" : : "rm" (__st) : "memory"); 3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* Standard macro to see if a specific flag is changeable */ 3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartmanstatic inline __constfunc bool cpu_has_eflag(unsigned long flag) 4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman{ 4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman unsigned long f0, f1; 4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman asm("pushf ; " 4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "pushf ; " 4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "pop %0 ; " 4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "mov %0,%1 ; " 4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "xor %2,%1 ; " 4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "push %1 ; " 4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "popf ; " 4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "pushf ; " 5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "pop %1 ; " 5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman "popf" 5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "=&r" (f0), "=&r" (f1) 5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman : "ri" (flag)); 5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman return !!((f0^f1) & flag); 5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman} 5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman 5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#endif 58