rt-thread icon indicating copy to clipboard operation
rt-thread copied to clipboard

feat: add support for restartable system calls on RISC-V64

Open eatvector opened this issue 7 months ago • 4 comments

拉取/合并请求描述:(PR description)

参考aarch64架构下的系统调用重启实现riscv64架构下的系统调用重启,关联问题#9761 [

为什么提交这份PR (why to submit this PR)

你的解决方案是什么 (what is your solution)

可重启的系统调用如果由于接受到信号中断导致执行失败,则在信号退出处理时,根据用户栈保存的exception frame 恢复寄存器(包括epc以及存储系统调用号和系统调用参数的寄存器等),并跳转到 trap_entry,以重新启动系统调用。

系统调用功能函数执行前阶段

  1. 在 syscall_handler 中,将系统调用第一个参数(a0,同时作为返回值寄存器)备份至内核栈的 t0 上下文槽位。RISC-V ABI 中 a0 兼具参数传递和返回值功能,若直接覆盖会导致重启时参数丢失;而 t0 作为调用者保存寄存器,用户程序必须假设这些寄存器可能在 ecall 后被修改,内核态修改不会影响用户态语义。

系统调用功能函数执行后阶段

  1. 移除对 a7(系统调用号寄存器)的清零操作,保留其原始值以供重启使用。

  2. 在系统调用执行被信号中断退出syscall_handler后,进行信号处理时如果判定需要进行系统调用重启,则通过 arch_syscall_set_errno 将 用户上下文中的a0 设为 -ERESTART,作为需重启的标记。之后将异常帧复制到用户栈,返回用户态执行中断处理函数(如果有的话)。

信号退出处理阶段(在这一步完成系统调用重启)

  1. 通过ecall再次陷入内核,执行arch_signal_quit

  2. arch_signal_quit 调用 arch_signal_ucontext_restore,并传递两个关键参数。其一为用户栈中保存的异常帧的基地址,其二为新增参数,表示内核栈中,arch_signal_quit 用户上下文信息的基地址加上 CTX_REG_NR * REGBYTES,设为ksp。

  3. 通过调用链 arch_signal_ucontext_restore-> arch_signal_post_action-> arch_signal_check_erestart 执行到核心函数 arch_signal_check_erestart 。

  4. 该函数根据保存的异常帧信息判断是否需要重启,如果需要,将异常帧中的t0赋值给a0,即恢复系统调用第一个参数的值。随后将异常帧中的epc减去4进行恢复,因为系统调用在被信号中断后在 syscall_handler对epc进行了加4操作,现在需要将其恢复到跟第一次调用系统调用前一样。之后将异常帧拷贝到内核栈中原来存储 arch_signal_quit 用户上下文信息的位置。并调用汇编函数arch_syscall_restart。

  5. arch_syscall_restart从内核栈中恢复刚刚拷贝进来的异常帧信息到寄存器(包括系统调用参数寄存器a0-a6,以及系统调用号寄存器a7,epc也被恢复指向用户空间的ecall指令地址)。此外,sscratch 会被设置为ksp。之后跳转 trap_entry以重新执行系统调用。

  • 请提供验证的bsp和config (provide the config and bsp)

  • BSP:
  • .config:
  • action:

]

当前拉取/合并请求的状态 Intent for your PR

必须选择一项 Choose one (Mandatory):

  • [ ] 本拉取/合并请求是一个草稿版本 This PR is for a code-review and is intended to get feedback
  • [x] 本拉取/合并请求是一个成熟版本 This PR is mature, and ready to be integrated into the repo

代码质量 Code Quality:

我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:

  • [x] 已经仔细查看过代码改动的对比 Already check the difference between PR and old code
  • [x] 代码风格正确,包括缩进空格,命名及其他风格 Style guide is adhered to, including spacing, naming and other styles
  • [x] 没有垃圾代码,代码尽量精简,不包含#if 0代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up
  • [x] 所有变更均有原因及合理的,并且不会影响到其他软件组件代码或BSP All modifications are justified and not affect other components or BSP
  • [x] 对难懂代码均提供对应的注释 I've commented appropriately where code is tricky
  • [x] 代码是高质量的 Code in this PR is of high quality
  • [x] 已经使用formatting 等源码格式化工具确保格式符合RT-Thread代码规范 This PR complies with RT-Thread code specification
  • [x] 如果是新增bsp, 已经添加ci检查到.github/workflows/bsp_buildings.yml 详细请参考链接BSP自查

eatvector avatar Jul 17 '25 03:07 eatvector

📌 Code Review Assignment

🏷️ Tag: components

Reviewers: Maihuanyi

Changed Files (Click to expand)
  • components/lwp/arch/risc-v/rv64/lwp_arch.c
  • components/lwp/arch/risc-v/rv64/lwp_arch.h
  • components/lwp/arch/risc-v/rv64/lwp_gcc.S

🏷️ Tag: components_lwp

Reviewers: xu18838022837

Changed Files (Click to expand)
  • components/lwp/arch/risc-v/rv64/lwp_arch.c
  • components/lwp/arch/risc-v/rv64/lwp_arch.h
  • components/lwp/arch/risc-v/rv64/lwp_gcc.S

🏷️ Tag: libcpu_riscv

Reviewers: Yaochenger

Changed Files (Click to expand)
  • libcpu/risc-v/common64/syscall_c.c

📊 Current Review Status (Last Updated: 2025-08-15 08:38 CST)

  • Maihuanyi Pending Review
  • Yaochenger Pending Review
  • xu18838022837 Pending Review

📝 Review Instructions

  1. 维护者可以通过单击此处来刷新审查状态: 🔄 刷新状态 Maintainers can refresh the review status by clicking here: 🔄 Refresh Status

  2. 确认审核通过后评论 LGTM/lgtm Comment LGTM/lgtm after confirming approval

  3. PR合并前需至少一位维护者确认 PR must be confirmed by at least one maintainer before merging

ℹ️ 刷新CI状态操作需要具备仓库写入权限。 ℹ️ Refresh CI status operation requires repository Write permission.

github-actions[bot] avatar Jul 17 '25 03:07 github-actions[bot]

请给出更多说明,包括对系统调用部分代码的更改,谢谢。

BernardXiong avatar Jul 19 '25 04:07 BernardXiong

请给出更多说明,包括对系统调用部分代码的更改,谢谢。

好的,我这几天改改

eatvector avatar Jul 19 '25 11:07 eatvector

@BernardXiong 您好,我已补充了相关说明信息。如果您需要更多细节,或对现有信息有任何疑问,请随时告知,我将尽快提供进一步说明

eatvector avatar Jul 20 '25 11:07 eatvector