feat: add support for restartable system calls on RISC-V64 #10520
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
拉取/合并请求描述:(PR description)
参考aarch64架构下的系统调用重启实现riscv64架构下的系统调用重启,关联问题#9761
[
为什么提交这份PR (why to submit this PR)
你的解决方案是什么 (what is your solution)
可重启的系统调用如果由于接受到信号中断导致执行失败,则在信号退出处理时,根据用户栈保存的exception frame 恢复寄存器(包括epc以及存储系统调用号和系统调用参数的寄存器等),并跳转到 trap_entry,以重新启动系统调用。
系统调用功能函数执行前阶段
系统调用功能函数执行后阶段
移除对 a7(系统调用号寄存器)的清零操作,保留其原始值以供重启使用。
在系统调用执行被信号中断退出syscall_handler后,进行信号处理时如果判定需要进行系统调用重启,则通过 arch_syscall_set_errno 将 用户上下文中的a0 设为 -ERESTART,作为需重启的标记。之后将异常帧复制到用户栈,返回用户态执行中断处理函数(如果有的话)。
信号退出处理阶段(在这一步完成系统调用重启)
通过ecall再次陷入内核,执行arch_signal_quit
arch_signal_quit 调用 arch_signal_ucontext_restore,并传递两个关键参数。其一为用户栈中保存的异常帧的基地址,其二为新增参数,表示内核栈中,arch_signal_quit 用户上下文信息的基地址加上 CTX_REG_NR * REGBYTES,设为ksp。
通过调用链 arch_signal_ucontext_restore-> arch_signal_post_action-> arch_signal_check_erestart 执行到核心函数 arch_signal_check_erestart 。
该函数根据保存的异常帧信息判断是否需要重启,如果需要,将异常帧中的t0赋值给a0,即恢复系统调用第一个参数的值。随后将异常帧中的epc减去4进行恢复,因为系统调用在被信号中断后在 syscall_handler对epc进行了加4操作,现在需要将其恢复到跟第一次调用系统调用前一样。之后将异常帧拷贝到内核栈中原来存储 arch_signal_quit 用户上下文信息的位置。并调用汇编函数arch_syscall_restart。
arch_syscall_restart从内核栈中恢复刚刚拷贝进来的异常帧信息到寄存器(包括系统调用参数寄存器a0-a6,以及系统调用号寄存器a7,epc也被恢复指向用户空间的ecall指令地址)。此外,sscratch 会被设置为ksp。之后跳转 trap_entry以重新执行系统调用。
请提供验证的bsp和config (provide the config and bsp)
]
当前拉取/合并请求的状态 Intent for your PR
必须选择一项 Choose one (Mandatory):
代码质量 Code Quality:
我在这个拉取/合并请求中已经考虑了 As part of this pull request, I've considered the following:
#if 0
代码,不包含已经被注释了的代码 All redundant code is removed and cleaned up