Commit 0de65288 authored by Andrew Jones's avatar Andrew Jones Committed by Palmer Dabbelt

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: default avatarYunhui Cui <cuiyunhui@bytedance.com>
Closes: https://lore.kernel.org/all/20240117082514.42967-1-cuiyunhui@bytedance.com
Fixes: a29e2a48 ("RISC-V: selftests: Add CBO tests")
Signed-off-by: default avatarAndrew Jones <ajones@ventanamicro.com>
Link: https://lore.kernel.org/r/20240117130933.57514-2-ajones@ventanamicro.com
Cc: stable@vger.kernel.org
Signed-off-by: default avatarPalmer Dabbelt <palmer@rivosinc.com>
parent a894e8ed
...@@ -36,16 +36,14 @@ static void sigill_handler(int sig, siginfo_t *info, void *context) ...@@ -36,16 +36,14 @@ static void sigill_handler(int sig, siginfo_t *info, void *context)
regs[0] += 4; regs[0] += 4;
} }
static void cbo_insn(char *base, int fn) #define cbo_insn(base, fn) \
{ ({ \
uint32_t insn = MK_CBO(fn); asm volatile( \
"mv a0, %0\n" \
asm volatile( "li a1, %1\n" \
"mv a0, %0\n" ".4byte %2\n" \
"li a1, %1\n" : : "r" (base), "i" (fn), "i" (MK_CBO(fn)) : "a0", "a1", "memory"); \
".4byte %2\n" })
: : "r" (base), "i" (fn), "i" (insn) : "a0", "a1", "memory");
}
static void cbo_inval(char *base) { cbo_insn(base, 0); } static void cbo_inval(char *base) { cbo_insn(base, 0); }
static void cbo_clean(char *base) { cbo_insn(base, 1); } static void cbo_clean(char *base) { cbo_insn(base, 1); }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment