Skip to content

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

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

eatvector
Copy link
Contributor

@eatvector eatvector commented Jul 17, 2025

拉取/合并请求描述:(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 作为调用者保存寄存器,内核态修改不会影响用户态语义。

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

  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
  • 本拉取/合并请求是一个成熟版本 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:

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

@eatvector eatvector requested a review from BernardXiong as a code owner July 17, 2025 03:16
@github-actions github-actions bot added the Arch: RISC-V BSP related with risc-v label Jul 17, 2025
Copy link

github-actions bot commented Jul 17, 2025

📌 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-07-20 15:05 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 github-actions bot added RT-Smart RT-Thread Smart related PR or issues component: lwp libcpu Component labels Jul 17, 2025
@eatvector eatvector force-pushed the feature/riscv64-syscall-restart branch 10 times, most recently from c3e2204 to 662b3f1 Compare July 18, 2025 03:20
@eatvector eatvector marked this pull request as draft July 18, 2025 08:37
@kurisaW kurisaW closed this Jul 18, 2025
@kurisaW kurisaW reopened this Jul 18, 2025
@eatvector eatvector marked this pull request as ready for review July 18, 2025 09:31
@eatvector eatvector marked this pull request as draft July 18, 2025 09:34
@eatvector eatvector force-pushed the feature/riscv64-syscall-restart branch 4 times, most recently from c9e2878 to 30ef0db Compare July 18, 2025 13:11
@eatvector eatvector marked this pull request as ready for review July 18, 2025 13:18
@BernardXiong
Copy link
Member

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

@eatvector
Copy link
Contributor Author

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

好的,我这几天改改

@eatvector eatvector force-pushed the feature/riscv64-syscall-restart branch from 30ef0db to 68859d2 Compare July 20, 2025 03:33
@eatvector eatvector force-pushed the feature/riscv64-syscall-restart branch from 68859d2 to 05aa0a6 Compare July 20, 2025 07:05
@eatvector
Copy link
Contributor Author

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Arch: RISC-V BSP related with risc-v component: lwp Component libcpu RT-Smart RT-Thread Smart related PR or issues
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants