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:53:24
On 2004.09.21 16:46:25 +0000, Jason Thorpe wrote:
> I like this suggestion.  Don't forget wrmsr64().

Ok. Here they are:
static __inline u_int64_t
rdmsr64(u_int msr)
{
        u_int64_t rv;
        u_int32_t regs[2];

        __asm __volatile("rdmsr" : "=A" (regs[0]), "=D" (regs[1]) : "c" (msr));
        rv = ((u_int64_t) regs[1] << 32) + regs[0];

        return (rv);

}

static __inline void
wrmsr64(u_int msr, u_int64_t newval)
{
        u_int32_t regs[2];

        regs[0] = (u_int32_t) (newval >> 32);
        regs[1] = (u_int32_t) newval;

        __asm __volatile("wrmsr" : : "A" (regs[0]), "D" (regs[1]), "c" (msr));
}


-- 
Rui Paulo                          "Simplicity is the ultimate sophistication."
                                      -- Leonardo da Vinci