Skip to content

fix(starry-kernel): align x86 ptrace gdb support#1314

Merged
ZR233 merged 4 commits into
rcore-os:devfrom
Promin3:feat/starryos-gdb-x86-followup
Jun 21, 2026
Merged

fix(starry-kernel): align x86 ptrace gdb support#1314
ZR233 merged 4 commits into
rcore-os:devfrom
Promin3:feat/starryos-gdb-x86-followup

Conversation

@Promin3

@Promin3 Promin3 commented Jun 18, 2026

Copy link
Copy Markdown
Contributor

问题

#1062 合入后,x86_64 的 ptrace/GDB 支持已经具备基础能力,但实现和测例仍然与现有 riscv64/aarch64/loongarch64 的 GDB 支持路径存在分叉:

  • x86_64 单独维护 FP regset helper,没有复用已有四架构公共 ArchFpRegs / PtraceStopFpData 路径。
  • x86_64 ptrace_setup_singlestep 签名与其他架构不同,导致用户态返回路径需要额外条件编译分支。
  • PTRACE_POKEUSER 对 debug register 写入直接返回成功,但当前 StarryOS 并未真正实现硬件断点,容易让调试器误判能力。
  • x86_64 单独新增了多组 ptrace 子测例,与统一的 test-ptrace-gdb 大量重复,增加 CI 和维护成本。
  • test-gdb-native-batch 硬编码 Linux x86_64 selector 0x33/0x2b,但当前 StarryOS 实际 GDT selector 为 0x23/0x1b,该检查不应作为当前 GDB 可用性的必要条件。

修改内容

  • 将 x86_64 FP regset 接入公共 ArchFpRegs 路径:
    • 新增 X8664FpRegs wrapper。
    • 复用公共 ptrace_getregset_fpregset / ptrace_setregset_fpregset
    • 删除 x86-only ptrace_getregset_fpregset_x86_64 等重复 helper。
  • 统一 x86_64 ptrace_setup_singlestep 函数签名,使 user.rs 可以和其他架构一样调用。
  • x86_64 #DB single-step stop 前清理当前 TID 的 single-step 标志,避免状态残留。
  • PTRACE_POKEUSER 写 debug register 时返回 EIO,避免假装支持硬件断点。
  • GETREGSET(NT_FPREGSET) 改为支持短 iovec 拷贝,和 NT_PRSTATUS 的行为保持一致。
  • 将 x86_64 纳入统一 test-ptrace-gdb 测例。
  • 删除重复的 x86-only ptrace 子测例:
    • test-ptrace-x86-regs
    • test-ptrace-x86-fpregs
    • test-ptrace-x86-singlestep
    • test-ptrace-x86-breakpoint
    • test-ptrace-x86-breakpoint-reinsert
  • 修正 test-gdb-native-batch
    • 不再硬编码 Linux selector 0x33/0x2b
    • 保留对 exec-stop、/proc/<pid>/auxv、动态链接入口断点、single-step、tracee 正常退出的验证。
  • 将旧 apps/starry/gdb 手工调试入口合并进 apps/starry/gdb-smoke,保留 GDB TUI/manual demo 辅助脚本和文档。

Rebase 处理

已将分支线性 rebase 到当前 devb2221a854bb44204a0d2b714977be43535c52268

冲突集中在 apps/starry/gdb-smoke 的 x86_64 配置和 README:当前 dev 已包含 #1330 的 x86_64 native/gdbserver smoke 配置,因此保留现有 gdb-smoke 结构和已验证的 x86_64 QEMU 参数,只叠加本 PR 的 TUI/manual demo 内容。apps/starry/gdb-smoke/build-x86_64-unknown-none.toml 不再指定 AX_IP / AX_GW,网络由 DHCP 获取;本地 QEMU 日志已确认 guest 通过 DHCP 获得 10.0.2.15/24 和 router 10.0.2.2

设计说明

本 PR 不扩展新的 x86-only Linux 兼容层,而是将 x86_64 收敛到现有四架构 GDB usable subset 的实现方式。这样可以减少架构分叉,避免同一语义在不同架构下重复维护。

debug register 写入暂时不返回成功,是因为 StarryOS 当前没有真正编程 x86 硬件断点。相比返回成功但不生效,显式返回 EIO 更符合当前能力边界,也更容易暴露未实现能力。

test-gdb-native-batch 保留为动态链接场景补充测例;统一 test-ptrace-gdb 则作为四架构共享的 ptrace/GDB 语义基线。

验证

cargo fmt
cargo xtask clippy --package starry-kernel
cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/test-ptrace-gdb
cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/system/test-gdb-native-batch

结果:

  • cargo xtask clippy --package starry-kernel:17/17 passed。
  • test-ptrace-gdb:guest 内 DONE: 20 pass, 0 fail,命中 STARRY_GROUPED_TESTS_PASSED
  • test-gdb-native-batch:guest 内 DONE: 1 pass, 0 fail,命中 STARRY_GROUPED_TESTS_PASSED
  • 两个 x86_64 QEMU run 均确认网络通过 DHCP 获取地址。

@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.

Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support

总体评价:这是一个质量很高的 PR,方向正确,实现干净。核心目标是将 x86_64 收敛到现有四架构共享的 ptrace/GDB 路径,减少架构分叉。修改涵盖了 kernel ptrace 实现、user task 调度、以及测试用例的整合与清理。

架构收敛 ✅

  • X8664FpRegs wrapper (#[repr(transparent)] around FxsaveArea) 正确接入公共 ArchFpRegs 类型别名。
  • From<PtraceStopFpData> / From<X8664FpRegs> 双向转换实现正确,与其他三个架构的模式一致。
  • 删除了 ptrace_getregset_fpregset_x86_64ptrace_setregset_fpregset_x86_64ptrace_read_stopped_fp_x86_64ptrace_write_stopped_fp_x86_64 等 x86-only helper,净减约 1400 行。

ptrace_setup_singlestep 签名统一 ✅

  • x86_64 版本新增 _tid: Pid 参数,与 riscv64/aarch64/loongarch64 保持一致。
  • user.rs 中统一为单个调用点,消除了 #[cfg(target_arch)] 分支。

Bug 修复 ✅

  1. CS/SS 真实值orig_raxcsss 改为从 uctx 读取,不再硬编码 0x33/0x2b。StarryOS 当前 GDT selector 为 0x23/0x1b,硬编码值会导致 GDB 误判。
  2. debug register 返回 EIOPTRACE_POKEUSER 写 debug register 时返回 EIO 而非假装成功,避免调试器误判硬件断点能力。
  3. #DB single-step 状态清理set_ptrace_singlestep_for(tid, false) 在 TF 清除后同步清除进程标记,防止状态残留。
  4. 短 iovec 读取支持ptrace_getregset_fpregset 改为 iov.iov_len < 0 检查 + min() 拷贝,支持返回部分数据,与 NT_PRSTATUS 行为一致。

测试整合 ✅

  • test-ptrace-gdb 新增 x86_64 支持:寄存器定义、inline asm(ss_step_targetsetregs_pc_landinglegacy_setregs_landing)、raw_clone_threadraw_clone_vfork_child_exit 均正确实现。
  • fpregs_set_f0/f1 使用 xmm[0]/xmm[2] 对应 XMM0/XMM1(每个 XMM 寄存器占 2 个 u64),布局正确。
  • 删除 5 个 x86-only 子测例目录,无残留引用。
  • test-gdb-native-batch 不再硬编码 Linux selector 检查。

一个小观察

ptrace_setregset_fpregset(set 路径)仍然要求 iov.iov_len >= size_of::<ArchFpRegs>(),而 get 路径已改为允许短读。这不是本 PR 引入的问题(set 路径未改动),但如果后续需要更严格的 Linux 兼容性,set 路径也可以支持短写(用零填充不足部分)。

CI 状态

CI check runs 均为 skipped(fork PR 未触发实际运行),但作者已在 PR 描述中提供了手动验证结果(test-ptrace-gdb 17/17 passed, test-gdb-native-batch 1/1 passed)。

结论:approve。 代码质量好,方向正确,架构收敛干净,bug 修复合理。

Powered by mimo-v2.5-pro

@Promin3

Promin3 commented Jun 18, 2026

Copy link
Copy Markdown
Contributor Author

最新 commit 主要是 gdb-smoke 的手工演示和体验增强:补充 GDB TUI helper、terminfo/source overlay,以及 PTY console manual config。它不改变内核 ptrace/GDB 语义,也不适合单独开一个 PR;所以合入了 x86 follow-up 分支

@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.

Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support

总体评价:这是一个质量很高的架构收敛 PR,方向正确,实现干净,将 x86_64 ptrace/GDB 支持统一到现有的四架构公共路径。

架构收敛 ✅

  • X8664FpRegs (#[repr(transparent)] around FxsaveArea) 正确接入公共 ArchFpRegs 类型别名,From<PtraceStopFpData> / From<X8664FpRegs> 双向转换与其他三架构一致。
  • 删除了 ptrace_getregset_fpregset_x86_64ptrace_setregset_fpregset_x86_64ptrace_read_stopped_fp_x86_64ptrace_write_stopped_fp_x86_64 等 x86-only helper,净减约 1400 行。
  • ptrace_setup_singlestep 新增 _tid: Pid 参数统一签名,user.rs 中消除了条件编译分支。

Bug 修复 ✅

  1. CS/SS 真实值orig_raxcsss 改为从 uctx 读取,write_to 中验证 self.cs != uctx.cs 而非硬编码 Linux selector 0x33/0x2b。StarryOS 当前 GDT selector 为 0x23/0x1b,硬编码值会导致 GDB 误判。
  2. debug register 返回 EIOPTRACE_POKEUSER 写 debug register 时返回 EIO 而非假装成功,避免调试器误判硬件断点能力。
  3. #DB single-step 状态清理set_ptrace_singlestep_for(tid, false) 在 TF 清除后同步清除进程标记,防止状态残留导致后续 single-step 被错误跳过。
  4. 短 iovec 读取支持ptrace_getregset_fpregset 改为 iov.iov_len < 0 检查 + min() 拷贝,与 ptrace_getregset_prstatus 的短读模式完全一致,符合 Linux PTRACE_GETREGSET 语义。

测试整合 ✅

  • test-ptrace-gdb 新增 x86_64:寄存器定义、inline asm(ss_step_targetsetregs_pc_landinglegacy_setregs_landing)、raw_clone_threadraw_clone_vfork_child_exit 均正确。
  • fpregs_set_f0/f1 使用 xmm[0]/xmm[2] 正确映射 XMM0/XMM1(每个 XMM 寄存器 128 位 = 2 × uint64_t)。
  • 删除 5 个 x86-only 子测例目录,无残留引用。
  • test-gdb-native-batch 不再硬编码 Linux selector 检查,改为非零验证。

CI 状态

CI checks 大部分为 skipped(fork PR 未触发),Detect changed pathsCancel stale CI runs 已通过,sync-lintCheck formatting 仍在运行中,无失败。作者在 PR 描述中已提供手动验证结果(test-ptrace-gdb 17/17, test-gdb-native-batch 1/1)。

未发现阻塞问题

代码逻辑正确,与现有架构模式一致,删除代码无残留,测试覆盖完整。

结论:APPROVE。

Powered by mimo-v2.5-pro

@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.

Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support

总体评价:高质量的架构收敛 PR,方向正确,实现干净。将 x86_64 ptrace/GDB 支持统一到现有四架构公共路径,净减约 1400 行。

架构收敛 ✅

  • X8664FpRegs (#[repr(transparent)] around FxsaveArea) 正确接入公共 ArchFpRegs 类型别名,From<PtraceStopFpData> / From<X8664FpRegs> 双向转换与其他三架构一致。
  • 删除了 ptrace_getregset_fpregset_x86_64ptrace_setregset_fpregset_x86_64ptrace_read_stopped_fp_x86_64ptrace_write_stopped_fp_x86_64 等 x86-only helper。
  • ptrace_setup_singlestep 新增 _tid: Pid 参数统一签名,user.rs 中消除了 #[cfg(target_arch)] 条件编译分支。

Bug 修复 ✅

  1. CS/SS 真实值orig_raxcsss 改为从 uctx 读取,write_to 中验证 self.cs != uctx.cs 而非硬编码 0x33/0x2b。StarryOS 当前 GDT selector 为 0x23/0x1b,硬编码值导致 GDB 误判。
  2. debug register 返回 EIOPTRACE_POKEUSER 写 debug register 时返回 EIO,避免假装支持硬件断点。
  3. #DB single-step 状态清理set_ptrace_singlestep_for(tid, false) 在 TF 清除后同步清除进程标记,防止状态残留。
  4. 短 iovec 读取ptrace_getregset_fpregset 改为 iov.iov_len < 0 检查 + min() 拷贝,与 ptrace_getregset_prstatus 一致,符合 Linux PTRACE_GETREGSET 语义。

测试整合 ✅

  • test-ptrace-gdb 新增 x86_64 支持:寄存器定义、inline asm(ss_step_targetsetregs_pc_landinglegacy_setregs_landing)、raw_clone_threadraw_clone_vfork_child_exit 均正确。
  • fpregs_set_f0/f1 使用 xmm[0]/xmm[2] 正确映射 XMM0/XMM1 低 64 位(每个 XMM 128 位 = 2 × uint64_t)。
  • 删除 5 个 x86-only 子测例目录,grep 确认无残留引用。
  • test-gdb-native-batch 不再硬编码 Linux selector,改为非零验证。
  • CMakeLists.txt 架构过滤器已更新为 x86_64|riscv64|aarch64|loongarch64qemu-x86_64.tomltest_commands 自动发现 /usr/bin/starry-test-suit/*,test-ptrace-gdb 会被正确执行。

重复/重叠分析

搜索了其他 open PRs(#1318 AIC8800DC, #1317 RISC-V vPLIC 等),无与 x86 ptrace/GDB 相关的重叠或冲突。

无 crates.io patch

grep -rn '[patch.crates-io]' --include='Cargo.toml' 无结果。

CI 状态

Fork PR,主 CI 未触发。作者已在 PR 描述中提供手动验证结果(test-ptrace-gdb 17/17 passed, test-gdb-native-batch 1/1 passed)。

小观察(非阻塞)

ptrace_setregset_fpregset(set 路径)仍要求 iov.iov_len >= size_of::<ArchFpRegs>(),而 get 路径已改为允许短读。这不是本 PR 引入的问题(set 路径未改动),与 Linux 行为一致。

结论:APPROVE。 代码质量好,方向正确,架构收敛干净,bug 修复合理,测试覆盖完整。

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 2e0dde9bd4025e5235b30b016b9d18203810d2bf 重新审查并处理了与最新 dev 的冲突。

本 PR 的主要价值仍然成立:x86_64 FP regset 收敛到现有 ArchFpRegs/PtraceStopFpData 公共路径,ptrace_setup_singlestep 调用签名与其他架构一致,#DB single-step stop 后同步清理 TID 级 single-step 标志,PTRACE_POKEUSER 写 debug register 不再假成功,同时将 x86_64 纳入统一 test-ptrace-gdb 覆盖并删除重复的 x86-only 子测例。

冲突处理:PR 原先与 dev 冲突在 apps/starry/gdb-smoke/{README.md,build-x86_64-unknown-none.toml,qemu-x86_64.toml}。已用普通 merge commit 合入最新 dev,保留 dev/#1330 已验证的 x86_64 native/gdbserver smoke 配置和 debug register offset 修复,只叠加本 PR 的 TUI/manual demo 文档与脚本;没有手工合并 Cargo.lock 冲突。修复后 PR diff 相对当前 dev 只剩本 PR 的独立改动。

验证结果:

  • cargo fmt 通过;git diff --check 通过;冲突标记检查通过。
  • cc -std=c11 -Wall -Wextra -Werror -Itest-suit/starryos/qemu-smp1/system/common -fsyntax-only test-suit/starryos/qemu-smp1/system/test-ptrace-gdb/src/main.c 通过。
  • cc -std=gnu11 -Wall -Wextra -Werror -fsyntax-only test-suit/starryos/qemu-smp1/system/test-gdb-native-batch/src/tracer.c 通过。
  • cargo xtask clippy --package starry-kernel 17/17 通过。
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/test-ptrace-gdb 通过,guest 内 DONE: 20 pass, 0 fail,命中 STARRY_GROUPED_TESTS_PASSED
  • cargo xtask starry test qemu --arch x86_64 -c qemu-smp1/test-gdb-native-batch 通过,guest 内 DONE: 1 pass, 0 fail,确认 selector 为当前 StarryOS 的 cs=0x23 ss=0x1b

测试覆盖:新增/调整的 grouped system case 仍位于 test-suit/starryos/qemu-smp1/system/<subcase>,通过 qemu-smp1/<subcase> 精确选择,CMake 安装到 /usr/bin/starry-test-suit/,本地 QEMU 日志确认 runner 实际执行对应二进制并能用 grouped success/fail marker 传播结果。该 PR 是 bugfix/行为收敛,回归覆盖充分。

CI 状态:push 冲突修复后 GitHub 已触发新 CI;当前已通过 Cancel stale CI runsDetect changed pathsCheck formatting / run_hostRun sync-lint / run_container 仍在运行中,尚未看到失败。之前旧 head 的完整相关 CI 已通过;当前 head 的关键行为已由上述本地验证覆盖。

重复/重叠分析:当前 dev 已包含 #1330 的 gdb-smoke x86_64 native/gdbserver app 和 u_debugreg offset=848 修复,本 PR 与其有 app 文件冲突但语义互补;冲突已按 #1330 的现有配置为准解决。本 PR 的 kernel/test-suit 收敛(x86_64 FP regset 公共路径、统一 test-ptrace-gdb、selector 检查调整、single-step 标志清理)仍是独立价值。#1323 也修改 ptrace,但集中在 PTRACE_SEIZE/LISTEN/strace flow,非重复;其当前构建问题不影响本 PR 的合入判断。

未发现阻塞问题,同意合入。

@ZR233
ZR233 requested review from Ivans-11 and yfblock June 21, 2026 03:48
@ZR233
ZR233 force-pushed the feat/starryos-gdb-x86-followup branch from 2e0dde9 to 26f1302 Compare June 21, 2026 03:49

@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 26f13026c65fddcc1959ac7b7726ec37c35aa5ff 重新审查。

这个 head 是对前一轮已审查版本的线性 rebase/整理;相对我之前批准并验证过的 2e0dde9bd4025e5235b30b016b9d18203810d2bf,实际新增差异只剩 apps/starry/README.mdapps/starry/gdb-smoke/README.md 的说明更新,代码、test-suit、gdb-smoke 脚本和 QEMU 配置没有再变化。README 现在把 x86_64 native/gdbserver smoke 可用性补齐,和 #1330 后的现状一致。

本轮补充验证:

  • 当前 head 可快进包含最新 origin/devmergeStateStatus=CLEAN
  • git diff --check origin/dev...HEAD 通过。
  • 对当前 diff 中仍存在的文件检查了冲突标记,未发现残留。
  • 2e0dde9b..HEAD 的代码/测试/脚本配置路径对比无差异,仅 README 变化。
  • GitHub CI 当前 head 全部相关 check run 已通过,包括 formatting、clippy、std、Starry x86_64 QEMU、各架构 QEMU 和 self-hosted board jobs;跳过项为矩阵中按 changed-path/host-container 选择跳过的对应项。

结论保持不变:本 PR 的 x86_64 ptrace/GDB 收敛、debug register EIO、single-step 状态清理、统一 test-ptrace-gdb 覆盖和 gdb-smoke 整理都已充分验证,未发现阻塞问题,同意合入。

@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.

Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support

总体评价:高质量的架构收敛 PR,方向正确,实现干净。将 x86_64 ptrace/GDB 支持统一到现有四架构公共路径,净减约 1400 行代码。

架构收敛 ✅

  • X8664FpRegs (#[repr(transparent)] around FxsaveArea) 正确接入公共 ArchFpRegs 类型别名,From<PtraceStopFpData> / From<X8664FpRegs> 双向转换与其他三架构一致。
  • 删除了 ptrace_getregset_fpregset_x86_64ptrace_setregset_fpregset_x86_64ptrace_read_stopped_fp_x86_64ptrace_write_stopped_fp_x86_64 等 x86-only helper。
  • ptrace_setup_singlestep 新增 _tid: Pid 参数统一签名,user.rs 中消除了 #[cfg(target_arch)] 条件编译分支。

Bug 修复 ✅

  1. CS/SS 真实值orig_raxcsss 改为从 uctx 读取,write_to 中验证 self.cs != uctx.cs 而非硬编码 0x33/0x2b。StarryOS 当前 GDT selector 为 0x23/0x1b,硬编码值会导致 GDB 误判。
  2. debug register 返回 EIOPTRACE_POKEUSER 写 debug register 时返回 EIO,避免假装支持硬件断点。
  3. #DB single-step 状态清理set_ptrace_singlestep_for(tid, false) 在 TF 清除后同步清除进程标记,防止状态残留。
  4. 短 iovec 读取ptrace_getregset_fpregsetptrace_getregset_prstatus 统一为 iov.iov_len < 0 检查 + min() 拷贝,符合 Linux PTRACE_GETREGSET 语义。

测试整合 ✅

  • test-ptrace-gdb 新增 x86_64:寄存器定义、inline asm、raw_clone_threadraw_clone_vfork_child_exit 均正确。
  • fpregs_set_f0/f1 使用 xmm[0]/xmm[2] 正确映射 XMM0/XMM1。
  • 删除 5 个 x86-only 子测例目录,无残留引用。
  • test-gdb-native-batch 不再硬编码 Linux selector,改为非零验证。

CI 状态

CI workflow run #6778 conclusion: success。相关 check jobs 均已通过或按路径过滤合理跳过。

小观察(非阻塞)

NT_FPREGSET 在 x86_64 和其他三架构分别定义了相同的值 2,可以合并为一个无 cfg 的常量。

结论:APPROVE。 代码质量好,方向正确,架构收敛干净,bug 修复合理,CI 已通过。

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit 3b1c6bf into rcore-os:dev Jun 21, 2026
52 checks passed
This was referenced Jun 21, 2026
Antareske pushed a commit to Antareske/tgoskits that referenced this pull request Jun 27, 2026
* fix(starry-kernel): align x86 ptrace gdb support

* chore(ci): trigger pr checks

* feat(starry): add GDB TUI manual demo path

* chore(starry): merge gdb app into gdb-smoke
Antareske pushed a commit to Antareske/tgoskits that referenced this pull request Jun 27, 2026
* fix(starry-kernel): align x86 ptrace gdb support

* chore(ci): trigger pr checks

* feat(starry): add GDB TUI manual demo path

* chore(starry): merge gdb app into gdb-smoke
luodeb pushed a commit that referenced this pull request Jun 30, 2026
* fix(starry-kernel): align x86 ptrace gdb support

* chore(ci): trigger pr checks

* feat(starry): add GDB TUI manual demo path

* chore(starry): merge gdb app into gdb-smoke
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