Subject: Re: rdmsr() function
To: None <port-i386@netbsd.org>
From: Rui Paulo <phlox-netbsd-i386@fnop.net>
List: port-i386
Date: 09/22/2004 21:45:26
On 2004.09.21 16:46:25 +0000, Jason Thorpe wrote:
> I like this suggestion. Don't forget wrmsr64().
Ok. Here they are:
Index: cpufunc.h
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D
RCS file: /cvsroot/src/sys/arch/i386/include/cpufunc.h,v
retrieving revision 1.28
diff -u -r1.28 cpufunc.h
--- cpufunc.h 14 Jan 2004 11:31:55 -0000 1.28
+++ cpufunc.h 22 Sep 2004 20:44:38 -0000
@@ -245,6 +245,19 @@
return (rv);
}
=20
+static __inline u_int64_t
+rdmsr64(u_int msr)
+{ =20
+ u_int64_t rv;
+ u_int32_t regs[2];
+ =20
+ __asm __volatile("rdmsr" : "=3DA" (regs[0]), "=3DD" (regs[1]) : "c" (msr)=
);
+ rv =3D ((u_int64_t) regs[1] << 32) + regs[0];
+
+ return (rv);
+
+}=20
+
static __inline void
wrmsr(u_int msr, u_int64_t newval)
{
@@ -252,6 +265,17 @@
}
=20
static __inline void
+wrmsr64(u_int msr, u_int64_t newval)
+{
+ u_int32_t regs[2];
+=09
+ regs[0] =3D (u_int32_t) (newval >> 32);
+ regs[1] =3D (u_int32_t) newval;
+=09
+ __asm __volatile("wrmsr" : : "A" (regs[0]), "D" (regs[1]), "c" (msr));
+}
+
+static __inline void
wbinvd(void)
{
__asm __volatile("wbinvd");
--=20
Rui Paulo "Simplicity is the ultimate sophisticati=
on."
-- Leonardo da Vinci