From: Dave Hansen <dave.hansen@linux.intel.com>
The paravirt and native code define very similar rdmsr()
implementations. Move the native one out to common code
and ensure it can find the paravirt implementation by
defining raw_read_msr() there.
Remove the now duplicate paravirt rdmsr().
Signed-off-by: Dave Hansen <dave.hansen@linux.intel.com>
---
b/arch/x86/include/asm/msr.h | 20 +++++++++++++-------
b/arch/x86/include/asm/paravirt.h | 7 -------
2 files changed, 13 insertions(+), 14 deletions(-)
diff -puN arch/x86/include/asm/msr.h~rdmsr-dups-2 arch/x86/include/asm/msr.h
--- a/arch/x86/include/asm/msr.h~rdmsr-dups-2 2026-03-20 11:24:18.760780632 -0700
+++ b/arch/x86/include/asm/msr.h 2026-03-20 11:24:18.767780943 -0700
@@ -171,6 +171,9 @@ static inline u64 native_read_pmc(int co
#ifdef CONFIG_PARAVIRT_XXL
#include <asm/paravirt.h>
+
+#define raw_read_msr paravirt_read_msr
+
#else
#include <linux/errno.h>
@@ -185,13 +188,6 @@ static inline u64 native_read_pmc(int co
* pointer indirection), this allows gcc to optimize better
*/
-#define rdmsr(msr, low, high) \
-do { \
- u64 __val = raw_read_msr((msr)); \
- (void)((low) = (u32)__val); \
- (void)((high) = (u32)(__val >> 32)); \
-} while (0)
-
static inline void wrmsr(u32 msr, u32 low, u32 high)
{
raw_write_msr(msr, (u64)high << 32 | low);
@@ -233,6 +229,16 @@ static __always_inline u64 rdpmc(int cou
#endif /* !CONFIG_PARAVIRT_XXL */
+/*
+ * Common paravirt and native helpers:
+ */
+#define rdmsr(msr, low, high) \
+do { \
+ u64 __val = raw_read_msr((msr)); \
+ (void)((low) = (u32)__val); \
+ (void)((high) = (u32)(__val >> 32)); \
+} while (0)
+
/* Instruction opcode for WRMSRNS supported in binutils >= 2.40 */
#define ASM_WRMSRNS _ASM_BYTES(0x0f,0x01,0xc6)
diff -puN arch/x86/include/asm/paravirt.h~rdmsr-dups-2 arch/x86/include/asm/paravirt.h
--- a/arch/x86/include/asm/paravirt.h~rdmsr-dups-2 2026-03-20 11:24:18.764780810 -0700
+++ b/arch/x86/include/asm/paravirt.h 2026-03-20 11:24:18.767780943 -0700
@@ -161,13 +161,6 @@ static inline int paravirt_write_msr_saf
return PVOP_CALL2(int, pv_ops, cpu.write_msr_safe, msr, val);
}
-#define rdmsr(msr, val1, val2) \
-do { \
- u64 _l = paravirt_read_msr(msr); \
- val1 = (u32)_l; \
- val2 = _l >> 32; \
-} while (0)
-
static __always_inline void wrmsr(u32 msr, u32 low, u32 high)
{
paravirt_write_msr(msr, (u64)high << 32 | low);
_