Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 158689
b: refs/heads/master
c: 177fed1
h: refs/heads/master
i:
  158687: fa91f25
v: v3
  • Loading branch information
Borislav Petkov authored and H. Peter Anvin committed Aug 31, 2009
1 parent c0e283a commit 8a94f41
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 25 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 132ec92f3f70fe365c1f4b8d46e66cf8a2a16880
refs/heads/master: 177fed1ee8d727c39601ce9fc2299b4cb25a718e
38 changes: 21 additions & 17 deletions trunk/arch/x86/include/asm/msr.h
Original file line number Diff line number Diff line change
Expand Up @@ -71,22 +71,6 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
return EAX_EDX_VAL(val, low, high);
}

static inline unsigned long long native_read_msr_amd_safe(unsigned int msr,
int *err)
{
DECLARE_ARGS(val, low, high);

asm volatile("2: rdmsr ; xor %0,%0\n"
"1:\n\t"
".section .fixup,\"ax\"\n\t"
"3: mov %3,%0 ; jmp 1b\n\t"
".previous\n\t"
_ASM_EXTABLE(2b, 3b)
: "=r" (*err), EAX_EDX_RET(val, low, high)
: "c" (msr), "D" (0x9c5a203a), "i" (-EFAULT));
return EAX_EDX_VAL(val, low, high);
}

static inline void native_write_msr(unsigned int msr,
unsigned low, unsigned high)
{
Expand Down Expand Up @@ -184,14 +168,34 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
*p = native_read_msr_safe(msr, &err);
return err;
}

static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p)
{
u32 gprs[8] = { 0 };
int err;

*p = native_read_msr_amd_safe(msr, &err);
gprs[1] = msr;
gprs[7] = 0x9c5a203a;

err = native_rdmsr_safe_regs(gprs);

*p = gprs[0] | ((u64)gprs[2] << 32);

return err;
}

static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val)
{
u32 gprs[8] = { 0 };

gprs[0] = (u32)val;
gprs[1] = msr;
gprs[2] = val >> 32;
gprs[7] = 0x9c5a203a;

return native_wrmsr_safe_regs(gprs);
}

static inline int rdmsr_safe_regs(u32 *regs)
{
return native_rdmsr_safe_regs(regs);
Expand Down
26 changes: 20 additions & 6 deletions trunk/arch/x86/include/asm/paravirt.h
Original file line number Diff line number Diff line change
Expand Up @@ -166,7 +166,6 @@ struct pv_cpu_ops {

/* MSR, PMC and TSR operations.
err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */
u64 (*read_msr_amd)(unsigned int msr, int *err);
u64 (*read_msr)(unsigned int msr, int *err);
int (*rdmsr_regs)(u32 *regs);
int (*write_msr)(unsigned int msr, unsigned low, unsigned high);
Expand Down Expand Up @@ -828,10 +827,6 @@ static inline int paravirt_rdmsr_regs(u32 *regs)
return PVOP_CALL1(int, pv_cpu_ops.rdmsr_regs, regs);
}

static inline u64 paravirt_read_msr_amd(unsigned msr, int *err)
{
return PVOP_CALL2(u64, pv_cpu_ops.read_msr_amd, msr, err);
}
static inline int paravirt_write_msr(unsigned msr, unsigned low, unsigned high)
{
return PVOP_CALL3(int, pv_cpu_ops.write_msr, msr, low, high);
Expand Down Expand Up @@ -887,12 +882,31 @@ static inline int rdmsrl_safe(unsigned msr, unsigned long long *p)
}
static inline int rdmsrl_amd_safe(unsigned msr, unsigned long long *p)
{
u32 gprs[8] = { 0 };
int err;

*p = paravirt_read_msr_amd(msr, &err);
gprs[1] = msr;
gprs[7] = 0x9c5a203a;

err = paravirt_rdmsr_regs(gprs);

*p = gprs[0] | ((u64)gprs[2] << 32);

return err;
}

static inline int wrmsrl_amd_safe(unsigned msr, unsigned long long val)
{
u32 gprs[8] = { 0 };

gprs[0] = (u32)val;
gprs[1] = msr;
gprs[2] = val >> 32;
gprs[7] = 0x9c5a203a;

return paravirt_wrmsr_regs(gprs);
}

static inline u64 paravirt_read_tsc(void)
{
return PVOP_CALL0(u64, pv_cpu_ops.read_tsc);
Expand Down
1 change: 0 additions & 1 deletion trunk/arch/x86/kernel/paravirt.c
Original file line number Diff line number Diff line change
Expand Up @@ -363,7 +363,6 @@ struct pv_cpu_ops pv_cpu_ops = {
.wbinvd = native_wbinvd,
.read_msr = native_read_msr_safe,
.rdmsr_regs = native_rdmsr_safe_regs,
.read_msr_amd = native_read_msr_amd_safe,
.write_msr = native_write_msr_safe,
.wrmsr_regs = native_wrmsr_safe_regs,
.read_tsc = native_read_tsc,
Expand Down

0 comments on commit 8a94f41

Please sign in to comment.