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