fix(starry-kernel): align x86 ptrace gdb support#1314
Conversation
There was a problem hiding this comment.
Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support
总体评价:这是一个质量很高的 PR,方向正确,实现干净。核心目标是将 x86_64 收敛到现有四架构共享的 ptrace/GDB 路径,减少架构分叉。修改涵盖了 kernel ptrace 实现、user task 调度、以及测试用例的整合与清理。
架构收敛 ✅
X8664FpRegswrapper (#[repr(transparent)]aroundFxsaveArea) 正确接入公共ArchFpRegs类型别名。From<PtraceStopFpData>/From<X8664FpRegs>双向转换实现正确,与其他三个架构的模式一致。- 删除了
ptrace_getregset_fpregset_x86_64、ptrace_setregset_fpregset_x86_64、ptrace_read_stopped_fp_x86_64、ptrace_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 修复 ✅
- CS/SS 真实值:
orig_rax、cs、ss改为从uctx读取,不再硬编码0x33/0x2b。StarryOS 当前 GDT selector 为0x23/0x1b,硬编码值会导致 GDB 误判。 - debug register 返回 EIO:
PTRACE_POKEUSER写 debug register 时返回EIO而非假装成功,避免调试器误判硬件断点能力。 - #DB single-step 状态清理:
set_ptrace_singlestep_for(tid, false)在 TF 清除后同步清除进程标记,防止状态残留。 - 短 iovec 读取支持:
ptrace_getregset_fpregset改为iov.iov_len < 0检查 +min()拷贝,支持返回部分数据,与NT_PRSTATUS行为一致。
测试整合 ✅
test-ptrace-gdb新增 x86_64 支持:寄存器定义、inline asm(ss_step_target、setregs_pc_landing、legacy_setregs_landing)、raw_clone_thread、raw_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
|
最新 commit 主要是 gdb-smoke 的手工演示和体验增强:补充 GDB TUI helper、terminfo/source overlay,以及 PTY console manual config。它不改变内核 ptrace/GDB 语义,也不适合单独开一个 PR;所以合入了 x86 follow-up 分支 |
There was a problem hiding this comment.
Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support
总体评价:这是一个质量很高的架构收敛 PR,方向正确,实现干净,将 x86_64 ptrace/GDB 支持统一到现有的四架构公共路径。
架构收敛 ✅
X8664FpRegs(#[repr(transparent)]aroundFxsaveArea) 正确接入公共ArchFpRegs类型别名,From<PtraceStopFpData>/From<X8664FpRegs>双向转换与其他三架构一致。- 删除了
ptrace_getregset_fpregset_x86_64、ptrace_setregset_fpregset_x86_64、ptrace_read_stopped_fp_x86_64、ptrace_write_stopped_fp_x86_64等 x86-only helper,净减约 1400 行。 ptrace_setup_singlestep新增_tid: Pid参数统一签名,user.rs中消除了条件编译分支。
Bug 修复 ✅
- CS/SS 真实值:
orig_rax、cs、ss改为从uctx读取,write_to中验证self.cs != uctx.cs而非硬编码 Linux selector0x33/0x2b。StarryOS 当前 GDT selector 为0x23/0x1b,硬编码值会导致 GDB 误判。 - debug register 返回 EIO:
PTRACE_POKEUSER写 debug register 时返回EIO而非假装成功,避免调试器误判硬件断点能力。 - #DB single-step 状态清理:
set_ptrace_singlestep_for(tid, false)在 TF 清除后同步清除进程标记,防止状态残留导致后续 single-step 被错误跳过。 - 短 iovec 读取支持:
ptrace_getregset_fpregset改为iov.iov_len < 0检查 +min()拷贝,与ptrace_getregset_prstatus的短读模式完全一致,符合 LinuxPTRACE_GETREGSET语义。
测试整合 ✅
test-ptrace-gdb新增 x86_64:寄存器定义、inline asm(ss_step_target、setregs_pc_landing、legacy_setregs_landing)、raw_clone_thread、raw_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 paths 和 Cancel stale CI runs 已通过,sync-lint 和 Check formatting 仍在运行中,无失败。作者在 PR 描述中已提供手动验证结果(test-ptrace-gdb 17/17, test-gdb-native-batch 1/1)。
未发现阻塞问题
代码逻辑正确,与现有架构模式一致,删除代码无残留,测试覆盖完整。
结论:APPROVE。
Powered by mimo-v2.5-pro
There was a problem hiding this comment.
Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support
总体评价:高质量的架构收敛 PR,方向正确,实现干净。将 x86_64 ptrace/GDB 支持统一到现有四架构公共路径,净减约 1400 行。
架构收敛 ✅
X8664FpRegs(#[repr(transparent)]aroundFxsaveArea) 正确接入公共ArchFpRegs类型别名,From<PtraceStopFpData>/From<X8664FpRegs>双向转换与其他三架构一致。- 删除了
ptrace_getregset_fpregset_x86_64、ptrace_setregset_fpregset_x86_64、ptrace_read_stopped_fp_x86_64、ptrace_write_stopped_fp_x86_64等 x86-only helper。 ptrace_setup_singlestep新增_tid: Pid参数统一签名,user.rs中消除了#[cfg(target_arch)]条件编译分支。
Bug 修复 ✅
- CS/SS 真实值:
orig_rax、cs、ss改为从uctx读取,write_to中验证self.cs != uctx.cs而非硬编码0x33/0x2b。StarryOS 当前 GDT selector 为0x23/0x1b,硬编码值导致 GDB 误判。 - debug register 返回 EIO:
PTRACE_POKEUSER写 debug register 时返回EIO,避免假装支持硬件断点。 - #DB single-step 状态清理:
set_ptrace_singlestep_for(tid, false)在 TF 清除后同步清除进程标记,防止状态残留。 - 短 iovec 读取:
ptrace_getregset_fpregset改为iov.iov_len < 0检查 +min()拷贝,与ptrace_getregset_prstatus一致,符合 LinuxPTRACE_GETREGSET语义。
测试整合 ✅
test-ptrace-gdb新增 x86_64 支持:寄存器定义、inline asm(ss_step_target、setregs_pc_landing、legacy_setregs_landing)、raw_clone_thread、raw_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|loongarch64,qemu-x86_64.toml的test_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
left a comment
There was a problem hiding this comment.
已按当前 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-kernel17/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 runs 和 Detect changed paths,Check formatting / run_host 与 Run 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 的合入判断。
未发现阻塞问题,同意合入。
2e0dde9 to
26f1302
Compare
ZR233
left a comment
There was a problem hiding this comment.
已按当前 head 26f13026c65fddcc1959ac7b7726ec37c35aa5ff 重新审查。
这个 head 是对前一轮已审查版本的线性 rebase/整理;相对我之前批准并验证过的 2e0dde9bd4025e5235b30b016b9d18203810d2bf,实际新增差异只剩 apps/starry/README.md 和 apps/starry/gdb-smoke/README.md 的说明更新,代码、test-suit、gdb-smoke 脚本和 QEMU 配置没有再变化。README 现在把 x86_64 native/gdbserver smoke 可用性补齐,和 #1330 后的现状一致。
本轮补充验证:
- 当前 head 可快进包含最新
origin/dev,mergeStateStatus=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 整理都已充分验证,未发现阻塞问题,同意合入。
There was a problem hiding this comment.
Review: PR #1314 — fix(starry-kernel): align x86 ptrace gdb support
总体评价:高质量的架构收敛 PR,方向正确,实现干净。将 x86_64 ptrace/GDB 支持统一到现有四架构公共路径,净减约 1400 行代码。
架构收敛 ✅
X8664FpRegs(#[repr(transparent)]aroundFxsaveArea) 正确接入公共ArchFpRegs类型别名,From<PtraceStopFpData>/From<X8664FpRegs>双向转换与其他三架构一致。- 删除了
ptrace_getregset_fpregset_x86_64、ptrace_setregset_fpregset_x86_64、ptrace_read_stopped_fp_x86_64、ptrace_write_stopped_fp_x86_64等 x86-only helper。 ptrace_setup_singlestep新增_tid: Pid参数统一签名,user.rs中消除了#[cfg(target_arch)]条件编译分支。
Bug 修复 ✅
- CS/SS 真实值:
orig_rax、cs、ss改为从uctx读取,write_to中验证self.cs != uctx.cs而非硬编码0x33/0x2b。StarryOS 当前 GDT selector 为0x23/0x1b,硬编码值会导致 GDB 误判。 - debug register 返回 EIO:
PTRACE_POKEUSER写 debug register 时返回EIO,避免假装支持硬件断点。 - #DB single-step 状态清理:
set_ptrace_singlestep_for(tid, false)在 TF 清除后同步清除进程标记,防止状态残留。 - 短 iovec 读取:
ptrace_getregset_fpregset和ptrace_getregset_prstatus统一为iov.iov_len < 0检查 +min()拷贝,符合 LinuxPTRACE_GETREGSET语义。
测试整合 ✅
test-ptrace-gdb新增 x86_64:寄存器定义、inline asm、raw_clone_thread、raw_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
* 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
* 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
* 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
问题
#1062 合入后,x86_64 的 ptrace/GDB 支持已经具备基础能力,但实现和测例仍然与现有 riscv64/aarch64/loongarch64 的 GDB 支持路径存在分叉:
ArchFpRegs/PtraceStopFpData路径。ptrace_setup_singlestep签名与其他架构不同,导致用户态返回路径需要额外条件编译分支。PTRACE_POKEUSER对 debug register 写入直接返回成功,但当前 StarryOS 并未真正实现硬件断点,容易让调试器误判能力。test-ptrace-gdb大量重复,增加 CI 和维护成本。test-gdb-native-batch硬编码 Linux x86_64 selector0x33/0x2b,但当前 StarryOS 实际 GDT selector 为0x23/0x1b,该检查不应作为当前 GDB 可用性的必要条件。修改内容
ArchFpRegs路径:X8664FpRegswrapper。ptrace_getregset_fpregset/ptrace_setregset_fpregset。ptrace_getregset_fpregset_x86_64等重复 helper。ptrace_setup_singlestep函数签名,使user.rs可以和其他架构一样调用。#DBsingle-step stop 前清理当前 TID 的 single-step 标志,避免状态残留。PTRACE_POKEUSER写 debug register 时返回EIO,避免假装支持硬件断点。GETREGSET(NT_FPREGSET)改为支持短 iovec 拷贝,和NT_PRSTATUS的行为保持一致。test-ptrace-gdb测例。test-ptrace-x86-regstest-ptrace-x86-fpregstest-ptrace-x86-singlesteptest-ptrace-x86-breakpointtest-ptrace-x86-breakpoint-reinserttest-gdb-native-batch:0x33/0x2b。/proc/<pid>/auxv、动态链接入口断点、single-step、tracee 正常退出的验证。apps/starry/gdb手工调试入口合并进apps/starry/gdb-smoke,保留 GDB TUI/manual demo 辅助脚本和文档。Rebase 处理
已将分支线性 rebase 到当前
dev:b2221a854bb44204a0d2b714977be43535c52268。冲突集中在
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和 router10.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 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。