diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-03-28 18:56:04 +0100 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2020-03-28 18:56:04 +0100 |
commit | 328335176df95e9762cc5e04877cb231b0b2292e (patch) | |
tree | 9d2c7be13ab936f2bf9158e564cb2e36329c8dd1 /i386 | |
parent | 4e4156bbdfdbc9855420de31d8bf4860f26f75f6 (diff) | |
download | gnumach-328335176df95e9762cc5e04877cb231b0b2292e.tar.gz gnumach-328335176df95e9762cc5e04877cb231b0b2292e.tar.bz2 gnumach-328335176df95e9762cc5e04877cb231b0b2292e.zip |
Fix low-level macros for 64bit
* i386/i386/proc_reg.h (get_eflags, set_eflags): Add 64bit version.
(get_dr0, set_dr0, get_dr1, set_dr1, get_dr2, set_dr2, get_dr3, set_dr3,
get_dr6, set_dr6, get_dr7, set_dr7): Drop explicit size qualifier.
Diffstat (limited to 'i386')
-rw-r--r-- | i386/i386/proc_reg.h | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/i386/i386/proc_reg.h b/i386/i386/proc_reg.h index 80835361..c787ef26 100644 --- a/i386/i386/proc_reg.h +++ b/i386/i386/proc_reg.h @@ -81,14 +81,22 @@ static inline unsigned long get_eflags(void) { unsigned long eflags; +#ifdef __x86_64__ + asm("pushfq; pop %0" : "=r" (eflags)); +#else asm("pushfd; pop %0" : "=r" (eflags)); +#endif return eflags; } static inline void set_eflags(unsigned long eflags) { +#ifdef __x86_64__ + asm volatile("push %0; popfq" : : "r" (eflags)); +#else asm volatile("push %0; popfd" : : "r" (eflags)); +#endif } #define get_esp() \ @@ -97,12 +105,21 @@ set_eflags(unsigned long eflags) _temp__; \ }) +#ifdef __x86_64__ #define get_eflags() \ ({ \ register unsigned long _temp__; \ - asm("pushf; pop %0" : "=r" (_temp__)); \ + asm("pushfq; pop %0" : "=r" (_temp__)); \ _temp__; \ }) +#else +#define get_eflags() \ + ({ \ + register unsigned long _temp__; \ + asm("pushfd; pop %0" : "=r" (_temp__)); \ + _temp__; \ + }) +#endif #define get_cr0() \ ({ \ @@ -240,7 +257,7 @@ extern unsigned long cr3; #define get_dr0() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr0, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr0, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -251,7 +268,7 @@ extern unsigned long cr3; #define set_dr0(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr0" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr0" : : "r" (_temp__)); \ }) #endif @@ -261,7 +278,7 @@ extern unsigned long cr3; #define get_dr1() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr1, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr1, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -272,7 +289,7 @@ extern unsigned long cr3; #define set_dr1(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr1" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr1" : : "r" (_temp__)); \ }) #endif @@ -282,7 +299,7 @@ extern unsigned long cr3; #define get_dr2() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr2, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr2, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -293,7 +310,7 @@ extern unsigned long cr3; #define set_dr2(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr2" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr2" : : "r" (_temp__)); \ }) #endif @@ -303,7 +320,7 @@ extern unsigned long cr3; #define get_dr3() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr3, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr3, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -314,7 +331,7 @@ extern unsigned long cr3; #define set_dr3(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr3" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr3" : : "r" (_temp__)); \ }) #endif @@ -324,7 +341,7 @@ extern unsigned long cr3; #define get_dr6() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr6, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr6, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -335,7 +352,7 @@ extern unsigned long cr3; #define set_dr6(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr6" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr6" : : "r" (_temp__)); \ }) #endif @@ -345,7 +362,7 @@ extern unsigned long cr3; #define get_dr7() \ ({ \ register unsigned long _temp__; \ - asm volatile("movl %%dr7, %0" : "=r" (_temp__)); \ + asm volatile("mov %%dr7, %0" : "=r" (_temp__)); \ _temp__; \ }) #endif @@ -356,7 +373,7 @@ extern unsigned long cr3; #define set_dr7(value) \ ({ \ register unsigned long _temp__ = (value); \ - asm volatile("movl %0,%%dr7" : : "r" (_temp__)); \ + asm volatile("mov %0,%%dr7" : : "r" (_temp__)); \ }) #endif |