Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

RISC-V: selftests: cbo: Ensure asm operands match constraints

The 'i' constraint expects a constant operand, which fn and its
constant derivative MK_CBO(fn) are, but passing fn through a function
as a parameter and using a local variable for MK_CBO(fn) allow the
compiler to lose sight of that when no optimization is done. Use
a macro instead of a function and skip the local variable to ensure
the compiler uses constants, matching the asm constraints.

Reported-by: Yunhui Cui <cuiyunhui@bytedance.com>
Closes: https://lore.kernel.org/all/20240117082514.42967-1-cuiyunhui@bytedance.com
Fixes: a29e2a48afe3 ("RISC-V: selftests: Add CBO tests")
Signed-off-by: Andrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/20240117130933.57514-2-ajones@ventanamicro.com
Cc: stable@vger.kernel.org
Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>

authored by

Andrew Jones and committed by
Palmer Dabbelt
0de65288 a894e8ed

+8 -10
+8 -10
tools/testing/selftests/riscv/hwprobe/cbo.c
··· 36 36 regs[0] += 4; 37 37 } 38 38 39 - static void cbo_insn(char *base, int fn) 40 - { 41 - uint32_t insn = MK_CBO(fn); 42 - 43 - asm volatile( 44 - "mv a0, %0\n" 45 - "li a1, %1\n" 46 - ".4byte %2\n" 47 - : : "r" (base), "i" (fn), "i" (insn) : "a0", "a1", "memory"); 48 - } 39 + #define cbo_insn(base, fn) \ 40 + ({ \ 41 + asm volatile( \ 42 + "mv a0, %0\n" \ 43 + "li a1, %1\n" \ 44 + ".4byte %2\n" \ 45 + : : "r" (base), "i" (fn), "i" (MK_CBO(fn)) : "a0", "a1", "memory"); \ 46 + }) 49 47 50 48 static void cbo_inval(char *base) { cbo_insn(base, 0); } 51 49 static void cbo_clean(char *base) { cbo_insn(base, 1); }