summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2020-03-28 18:56:04 +0100
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2020-03-28 18:56:04 +0100
commit328335176df95e9762cc5e04877cb231b0b2292e (patch)
tree9d2c7be13ab936f2bf9158e564cb2e36329c8dd1
parent4e4156bbdfdbc9855420de31d8bf4860f26f75f6 (diff)
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.
-rw-r--r--i386/i386/proc_reg.h43
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