Skip to content

Commit

Permalink
selftests: sud_test: return correct emulated syscall value on RISC-V
Browse files Browse the repository at this point in the history
Currently, the sud_test expects the emulated syscall to return the
emulated syscall number. This assumption only works on architectures
were the syscall calling convention use the same register for syscall
number/syscall return value. This is not the case for RISC-V and thus
the return value must be also emulated using the provided ucontext.

Signed-off-by: Clément Léger <cleger@rivosinc.com>
Reviewed-by: Palmer Dabbelt <palmer@rivosinc.com>
Acked-by: Palmer Dabbelt <palmer@rivosinc.com>
Signed-off-by: Björn Töpel <bjorn@rivosinc.com>
  • Loading branch information
clementleger authored and Björn Töpel committed Dec 12, 2023
1 parent cd54c39 commit 770036d
Showing 1 changed file with 14 additions and 0 deletions.
14 changes: 14 additions & 0 deletions tools/testing/selftests/syscall_user_dispatch/sud_test.c
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,20 @@ static void handle_sigsys(int sig, siginfo_t *info, void *ucontext)

/* In preparation for sigreturn. */
SYSCALL_DISPATCH_OFF(glob_sel);

/*
* The tests for argument handling assume that `syscall(x) == x`. This
* is a NOP on x86 because the syscall number is passed in %rax, which
* happens to also be the function ABI return register. Other
* architectures may need to swizzle the arguments around.
*/
#if defined(__riscv)
/* REG_A7 is not defined in libc headers */
# define REG_A7 (REG_A0 + 7)

((ucontext_t *)ucontext)->uc_mcontext.__gregs[REG_A0] =
((ucontext_t *)ucontext)->uc_mcontext.__gregs[REG_A7];
#endif
}

TEST(dispatch_and_return)
Expand Down

0 comments on commit 770036d

Please sign in to comment.