Skip to content

feat(starry-kernel): extend gdb support to aarch64 and loongarch64 - #1247

Merged
ZR233 merged 2 commits into
rcore-os:devfrom
Promin3:feat/starryos-gdb-multiarch
Jun 15, 2026
Merged

feat(starry-kernel): extend gdb support to aarch64 and loongarch64#1247
ZR233 merged 2 commits into
rcore-os:devfrom
Promin3:feat/starryos-gdb-multiarch

Conversation

@Promin3

@Promin3 Promin3 commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

背景

PR #1167 已经完成 StarryOS riscv64 用户态 GDB 的初步支持。本 PR 在保持现有 explicit-TID all-stop 调试模型的基础上,将同等 smoke-level GDB 支持扩展到 aarch64 和 loongarch64,目标是覆盖单进程 GDB usable subset,而不是一次性实现完整 Linux GDB 语义。

修改内容

  • 为 aarch64 / loongarch64 补充 ptrace 架构后端:
    • PTRACE_GETREGS / PTRACE_SETREGS
    • PTRACE_GETREGSET / PTRACE_SETREGSET
    • NT_PRSTATUS
    • 基础 NT_FPREGSET
    • PTRACE_GETSIGINFO / PTRACE_SETSIGINFO
    • 顺序指令级 PTRACE_SINGLESTEP
  • 为 aarch64 / loongarch64 保存和恢复 ptrace stop 所需的 FP/SIMD/FP 状态。
  • 修复 PTRACE_EVENT_VFORK_DONE 仍按 parent pid 记录 pending event 的问题,改为绑定具体 parent tid。
  • 扩展 test-ptrace-gdb,支持 riscv64 / aarch64 / loongarch64 并行条件编译。
  • 扩展 apps/starry/gdb-smoke
    • 新增 aarch64 / loongarch64 build 配置。
    • 新增 native GDB smoke QEMU 配置。
    • 新增 guest-internal gdbserver 配置。
    • 新增 host-to-guest remote GDB batch/manual 配置。
    • 新增对应 host GDB 脚本。
  • 更新 README,记录三架构 GDB smoke 入口和 LoongArch 当前限制。

设计说明

当前实现继续沿用 PR #1167 的 TID-aware ptrace stop / wait 模型,避免回退到“一个进程只有一个 ptrace stop 状态”的旧设计。aarch64 和 loongarch64 只补架构相关寄存器 ABI、断点指令、FP 状态和单步恢复逻辑。

LoongArch 当前 PTRACE_SINGLESTEP 仅覆盖顺序下一条指令,分支/跳转目标精确单步后续再增强。LoongArch gdbserver 在探测部分 legacy/可选 regset 时可能打印 Function not implemented warning,但不影响当前 smoke 路径完成断点、回溯、继续和 detach。

验证

  • cargo fmt --all
  • git diff --check
  • bash -n apps/starry/gdb-smoke/prebuild.sh
  • gdb-multiarch -q -batch -ex "set architecture Loongarch64" -ex "show architecture"
  • cargo xtask clippy --package starry-kernel
  • cargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/test-ptrace-gdb
  • cargo xtask starry app qemu -t gdb-smoke --arch aarch64
  • cargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver.toml
  • cargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver-host.toml
  • gdb-multiarch -q -batch -x apps/starry/gdb-smoke/gdbserver/host-remote-aarch64.gdb target/gdb-smoke-host/aarch64/gdbserver-smoke-target
  • cargo xtask starry test qemu --arch loongarch64 -c qemu-smp1/system/test-ptrace-gdb
  • cargo xtask starry app qemu -t gdb-smoke --arch loongarch64
  • cargo xtask starry app qemu -t gdb-smoke --arch loongarch64 --qemu-config qemu-loongarch64-gdbserver.toml
  • cargo xtask starry app qemu -t gdb-smoke --arch loongarch64 --qemu-config qemu-loongarch64-gdbserver-host.toml
  • gdb-multiarch -q -batch -x apps/starry/gdb-smoke/gdbserver/host-remote-loongarch64.gdb target/gdb-smoke-host/loongarch64/gdbserver-smoke-target

@Promin3
Promin3 force-pushed the feat/starryos-gdb-multiarch branch from 34cfdd7 to 29a24be Compare June 12, 2026 10:06

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 审查总结

本 PR 将 StarryOS 的 GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改清晰、系统化,无阻塞性问题。

修改内容评估

  1. 架构寄存器 ABIAarch64UserRegsAarch64FpRegsLoongarchUserRegsLoongarchFpRegs 的布局与 Linux 内核 user_pt_regs / user_fpsimd_state 一致,#[repr(C)] 和字段顺序正确。

  2. PtraceStopFpData 多架构变体:aarch64 用 [u128; 32](SIMD/FP)+ fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。

  3. 单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制,后续再增强分支/跳转目标精确单步。

  4. PTRACE_EVENT_VFORK_DONE 修复:将 pending event 从按 parent_pid 绑定改为按 parent_tid 绑定(clone.rs 第 409 行),这是正确的 bugfix——多线程进程中需要精确绑定到发起 vfork 的具体线程。

  5. #[cfg] 扩展模式:所有 riscv64 限定函数(GETREGS/SETREGS、GETREGSET/SETREGSET、GETSIGINFO/SETSIGINFO 等)统一扩展为 #[cfg(any(riscv64, aarch64, loongarch64))],模式一致无遗漏。

  6. 测试和文档:gdb-smoke 配置、QEMU TOML、GDB 脚本、prebuild.sh 和 README 都完整覆盖三架构,test-ptrace-gdb 的条件编译扩展也正确。

CI 状态

CI check runs 全部为 skipped 结论,无失败。PR 的 mergeable_stateunstable,这是由于 CI 跳过(非失败)导致,不是 PR 引入的问题。

相关 PR

  • PR #931(已合并):初始 GDB ptrace 支持
  • PR #1167(已合并):TID-aware GDB 可用性改进
  • PR #1062(开放):x86_64 ptrace,独立方向

本 PR 与 #1062 无冲突(不同架构)。

结论

代码质量好,架构移植遵循现有模式,vfork_done 修复正确,测试覆盖全面。推荐合并。

Powered by mimo-v2.5-pro

@Promin3
Promin3 force-pushed the feat/starryos-gdb-multiarch branch from 29a24be to 884b426 Compare June 12, 2026 14:11

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

PR 审查总结

本 PR 将 StarryOS 的 GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改系统化、模式一致,无阻塞性问题。

修改内容评估

  1. 架构寄存器 ABIAarch64UserRegs/Aarch64FpRegs/LoongarchUserRegs/LoongarchFpRegs#[repr(C)] 布局与 Linux 内核 user_pt_regs/user_fpsimd_state/LoongArch user_pt_regs 一致,字段顺序正确。From<&UserContext>write_to 转换逻辑正确映射每个寄存器。

  2. PtraceStopFpData 多架构变体task/mod.rs):aarch64 用 [u128; 32](NEON/FP 寄存器)+ fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。

  3. 断点指令常量AARCH64_BRK_INSN = 0xd4200000brk #0),LOONGARCH_BREAK_INSN = 0x002a0000break 0),编码正确。

  4. 单步执行:aarch64 和 loongarch64 的 ptrace_setup_singlestep 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制。ptrace_restore_singlestep_insn 使用 ptrace_write_u32_unlocked(而非 riscv64 的 u16),正确处理了 4 字节固定指令长度。

  5. PTRACE_EVENT_VFORK_DONE bugfixclone.rs:411):将 pending event 绑定从 parent_pid 改为 parent_tid,多线程进程中需要精确绑定到发起 vfork 的具体线程,这是正确的修复。

  6. #[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 调用也正确扩展到三架构。

  7. 测试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 同样正确。

  8. gdb-smoke 应用:新增 aarch64/loongarch64 的 build TOML、QEMU TOML(native/gdbserver/gdbserver-manual/gdbserver-host)、GDB 脚本、prebuild.sh 多架构支持(STARRY_ARCH 环境变量、find_qemu_runner case 分支、linux_target 变量)。README 文档完整记录了所有架构的使用入口。

  9. 信号处理signal.rs):#[cfg(target_arch = "riscv64")]UserStackFrameread_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

Comment thread apps/starry/gdb-smoke/build-loongarch64-unknown-none-softfloat.toml
@Promin3
Promin3 requested a review from ZR233 June 12, 2026 15:46

@ZR233 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

本轮看完后还有一个阻塞项:LoongArch PTRACE_GETREGSET/SETREGSETNT_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...HEADbash -n apps/starry/gdb-smoke/prebuild.sh apps/starry/gdb-smoke/gdbserver/gdbserver-smoke.shcargo fmt --all --check 通过。也做了重复/重叠检查:#1062 同样碰到 ptrace/GDB 但主要是 x86_64 清理和测试,和本 PR 的 aarch64/LoongArch regset 支持属于部分重叠,不替代这个 ABI 问题。

Comment thread os/StarryOS/kernel/src/syscall/task/ptrace.rs
@ZR233
ZR233 requested a review from Ivans-11 June 15, 2026 02:50
@Promin3
Promin3 force-pushed the feat/starryos-gdb-multiarch branch from 884b426 to ea74292 Compare June 15, 2026 04:44
@Promin3
Promin3 requested a review from ZR233 June 15, 2026 05:24

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本 PR 将 StarryOS GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,包括架构寄存器 ABI、单步指令替换、断点指令常量、FP/SIMD 状态保存恢复、vfork_done tid 绑定修复,以及完整的 gdb-smoke 测试/配置/文档。

变更评估

  1. LoongArch 寄存器布局LoongarchUserRegs 当前已包含 reserved[10](45 × u64 = 360 字节),与 Linux UAPI struct user_pt_regs 一致。ZR233 提出的 ABI 不兼容问题已在最新提交中修复。

  2. AArch64 寄存器布局Aarch64UserRegs(31 regs + sp + pc + pstate = 34 × u64)和 Aarch64FpRegs(32 × u128 + fpsr + fpcr)与 Linux UAPI 一致。

  3. PTRACE_EVENT_VFORK_DONE 修复:将 pending event 从 parent_pid 绑定改为 parent_tid,多线程环境中正确绑定到发起 vfork 的线程。

  4. 单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制。断点指令常量正确(0xd4200000 / 0x002a0000)。

  5. #[cfg] 扩展模式:所有 riscv64 限定函数统一扩展为 #[cfg(any(riscv64, aarch64, loongarch64))],模式一致无遗漏。

  6. 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 ZR233 left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

已复查最新 head ea74292ec080781d386c2ff24415ec7b4a0ad042,未发现阻塞合入的问题,批准。

检查结论:

  • LoongArch NT_PRSTATUS 已按 Linux user_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...HEAD
  • bash -n apps/starry/gdb-smoke/prebuild.sh apps/starry/gdb-smoke/gdbserver/gdbserver-smoke.sh
  • cargo fmt --all --check
  • cargo xtask clippy --package starry-kernel
  • cargo xtask starry test qemu --arch aarch64 -c qemu-smp1/system/test-ptrace-gdb,18 pass / 0 fail
  • cargo xtask starry test qemu --arch loongarch64 -c qemu-smp1/system/test-ptrace-gdb,18 pass / 0 fail
  • cargo xtask starry app qemu -t gdb-smoke --arch aarch64,命中 GDB_NATIVE_SMOKE_DONE
  • cargo xtask starry app qemu -t gdb-smoke --arch loongarch64,命中 GDB_NATIVE_SMOKE_DONE
  • cargo xtask starry app qemu -t gdb-smoke --arch aarch64 --qemu-config qemu-aarch64-gdbserver.toml,命中 GDBSERVER_SMOKE_DONE
  • cargo 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_CONNECTEDHOST_GDB_REMOTE_BT_DONEHOST_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,无失败项。

@mai-team-app mai-team-app Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

审查总结

本 PR 将 StarryOS GDB/ptrace 支持从 riscv64 扩展到 aarch64 和 loongarch64,基于 PR #1167 的 TID-aware ptrace 模型进行架构移植。修改系统化、模式一致,无阻塞性问题。

变更评估

  1. 架构寄存器 ABI

    • LoongarchUserRegs 包含 regs[32] + orig_a0 + csr_era + csr_badv + reserved[10](45 × u64 = 360 字节),与 Linux UAPI struct 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)布局正确。
  2. PTRACE_EVENT_VFORK_DONE 修复(clone.rs:412):将 pending event 从 parent_pid 绑定改为 parent_tid,多线程环境中正确绑定到发起 vfork 的具体线程。这是正确的 bugfix。

  3. 单步执行:aarch64 和 loongarch64 仅覆盖顺序下一条指令(PC+4),PR 描述已明确说明这是有意限制,后续再增强分支/跳转目标精确单步。断点指令常量正确(0xd4200000 / 0x002a0000)。ptrace_restore_singlestep_insn 使用 u32(而非 riscv64 的 u16),正确处理 4 字节固定指令长度。

  4. #[cfg] 扩展模式:所有 riscv64 限定函数(GETREGS/SETREGS、GETREGSET/SETREGSET、GETSIGINFO/SETSIGINFO、getregset_prstatus/fpregset 等)统一扩展为 #[cfg(any(riscv64, aarch64, loongarch64))]#[cfg(not(...))] fallback 保持 Err(Unsupported),模式一致无遗漏。

  5. PtraceStopFpData 多架构变体(task/mod.rs):aarch64 用 [u128; 32] + fpsr/fpcr,loongarch64 包含 LASX 高位寄存器和 fcc/fcsr,设计合理。

  6. user.rs 单步集成ptrace_setup_singlestep / ptrace_restore_singlestep_insn#[cfg] 扩展和断点命中恢复逻辑正确,三架构一致。

  7. gdb-smoke 完整性:aarch64/loongarch64 的 build TOML、QEMU TOML(native/gdbserver/gdbserver-manual/gdbserver-host)、GDB 脚本、prebuild.sh 多架构支持(STARRY_ARCH 环境变量、find_qemu_runner case 分支)、README 文档均完整覆盖。

  8. 测试覆盖(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

  • PR #931(已合并):初始 ptrace 支持
  • PR #1167(已合并):TID-aware GDB 改进
  • PR #1062(开放):x86_64 ptrace,不同架构方向,无冲突

结论

代码质量好,架构移植遵循现有 riscv64 模式,ABI 问题已修复,vfork_done 修复正确,测试覆盖全面,无残留阻塞性问题。推荐合并。

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit a801684 into rcore-os:dev Jun 15, 2026
50 checks passed
@github-actions github-actions Bot mentioned this pull request Jun 15, 2026
fzg-23 pushed a commit to fzg-23/tgoskits that referenced this pull request Jun 16, 2026
…core-os#1247)

* feat(starry-kernel): extend gdb support to aarch64 and loongarch64

* chore(ci): trigger ci

---------

Co-authored-by: 周睿 <zrufo747@outlook.com>
This was referenced Jun 22, 2026
luodeb pushed a commit that referenced this pull request Jun 30, 2026
…1247)

* feat(starry-kernel): extend gdb support to aarch64 and loongarch64

* chore(ci): trigger ci

---------

Co-authored-by: 周睿 <zrufo747@outlook.com>
aptacc2421 pushed a commit to aptacc2421/tgoskits that referenced this pull request Jul 30, 2026
…core-os#1247)

* feat(starry-kernel): extend gdb support to aarch64 and loongarch64

* chore(ci): trigger ci

---------

Co-authored-by: 周睿 <zrufo747@outlook.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants