[PATCH 00/32] x86/msr: Drop 32-bit MSR interfaces
From: Juergen Gross
Date: Mon Jun 29 2026 - 02:06:37 EST
For accessing the MSR registers on the local CPU, there are 2 types of
interfaces: the "modern" 64-bit ones (rdmsrq() etc.) and the 32-bit
ones (rdmsr() etc.) which are using the upper and lower 32-bit halves
of the 64-bit wide MSR register values.
The 32-bit interfaces are not optimal for 3 reasons:
- They are based on primitives using 64-bit sized values anyway.
- Modern x86 CPUs have added support for MSR access instructions using
an immediate value instead of a register for addressing the MSR,
while the value is in a 64-bit register.
- rdmsr() is a macro storing the upper and lower 32-bit halves in
variables specified as macro parameters. This is obscuring variable
assignment through a macro. Additionally rdmsrq() is mimicking this
pattern by being a macro, too, with the target variable specified as
a parameter as well.
For those reasons drop the 32-bit interfaces for accessing the x86 MSR
registers completely and only use the 64-bit variants.
This allows to switch all "high-level" MSR access macros to inline
functions in the end.
This series will be used as the base for further reorganisation of the
MSR access functions, especially for completely inlining the MSR
access instructions even with paravirtualization being active.
Note that most patches of this series are independent from each other.
Only the patches removing a specific interface (patches 7, 15, 26 and
30) and the last two patches of the series depend on all previous
patches.
Based on kernel 7.2-rc1, tested with and without parvirtualization
active, compile tested for x86 with 64- and 32-bit allyes and allno
configs.
Juergen Gross (32):
thermal/intel: Stop using 32-bit MSR interfaces
powercap: Stop using 32-bit MSR interfaces
edac: Stop using 32-bit MSR interfaces
acpi: Stop using 32-bit MSR interfaces
x86/mtrr: Stop using 32-bit MSR interfaces
x86/msr: Stop using 32-bit MSR interfaces in lib/msr-smp.c
x86/msr: Remove wrmsr_safe()
x86/mce: Stop using 32-bit MSR interfaces
KVM/x86: Stop using 32-bit MSR interfaces
x86/hygon: Stop using 32-bit MSR interfaces
x86/pci: Stop using 32-bit MSR interfaces
x86/amd: Stop using 32-bit MSR interfaces
x86/featctl: Stop using 32-bit MSR interfaces
x86/tsc: Stop using 32-bit MSR interfaces
x86/msr: Remove rdmsr_safe()
cpufreq: Stop using 32-bit MSR interfaces
x86/resctrl: Stop using 32-bit MSR interfaces
x86/apic: Stop using 32-bit MSR interfaces
x86/cpu: Stop using 32-bit MSR interfaces
drivers/ata: Stop using 32-bit MSR interfaces
agp/nvidia: Stop using 32-bit MSR interfaces
fbdev/geode: Stop using 32-bit MSR interfaces
hw_random/via-rng: Stop using 32-bit MSR interfaces
drivers/gpio: Stop using 32-bit MSR interfaces
drivers/misc: Stop using 32-bit MSR interfaces
x86/msr: Remove wrmsr()
x86/hyperv: Stop using 32-bit MSR interfaces
x86/olpc: Stop using 32-bit MSR interfaces
hwmon: Stop using 32-bit MSR interfaces
x86/msr: Remove rdmsr()
treewide: convert rdmsrq() from a macro to an inline function
x86/msr: Simplify some rdmsrq() use cases
arch/x86/coco/sev/core.c | 2 +-
arch/x86/events/amd/brs.c | 4 +-
arch/x86/events/amd/core.c | 8 +-
arch/x86/events/amd/ibs.c | 18 ++--
arch/x86/events/amd/lbr.c | 16 +--
arch/x86/events/amd/power.c | 8 +-
arch/x86/events/amd/uncore.c | 4 +-
arch/x86/events/core.c | 20 ++--
arch/x86/events/intel/core.c | 14 +--
arch/x86/events/intel/cstate.c | 5 +-
arch/x86/events/intel/ds.c | 2 +-
arch/x86/events/intel/knc.c | 10 +-
arch/x86/events/intel/lbr.c | 25 ++---
arch/x86/events/intel/p4.c | 6 +-
arch/x86/events/intel/p6.c | 4 +-
arch/x86/events/intel/pt.c | 12 +--
arch/x86/events/intel/uncore.c | 6 +-
arch/x86/events/intel/uncore_nhmex.c | 4 +-
arch/x86/events/intel/uncore_snb.c | 2 +-
arch/x86/events/intel/uncore_snbep.c | 6 +-
arch/x86/events/msr.c | 2 +-
arch/x86/events/perf_event.h | 6 +-
arch/x86/events/rapl.c | 6 +-
arch/x86/events/zhaoxin/core.c | 10 +-
arch/x86/hyperv/hv_apic.c | 17 ++--
arch/x86/hyperv/hv_init.c | 26 ++---
arch/x86/hyperv/hv_spinlock.c | 2 +-
arch/x86/include/asm/apic.h | 7 +-
arch/x86/include/asm/debugreg.h | 6 +-
arch/x86/include/asm/fsgsbase.h | 2 +-
arch/x86/include/asm/kvm_host.h | 5 +-
arch/x86/include/asm/msr.h | 39 +-------
arch/x86/include/asm/paravirt.h | 26 +----
arch/x86/include/asm/resctrl.h | 5 +-
arch/x86/kernel/acpi/sleep.c | 20 ++--
arch/x86/kernel/apic/apic.c | 45 ++++-----
arch/x86/kernel/apic/apic_numachip.c | 6 +-
arch/x86/kernel/cet.c | 2 +-
arch/x86/kernel/cpu/amd.c | 42 ++++----
arch/x86/kernel/cpu/aperfmperf.c | 8 +-
arch/x86/kernel/cpu/bugs.c | 12 +--
arch/x86/kernel/cpu/bus_lock.c | 8 +-
arch/x86/kernel/cpu/centaur.c | 35 +++----
arch/x86/kernel/cpu/common.c | 22 +++--
arch/x86/kernel/cpu/feat_ctl.c | 27 +++---
arch/x86/kernel/cpu/hygon.c | 9 +-
arch/x86/kernel/cpu/intel.c | 12 +--
arch/x86/kernel/cpu/intel_epb.c | 4 +-
arch/x86/kernel/cpu/mce/amd.c | 89 ++++++++---------
arch/x86/kernel/cpu/mce/core.c | 10 +-
arch/x86/kernel/cpu/mce/inject.c | 2 +-
arch/x86/kernel/cpu/mce/intel.c | 18 ++--
arch/x86/kernel/cpu/mce/p5.c | 16 +--
arch/x86/kernel/cpu/mce/winchip.c | 10 +-
arch/x86/kernel/cpu/microcode/intel.c | 2 +-
arch/x86/kernel/cpu/mshyperv.c | 6 +-
arch/x86/kernel/cpu/mtrr/amd.c | 36 ++++---
arch/x86/kernel/cpu/mtrr/centaur.c | 18 ++--
arch/x86/kernel/cpu/mtrr/cleanup.c | 18 ++--
arch/x86/kernel/cpu/mtrr/generic.c | 97 ++++++++++---------
arch/x86/kernel/cpu/mtrr/mtrr.c | 4 +-
arch/x86/kernel/cpu/resctrl/core.c | 9 +-
arch/x86/kernel/cpu/resctrl/monitor.c | 27 +++---
arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 12 +--
arch/x86/kernel/cpu/resctrl/rdtgroup.c | 2 +-
arch/x86/kernel/cpu/topology.c | 2 +-
arch/x86/kernel/cpu/topology_amd.c | 4 +-
arch/x86/kernel/cpu/transmeta.c | 9 +-
arch/x86/kernel/cpu/tsx.c | 10 +-
arch/x86/kernel/cpu/umwait.c | 2 +-
arch/x86/kernel/cpu/zhaoxin.c | 12 +--
arch/x86/kernel/fpu/core.c | 2 +-
arch/x86/kernel/hpet.c | 2 +-
arch/x86/kernel/kvm.c | 2 +-
arch/x86/kernel/mmconf-fam10h_64.c | 6 +-
arch/x86/kernel/process.c | 4 +-
arch/x86/kernel/process_64.c | 14 +--
arch/x86/kernel/shstk.c | 8 +-
arch/x86/kernel/traps.c | 4 +-
arch/x86/kernel/tsc.c | 8 +-
arch/x86/kernel/tsc_msr.c | 15 +--
arch/x86/kernel/tsc_sync.c | 6 +-
arch/x86/kvm/svm/pmu.c | 4 +-
arch/x86/kvm/svm/svm.c | 4 +-
arch/x86/kvm/vmx/nested.c | 4 +-
arch/x86/kvm/vmx/pmu_intel.c | 8 +-
arch/x86/kvm/vmx/sgx.c | 6 +-
arch/x86/kvm/vmx/vmx.c | 54 ++++++-----
arch/x86/kvm/x86.c | 12 +--
arch/x86/lib/insn-eval.c | 6 +-
arch/x86/lib/msr-smp.c | 8 +-
arch/x86/mm/pat/memtype.c | 2 +-
arch/x86/pci/amd_bus.c | 8 +-
arch/x86/pci/mmconfig-shared.c | 8 +-
arch/x86/platform/olpc/olpc-xo1-rtc.c | 6 +-
arch/x86/platform/olpc/olpc-xo1-sci.c | 11 ++-
arch/x86/power/cpu.c | 10 +-
arch/x86/realmode/init.c | 2 +-
arch/x86/virt/hw.c | 8 +-
arch/x86/virt/svm/sev.c | 18 ++--
arch/x86/virt/vmx/tdx/tdx.c | 8 +-
arch/x86/xen/suspend.c | 2 +-
drivers/acpi/processor_perflib.c | 11 ++-
drivers/acpi/processor_throttling.c | 14 +--
drivers/ata/pata_cs5535.c | 20 ++--
drivers/ata/pata_cs5536.c | 17 ++--
drivers/char/agp/nvidia-agp.c | 32 +++---
drivers/char/hw_random/via-rng.c | 29 +++---
drivers/cpufreq/acpi-cpufreq.c | 24 ++---
drivers/cpufreq/amd-pstate.c | 4 +-
drivers/cpufreq/e_powersaver.c | 52 +++++-----
drivers/cpufreq/intel_pstate.c | 30 +++---
drivers/cpufreq/longhaul.c | 23 ++---
drivers/cpufreq/longrun.c | 78 ++++++++-------
drivers/cpufreq/powernow-k6.c | 12 +--
drivers/cpufreq/powernow-k7.c | 10 +-
drivers/cpufreq/powernow-k8.c | 67 ++++++-------
drivers/cpufreq/speedstep-centrino.c | 16 +--
drivers/cpufreq/speedstep-lib.c | 63 ++++++------
drivers/edac/amd64_edac.c | 6 +-
drivers/edac/ie31200_edac.c | 10 +-
drivers/edac/mce_amd.c | 8 +-
drivers/gpio/gpio-cs5535.c | 10 +-
drivers/hv/mshv_vtl_main.c | 2 +-
drivers/hwmon/hwmon-vid.c | 11 ++-
drivers/idle/intel_idle.c | 26 ++---
drivers/misc/cs5535-mfgpt.c | 33 +++----
drivers/mtd/nand/raw/cs553x_nand.c | 6 +-
drivers/platform/x86/intel/ifs/load.c | 10 +-
drivers/platform/x86/intel/ifs/runtest.c | 8 +-
drivers/platform/x86/intel/pmc/cnp.c | 2 +-
.../intel/speed_select_if/isst_if_mbox_msr.c | 6 +-
.../intel/speed_select_if/isst_tpmi_core.c | 2 +-
drivers/platform/x86/intel_ips.c | 20 ++--
drivers/powercap/intel_rapl_common.c | 20 ++--
drivers/powercap/intel_rapl_msr.c | 2 +-
drivers/thermal/intel/intel_hfi.c | 8 +-
drivers/thermal/intel/intel_tcc.c | 10 +-
drivers/thermal/intel/therm_throt.c | 74 +++++++-------
drivers/thermal/intel/x86_pkg_temp_thermal.c | 32 +++---
drivers/video/fbdev/geode/display_gx.c | 8 +-
drivers/video/fbdev/geode/gxfb_core.c | 2 +-
drivers/video/fbdev/geode/lxfb_ops.c | 50 +++++-----
drivers/video/fbdev/geode/suspend_gx.c | 24 ++---
drivers/video/fbdev/geode/video_gx.c | 8 +-
include/linux/cs5535.h | 10 +-
146 files changed, 1044 insertions(+), 1128 deletions(-)
--
2.54.0