PERFORCE change 28417 for review
Peter Wemm
peter at FreeBSD.org
Mon Apr 7 01:00:50 PDT 2003
http://perforce.freebsd.org/chv.cgi?CH=28417
Change 28417 by peter at peter_overcee on 2003/04/07 01:00:41
argh. dont ask for 64 bit register when we mean %eax/%edx.
Otherwise we get what we ask for.. The *msr instructions are
32 bit.. (!)
Affected files ...
.. //depot/projects/hammer/sys/x86_64/include/cpufunc.h#9 edit
Differences ...
==== //depot/projects/hammer/sys/x86_64/include/cpufunc.h#9 (text+ko) ====
@@ -315,37 +315,37 @@
static __inline u_long
read_rflags(void)
{
- u_long ef;
+ u_long rf;
- __asm __volatile("pushfq; popq %0" : "=r" (ef));
- return (ef);
+ __asm __volatile("pushfq; popq %0" : "=r" (rf));
+ return (rf);
}
static __inline u_int64_t
rdmsr(u_int msr)
{
- u_int64_t rv;
+ u_int32_t low, high;
- __asm __volatile("rdmsr" : "=A" (rv) : "c" (msr));
- return (rv);
+ __asm __volatile("rdmsr" : "=a" (low), "=d" (high) : "c" (msr));
+ return (low | ((u_int64_t)high << 32));
}
static __inline u_int64_t
rdpmc(u_int pmc)
{
- u_int64_t rv;
+ u_int32_t low, high;
- __asm __volatile("rdpmc" : "=A" (rv) : "c" (pmc));
- return (rv);
+ __asm __volatile("rdpmc" : "=a" (low), "=d" (high) : "c" (pmc));
+ return (low | ((u_int64_t)high << 32));
}
static __inline u_int64_t
rdtsc(void)
{
- u_int64_t rv;
+ u_int32_t low, high;
- __asm __volatile("rdtsc" : "=A" (rv));
- return (rv);
+ __asm __volatile("rdtsc" : "=a" (low), "=d" (high));
+ return (low | ((u_int64_t)high << 32));
}
static __inline void
@@ -355,15 +355,19 @@
}
static __inline void
-write_rflags(u_long ef)
+write_rflags(u_long rf)
{
- __asm __volatile("pushq %0; popfq" : : "r" (ef));
+ __asm __volatile("pushq %0; popfq" : : "r" (rf));
}
static __inline void
wrmsr(u_int msr, u_int64_t newval)
{
- __asm __volatile("wrmsr" : : "A" (newval), "c" (msr));
+ u_int32_t low, high;
+
+ low = newval;
+ high = newval >> 32;
+ __asm __volatile("wrmsr" : : "a" (low), "d" (high), "c" (msr));
}
static __inline void
@@ -557,11 +561,11 @@
u_int64_t rdtsc(void);
u_int read_rflags(void);
void wbinvd(void);
-void write_rflags(u_int ef);
+void write_rflags(u_int rf);
void wrmsr(u_int msr, u_int64_t newval);
void load_dr7(u_int dr7);
register_t intr_disable(void);
-void intr_restore(register_t ef);
+void intr_restore(register_t rf);
#endif /* __GNUC__ */
More information about the p4-projects
mailing list