x86: Fix write_msr() casting
authorBarret Rhoden <brho@cs.berkeley.edu>
Thu, 28 Apr 2016 16:42:24 +0000 (12:42 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Mon, 2 May 2016 21:11:15 +0000 (17:11 -0400)
commitc47d812e856902f0ba88e270ff993067959c76e9
tree115369564ae9069cd85e0d978535ef284bb50f36
parentc779429ad7950ef387f29ba96c49e8acc3a2d761
x86: Fix write_msr() casting

The hardware is supposed to ignore the upper 32 bits of rdx and rax, which
it does.  But we shouldn't pass in garbage.

Here's the asm before, with the input value in rax:

# ecx previously loaded
mov    %rax,%rdx  # u64 rax has the val, putting the upper 32 in rdx
shr    $0x20,%rdx  # upper 32 in rdx
wrmsr  # rax still has the upper bits

Here's the new asm:

mov    %rax,%rdx
mov    %edi,%ecx
mov    %eax,%eax  # zeroes the upper part of rax
shr    $0x20,%rdx  # upper 32 in rdx
wrmsr

When the compiler saw the u32 cast, it just ignores the masking.  However,
the inline asm actually takes rax, not eax.  So it's wrong to cast to a u32
there.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/arch/x86/x86.h