diff options
Diffstat (limited to 'include/x86/ops.h')
-rw-r--r-- | include/x86/ops.h | 245 |
1 files changed, 109 insertions, 136 deletions
diff --git a/include/x86/ops.h b/include/x86/ops.h index ad795b9..97ecdd6 100644 --- a/include/x86/ops.h +++ b/include/x86/ops.h @@ -10,7 +10,7 @@ ** MIT's xv6, https://github.com/mit-pdos/xv6-public ** ** Note: normally, GCC doesn't inline unless the optimization level is -** over 1. This can be forced by adding +** over 1. This can be forced by adding ** ** __attribute__((always_inline)) ** @@ -27,10 +27,10 @@ // control "forced" inlining #ifdef FORCE_INLINING -#define OPSINLINED __attribute__((always_inline)) +#define OPSINLINED __attribute__((always_inline)) #else -#define OPSINLINED /* no-op */ -#endif /* FORCE_INLINING */ +#define OPSINLINED /* no-op */ +#endif /* FORCE_INLINING */ /**************************** ** Data movement @@ -47,36 +47,36 @@ ** @param src Source buffer ** @param len Byte count */ -static inline void -movsb( void* dst, const void* src, uint32_t len ) OPSINLINED +static inline void movsb(void *dst, const void *src, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep movsb" - : "+D"(dst), "+S"(src), "+c"(len) - : : "memory" ); + __asm__ __volatile__("cld; rep movsb" + : "+D"(dst), "+S"(src), "+c"(len) + : + : "memory"); } -static inline void -movsw( void* dst, const void* src, uint32_t len ) OPSINLINED +static inline void movsw(void *dst, const void *src, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep movsw" - : "+D"(dst), "+S"(src), "+c"(len) - : : "memory" ); + __asm__ __volatile__("cld; rep movsw" + : "+D"(dst), "+S"(src), "+c"(len) + : + : "memory"); } -static inline void -movsl( void* dst, const void* src, uint32_t len ) OPSINLINED +static inline void movsl(void *dst, const void *src, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep movsl" - : "+D"(dst), "+S"(src), "+c"(len) - : : "memory" ); + __asm__ __volatile__("cld; rep movsl" + : "+D"(dst), "+S"(src), "+c"(len) + : + : "memory"); } -static inline void -movsq( void* dst, const void* src, uint32_t len ) OPSINLINED +static inline void movsq(void *dst, const void *src, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep movsq" - : "+D"(dst), "+S"(src), "+c"(len) - : : "memory" ); + __asm__ __volatile__("cld; rep movsq" + : "+D"(dst), "+S"(src), "+c"(len) + : + : "memory"); } /** @@ -90,31 +90,28 @@ movsq( void* dst, const void* src, uint32_t len ) OPSINLINED ** @param val Data to copy ** @param len Byte count */ -static inline void -stosb( void *dst, uint8_t val, uint32_t len ) OPSINLINED +static inline void stosb(void *dst, uint8_t val, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep stosb" - : "=D" (dst), "=c" (len) - : "0" (dst), "1" (len), "a" (val) - : "memory", "cc" ); + __asm__ __volatile__("cld; rep stosb" + : "=D"(dst), "=c"(len) + : "0"(dst), "1"(len), "a"(val) + : "memory", "cc"); } -static inline void -stosw( void *dst, uint16_t val, uint32_t len ) OPSINLINED +static inline void stosw(void *dst, uint16_t val, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep stos2" - : "=D" (dst), "=c" (len) - : "0" (dst), "1" (len), "a" (val) - : "memory", "cc" ); + __asm__ __volatile__("cld; rep stos2" + : "=D"(dst), "=c"(len) + : "0"(dst), "1"(len), "a"(val) + : "memory", "cc"); } -static inline void -stosl( void *dst, uint32_t val, uint32_t len ) OPSINLINED +static inline void stosl(void *dst, uint32_t val, uint32_t len) OPSINLINED { - __asm__ __volatile__( "cld; rep stosl" - : "=D" (dst), "=c" (len) - : "0" (dst), "1" (len), "a" (val) - : "memory", "cc" ); + __asm__ __volatile__("cld; rep stosl" + : "=D"(dst), "=c"(len) + : "0"(dst), "1"(len), "a"(val) + : "memory", "cc"); } /**************************** @@ -131,59 +128,52 @@ stosl( void *dst, uint32_t val, uint32_t len ) OPSINLINED ** ** @return Contents of the register */ -static inline uint32_t -r_cr0( void ) OPSINLINED +static inline uint32_t r_cr0(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%cr0,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%cr0,%0" : "=r"(val)); return val; } -static inline uint32_t -r_cr2( void ) OPSINLINED +static inline uint32_t r_cr2(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%cr2,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%cr2,%0" : "=r"(val)); return val; } -static inline uint32_t -r_cr3( void ) OPSINLINED +static inline uint32_t r_cr3(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%cr3,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%cr3,%0" : "=r"(val)); return val; } -static inline uint32_t -r_cr4( void ) OPSINLINED +static inline uint32_t r_cr4(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%cr4,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%cr4,%0" : "=r"(val)); return val; } -static inline uint32_t -r_eflags(void) OPSINLINED +static inline uint32_t r_eflags(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "pushfl; popl %0" : "=r" (val) ); + __asm__ __volatile__("pushfl; popl %0" : "=r"(val)); return val; } -static inline uint32_t -r_ebp(void) OPSINLINED +static inline uint32_t r_ebp(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%ebp,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%ebp,%0" : "=r"(val)); return val; } -static inline uint32_t -r_esp(void) OPSINLINED +static inline uint32_t r_esp(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl %%esp,%0" : "=r" (val) ); + __asm__ __volatile__("movl %%esp,%0" : "=r"(val)); return val; } @@ -194,34 +184,29 @@ r_esp(void) OPSINLINED ** ** Description: Writes a value into the CR indicated by its name */ -static inline void -w_cr0( uint32_t val ) OPSINLINED +static inline void w_cr0(uint32_t val) OPSINLINED { - __asm__ __volatile__( "movl %0,%%cr0" : : "r" (val) ); + __asm__ __volatile__("movl %0,%%cr0" : : "r"(val)); } -static inline void -w_cr2( uint32_t val ) OPSINLINED +static inline void w_cr2(uint32_t val) OPSINLINED { - __asm__ __volatile__( "movl %0,%%cr2" : : "r" (val) ); + __asm__ __volatile__("movl %0,%%cr2" : : "r"(val)); } -static inline void -w_cr3( uint32_t val ) OPSINLINED +static inline void w_cr3(uint32_t val) OPSINLINED { - __asm__ __volatile__( "movl %0,%%cr3" : : "r" (val) ); + __asm__ __volatile__("movl %0,%%cr3" : : "r"(val)); } -static inline void -w_cr4( uint32_t val ) OPSINLINED +static inline void w_cr4(uint32_t val) OPSINLINED { - __asm__ __volatile__( "movl %0,%%cr4" : : "r" (val) ); + __asm__ __volatile__("movl %0,%%cr4" : : "r"(val)); } -static inline void -w_eflags(uint32_t eflags) OPSINLINED +static inline void w_eflags(uint32_t eflags) OPSINLINED { - __asm__ __volatile__( "pushl %0; popfl" : : "r" (eflags) ); + __asm__ __volatile__("pushl %0; popfl" : : "r"(eflags)); } /** @@ -233,16 +218,14 @@ w_eflags(uint32_t eflags) OPSINLINED ** ** @param addr The value to be loaded into the register */ -static inline void -w_gdt( void *addr ) OPSINLINED +static inline void w_gdt(void *addr) OPSINLINED { - __asm__ __volatile__( "lgdt (%0)" : : "r" (addr) ); + __asm__ __volatile__("lgdt (%0)" : : "r"(addr)); } -static inline void -w_idt( void *addr ) OPSINLINED +static inline void w_idt(void *addr) OPSINLINED { - __asm__ __volatile__( "lidt (%0)" : : "r" (addr) ); + __asm__ __volatile__("lidt (%0)" : : "r"(addr)); } /** @@ -256,19 +239,22 @@ w_idt( void *addr ) OPSINLINED ** @param cp Pointer to where %ecx contents should be saved, or NULL ** @param dp Pointer to where %edx contents should be saved, or NULL */ -static inline void -cpuid( uint32_t op, uint32_t *ap, uint32_t *bp, - uint32_t *cp, uint32_t *dp ) OPSINLINED +static inline void cpuid(uint32_t op, uint32_t *ap, uint32_t *bp, uint32_t *cp, + uint32_t *dp) OPSINLINED { uint32_t eax, ebx, ecx, edx; - __asm__ __volatile__( "cpuid" - : "=a" (eax), "=b" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op) ); + __asm__ __volatile__("cpuid" + : "=a"(eax), "=b"(ebx), "=c"(ecx), "=d"(edx) + : "a"(op)); - if( ap ) *ap = eax; - if( bp ) *bp = ebx; - if( cp ) *cp = ecx; - if( dp ) *dp = edx; + if (ap) + *ap = eax; + if (bp) + *bp = ebx; + if (cp) + *cp = ecx; + if (dp) + *dp = edx; } /**************************** @@ -282,10 +268,9 @@ cpuid( uint32_t op, uint32_t *ap, uint32_t *bp, ** ** @param addr An address within the page to be flushed */ -static inline void -invlpg( uint32_t addr ) OPSINLINED +static inline void invlpg(uint32_t addr) OPSINLINED { - __asm__ __volatile__( "invlpg (%0)" : : "r" (addr) : "memory" ); + __asm__ __volatile__("invlpg (%0)" : : "r"(addr) : "memory"); } /** @@ -295,12 +280,11 @@ invlpg( uint32_t addr ) OPSINLINED ** ** We do this by changing CR3. */ -static inline void -flushtlb( void ) OPSINLINED +static inline void flushtlb(void) OPSINLINED { uint32_t cr3; - __asm__ __volatile__( "movl %%cr3,%0" : "=r" (cr3) ); - __asm__ __volatile__( "movl %0,%%cr2" : : "r" (cr3) ); + __asm__ __volatile__("movl %%cr3,%0" : "=r"(cr3)); + __asm__ __volatile__("movl %0,%%cr2" : : "r"(cr3)); } /**************************** @@ -318,27 +302,24 @@ flushtlb( void ) OPSINLINED ** ** @return The data read from the specified port */ -static inline uint8_t -inb( int port ) OPSINLINED +static inline uint8_t inb(int port) OPSINLINED { uint8_t data; - __asm__ __volatile__( "inb %w1,%0" : "=a" (data) : "d" (port) ); + __asm__ __volatile__("inb %w1,%0" : "=a"(data) : "d"(port)); return data; } -static inline uint16_t -inw( int port ) OPSINLINED +static inline uint16_t inw(int port) OPSINLINED { uint16_t data; - __asm__ __volatile__( "inw %w1,%0" : "=a" (data) : "d" (port) ); + __asm__ __volatile__("inw %w1,%0" : "=a"(data) : "d"(port)); return data; } -static inline uint32_t -inl( int port ) OPSINLINED +static inline uint32_t inl(int port) OPSINLINED { uint32_t data; - __asm__ __volatile__( "inl %w1,%0" : "=a" (data) : "d" (port) ); + __asm__ __volatile__("inl %w1,%0" : "=a"(data) : "d"(port)); return data; } @@ -354,22 +335,19 @@ inl( int port ) OPSINLINED ** ** @return The data read from the specified port */ -static inline void -outb( int port, uint8_t data ) OPSINLINED +static inline void outb(int port, uint8_t data) OPSINLINED { - __asm__ __volatile__( "outb %0,%w1" : : "a" (data), "d" (port) ); + __asm__ __volatile__("outb %0,%w1" : : "a"(data), "d"(port)); } -static inline void -outw( int port, uint16_t data ) OPSINLINED +static inline void outw(int port, uint16_t data) OPSINLINED { - __asm__ __volatile__( "outw %0,%w1" : : "a" (data), "d" (port) ); + __asm__ __volatile__("outw %0,%w1" : : "a"(data), "d"(port)); } -static inline void -outl( int port, uint32_t data ) OPSINLINED +static inline void outl(int port, uint32_t data) OPSINLINED { - __asm__ __volatile__( "outl %0,%w1" : : "a" (data), "d" (port) ); + __asm__ __volatile__("outl %0,%w1" : : "a"(data), "d"(port)); } /**************************** @@ -381,10 +359,9 @@ outl( int port, uint32_t data ) OPSINLINED ** ** Description: Cause a breakpoint interrupt for debugging purposes */ -static inline void -breakpoint( void ) OPSINLINED +static inline void breakpoint(void) OPSINLINED { - __asm__ __volatile__( "int3" ); + __asm__ __volatile__("int3"); } /** @@ -395,11 +372,10 @@ breakpoint( void ) OPSINLINED ** ** @return The address the calling routine will return to as a uint32_t */ -static inline uint32_t -get_ra( void ) OPSINLINED +static inline uint32_t get_ra(void) OPSINLINED { uint32_t val; - __asm__ __volatile__( "movl 4(%%ebp),%0" : "=r" (val) ); + __asm__ __volatile__("movl 4(%%ebp),%0" : "=r"(val)); return val; } @@ -408,13 +384,11 @@ get_ra( void ) OPSINLINED ** ** Description: Pause until something happens */ -static inline void -ev_wait( void ) OPSINLINED +static inline void ev_wait(void) OPSINLINED { - __asm__ __volatile__( "sti ; hlt" ); + __asm__ __volatile__("sti ; hlt"); } - /** ** Name: xchgl ** @@ -425,19 +399,18 @@ ev_wait( void ) OPSINLINED ** ** @return The old contents of the memory location */ -static inline uint32_t -xchgl( volatile uint32_t *addr, uint32_t data ) OPSINLINED +static inline uint32_t xchgl(volatile uint32_t *addr, uint32_t data) OPSINLINED { uint32_t old; // + indicates a read-modify-write operand - __asm__ __volatile__( "lock; xchgl %0, %1" - : "+m" (*addr), "=a" (old) - : "1" (data) - : "cc"); + __asm__ __volatile__("lock; xchgl %0, %1" + : "+m"(*addr), "=a"(old) + : "1"(data) + : "cc"); return old; } -#endif /* !ASM_SRC */ +#endif /* !ASM_SRC */ #endif |