xref: /haiku/headers/private/kernel/arch/x86/arch_cpuasm.h (revision 89fd39f42ab0760ea7d9cb6c8f9da8947a6bdc89)
1*89fd39f4SAlexander von Gluck IV /*
2*89fd39f4SAlexander von Gluck IV  * Copyright 2018, Jérôme Duval, jerome.duval@gmail.com.
3*89fd39f4SAlexander von Gluck IV  * Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
4*89fd39f4SAlexander von Gluck IV  * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
5*89fd39f4SAlexander von Gluck IV  * Distributed under the terms of the MIT License.
6*89fd39f4SAlexander von Gluck IV  *
7*89fd39f4SAlexander von Gluck IV  * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
8*89fd39f4SAlexander von Gluck IV  * Distributed under the terms of the NewOS License.
9*89fd39f4SAlexander von Gluck IV  */
10*89fd39f4SAlexander von Gluck IV #ifndef _KERNEL_ARCH_x86_CPUASM_H
11*89fd39f4SAlexander von Gluck IV #define _KERNEL_ARCH_x86_CPUASM_H
12*89fd39f4SAlexander von Gluck IV 
13*89fd39f4SAlexander von Gluck IV 
14*89fd39f4SAlexander von Gluck IV #define nop() __asm__ ("nop"::)
15*89fd39f4SAlexander von Gluck IV 
16*89fd39f4SAlexander von Gluck IV #define x86_read_cr0() ({ \
17*89fd39f4SAlexander von Gluck IV 	size_t _v; \
18*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %%cr0,%0" : "=r" (_v)); \
19*89fd39f4SAlexander von Gluck IV 	_v; \
20*89fd39f4SAlexander von Gluck IV })
21*89fd39f4SAlexander von Gluck IV 
22*89fd39f4SAlexander von Gluck IV #define x86_write_cr0(value) \
23*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %0,%%cr0" : : "r" (value))
24*89fd39f4SAlexander von Gluck IV 
25*89fd39f4SAlexander von Gluck IV #define x86_read_cr2() ({ \
26*89fd39f4SAlexander von Gluck IV 	size_t _v; \
27*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %%cr2,%0" : "=r" (_v)); \
28*89fd39f4SAlexander von Gluck IV 	_v; \
29*89fd39f4SAlexander von Gluck IV })
30*89fd39f4SAlexander von Gluck IV 
31*89fd39f4SAlexander von Gluck IV #define x86_read_cr3() ({ \
32*89fd39f4SAlexander von Gluck IV 	size_t _v; \
33*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %%cr3,%0" : "=r" (_v)); \
34*89fd39f4SAlexander von Gluck IV 	_v; \
35*89fd39f4SAlexander von Gluck IV })
36*89fd39f4SAlexander von Gluck IV 
37*89fd39f4SAlexander von Gluck IV #define x86_write_cr3(value) \
38*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %0,%%cr3" : : "r" (value))
39*89fd39f4SAlexander von Gluck IV 
40*89fd39f4SAlexander von Gluck IV #define x86_read_cr4() ({ \
41*89fd39f4SAlexander von Gluck IV 	size_t _v; \
42*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %%cr4,%0" : "=r" (_v)); \
43*89fd39f4SAlexander von Gluck IV 	_v; \
44*89fd39f4SAlexander von Gluck IV })
45*89fd39f4SAlexander von Gluck IV 
46*89fd39f4SAlexander von Gluck IV #define x86_write_cr4(value) \
47*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %0,%%cr4" : : "r" (value))
48*89fd39f4SAlexander von Gluck IV 
49*89fd39f4SAlexander von Gluck IV #define x86_read_dr3() ({ \
50*89fd39f4SAlexander von Gluck IV 	size_t _v; \
51*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %%dr3,%0" : "=r" (_v)); \
52*89fd39f4SAlexander von Gluck IV 	_v; \
53*89fd39f4SAlexander von Gluck IV })
54*89fd39f4SAlexander von Gluck IV 
55*89fd39f4SAlexander von Gluck IV #define x86_write_dr3(value) \
56*89fd39f4SAlexander von Gluck IV 	__asm__("mov    %0,%%dr3" : : "r" (value))
57*89fd39f4SAlexander von Gluck IV 
58*89fd39f4SAlexander von Gluck IV #define invalidate_TLB(va) \
59*89fd39f4SAlexander von Gluck IV 	__asm__("invlpg (%0)" : : "r" (va))
60*89fd39f4SAlexander von Gluck IV 
61*89fd39f4SAlexander von Gluck IV #define wbinvd() \
62*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("wbinvd" : : : "memory")
63*89fd39f4SAlexander von Gluck IV 
64*89fd39f4SAlexander von Gluck IV #define set_ac() \
65*89fd39f4SAlexander von Gluck IV 	__asm__ volatile (ASM_STAC : : : "memory")
66*89fd39f4SAlexander von Gluck IV 
67*89fd39f4SAlexander von Gluck IV #define clear_ac() \
68*89fd39f4SAlexander von Gluck IV 	__asm__ volatile (ASM_CLAC : : : "memory")
69*89fd39f4SAlexander von Gluck IV 
70*89fd39f4SAlexander von Gluck IV #define xgetbv(reg) ({ \
71*89fd39f4SAlexander von Gluck IV 	uint32 low, high; \
72*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("xgetbv" : "=a" (low), "=d" (high), "c" (reg)); \
73*89fd39f4SAlexander von Gluck IV 	(low | (uint64)high << 32); \
74*89fd39f4SAlexander von Gluck IV })
75*89fd39f4SAlexander von Gluck IV 
76*89fd39f4SAlexander von Gluck IV #define xsetbv(reg, value) { \
77*89fd39f4SAlexander von Gluck IV 	uint32 low = value; uint32 high = value >> 32; \
78*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("xsetbv" : : "a" (low), "d" (high), "c" (reg)); }
79*89fd39f4SAlexander von Gluck IV 
80*89fd39f4SAlexander von Gluck IV #define out8(value,port) \
81*89fd39f4SAlexander von Gluck IV 	__asm__ ("outb %%al,%%dx" : : "a" (value), "d" (port))
82*89fd39f4SAlexander von Gluck IV 
83*89fd39f4SAlexander von Gluck IV #define out16(value,port) \
84*89fd39f4SAlexander von Gluck IV 	__asm__ ("outw %%ax,%%dx" : : "a" (value), "d" (port))
85*89fd39f4SAlexander von Gluck IV 
86*89fd39f4SAlexander von Gluck IV #define out32(value,port) \
87*89fd39f4SAlexander von Gluck IV 	__asm__ ("outl %%eax,%%dx" : : "a" (value), "d" (port))
88*89fd39f4SAlexander von Gluck IV 
89*89fd39f4SAlexander von Gluck IV #define in8(port) ({ \
90*89fd39f4SAlexander von Gluck IV 	uint8 _v; \
91*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (port)); \
92*89fd39f4SAlexander von Gluck IV 	_v; \
93*89fd39f4SAlexander von Gluck IV })
94*89fd39f4SAlexander von Gluck IV 
95*89fd39f4SAlexander von Gluck IV #define in16(port) ({ \
96*89fd39f4SAlexander von Gluck IV 	uint16 _v; \
97*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("inw %%dx,%%ax":"=a" (_v) : "d" (port)); \
98*89fd39f4SAlexander von Gluck IV 	_v; \
99*89fd39f4SAlexander von Gluck IV })
100*89fd39f4SAlexander von Gluck IV 
101*89fd39f4SAlexander von Gluck IV #define in32(port) ({ \
102*89fd39f4SAlexander von Gluck IV 	uint32 _v; \
103*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("inl %%dx,%%eax":"=a" (_v) : "d" (port)); \
104*89fd39f4SAlexander von Gluck IV 	_v; \
105*89fd39f4SAlexander von Gluck IV })
106*89fd39f4SAlexander von Gluck IV 
107*89fd39f4SAlexander von Gluck IV #define out8_p(value,port) \
108*89fd39f4SAlexander von Gluck IV 	__asm__ ("outb %%al,%%dx\n" \
109*89fd39f4SAlexander von Gluck IV 			"\tjmp 1f\n" \
110*89fd39f4SAlexander von Gluck IV 			"1:\tjmp 1f\n" \
111*89fd39f4SAlexander von Gluck IV 			"1:" : : "a" (value), "d" (port))
112*89fd39f4SAlexander von Gluck IV 
113*89fd39f4SAlexander von Gluck IV #define in8_p(port) ({ \
114*89fd39f4SAlexander von Gluck IV 	uint8 _v; \
115*89fd39f4SAlexander von Gluck IV 	__asm__ volatile ("inb %%dx,%%al\n" \
116*89fd39f4SAlexander von Gluck IV 			"\tjmp 1f\n" \
117*89fd39f4SAlexander von Gluck IV 			"1:\tjmp 1f\n" \
118*89fd39f4SAlexander von Gluck IV 			"1:" : "=a" (_v) : "d" (port)); \
119*89fd39f4SAlexander von Gluck IV 	_v; \
120*89fd39f4SAlexander von Gluck IV })
121*89fd39f4SAlexander von Gluck IV 
122*89fd39f4SAlexander von Gluck IV 
123*89fd39f4SAlexander von Gluck IV #endif /* _KERNEL_ARCH_x86_CPUASM_H */
124