diff options
author | Glauber de Oliveira Costa <gcosta@redhat.com> | 2008-01-30 07:31:07 -0500 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2008-01-30 07:31:07 -0500 |
commit | c9dcda5ce46c395c5c99003e259e1973dface640 (patch) | |
tree | aec2a6b41de18d2313c2d620c077835d24222480 | |
parent | b8d1fae7dbde6a1227fa142acecb48dc3dd63817 (diff) |
x86: change write msr functions interface
This patche changes the native_write_msr() and friends interface
to explicitly take 2 32-bit registers instead of a 64-bit value.
The change will ease the merge with 64-bit code. As the 64-bit
value will be passed as two registers anyway in i386,
the PVOP_CALL interface has to account for that and use low/high parameters
It would force the x86_64 version to be different.
The change does not make i386 generated code less efficient. As said above,
it would get the values from two registers anyway.
Signed-off-by: Glauber de Oliveira Costa <gcosta@redhat.com>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-rw-r--r-- | include/asm-x86/msr.h | 19 | ||||
-rw-r--r-- | include/asm-x86/paravirt.h | 2 |
2 files changed, 11 insertions, 10 deletions
diff --git a/include/asm-x86/msr.h b/include/asm-x86/msr.h index effb7319c0a5..cb7222358897 100644 --- a/include/asm-x86/msr.h +++ b/include/asm-x86/msr.h | |||
@@ -63,13 +63,14 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr, | |||
63 | return val; | 63 | return val; |
64 | } | 64 | } |
65 | 65 | ||
66 | static inline void native_write_msr(unsigned int msr, unsigned long long val) | 66 | static inline void native_write_msr(unsigned int msr, |
67 | unsigned low, unsigned high) | ||
67 | { | 68 | { |
68 | asm volatile("wrmsr" : : "c" (msr), "A"(val)); | 69 | asm volatile("wrmsr" : : "c" (msr), "a"(low), "d" (high)); |
69 | } | 70 | } |
70 | 71 | ||
71 | static inline int native_write_msr_safe(unsigned int msr, | 72 | static inline int native_write_msr_safe(unsigned int msr, |
72 | unsigned long long val) | 73 | unsigned low, unsigned high) |
73 | { | 74 | { |
74 | int err; | 75 | int err; |
75 | asm volatile("2: wrmsr ; xorl %0,%0\n" | 76 | asm volatile("2: wrmsr ; xorl %0,%0\n" |
@@ -82,7 +83,7 @@ static inline int native_write_msr_safe(unsigned int msr, | |||
82 | " .long 2b,3b\n\t" | 83 | " .long 2b,3b\n\t" |
83 | ".previous" | 84 | ".previous" |
84 | : "=a" (err) | 85 | : "=a" (err) |
85 | : "c" (msr), "0" ((u32)val), "d" ((u32)(val>>32)), | 86 | : "c" (msr), "0" (low), "d" (high), |
86 | "i" (-EFAULT)); | 87 | "i" (-EFAULT)); |
87 | return err; | 88 | return err; |
88 | } | 89 | } |
@@ -118,20 +119,20 @@ static inline unsigned long long native_read_pmc(int counter) | |||
118 | (val2) = (u32)(__val >> 32); \ | 119 | (val2) = (u32)(__val >> 32); \ |
119 | } while(0) | 120 | } while(0) |
120 | 121 | ||
121 | static inline void wrmsr(u32 __msr, u32 __low, u32 __high) | 122 | static inline void wrmsr(unsigned msr, unsigned low, unsigned high) |
122 | { | 123 | { |
123 | native_write_msr(__msr, ((u64)__high << 32) | __low); | 124 | native_write_msr(msr, low, high); |
124 | } | 125 | } |
125 | 126 | ||
126 | #define rdmsrl(msr,val) \ | 127 | #define rdmsrl(msr,val) \ |
127 | ((val) = native_read_msr(msr)) | 128 | ((val) = native_read_msr(msr)) |
128 | 129 | ||
129 | #define wrmsrl(msr,val) native_write_msr(msr, val) | 130 | #define wrmsrl(msr, val) native_write_msr(msr, (u32)val, (u32)(val >> 32)) |
130 | 131 | ||
131 | /* wrmsr with exception handling */ | 132 | /* wrmsr with exception handling */ |
132 | static inline int wrmsr_safe(u32 __msr, u32 __low, u32 __high) | 133 | static inline int wrmsr_safe(unsigned msr, unsigned low, unsigned high) |
133 | { | 134 | { |
134 | return native_write_msr_safe(__msr, ((u64)__high << 32) | __low); | 135 | return native_write_msr_safe(msr, low, high); |
135 | } | 136 | } |
136 | 137 | ||
137 | /* rdmsr with exception handling */ | 138 | /* rdmsr with exception handling */ |
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 4782be68d0fa..e95c2a655165 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -115,7 +115,7 @@ struct pv_cpu_ops { | |||
115 | /* MSR, PMC and TSR operations. | 115 | /* MSR, PMC and TSR operations. |
116 | err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */ | 116 | err = 0/-EFAULT. wrmsr returns 0/-EFAULT. */ |
117 | u64 (*read_msr)(unsigned int msr, int *err); | 117 | u64 (*read_msr)(unsigned int msr, int *err); |
118 | int (*write_msr)(unsigned int msr, u64 val); | 118 | int (*write_msr)(unsigned int msr, unsigned low, unsigned high); |
119 | 119 | ||
120 | u64 (*read_tsc)(void); | 120 | u64 (*read_tsc)(void); |
121 | u64 (*read_pmc)(int counter); | 121 | u64 (*read_pmc)(int counter); |