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
22#define IA32_EFER 0xC0000080
23#define IA32_STAR 0xC0000081
24#define IA32_LSTAR 0xC0000082
25#define IA32_CSTAR 0xC0000083
26#define IA32_FMASK 0xC0000084
28#ifndef UNREFERENCED_PARAMETER
29#define UNREFERENCED_PARAMETER(x) (void)(x)
44 __asm__
volatile (
"cli");
49 __asm__
volatile(
"stac" :::
"memory");
54 __asm__
volatile(
"clac" :::
"memory");
60 __asm__
volatile (
"sti");
66 __asm__
volatile (
"hlt");
71 unsigned long int val;
72 __asm__
volatile (
"mov %%cr0, %0" :
"=r"(val));
78 __asm__
volatile (
"mov %0, %%cr0" ::
"r"(val));
84 __asm__
volatile(
"mov %%cr2, %0" :
"=r"(val));
89 __asm__
volatile(
"mov %0, %%cr2" ::
"r"(val) :
"memory");
95 __asm__
volatile(
"mov %%cr3, %0" :
"=r"(val));
99 __asm__
volatile(
"mov %0, %%cr3" ::
"r"(val) :
"memory");
105 __asm__
volatile(
"mov %%cr4, %0" :
"=r"(val));
109 __asm__
volatile(
"mov %0, %%cr4" ::
"r"(val) :
"memory");
115 __asm__
volatile(
"mov %%cr8, %0" :
"=r"(val));
119 __asm__
volatile(
"mov %0, %%cr8" ::
"r"(val) :
"memory");
125 unsigned long val = 0;
127 case 0: __asm__
volatile(
"mov %%dr0, %0" :
"=r"(val));
break;
128 case 1: __asm__
volatile(
"mov %%dr1, %0" :
"=r"(val));
break;
129 case 2: __asm__
volatile(
"mov %%dr2, %0" :
"=r"(val));
break;
130 case 3: __asm__
volatile(
"mov %%dr3, %0" :
"=r"(val));
break;
131 case 6: __asm__
volatile(
"mov %%dr6, %0" :
"=r"(val));
break;
132 case 7: __asm__
volatile(
"mov %%dr7, %0" :
"=r"(val));
break;
141 case 0: __asm__
volatile(
"mov %0, %%dr0" ::
"r"(val));
break;
142 case 1: __asm__
volatile(
"mov %0, %%dr1" ::
"r"(val));
break;
143 case 2: __asm__
volatile(
"mov %0, %%dr2" ::
"r"(val));
break;
144 case 3: __asm__
volatile(
"mov %0, %%dr3" ::
"r"(val));
break;
145 case 6: __asm__
volatile(
"mov %0, %%dr6" ::
"r"(val));
break;
146 case 7: __asm__
volatile(
"mov %0, %%dr7" ::
"r"(val));
break;
151 __asm__
volatile (
"lidt (%0)" ::
"r"(idt_ptr));
156 unsigned long int rflags;
177 __asm__
volatile (
"inw %1, %0" :
"=a"(ret) :
"Nd"(port));
183 __asm__
volatile (
"outw %0, %1" : :
"a"(val),
"Nd"(port));
189 __asm__
volatile (
"inb %1, %0" :
"=a"(ret) :
"Nd"(port));
195 __asm__
volatile (
"outb %0, %1" ::
"a"(val),
"Nd"(port));
206 __asm__
volatile(
"invlpg (%0)" : :
"b"(m) :
"memory");
211 __asm__
volatile (
"rdmsr" :
"=a"(lo),
"=d"(hi) :
"c"(msr));
212 return ((uint64_t)hi << 32) | lo;
216 uint32_t lo = value & 0xFFFFFFFF;
217 uint32_t hi = value >> 32;
218 __asm__
volatile (
"wrmsr" : :
"c"(msr),
"a"(lo),
"d"(hi));
223 __asm__
volatile (
"mov %%rbp, %0" :
"=r"(val));
229 __asm__
volatile (
"mov %%rsp, %0" :
"=r"(val));
235 __asm__
volatile (
"leaq (%%rip), %0" :
"=r"(rip));
240 __asm__
volatile(
"pause" :::
"memory");
266 __asm__
volatile (
"swapgs" :::
"memory");
272 __asm__
volatile(
"rdrand %0; setc %1"
273 :
"=r"(val),
"=qm"(ok));
280 __asm__
volatile (
"rdtsc" :
"=a"(lo),
"=d"(hi));
281 return ((uint64_t)hi << 32) | lo;
288static void gcli(
void) {
292static void gsti(
void) {
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 void __stac(void)
FORCEINLINE unsigned long __read_cr8(void)
FORCEINLINE void send_eoi(unsigned char irq)
FORCEINLINE uint64_t __read_cr3(void)
FORCEINLINE void __clac(void)