* [PATCH v6 0/3] riscv/ptrace: add new regset to access original a0 register
@ 2025-01-15 11:13 Celeste Liu
2025-01-15 11:13 ` [PATCH v6 1/3] " Celeste Liu
2025-01-15 22:43 ` [PATCH v6 0/3] " Charlie Jenkins
0 siblings, 2 replies; 4+ messages in thread
From: Celeste Liu @ 2025-01-15 11:13 UTC (permalink / raw)
To: Oleg Nesterov, Paul Walmsley, Palmer Dabbelt, Eric Biederman,
Kees Cook, Shuah Khan, Albert Ou
Cc: Alexandre Ghiti, Dmitry V. Levin, Andrea Bolognani,
Björn Töpel, Thomas Gleixner, Ron Economos,
Charlie Jenkins, Andrew Jones, Quan Zhou, Felix Yan, Ruizhe Pan,
Guo Ren, Yao Zi, linux-riscv, linux-kernel, linux-mm,
linux-kselftest, Celeste Liu, stable, Björn Töpel
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@gmail.com/
Signed-off-by: Celeste Liu <uwu@coelacanthus.name>
---
Changes in v6:
- Fix obsolute comment.
- Copy include/linux/stddef.h to tools/include to use offsetofend in
selftests.
- Link to v5: https://lore.kernel.org/r/20250115-riscv-new-regset-v5-0-d0e6ec031a23@coelacanthus.name
Changes in v5:
- Fix wrong usage in selftests.
- Link to v4: https://lore.kernel.org/r/20241226-riscv-new-regset-v4-0-4496a29d0436@coelacanthus.name
Changes in v4:
- Fix a copy paste error in selftest. (Forget to commit...)
- Link to v3: https://lore.kernel.org/r/20241226-riscv-new-regset-v3-0-f5b96465826b@coelacanthus.name
Changes in v3:
- Use return 0 directly for readability.
- Fix test for modify a0.
- Add Fixes: tag
- Remove useless Cc: stable.
- Selftest will check both a0 and orig_a0, but depends on the
correctness of PTRACE_GET_SYSCALL_INFO.
- Link to v2: https://lore.kernel.org/r/20241203-riscv-new-regset-v2-0-d37da8c0cba6@coelacanthus.name
Changes in v2:
- Fix integer width.
- Add selftest.
- Link to v1: https://lore.kernel.org/r/20241201-riscv-new-regset-v1-1-c83c58abcc7b@coelacanthus.name
---
Celeste Liu (3):
riscv/ptrace: add new regset to access original a0 register
tools: copy include/linux/stddef.h to tools/include
riscv: selftests: Add a ptrace test to verify a0 and orig_a0 access
arch/riscv/kernel/ptrace.c | 32 +++++
include/uapi/linux/elf.h | 1 +
tools/include/linux/stddef.h | 85 ++++++++++++
tools/include/uapi/linux/stddef.h | 6 +-
tools/testing/selftests/riscv/abi/.gitignore | 1 +
tools/testing/selftests/riscv/abi/Makefile | 6 +-
tools/testing/selftests/riscv/abi/ptrace.c | 193 +++++++++++++++++++++++++++
7 files changed, 319 insertions(+), 5 deletions(-)
---
base-commit: 0e287d31b62bb53ad81d5e59778384a40f8b6f56
change-id: 20241201-riscv-new-regset-d529b952ad0d
Best regards,
--
Celeste Liu <uwu@coelacanthus.name>
^ permalink raw reply [flat|nested] 4+ messages in thread
* [PATCH v6 1/3] riscv/ptrace: add new regset to access original a0 register
2025-01-15 11:13 [PATCH v6 0/3] riscv/ptrace: add new regset to access original a0 register Celeste Liu
@ 2025-01-15 11:13 ` Celeste Liu
2025-01-15 21:33 ` Charlie Jenkins
2025-01-15 22:43 ` [PATCH v6 0/3] " Charlie Jenkins
1 sibling, 1 reply; 4+ messages in thread
From: Celeste Liu @ 2025-01-15 11:13 UTC (permalink / raw)
To: Oleg Nesterov, Paul Walmsley, Palmer Dabbelt, Eric Biederman,
Kees Cook, Shuah Khan, Albert Ou
Cc: Alexandre Ghiti, Dmitry V. Levin, Andrea Bolognani,
Björn Töpel, Thomas Gleixner, Ron Economos,
Charlie Jenkins, Andrew Jones, Quan Zhou, Felix Yan, Ruizhe Pan,
Guo Ren, Yao Zi, linux-riscv, linux-kernel, linux-mm,
linux-kselftest, Celeste Liu, stable, Björn Töpel
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.
Fixes: e2c0cdfba7f6 ("RISC-V: User-facing API")
Link: https://lore.kernel.org/all/59505464-c84a-403d-972f-d4b2055eeaac@gmail.com/
Cc: stable@vger.kernel.org
Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
Signed-off-by: Celeste Liu <uwu@coelacanthus.name>
---
arch/riscv/kernel/ptrace.c | 32 ++++++++++++++++++++++++++++++++
include/uapi/linux/elf.h | 1 +
2 files changed, 33 insertions(+)
diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
index ea67e9fb7a583683b922fe2c017ea61f3bc848db..ef9ab74c8575a5c440155973b1c625c06a867c97 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,29 @@ 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)
+{
+ 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)
+{
+ unsigned long orig_a0 = task_pt_regs(target)->orig_a0;
+ 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 0;
+}
+
static const struct user_regset riscv_user_regset[] = {
[REGSET_X] = {
.core_note_type = NT_PRSTATUS,
@@ -224,6 +248,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),
+ .regset_get = riscv_orig_a0_get,
+ .set = riscv_orig_a0_set,
+ },
};
static const struct user_regset_view riscv_user_native_view = {
diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h
index b44069d29cecc0f9de90ee66bfffd2137f4275a8..390060229601631da2fb27030d9fa2142e676c14 100644
--- a/include/uapi/linux/elf.h
+++ b/include/uapi/linux/elf.h
@@ -452,6 +452,7 @@ typedef struct elf64_shdr {
#define NT_RISCV_CSR 0x900 /* RISC-V Control and Status Registers */
#define NT_RISCV_VECTOR 0x901 /* RISC-V vector registers */
#define NT_RISCV_TAGGED_ADDR_CTRL 0x902 /* RISC-V tagged address control (prctl()) */
+#define NT_RISCV_ORIG_A0 0x903 /* RISC-V original a0 register */
#define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers */
#define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and status registers */
#define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD Extension registers */
--
2.48.0
^ permalink raw reply related [flat|nested] 4+ messages in thread
* Re: [PATCH v6 1/3] riscv/ptrace: add new regset to access original a0 register
2025-01-15 11:13 ` [PATCH v6 1/3] " Celeste Liu
@ 2025-01-15 21:33 ` Charlie Jenkins
0 siblings, 0 replies; 4+ messages in thread
From: Charlie Jenkins @ 2025-01-15 21:33 UTC (permalink / raw)
To: Celeste Liu
Cc: Oleg Nesterov, Paul Walmsley, Palmer Dabbelt, Eric Biederman,
Kees Cook, Shuah Khan, Albert Ou, Alexandre Ghiti,
Dmitry V. Levin, Andrea Bolognani, Björn Töpel,
Thomas Gleixner, Ron Economos, Andrew Jones, Quan Zhou, Felix Yan,
Ruizhe Pan, Guo Ren, Yao Zi, linux-riscv, linux-kernel, linux-mm,
linux-kselftest, stable, Björn Töpel
On Wed, Jan 15, 2025 at 07:13:27PM +0800, Celeste Liu wrote:
> 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.
>
> Fixes: e2c0cdfba7f6 ("RISC-V: User-facing API")
> Link: https://lore.kernel.org/all/59505464-c84a-403d-972f-d4b2055eeaac@gmail.com/
> Cc: stable@vger.kernel.org
> Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
> Signed-off-by: Celeste Liu <uwu@coelacanthus.name>
Thank you!
Reviewed-by: Charlie Jenkins <charlie@rivosinc.com>
Tested-by: Charlie Jenkins <charlie@rivosinc.com>
> ---
> arch/riscv/kernel/ptrace.c | 32 ++++++++++++++++++++++++++++++++
> include/uapi/linux/elf.h | 1 +
> 2 files changed, 33 insertions(+)
>
> diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
> index ea67e9fb7a583683b922fe2c017ea61f3bc848db..ef9ab74c8575a5c440155973b1c625c06a867c97 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,29 @@ 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)
> +{
> + 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)
> +{
> + unsigned long orig_a0 = task_pt_regs(target)->orig_a0;
> + 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 0;
> +}
> +
> static const struct user_regset riscv_user_regset[] = {
> [REGSET_X] = {
> .core_note_type = NT_PRSTATUS,
> @@ -224,6 +248,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),
> + .regset_get = riscv_orig_a0_get,
> + .set = riscv_orig_a0_set,
> + },
> };
>
> static const struct user_regset_view riscv_user_native_view = {
> diff --git a/include/uapi/linux/elf.h b/include/uapi/linux/elf.h
> index b44069d29cecc0f9de90ee66bfffd2137f4275a8..390060229601631da2fb27030d9fa2142e676c14 100644
> --- a/include/uapi/linux/elf.h
> +++ b/include/uapi/linux/elf.h
> @@ -452,6 +452,7 @@ typedef struct elf64_shdr {
> #define NT_RISCV_CSR 0x900 /* RISC-V Control and Status Registers */
> #define NT_RISCV_VECTOR 0x901 /* RISC-V vector registers */
> #define NT_RISCV_TAGGED_ADDR_CTRL 0x902 /* RISC-V tagged address control (prctl()) */
> +#define NT_RISCV_ORIG_A0 0x903 /* RISC-V original a0 register */
> #define NT_LOONGARCH_CPUCFG 0xa00 /* LoongArch CPU config registers */
> #define NT_LOONGARCH_CSR 0xa01 /* LoongArch control and status registers */
> #define NT_LOONGARCH_LSX 0xa02 /* LoongArch Loongson SIMD Extension registers */
>
> --
> 2.48.0
>
^ permalink raw reply [flat|nested] 4+ messages in thread
* Re: [PATCH v6 0/3] riscv/ptrace: add new regset to access original a0 register
2025-01-15 11:13 [PATCH v6 0/3] riscv/ptrace: add new regset to access original a0 register Celeste Liu
2025-01-15 11:13 ` [PATCH v6 1/3] " Celeste Liu
@ 2025-01-15 22:43 ` Charlie Jenkins
1 sibling, 0 replies; 4+ messages in thread
From: Charlie Jenkins @ 2025-01-15 22:43 UTC (permalink / raw)
To: Celeste Liu
Cc: Oleg Nesterov, Paul Walmsley, Palmer Dabbelt, Eric Biederman,
Kees Cook, Shuah Khan, Albert Ou, Alexandre Ghiti,
Dmitry V. Levin, Andrea Bolognani, Björn Töpel,
Thomas Gleixner, Ron Economos, Andrew Jones, Quan Zhou, Felix Yan,
Ruizhe Pan, Guo Ren, Yao Zi, linux-riscv, linux-kernel, linux-mm,
linux-kselftest, stable, Björn Töpel
On Wed, Jan 15, 2025 at 07:13:26PM +0800, Celeste Liu wrote:
> 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@gmail.com/
>
> Signed-off-by: Celeste Liu <uwu@coelacanthus.name>
> ---
> Changes in v6:
> - Fix obsolute comment.
> - Copy include/linux/stddef.h to tools/include to use offsetofend in
> selftests.
> - Link to v5: https://lore.kernel.org/r/20250115-riscv-new-regset-v5-0-d0e6ec031a23@coelacanthus.name
>
> Changes in v5:
> - Fix wrong usage in selftests.
> - Link to v4: https://lore.kernel.org/r/20241226-riscv-new-regset-v4-0-4496a29d0436@coelacanthus.name
>
> Changes in v4:
> - Fix a copy paste error in selftest. (Forget to commit...)
> - Link to v3: https://lore.kernel.org/r/20241226-riscv-new-regset-v3-0-f5b96465826b@coelacanthus.name
>
> Changes in v3:
> - Use return 0 directly for readability.
> - Fix test for modify a0.
> - Add Fixes: tag
> - Remove useless Cc: stable.
> - Selftest will check both a0 and orig_a0, but depends on the
> correctness of PTRACE_GET_SYSCALL_INFO.
> - Link to v2: https://lore.kernel.org/r/20241203-riscv-new-regset-v2-0-d37da8c0cba6@coelacanthus.name
>
> Changes in v2:
> - Fix integer width.
> - Add selftest.
> - Link to v1: https://lore.kernel.org/r/20241201-riscv-new-regset-v1-1-c83c58abcc7b@coelacanthus.name
>
> ---
> Celeste Liu (3):
> riscv/ptrace: add new regset to access original a0 register
> tools: copy include/linux/stddef.h to tools/include
> riscv: selftests: Add a ptrace test to verify a0 and orig_a0 access
>
> arch/riscv/kernel/ptrace.c | 32 +++++
> include/uapi/linux/elf.h | 1 +
> tools/include/linux/stddef.h | 85 ++++++++++++
> tools/include/uapi/linux/stddef.h | 6 +-
> tools/testing/selftests/riscv/abi/.gitignore | 1 +
> tools/testing/selftests/riscv/abi/Makefile | 6 +-
> tools/testing/selftests/riscv/abi/ptrace.c | 193 +++++++++++++++++++++++++++
> 7 files changed, 319 insertions(+), 5 deletions(-)
> ---
> base-commit: 0e287d31b62bb53ad81d5e59778384a40f8b6f56
> change-id: 20241201-riscv-new-regset-d529b952ad0d
>
> Best regards,
> --
> Celeste Liu <uwu@coelacanthus.name>
>
There is also this series that looks like it will solve this problem by
providing an architecture agnostic way of changing syscall args with
PTRACE_SET_SYSCALL_INFO [1].
- Charlie
[1] https://lore.kernel.org/lkml/20250113170925.GA392@altlinux.org/
^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2025-01-15 22:43 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2025-01-15 11:13 [PATCH v6 0/3] riscv/ptrace: add new regset to access original a0 register Celeste Liu
2025-01-15 11:13 ` [PATCH v6 1/3] " Celeste Liu
2025-01-15 21:33 ` Charlie Jenkins
2025-01-15 22:43 ` [PATCH v6 0/3] " Charlie Jenkins
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).