On 2024-12-02 23:44, Björn Töpel wrote: > Thanks for working on this! > > Celeste Liu <uwu@xxxxxxxxxxxxxxxxx> writes: > >> The orig_a0 is missing in struct user_regs_struct of riscv, and there is >> no way to add it without breaking UAPI. (See Link tag below) >> >> Like NT_ARM_SYSTEM_CALL do, we add a new regset name NT_RISCV_ORIG_A0 to >> access original a0 register from userspace via ptrace API. >> >> Link: https://lore.kernel.org/all/59505464-c84a-403d-972f-d4b2055eeaac@xxxxxxxxx/ >> Signed-off-by: Celeste Liu <uwu@xxxxxxxxxxxxxxxxx> >> --- >> arch/riscv/kernel/ptrace.c | 33 +++++++++++++++++++++++++++++++++ >> include/uapi/linux/elf.h | 1 + >> 2 files changed, 34 insertions(+) >> >> diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c >> index ea67e9fb7a583683b922fe2c017ea61f3bc848db..faa46de9000376eb445a32d43a40210d7b846844 100644 >> --- a/arch/riscv/kernel/ptrace.c >> +++ b/arch/riscv/kernel/ptrace.c >> @@ -31,6 +31,7 @@ enum riscv_regset { >> #ifdef CONFIG_RISCV_ISA_SUPM >> REGSET_TAGGED_ADDR_CTRL, >> #endif >> + REGSET_ORIG_A0, >> }; >> >> static int riscv_gpr_get(struct task_struct *target, >> @@ -184,6 +185,30 @@ static int tagged_addr_ctrl_set(struct task_struct *target, >> } >> #endif >> >> +static int riscv_orig_a0_get(struct task_struct *target, >> + const struct user_regset *regset, >> + struct membuf to) > > Use full 100 chars! Linux code style prefer 80 limit. > >> +{ >> + return membuf_store(&to, task_pt_regs(target)->orig_a0); >> +} >> + >> +static int riscv_orig_a0_set(struct task_struct *target, >> + const struct user_regset *regset, >> + unsigned int pos, unsigned int count, >> + const void *kbuf, const void __user *ubuf) > > Dito! > >> +{ >> + int orig_a0 = task_pt_regs(target)->orig_a0; > > 64b regs on RV64. Oh, my bad. > >> + int ret; >> + >> + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &orig_a0, 0, -1); >> + if (ret) >> + return ret; >> + >> + task_pt_regs(target)->orig_a0 = orig_a0; >> + return ret; >> +} >> + >> + > > Multiple blanks. > >> static const struct user_regset riscv_user_regset[] = { >> [REGSET_X] = { >> .core_note_type = NT_PRSTATUS, >> @@ -224,6 +249,14 @@ static const struct user_regset riscv_user_regset[] = { >> .set = tagged_addr_ctrl_set, >> }, >> #endif >> + [REGSET_ORIG_A0] = { >> + .core_note_type = NT_RISCV_ORIG_A0, >> + .n = 1, >> + .size = sizeof(elf_greg_t), >> + .align = sizeof(elf_greg_t), > > ...and sizeof(elf_greg_t) is 64b in RV64 -- mismatch above. v2 has been sent. > > > Björn