189fd39f4SAlexander von Gluck IV /*
289fd39f4SAlexander von Gluck IV * Copyright 2018, Jérôme Duval, jerome.duval@gmail.com.
389fd39f4SAlexander von Gluck IV * Copyright 2002-2009, Axel Dörfler, axeld@pinc-software.de.
489fd39f4SAlexander von Gluck IV * Copyright 2012, Alex Smith, alex@alex-smith.me.uk.
589fd39f4SAlexander von Gluck IV * Distributed under the terms of the MIT License.
689fd39f4SAlexander von Gluck IV *
789fd39f4SAlexander von Gluck IV * Copyright 2001-2002, Travis Geiselbrecht. All rights reserved.
889fd39f4SAlexander von Gluck IV * Distributed under the terms of the NewOS License.
989fd39f4SAlexander von Gluck IV */
1089fd39f4SAlexander von Gluck IV #ifndef _KERNEL_ARCH_x86_CPUASM_H
1189fd39f4SAlexander von Gluck IV #define _KERNEL_ARCH_x86_CPUASM_H
1289fd39f4SAlexander von Gluck IV
1389fd39f4SAlexander von Gluck IV
1489fd39f4SAlexander von Gluck IV #define nop() __asm__ ("nop"::)
1589fd39f4SAlexander von Gluck IV
1689fd39f4SAlexander von Gluck IV #define x86_read_cr0() ({ \
1789fd39f4SAlexander von Gluck IV size_t _v; \
1889fd39f4SAlexander von Gluck IV __asm__("mov %%cr0,%0" : "=r" (_v)); \
1989fd39f4SAlexander von Gluck IV _v; \
2089fd39f4SAlexander von Gluck IV })
2189fd39f4SAlexander von Gluck IV
2289fd39f4SAlexander von Gluck IV #define x86_write_cr0(value) \
2389fd39f4SAlexander von Gluck IV __asm__("mov %0,%%cr0" : : "r" (value))
2489fd39f4SAlexander von Gluck IV
2589fd39f4SAlexander von Gluck IV #define x86_read_cr2() ({ \
2689fd39f4SAlexander von Gluck IV size_t _v; \
2789fd39f4SAlexander von Gluck IV __asm__("mov %%cr2,%0" : "=r" (_v)); \
2889fd39f4SAlexander von Gluck IV _v; \
2989fd39f4SAlexander von Gluck IV })
3089fd39f4SAlexander von Gluck IV
3189fd39f4SAlexander von Gluck IV #define x86_read_cr3() ({ \
3289fd39f4SAlexander von Gluck IV size_t _v; \
3389fd39f4SAlexander von Gluck IV __asm__("mov %%cr3,%0" : "=r" (_v)); \
3489fd39f4SAlexander von Gluck IV _v; \
3589fd39f4SAlexander von Gluck IV })
3689fd39f4SAlexander von Gluck IV
377aa55747SAugustin Cavalier static inline void
x86_write_cr3(size_t value)387aa55747SAugustin Cavalier x86_write_cr3(size_t value)
397aa55747SAugustin Cavalier {
407aa55747SAugustin Cavalier __asm__("mov %0,%%cr3" : : "r" (value) : "memory");
417aa55747SAugustin Cavalier }
4289fd39f4SAlexander von Gluck IV
4389fd39f4SAlexander von Gluck IV #define x86_read_cr4() ({ \
4489fd39f4SAlexander von Gluck IV size_t _v; \
4589fd39f4SAlexander von Gluck IV __asm__("mov %%cr4,%0" : "=r" (_v)); \
4689fd39f4SAlexander von Gluck IV _v; \
4789fd39f4SAlexander von Gluck IV })
4889fd39f4SAlexander von Gluck IV
4989fd39f4SAlexander von Gluck IV #define x86_write_cr4(value) \
5089fd39f4SAlexander von Gluck IV __asm__("mov %0,%%cr4" : : "r" (value))
5189fd39f4SAlexander von Gluck IV
5289fd39f4SAlexander von Gluck IV #define x86_read_dr3() ({ \
5389fd39f4SAlexander von Gluck IV size_t _v; \
5489fd39f4SAlexander von Gluck IV __asm__("mov %%dr3,%0" : "=r" (_v)); \
5589fd39f4SAlexander von Gluck IV _v; \
5689fd39f4SAlexander von Gluck IV })
5789fd39f4SAlexander von Gluck IV
5889fd39f4SAlexander von Gluck IV #define x86_write_dr3(value) \
5989fd39f4SAlexander von Gluck IV __asm__("mov %0,%%dr3" : : "r" (value))
6089fd39f4SAlexander von Gluck IV
6189fd39f4SAlexander von Gluck IV #define invalidate_TLB(va) \
6289fd39f4SAlexander von Gluck IV __asm__("invlpg (%0)" : : "r" (va))
6389fd39f4SAlexander von Gluck IV
6489fd39f4SAlexander von Gluck IV #define wbinvd() \
6589fd39f4SAlexander von Gluck IV __asm__ volatile ("wbinvd" : : : "memory")
6689fd39f4SAlexander von Gluck IV
67*6f88de11SAugustin Cavalier #define arch_cpu_enable_user_access() \
6889fd39f4SAlexander von Gluck IV __asm__ volatile (ASM_STAC : : : "memory")
6989fd39f4SAlexander von Gluck IV
70*6f88de11SAugustin Cavalier #define arch_cpu_disable_user_access() \
7189fd39f4SAlexander von Gluck IV __asm__ volatile (ASM_CLAC : : : "memory")
7289fd39f4SAlexander von Gluck IV
7389fd39f4SAlexander von Gluck IV #define xgetbv(reg) ({ \
7489fd39f4SAlexander von Gluck IV uint32 low, high; \
7589fd39f4SAlexander von Gluck IV __asm__ volatile ("xgetbv" : "=a" (low), "=d" (high), "c" (reg)); \
7689fd39f4SAlexander von Gluck IV (low | (uint64)high << 32); \
7789fd39f4SAlexander von Gluck IV })
7889fd39f4SAlexander von Gluck IV
7989fd39f4SAlexander von Gluck IV #define xsetbv(reg, value) { \
8089fd39f4SAlexander von Gluck IV uint32 low = value; uint32 high = value >> 32; \
8189fd39f4SAlexander von Gluck IV __asm__ volatile ("xsetbv" : : "a" (low), "d" (high), "c" (reg)); }
8289fd39f4SAlexander von Gluck IV
8389fd39f4SAlexander von Gluck IV #define out8(value,port) \
8489fd39f4SAlexander von Gluck IV __asm__ ("outb %%al,%%dx" : : "a" (value), "d" (port))
8589fd39f4SAlexander von Gluck IV
8689fd39f4SAlexander von Gluck IV #define out16(value,port) \
8789fd39f4SAlexander von Gluck IV __asm__ ("outw %%ax,%%dx" : : "a" (value), "d" (port))
8889fd39f4SAlexander von Gluck IV
8989fd39f4SAlexander von Gluck IV #define out32(value,port) \
9089fd39f4SAlexander von Gluck IV __asm__ ("outl %%eax,%%dx" : : "a" (value), "d" (port))
9189fd39f4SAlexander von Gluck IV
9289fd39f4SAlexander von Gluck IV #define in8(port) ({ \
9389fd39f4SAlexander von Gluck IV uint8 _v; \
9489fd39f4SAlexander von Gluck IV __asm__ volatile ("inb %%dx,%%al" : "=a" (_v) : "d" (port)); \
9589fd39f4SAlexander von Gluck IV _v; \
9689fd39f4SAlexander von Gluck IV })
9789fd39f4SAlexander von Gluck IV
9889fd39f4SAlexander von Gluck IV #define in16(port) ({ \
9989fd39f4SAlexander von Gluck IV uint16 _v; \
10089fd39f4SAlexander von Gluck IV __asm__ volatile ("inw %%dx,%%ax":"=a" (_v) : "d" (port)); \
10189fd39f4SAlexander von Gluck IV _v; \
10289fd39f4SAlexander von Gluck IV })
10389fd39f4SAlexander von Gluck IV
10489fd39f4SAlexander von Gluck IV #define in32(port) ({ \
10589fd39f4SAlexander von Gluck IV uint32 _v; \
10689fd39f4SAlexander von Gluck IV __asm__ volatile ("inl %%dx,%%eax":"=a" (_v) : "d" (port)); \
10789fd39f4SAlexander von Gluck IV _v; \
10889fd39f4SAlexander von Gluck IV })
10989fd39f4SAlexander von Gluck IV
11089fd39f4SAlexander von Gluck IV #define out8_p(value,port) \
11189fd39f4SAlexander von Gluck IV __asm__ ("outb %%al,%%dx\n" \
11289fd39f4SAlexander von Gluck IV "\tjmp 1f\n" \
11389fd39f4SAlexander von Gluck IV "1:\tjmp 1f\n" \
11489fd39f4SAlexander von Gluck IV "1:" : : "a" (value), "d" (port))
11589fd39f4SAlexander von Gluck IV
11689fd39f4SAlexander von Gluck IV #define in8_p(port) ({ \
11789fd39f4SAlexander von Gluck IV uint8 _v; \
11889fd39f4SAlexander von Gluck IV __asm__ volatile ("inb %%dx,%%al\n" \
11989fd39f4SAlexander von Gluck IV "\tjmp 1f\n" \
12089fd39f4SAlexander von Gluck IV "1:\tjmp 1f\n" \
12189fd39f4SAlexander von Gluck IV "1:" : "=a" (_v) : "d" (port)); \
12289fd39f4SAlexander von Gluck IV _v; \
12389fd39f4SAlexander von Gluck IV })
12489fd39f4SAlexander von Gluck IV
12589fd39f4SAlexander von Gluck IV
12689fd39f4SAlexander von Gluck IV #endif /* _KERNEL_ARCH_x86_CPUASM_H */
127