[PATCH v5 00/12] x86/msr: Drop 32-bit MSR interfaces
flat view
WARM1d
PENDING · 4 of 12 reviewed
From: Juergen Gross <jgross@suse.com>
Date: 2026-10-26 13:02:29
Also in:
dri-devel, kvm, linux-acpi, linux-coco, linux-crypto, linux-edac, linux-gpio, linux-hwmon, linux-hyperv, linux-ide, linux-pci, linux-perf-users, linux-pm, lkml, platform-driver-x86, virtualization, xen-devel
Subsystem:
acpi, agpgart driver, amd geode processor/chipset support, amd pstate driver, char and misc drivers, cpu frequency scaling framework, edac-amd64, edac-core, edac-intel-bff-reset, framebuffer layer, gpio subsystem, hardware monitoring, hardware random number generator core, hibernation (aka software suspend, aka swsusp), hpet: x86, hygon processor support, hyper-v/azure core and drivers, intel idle driver, intel pmc core driver, intel pstate driver, intel speed select technology, kernel virtual machine for x86 (kvm/x86), kvm paravirt (kvm/paravirt), libata subsystem (serial and parallel ata drivers), memory technology devices (mtd), nand flash subsystem, paravirt_ops interface, pci subsystem, performance events subsystem, power management core, rdt - resource allocation, the rest, thermal, x86 architecture (32-bit and 64-bit), x86 hardware vulnerabilities, x86 mce infrastructure, x86 microcode update support, x86 mm, x86 platform drivers, xen hypervisor x86, zhaoxin processor support · Maintainers:
"Rafael J. Wysocki", David Airlie, Huang Rui, Mario Limonciello, Arnd Bergmann, Greg Kroah-Hartman, Viresh Kumar, Yazen Ghannam, Borislav Petkov, Tony Luck, Helge Deller, Linus Walleij, Bartosz Golaszewski, Guenter Roeck, Olivia Mackall, Herbert Xu, Pu Wen, Haiyang Zhang, Wei Liu, Dexuan Cui, Artem Bityutskiy, Artem Bityutskiy, Rajneesh Bhardwaj, Xi Pardee, Srinivas Pandruvada, Len Brown, Sean Christopherson, Paolo Bonzini, Damien Le Moal, Niklas Cassel, Miquel Raynal, Richard Weinberger, Vignesh Raghavendra, Juergen Gross, Bjorn Helgaas, Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Namhyung Kim, Reinette Chatre, Linus Torvalds, Daniel Lezcano, Thomas Gleixner, Dave Hansen, Josh Poimboeuf, Andy Lutomirski, Hans de Goede, Ilpo Järvinen, Tony W Wang-oc
Status: Pending, 4 of 12 reviewed.
Revision v5 (5 revisions archived).
Revisions (5)
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.
Based on kernel 7.4 as of 2026-10-26.
IMHO at least patches 2 and 3 should be applied rather sooner than later
in order to avoid new instances of the 32-bit variants of the *_safe()
functions creeping in again.
Changes in V2:
- dropped already applied patches
- added patch 1
- rebased
Changes in V3:
- small fixes in patches 4 and 13
- rebased
Changes in V4:
- rebased
Changes in V5:
- patch 9 of V4 has been applied
- rebased
Juergen Gross (12):
x86/cpu: Fix coding style violation
x86/msr: Remove wrmsr_safe()
x86/msr: Remove rdmsr_safe()
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
x86/msr: Remove wrmsr()
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 | 15 ++----
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 | 9 ++--
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 | 10 ----
arch/x86/include/asm/msr.h | 39 ++-------------
arch/x86/include/asm/paravirt.h | 26 +---------
arch/x86/kernel/apic/apic.c | 14 +++---
arch/x86/kernel/apic/apic_numachip.c | 6 +--
arch/x86/kernel/cet.c | 2 +-
arch/x86/kernel/cpu/amd.c | 14 +++---
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 | 8 +--
arch/x86/kernel/cpu/common.c | 12 ++---
arch/x86/kernel/cpu/feat_ctl.c | 4 +-
arch/x86/kernel/cpu/hygon.c | 4 +-
arch/x86/kernel/cpu/intel.c | 6 +--
arch/x86/kernel/cpu/intel_epb.c | 4 +-
arch/x86/kernel/cpu/mce/amd.c | 4 +-
arch/x86/kernel/cpu/mce/core.c | 8 +--
arch/x86/kernel/cpu/mce/inject.c | 2 +-
arch/x86/kernel/cpu/mce/intel.c | 18 +++----
arch/x86/kernel/cpu/mce/p5.c | 8 +--
arch/x86/kernel/cpu/mce/winchip.c | 2 +-
arch/x86/kernel/cpu/microcode/intel.c | 2 +-
arch/x86/kernel/cpu/mshyperv.c | 6 +--
arch/x86/kernel/cpu/mtrr/amd.c | 4 +-
arch/x86/kernel/cpu/mtrr/cleanup.c | 4 +-
arch/x86/kernel/cpu/mtrr/generic.c | 32 ++++++------
arch/x86/kernel/cpu/mtrr/mtrr.c | 2 +-
arch/x86/kernel/cpu/resctrl/core.c | 2 +-
arch/x86/kernel/cpu/resctrl/monitor.c | 4 +-
arch/x86/kernel/cpu/resctrl/pseudo_lock.c | 4 +-
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 | 8 +--
arch/x86/kernel/cpu/tsx.c | 10 ++--
arch/x86/kernel/cpu/umwait.c | 2 +-
arch/x86/kernel/cpu/zhaoxin.c | 4 +-
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 | 2 +-
arch/x86/kernel/tsc_msr.c | 6 +--
arch/x86/kernel/tsc_sync.c | 6 +--
arch/x86/kvm/msrs.c | 2 +-
arch/x86/kvm/svm/pmu.c | 4 +-
arch/x86/kvm/svm/svm.c | 6 +--
arch/x86/kvm/vmx/main.c | 2 +-
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/tdx.c | 2 +-
arch/x86/kvm/vmx/vmx.c | 40 +++++++--------
arch/x86/kvm/x86.c | 6 +--
arch/x86/lib/insn-eval.c | 6 +--
arch/x86/lib/msr-smp.c | 2 +-
arch/x86/mm/pat/memtype.c | 2 +-
arch/x86/pci/amd_bus.c | 8 +--
arch/x86/platform/olpc/olpc-xo1-rtc.c | 6 +--
arch/x86/platform/olpc/olpc-xo1-sci.c | 2 +-
arch/x86/power/cpu.c | 10 ++--
arch/x86/realmode/init.c | 2 +-
arch/x86/virt/hw.c | 8 +--
arch/x86/virt/svm/sev.c | 22 ++++----
arch/x86/virt/vmx/tdx/tdx.c | 2 +-
arch/x86/xen/suspend.c | 2 +-
drivers/acpi/processor_perflib.c | 2 +-
drivers/ata/pata_cs5535.c | 24 ++++-----
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 | 8 +--
drivers/cpufreq/amd-pstate.c | 4 +-
drivers/cpufreq/e_powersaver.c | 20 ++++----
drivers/cpufreq/intel_pstate.c | 28 +++++------
drivers/cpufreq/longhaul.c | 12 ++---
drivers/cpufreq/longrun.c | 16 +++---
drivers/cpufreq/powernow-k7.c | 10 ++--
drivers/cpufreq/powernow-k8.c | 8 +--
drivers/cpufreq/speedstep-centrino.c | 4 +-
drivers/cpufreq/speedstep-lib.c | 14 +++---
drivers/edac/amd64_edac.c | 6 +--
drivers/edac/intel-bff.c | 4 +-
drivers/gpio/gpio-cs5535.c | 10 ++--
drivers/hv/mshv_vtl_main.c | 2 +-
drivers/hwmon/hwmon-vid.c | 4 +-
drivers/idle/intel_idle.c | 26 +++++-----
drivers/misc/cs5535-mfgpt.c | 6 +--
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_msr.c | 2 +-
drivers/thermal/intel/intel_hfi.c | 8 +--
drivers/thermal/intel/therm_throt.c | 22 ++++----
drivers/thermal/intel/x86_pkg_temp_thermal.c | 6 +--
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 ++--
140 files changed, 567 insertions(+), 685 deletions(-)
--
2.56.0