6#ifndef X86_INTRINSICS_H
7#define X86_INTRINSICS_H
10#define PIC1_COMMAND_MASTER 0x20
12#define PIC2_COMMAND_SLAVE 0xA0
19#define IA32_KERNEL_GS_BASE 0xC0000102
20#define IA32_GS_BASE 0xC0000101
21#define IA32_FS_BASE 0xC0000100
23#ifndef UNREFERENCED_PARAMETER
24#define UNREFERENCED_PARAMETER(x) (void)(x)
39 __asm__
volatile (
"cli");
45 __asm__
volatile (
"sti");
51 __asm__
volatile (
"hlt");
56 unsigned long int val;
57 __asm__
volatile (
"mov %%cr0, %0" :
"=r"(val));
63 __asm__
volatile (
"mov %0, %%cr0" ::
"r"(val));
69 __asm__
volatile(
"mov %%cr2, %0" :
"=r"(val));
74 __asm__
volatile(
"mov %0, %%cr2" ::
"r"(val) :
"memory");
80 __asm__
volatile(
"mov %%cr3, %0" :
"=r"(val));
84 __asm__
volatile(
"mov %0, %%cr3" ::
"r"(val) :
"memory");
90 __asm__
volatile(
"mov %%cr4, %0" :
"=r"(val));
94 __asm__
volatile(
"mov %0, %%cr4" ::
"r"(val) :
"memory");
100 __asm__
volatile(
"mov %%cr8, %0" :
"=r"(val));
104 __asm__
volatile(
"mov %0, %%cr8" ::
"r"(val) :
"memory");
110 unsigned long val = 0;
112 case 0: __asm__
volatile(
"mov %%dr0, %0" :
"=r"(val));
break;
113 case 1: __asm__
volatile(
"mov %%dr1, %0" :
"=r"(val));
break;
114 case 2: __asm__
volatile(
"mov %%dr2, %0" :
"=r"(val));
break;
115 case 3: __asm__
volatile(
"mov %%dr3, %0" :
"=r"(val));
break;
116 case 6: __asm__
volatile(
"mov %%dr6, %0" :
"=r"(val));
break;
117 case 7: __asm__
volatile(
"mov %%dr7, %0" :
"=r"(val));
break;
126 case 0: __asm__
volatile(
"mov %0, %%dr0" ::
"r"(val));
break;
127 case 1: __asm__
volatile(
"mov %0, %%dr1" ::
"r"(val));
break;
128 case 2: __asm__
volatile(
"mov %0, %%dr2" ::
"r"(val));
break;
129 case 3: __asm__
volatile(
"mov %0, %%dr3" ::
"r"(val));
break;
130 case 6: __asm__
volatile(
"mov %0, %%dr6" ::
"r"(val));
break;
131 case 7: __asm__
volatile(
"mov %0, %%dr7" ::
"r"(val));
break;
136 __asm__
volatile (
"lidt (%0)" ::
"r"(idt_ptr));
141 unsigned long int rflags;
162 __asm__
volatile (
"inw %1, %0" :
"=a"(ret) :
"Nd"(port));
168 __asm__
volatile (
"outw %0, %1" : :
"a"(val),
"Nd"(port));
174 __asm__
volatile (
"inb %1, %0" :
"=a"(ret) :
"Nd"(port));
180 __asm__
volatile (
"outb %0, %1" ::
"a"(val),
"Nd"(port));
191 __asm__
volatile(
"invlpg (%0)" : :
"b"(m) :
"memory");
196 __asm__
volatile (
"rdmsr" :
"=a"(lo),
"=d"(hi) :
"c"(msr));
197 return ((uint64_t)hi << 32) | lo;
201 uint32_t lo = value & 0xFFFFFFFF;
202 uint32_t hi = value >> 32;
203 __asm__
volatile (
"wrmsr" : :
"c"(msr),
"a"(lo),
"d"(hi));
208 __asm__
volatile (
"mov %%rbp, %0" :
"=r"(val));
214 __asm__
volatile (
"mov %%rsp, %0" :
"=r"(val));
220 __asm__
volatile (
"leaq (%%rip), %0" :
"=r"(rip));
225 __asm__
volatile(
"pause" :::
"memory");
251 __asm__
volatile (
"swapgs" :::
"memory");
257 __asm__
volatile(
"rdrand %0; setc %1"
258 :
"=r"(val),
"=qm"(ok));
265 __asm__
volatile (
"rdtsc" :
"=a"(lo),
"=d"(hi));
266 return ((uint64_t)hi << 32) | lo;
FORCEINLINE uint64_t __readmsr(uint32_t msr)
FORCEINLINE void __writemsr(uint32_t msr, uint64_t value)
#define PIC1_COMMAND_MASTER
FORCEINLINE uint64_t __rdtsc(void)
FORCEINLINE uint64_t __read_rip(void)
#define PIC2_COMMAND_SLAVE
FORCEINLINE void __pause(void)
FORCEINLINE uint64_t __readgsqword(uint64_t offset)
FORCEINLINE uint64_t __read_rsp(void)
FORCEINLINE bool __rdrand64(uint64_t *out)
FORCEINLINE void __write_cr2(unsigned long val)
FORCEINLINE uint64_t __read_dr(int reg)
FORCEINLINE void invlpg(void *m)
FORCEINLINE void __outword(unsigned short port, unsigned short val)
FORCEINLINE void __hlt(void)
FORCEINLINE unsigned long int __read_cr0(void)
FORCEINLINE unsigned short __inword(unsigned short port)
FORCEINLINE void __sti(void)
FORCEINLINE uint64_t __read_rbp(void)
FORCEINLINE void __write_cr0(unsigned long int val)
FORCEINLINE void __write_cr4(unsigned long val)
FORCEINLINE void __write_dr(int reg, uint64_t val)
FORCEINLINE unsigned long __read_cr4(void)
FORCEINLINE void __swapgs(void)
FORCEINLINE void __outbyte(unsigned short port, unsigned char val)
FORCEINLINE void __write_cr8(unsigned long val)
FORCEINLINE void __cli(void)
FORCEINLINE uint64_t __readfsqword(uint64_t offset)
FORCEINLINE void __write_cr3(uint64_t val)
FORCEINLINE unsigned long __read_cr2(void)
FORCEINLINE unsigned long int __read_rflags(void)
FORCEINLINE void __lidt(void *idt_ptr)
FORCEINLINE void __write_rflags(unsigned long int rflags)
FORCEINLINE unsigned char __inbyte(unsigned short port)
FORCEINLINE unsigned long __read_cr8(void)
FORCEINLINE void send_eoi(unsigned char irq)
FORCEINLINE uint64_t __read_cr3(void)