aboutsummaryrefslogtreecommitdiffstats
path: root/xen/include/asm-x86/msr.h
diff options
context:
space:
mode:
authorkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2005-02-18 13:34:28 +0000
committerkaf24@scramble.cl.cam.ac.uk <kaf24@scramble.cl.cam.ac.uk>2005-02-18 13:34:28 +0000
commitc38a84195269fe27ac6e2e714b89c86bf8aab78d (patch)
tree910ce858e869caeeeff724f028250c85d3961d62 /xen/include/asm-x86/msr.h
parent6ea6052a260c301e7ad6755669a73e739bdca6c0 (diff)
downloadxen-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.h43
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))