]> 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)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Oct 2025 09:56:25 +0000 (11:56 +0200)
[ Upstream commit ac9c408ed19d535289ca59200dd6a44a6a2d6036 ]

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
Signed-off-by: Sasha Levin <sashal@kernel.org>
arch/x86/include/asm/segment.h

index 2e7890dd58a47714fbba4bbddb68e05605835ee5..7865f180eb087ae1059c01f113f27ba1dfd2eea7 100644 (file)
@@ -243,7 +243,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
@@ -253,10 +253,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);