]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
x86/vdso: Fix output operand size of RDPID
authorUros Bizjak <ubizjak@gmail.com>
Mon, 16 Jun 2025 09:52:57 +0000 (11:52 +0200)
committerBorislav Petkov (AMD) <bp@alien8.de>
Tue, 26 Aug 2025 17:33:19 +0000 (19:33 +0200)
RDPID instruction outputs to a word-sized register (64-bit on x86_64 and
32-bit on x86_32). Use an unsigned long variable to store the correct size.

LSL outputs to 32-bit register, use %k operand prefix to always print the
32-bit name of the register.

Use RDPID insn mnemonic while at it as the minimum binutils version of
2.30 supports it.

  [ bp: Merge two patches touching the same function into a single one. ]

Fixes: ffebbaedc861 ("x86/vdso: Introduce helper functions for CPU and node number")
Signed-off-by: Uros Bizjak <ubizjak@gmail.com>
Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
Link: https://lore.kernel.org/20250616095315.230620-1-ubizjak@gmail.com
arch/x86/include/asm/segment.h

index 77d8f49b92bdd05a49c5314eecb0fe523ddc6b4f..f59ae7186940a934eabb94b186a04b9622726704 100644 (file)
@@ -244,7 +244,7 @@ static inline unsigned long vdso_encode_cpunode(int cpu, unsigned long node)
 
 static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
 {
-       unsigned int p;
+       unsigned long p;
 
        /*
         * Load CPU and node number from the GDT.  LSL is faster than RDTSCP
@@ -254,10 +254,10 @@ static inline void vdso_read_cpunode(unsigned *cpu, unsigned *node)
         *
         * If RDPID is available, use it.
         */
-       alternative_io ("lsl %[seg],%[p]",
-                       ".byte 0xf3,0x0f,0xc7,0xf8", /* RDPID %eax/rax */
+       alternative_io ("lsl %[seg],%k[p]",
+                       "rdpid %[p]",
                        X86_FEATURE_RDPID,
-                       [p] "=a" (p), [seg] "r" (__CPUNODE_SEG));
+                       [p] "=r" (p), [seg] "r" (__CPUNODE_SEG));
 
        if (cpu)
                *cpu = (p & VDSO_CPUNODE_MASK);