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