feat(starry-kernel): extend gdb support to aarch64 and loongarch64 - #1247
Conversation
34cfdd7 to
29a24be
Compare
There was a problem hiding this comment.
PR 审查总结
本 PR 将 StarryOS 的 GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改清晰、系统化,无阻塞性问题。
修改内容评估
-
架构寄存器 ABI:
Aarch64UserRegs、Aarch64FpRegs、LoongarchUserRegs、LoongarchFpRegs的布局与 Linux 内核user_pt_regs/user_fpsimd_state一致,#[repr(C)]和字段顺序正确。 -
PtraceStopFpData 多架构变体:aarch64 用
[u128; 32](SIMD/FP)+ fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。 -
单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制,后续再增强分支/跳转目标精确单步。
-
PTRACE_EVENT_VFORK_DONE 修复:将 pending event 从按
parent_pid绑定改为按parent_tid绑定(clone.rs第 409 行),这是正确的 bugfix——多线程进程中需要精确绑定到发起 vfork 的具体线程。 -
#[cfg] 扩展模式:所有 riscv64 限定函数(GETREGS/SETREGS、GETREGSET/SETREGSET、GETSIGINFO/SETSIGINFO 等)统一扩展为
#[cfg(any(riscv64, aarch64, loongarch64))],模式一致无遗漏。 -
测试和文档:gdb-smoke 配置、QEMU TOML、GDB 脚本、prebuild.sh 和 README 都完整覆盖三架构,
test-ptrace-gdb的条件编译扩展也正确。
CI 状态
CI check runs 全部为 skipped 结论,无失败。PR 的 mergeable_state 为 unstable,这是由于 CI 跳过(非失败)导致,不是 PR 引入的问题。
相关 PR
本 PR 与 #1062 无冲突(不同架构)。
结论
代码质量好,架构移植遵循现有模式,vfork_done 修复正确,测试覆盖全面。推荐合并。
Powered by mimo-v2.5-pro
29a24be to
884b426
Compare
There was a problem hiding this comment.
PR 审查总结
本 PR 将 StarryOS 的 GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改系统化、模式一致,无阻塞性问题。
修改内容评估
-
架构寄存器 ABI:
Aarch64UserRegs/Aarch64FpRegs/LoongarchUserRegs/LoongarchFpRegs的#[repr(C)]布局与 Linux 内核user_pt_regs/user_fpsimd_state/LoongArchuser_pt_regs一致,字段顺序正确。From<&UserContext>和write_to转换逻辑正确映射每个寄存器。 -
PtraceStopFpData 多架构变体(
task/mod.rs):aarch64 用[u128; 32](NEON/FP 寄存器)+ fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。 -
断点指令常量:
AARCH64_BRK_INSN = 0xd4200000(brk #0),LOONGARCH_BREAK_INSN = 0x002a0000(break 0),编码正确。 -
单步执行:aarch64 和 loongarch64 的
ptrace_setup_singlestep仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制。ptrace_restore_singlestep_insn使用ptrace_write_u32_unlocked(而非 riscv64 的 u16),正确处理了 4 字节固定指令长度。 -
PTRACE_EVENT_VFORK_DONE bugfix(
clone.rs:411):将 pending event 绑定从parent_pid改为parent_tid,多线程进程中需要精确绑定到发起 vfork 的具体线程,这是正确的修复。 -
#[cfg] 扩展模式:所有 riscv64 限定函数(GETREGS/SETREGS、GETREGSET/SETREGSET、GETSIGINFO/SETSIGINFO、getregset_prstatus/fpregset 等)统一扩展为
#[cfg(any(riscv64, aarch64, loongarch64))],#[cfg(not(...))]fallback 保持Err(Unsupported),模式一致无遗漏。user.rs中的ptrace_setup_singlestep/ptrace_restore_singlestep_insn调用也正确扩展到三架构。 -
测试(
test-ptrace-gdb/src/main.c):条件编译覆盖三架构寄存器布局和汇编模板,ss_step_target对非 riscv 使用架构正确指令(aarch64:mov x0, #123+brk #0;loongarch:addi.d $a0, $zero, 123+break 0),setregs_pc_landing/legacy_setregs_landing同样正确。 -
gdb-smoke 应用:新增 aarch64/loongarch64 的 build TOML、QEMU TOML(native/gdbserver/gdbserver-manual/gdbserver-host)、GDB 脚本、prebuild.sh 多架构支持(
STARRY_ARCH环境变量、find_qemu_runnercase 分支、linux_target变量)。README 文档完整记录了所有架构的使用入口。 -
信号处理(
signal.rs):#[cfg(target_arch = "riscv64")]的UserStackFrame和read_user_stack_frame未被本 PR 修改,保持 riscv64 限定。这与本 PR 的范围一致——信号栈展开是独立功能。
CI 状态
CI check runs 全部为 skipped 结论(success=0, skipped=14, failure=0),非 PR 引入的失败。这些是 CI 矩阵中的互斥 job(run_host/run_container)和 path-filtered job 正常跳过行为。mergeable_state=unstable 是 CI 跳过导致,非代码问题。
重复/重叠分析
- PR #931(已合并):初始 ptrace 支持
- PR #1167(已合并):TID-aware GDB 改进
- PR #1062(开放):x86_64 ptrace,不同架构方向,无冲突
- 当前开放 PR #1250(timer 修复)、#1251(CI fetch depth 修复):完全无关
本 PR 与所有开放 PR 无冲突或重叠。
本地验证
cargo fmt --check✅(通过)cargo clippy --package starry-kernel -- -D warnings✅(无警告)- 无
[patch.crates-io]使用
结论
代码质量好,架构移植遵循现有 riscv64 模式,vfork_done 修复正确,测试覆盖全面,无阻塞性问题。推荐合并。
Powered by mimo-v2.5-pro
ZR233
left a comment
There was a problem hiding this comment.
本轮看完后还有一个阻塞项:LoongArch PTRACE_GETREGSET/SETREGSET 的 NT_PRSTATUS 用户 ABI 目前不是 Linux UAPI 的 struct user_pt_regs 布局,会让按 Linux 头文件或 GDB 预期解析的工具看到错误的 regset 长度/字段。AArch64 的寄存器布局对照 Linux UAPI 未发现同类问题;LoongArch 静态平台 smoke 配置虽然和后续动态平台方向有差异,但当前仓库里 Starry LoongArch app 配置仍然是静态平台,所以我没有把这一点作为本轮阻塞项。
已检查:当前 head 的 Actions check rollup 没有失败;git diff --check origin/dev...HEAD、bash -n apps/starry/gdb-smoke/prebuild.sh apps/starry/gdb-smoke/gdbserver/gdbserver-smoke.sh、cargo fmt --all --check 通过。也做了重复/重叠检查:#1062 同样碰到 ptrace/GDB 但主要是 x86_64 清理和测试,和本 PR 的 aarch64/LoongArch regset 支持属于部分重叠,不替代这个 ABI 问题。
884b426 to
ea74292
Compare
There was a problem hiding this comment.
审查总结
本 PR 将 StarryOS GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,包括架构寄存器 ABI、单步指令替换、断点指令常量、FP/SIMD 状态保存恢复、vfork_done tid 绑定修复,以及完整的 gdb-smoke 测试/配置/文档。
变更评估
-
LoongArch 寄存器布局:
LoongarchUserRegs当前已包含reserved[10](45 × u64 = 360 字节),与 Linux UAPIstruct user_pt_regs一致。ZR233 提出的 ABI 不兼容问题已在最新提交中修复。 -
AArch64 寄存器布局:
Aarch64UserRegs(31 regs + sp + pc + pstate = 34 × u64)和Aarch64FpRegs(32 × u128 + fpsr + fpcr)与 Linux UAPI 一致。 -
PTRACE_EVENT_VFORK_DONE 修复:将 pending event 从
parent_pid绑定改为parent_tid,多线程环境中正确绑定到发起 vfork 的线程。 -
单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制。断点指令常量正确(
0xd4200000/0x002a0000)。 -
#[cfg] 扩展模式:所有 riscv64 限定函数统一扩展为
#[cfg(any(riscv64, aarch64, loongarch64))],模式一致无遗漏。 -
gdb-smoke 完整性:aarch64/loongarch64 的 build TOML、QEMU TOML、GDB 脚本、prebuild.sh 多架构支持、README 文档均完整覆盖。
CI 状态
CI check runs 全部为 skipped(非失败),与 path-filtered 行为一致,非 PR 引入问题。
评审历史
- ZR233 提出两个审查意见:(1) LoongArch 静态平台废弃(已回应 dynamic boot 路径当前不支持,保留静态配置合理);(2) LoongArch NT_PRSTATUS ABI 不匹配(已修复)。
- 当前提交
ea74292包含reserved[10]字段,ABI 问题已解决。
本地验证
bash -n prebuild.sh✅bash -n gdbserver-smoke.sh✅git diff --check origin/dev...HEAD✅cargo fmt --all --check✅cargo xtask clippy --package starry-kernel(15/15 通过)✅
结论
代码质量好,架构移植遵循现有模式,ABI 问题已修复,无残留阻塞性问题。推荐合并。
Powered by mimo-v2.5-pro
ZR233
left a comment
There was a problem hiding this comment.
已复查最新 head ea74292ec080781d386c2ff24415ec7b4a0ad042,未发现阻塞合入的问题,批准。
检查结论:
- LoongArch
NT_PRSTATUS已按 Linuxuser_pt_regs调整为regs[32] + orig_a0 + csr_era + csr_badv + reserved[10],测试也覆盖了 45 个elf_greg_t/iov_len大小;此前 ABI thread 已 resolve。 - aarch64/loongarch64 的
GETREGSET/SETREGSET、单步断点、clone/vforkdone event keying 和 gdb-smoke 配置与当前 smoke 目标一致。 - LoongArch gdb-smoke 继续使用静态平台配置是当前可运行路径;dynamic/UEFI app boot 超时不属于本 PR 的 ptrace/GDB 逻辑问题,此前 thread 已 resolve。
- 与 open PR 对比:#1062 也改 ptrace/GDB 相关代码,但主要是 x86_64 方向;功能不重复,只需要后续按合入顺序处理可能的同文件冲突。
本地验证:
git diff --check origin/dev...HEADbash -n apps/starry/gdb-smoke/prebuild.sh apps/starry/gdb-smoke/gdbserver/gdbserver-smoke.shcargo fmt --all --checkcargo xtask clippy --package starry-kernelcargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/test-ptrace-gdb,18 pass / 0 failcargo xtask starry test qemu --arch loongarch64 -c qemu-smp1/system/test-ptrace-gdb,18 pass / 0 failcargo xtask starry app qemu -t gdb-smoke --arch aarch64,命中GDB_NATIVE_SMOKE_DONEcargo xtask starry app qemu -t gdb-smoke --arch loongarch64,命中GDB_NATIVE_SMOKE_DONEcargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver.toml,命中GDBSERVER_SMOKE_DONEcargo xtask starry app qemu -t gdb-smoke --arch loongarch64 --qemu-config qemu-loongarch64-gdbserver.toml,命中GDBSERVER_SMOKE_DONE- aarch64 host-to-guest remote:临时解包 Ubuntu
gdb-multiarch后连接qemu-aarch64-gdbserver-host.toml,命中HOST_GDB_REMOTE_CONNECTED、HOST_GDB_REMOTE_BT_DONE、HOST_GDB_REMOTE_DETACH_DONE,QEMU 端命中__HOST_REMOTE_GDBSERVER_DONE__ - loongarch64 host-to-guest remote:本机 Ubuntu 24.04 的
gdb-multiarch不含 LoongArch target,因此改用qemu-loongarch64 -L ... /usr/bin/gdb运行 rootfs 内 LoongArch GDB 连接qemu-loongarch64-gdbserver-host.toml;将远程 timeout 拉长后断点、回溯、detach 成功,QEMU 端命中__HOST_REMOTE_GDBSERVER_DONE__
观察项:LoongArch gdbserver 路径会打印 legacy regset 探测的 Function not implemented 警告,和 README 描述一致;实际断点、backtrace、continue/detach、目标进程退出均成功,当前不作为阻塞项。CI 当前 25 success / 25 skipped,无失败项。
There was a problem hiding this comment.
审查总结
本 PR 将 StarryOS GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改系统化、模式一致,无阻塞性问题。
变更评估
-
架构寄存器 ABI:
LoongarchUserRegs包含regs[32] + orig_a0 + csr_era + csr_badv + reserved[10](45 × u64 = 360 字节),与 Linux UAPIstruct user_pt_regs一致。此前 ZR233 提出的 ABI 不兼容问题已在最新提交中修复。Aarch64UserRegs(31 regs + sp + pc + pstate = 34 × u64)和Aarch64FpRegs(32 × u128 + fpsr + fpcr)与 Linux UAPI 一致。LoongarchFpRegs(fpr[32] + fcc + fcsr)布局正确。
-
PTRACE_EVENT_VFORK_DONE 修复(clone.rs:412):将 pending event 从
parent_pid绑定改为parent_tid,多线程环境中正确绑定到发起 vfork 的具体线程。这是正确的 bugfix。 -
单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制,后续再增强分支/跳转目标精确单步。断点指令常量正确(
0xd4200000/0x002a0000)。ptrace_restore_singlestep_insn使用u32(而非 riscv64 的 u16),正确处理 4 字节固定指令长度。 -
#[cfg] 扩展模式:所有 riscv64 限定函数(GETREGS/SETREGS、GETREGSET/SETREGSET、GETSIGINFO/SETSIGINFO、getregset_prstatus/fpregset 等)统一扩展为
#[cfg(any(riscv64, aarch64, loongarch64))],#[cfg(not(...))]fallback 保持Err(Unsupported),模式一致无遗漏。 -
PtraceStopFpData 多架构变体(task/mod.rs):aarch64 用
[u128; 32]+ fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。 -
user.rs 单步集成:
ptrace_setup_singlestep/ptrace_restore_singlestep_insn的#[cfg]扩展和断点命中恢复逻辑正确,三架构一致。 -
gdb-smoke 完整性:aarch64/loongarch64 的 build TOML、QEMU TOML(native/gdbserver/gdbserver-manual/gdbserver-host)、GDB 脚本、prebuild.sh 多架构支持(
STARRY_ARCH环境变量、find_qemu_runnercase 分支)、README 文档均完整覆盖。 -
测试覆盖(test-ptrace-gdb):条件编译覆盖三架构寄存器布局和汇编模板,
ss_step_target对非 riscv 使用架构正确指令。
CI 状态
CI check runs:3 success(Detect changed paths、Cancel stale CI runs、Run sync-lint / run_container)、1 in_progress(Check formatting / run_host)、5 skipped。无失败项。mergeable_state=unstable 是 CI 跳过导致,非代码问题。
本地验证
cargo fmt --check✅bash -n apps/starry/gdb-smoke/prebuild.sh✅git diff --check origin/dev...HEAD✅
评审历史
- ZR233 提出两个审查意见均已 resolve:(1) LoongArch 静态平台废弃(当前 dynamic boot 路径不支持 gdb-smoke,保留静态配置合理);(2) LoongArch NT_PRSTATUS ABI 不匹配(已修复,
reserved[10]已补充)。 - ZR233 在最新提交上做了完整 QEMU 测试后已 APPROVE。
相关 PR
结论
代码质量好,架构移植遵循现有 riscv64 模式,ABI 问题已修复,vfork_done 修复正确,测试覆盖全面,无残留阻塞性问题。推荐合并。
Powered by mimo-v2.5-pro
…core-os#1247) * feat(starry-kernel): extend gdb support to aarch64 and loongarch64 * chore(ci): trigger ci --------- Co-authored-by: 周睿 <zrufo747@outlook.com>
…1247) * feat(starry-kernel): extend gdb support to aarch64 and loongarch64 * chore(ci): trigger ci --------- Co-authored-by: 周睿 <zrufo747@outlook.com>
…core-os#1247) * feat(starry-kernel): extend gdb support to aarch64 and loongarch64 * chore(ci): trigger ci --------- Co-authored-by: 周睿 <zrufo747@outlook.com>
背景
PR #1167 已经完成 StarryOS riscv64 用户态 GDB 的初步支持。本 PR 在保持现有 explicit-TID all-stop 调试模型的基础上,将同等 smoke-level GDB 支持扩展到 aarch64 和 loongarch64,目标是覆盖单进程 GDB usable subset,而不是一次性实现完整 Linux GDB 语义。
修改内容
PTRACE_GETREGS/PTRACE_SETREGSPTRACE_GETREGSET/PTRACE_SETREGSETNT_PRSTATUSNT_FPREGSETPTRACE_GETSIGINFO/PTRACE_SETSIGINFOPTRACE_SINGLESTEPPTRACE_EVENT_VFORK_DONE仍按 parent pid 记录 pending event 的问题,改为绑定具体 parent tid。test-ptrace-gdb,支持 riscv64 / aarch64 / loongarch64 并行条件编译。apps/starry/gdb-smoke:设计说明
当前实现继续沿用 PR #1167 的 TID-aware ptrace stop / wait 模型,避免回退到“一个进程只有一个 ptrace stop 状态”的旧设计。aarch64 和 loongarch64 只补架构相关寄存器 ABI、断点指令、FP 状态和单步恢复逻辑。
LoongArch 当前
PTRACE_SINGLESTEP仅覆盖顺序下一条指令,分支/跳转目标精确单步后续再增强。LoongArch gdbserver 在探测部分 legacy/可选 regset 时可能打印Function not implementedwarning,但不影响当前 smoke 路径完成断点、回溯、继续和 detach。验证
cargo fmt --allgit diff --checkbash -n apps/starry/gdb-smoke/prebuild.shgdb-multiarch -q -batch -ex "set architecture Loongarch64" -ex "show architecture"cargo xtask clippy --package starry-kernelcargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/test-ptrace-gdbcargo xtask starry app qemu -t gdb-smoke --arch aarch64cargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver.tomlcargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver-host.tomlgdb-multiarch -q -batch -x apps/starry/gdb-smoke/gdbserver/host-remote-aarch64.gdb target/gdb-smoke-host/aarch64/gdbserver-smoke-targetcargo xtask starry test qemu --arch loongarch64 -c qemu-smp1/system/test-ptrace-gdbcargo xtask starry app qemu -t gdb-smoke --arch loongarch64cargo xtask starry app qemu -t gdb-smoke --arch loongarch64 --qemu-config qemu-loongarch64-gdbserver.tomlcargo xtask starry app qemu -t gdb-smoke --arch loongarch64 --qemu-config qemu-loongarch64-gdbserver-host.tomlgdb-multiarch -q -batch -x apps/starry/gdb-smoke/gdbserver/host-remote-loongarch64.gdb target/gdb-smoke-host/loongarch64/gdbserver-smoke-target