diff options
author | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-18 13:34:28 +0000 |
---|---|---|
committer | kaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk> | 2005-02-18 13:34:28 +0000 |
commit | c38a84195269fe27ac6e2e714b89c86bf8aab78d (patch) | |
tree | 910ce858e869caeeeff724f028250c85d3961d62 /xen/include/asm-x86/msr.h | |
parent | 6ea6052a260c301e7ad6755669a73e739bdca6c0 (diff) | |
download | xen-c38a84195269fe27ac6e2e714b89c86bf8aab78d.tar.gz xen-c38a84195269fe27ac6e2e714b89c86bf8aab78d.tar.bz2 xen-c38a84195269fe27ac6e2e714b89c86bf8aab78d.zip |
bitkeeper revision 1.1223 (4215eee4gqIO-1mu8V6FHhIhoaqaiQ)
Change priv-op emulation behaviour to fail silently in some cases
rather than propagate the fault (still non-silent in debug builds!).
Also be careful in running user-specified RDMSR/WRMSR: an invalid
MSR index causes a GP(0) fault.
Signed-off-by: Keir Fraser <keir@xensource.com>
Diffstat (limited to 'xen/include/asm-x86/msr.h')
-rw-r--r-- | xen/include/asm-x86/msr.h | 43 |
1 files changed, 30 insertions, 13 deletions
diff --git a/xen/include/asm-x86/msr.h b/xen/include/asm-x86/msr.h index a7178f2e3b..dd01e9642a 100644 --- a/xen/include/asm-x86/msr.h +++ b/xen/include/asm-x86/msr.h @@ -1,29 +1,46 @@ #ifndef __ASM_MSR_H #define __ASM_MSR_H -/* - * Access to machine-specific registers (available on 586 and better only) - * Note: the rd* operations modify the parameters directly (without using - * pointer indirection), this allows gcc to optimize better - */ - #define rdmsr(msr,val1,val2) \ __asm__ __volatile__("rdmsr" \ : "=a" (val1), "=d" (val2) \ : "c" (msr)) -#define rdmsrl(msr,val) do { unsigned long a__,b__; \ - __asm__ __volatile__("rdmsr" \ - : "=a" (a__), "=d" (b__) \ - : "c" (msr)); \ - val = a__ | (b__<<32); \ -} while(0); - #define wrmsr(msr,val1,val2) \ __asm__ __volatile__("wrmsr" \ : /* no outputs */ \ : "c" (msr), "a" (val1), "d" (val2)) +#define rdmsr_user(msr,val1,val2) ({\ + int _rc = 0; \ + __asm__ __volatile__( \ + "1: rdmsr\n2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: movl $1,%2\n; jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " "__FIXUP_ALIGN"\n" \ + " "__FIXUP_WORD" 1b,3b\n" \ + ".previous\n" \ + : "=a" (val1), "=d" (val2), "=r" (_rc) \ + : "c" (msr)); \ + _rc; }) + +#define wrmsr_user(msr,val1,val2) ({\ + int _rc = 0; \ + __asm__ __volatile__( \ + "1: wrmsr\n2:\n" \ + ".section .fixup,\"ax\"\n" \ + "3: movl $1,%0\n; jmp 2b\n" \ + ".previous\n" \ + ".section __ex_table,\"a\"\n" \ + " "__FIXUP_ALIGN"\n" \ + " "__FIXUP_WORD" 1b,3b\n" \ + ".previous\n" \ + : "=r" (_rc) \ + : "c" (msr), "a" (val1), "d" (val2)); \ + _rc; }) + #define rdtsc(low,high) \ __asm__ __volatile__("rdtsc" : "=a" (low), "=d" (high)) |