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