fix(tty): handle input flush and wakeups - #1922
Conversation
There was a problem hiding this comment.
本 PR 为 StarryOS TTY 修复:新增 TCFLSH 输入清理,并将 reader 改为依赖稳定的 AxWaker 关闭检查/注册窗口。它影响用户可见的终端 ioctl 与读唤醒 ABI;feature-development.md 不适用(既有行为修复,未新增公共能力),已按 Starry syscall 指南核对其语义。
发现 1 个实现阻塞项(见行内评论):输出方向的 TCOFLUSH/TCIOFLUSH 没有执行输出丢弃,却成功返回。
另一个阻塞项是回归覆盖缺失:本 PR 只修改了两个内核源文件,仓库中没有 TCFLSH/tcflush 测试。请在 test-suit/starryos 添加可由 runner 选中的直接 ioctl 测试,至少验证三个 selector 及排队数据的输入/输出效果;并为输入 flush 与 reader 唤醒竞态提供确定性回归路径。该测试应在未修复版本失败,避免格式或 lint 通过掩盖 ABI/并发回归。
实现影响范围集中在 TTY line discipline 与 writer 队列,未见依赖、公共 crate API 或 crates.io patch 改动。基线和相关开放 PR 搜索未发现同一 TTY/TCFLSH 改动的重叠 PR。此前没有 review、行内评论或 issue 评论需要处理。
验证:prepare-review 已确认工作区为目标 head;git diff --check origin/dev...HEAD 通过;当前 head 的组织 CI workflow 成功(41 success、43 路由/矩阵 skipped、3 cancelled、0 failure),其中 formatting/lint 路由已执行。按已通过 CI 不重复完整本地构建;尝试 cargo xtask clippy --help 时首次构建 xtask 下载依赖超时,未作为 PR 失败依据。CI 也没有显示本改动的 TTY ABI/竞态专门运行证据。
审查待办已逐项完成:头 SHA 复核为 70288837a1ea6c4775102f991f4891ae87007e9f,差异、TTY 状态机、既有评论、CI、重复分析和验证均已核对。剩余问题仅为上述输出 flush 语义和回归测试,修复后请重新请求审查。
Powered by gpt-5.6-terra
| return Err(AxError::Unsupported); | ||
| } | ||
| TCFLSH => match arg { | ||
| TCIFLUSH | TCIOFLUSH => self.ldisc.lock().drain_input(), |
There was a problem hiding this comment.
阻塞:TCFLSH 的 TCOFLUSH 现在是成功的空操作,TCIOFLUSH 也只清输入。Linux 的 tcflush(..., TCOFLUSH) 必须丢弃尚未传输的输出,TCIOFLUSH 必须同时处理两侧;目前调用者会收到成功返回,却仍可能看到本应清除的排队输出。请在 writer/输出队列边界实现明确的 discard 操作,并用于这两个分支;如果后端暂不支持,至少应返回 Unsupported,不能静默成功。
There was a problem hiding this comment.
本 PR 为 StarryOS TTY 修复:补齐 TCFLSH 三个 selector 的处理、为 PTY/USB serial 增加输出队列清理,并以稳定 AxWaker 重写 reader 的检查/注册窗口。它修改既有终端 ioctl 与读唤醒 ABI;feature-development.md 不适用(没有新增公共能力),已按 Starry syscall 指南核对。
影响集中在 line discipline、PTY/串口队列和 test-suit,没有 crates.io patch 或公共 crate API 变更。上一轮关于 TCOFLUSH/TCIOFLUSH 未清输出的评论合理,当前 discard_output() 实现和新增 selector 测试已解决;未发现同一 TTY/TCFLSH 的开放 PR 重叠。
阻塞问题见行内评论:TCIFLUSH 没有同底层 source-reader 建立清理同步边界,仍可能把 ioctl 前已接收、但尚未由异步 reader 搬运的数据交付给用户态。
验证:prepare-review 与最终 HEAD 均为 bfa55180b1ec33704a1dced7341a68561be6dd1f;git diff --check origin/dev...HEAD 通过;cargo xtask starry test qemu --arch x86_64 -c qemu/system/test-tty-flush 实际构建、安装并通过(test-tty-flush: PASS、STARRY_GROUPED_TESTS_PASSED)。组织 CI 的格式检查和 clippy 成功;Starry x86_64/riscv64 QEMU job 被取消而非失败,未提供本 TTY 用例的通过证据,因此本地执行了该精确 x86_64 case。当前未见 PR 引入的 CI failure。
待办审计:已完成基线规范、TTY 并发/ABI、测试布局与失败传播、依赖、既有评论、CI、重叠和当前 head 核对。test-tty-flush 的布局、发现和三 selector 断言均正确,但未覆盖 source-reader interleaving;该未解决正确性问题阻止合并。修复并补充确定性竞态回归后请重新请求审查。
Powered by gpt-5.6-terra
| return Err(AxError::Unsupported); | ||
| } | ||
| TCFLSH => match arg { | ||
| TCIFLUSH => self.ldisc.lock().drain_input(), |
There was a problem hiding this comment.
阻塞(正确性):这里的 TCIFLUSH 只清除了 line discipline 已交付的缓冲区,没有清理底层 reader 中“已经收到但尚未搬运”的数据。以 PTY 为例,master 写入后立即在 slave 上执行 ioctl 时,字节仍可能留在 master_to_slave 的 PtyReader source ring;reader task 随后仍会把它交付给用户态,违反 tcflush(TCIFLUSH) 必须丢弃已接收、尚未读取输入的语义。新增用例在 flush 前先等待 slave 可读,恰好保证旧数据已经进入 buf_rx,覆盖不到该竞态。请为输入 source 和 InputReader 的暂存数据建立可同步的 discard/代际边界,并增加“不等待 ldisc 投递、直接 write 后 flush”的确定性回归用例。
There was a problem hiding this comment.
本 PR 为 StarryOS TTY 修复:实现 TCFLSH 的三个 selector,修复输入 reader 的检查/注册唤醒窗口,并新增 PTY QEMU 回归用例。它改变既有终端 ioctl/read 唤醒 ABI;book/guideline/feature-development.md 不适用(既有行为修复,未新增公共能力)。实现范围集中在 line discipline、PTY/串口/USB serial 队列和对应的 test-suit,未见公共 crate API 或 [patch.crates-io] 改动。
存在 1 个阻塞正确性问题,见行内评论。 TCOFLUSH/TCIOFLUSH 未清理 line discipline 的延迟回显队列,可能在 ioctl 成功后仍输出 ioctl 前的回显数据;请在 line discipline/output 边界完成统一清理,并补充回显受背压时的回归覆盖。
前两轮评论已复核:此前输出 backend 队列未清理的问题已由 discard_output() 解决;此前输入 source-reader/暂存缓冲与 line discipline 未建立同步清理边界的问题已由共享 consumer 和 InputReader::discard_input() 处理,新增 source-stage 用例覆盖该路径。历史评论没有其他未解决事项。
测试覆盖:新增 case 位于 test-suit/starryos/qemu/system/test-tty-flush/,根 CMake 会发现该子目录,实际命令 cargo xtask starry test qemu --arch x86_64 -c qemu/system/test-tty-flush 成功构建、安装并运行,输出 test-tty-flush: PASS、STARRY_GROUPED_TESTS_PASSED,故 failure marker 能传播到 runner。该用例验证三个 selector、非法 selector、reader 唤醒及 input source-stage,但 raw PTY 配置关闭 ECHO,未覆盖本评论中的 deferred echo 路径。
验证:prepare-review、本地最终 HEAD 与 GitHub PR head 均为 3621348b6993cadcb2544ec37ff67a607ac4bdd8;git diff --check origin/dev...HEAD 和 cargo fmt --check 通过。组织 CI 的格式检查、spin/sync lint 成功;当前 head 没有 check-run failure,相关 Starry QEMU job 为 cancelled,未提供该 case 的执行证据,因此运行了上述精确本地 QEMU case。workflow aggregate 的 cancelled/skip 矩阵不作为本 PR 失败结论。
重复分析:已在基线搜索 TTY/TCFLSH 实现,并以 TTY flush、TCFLSH、变更路径和测试名搜索开放 PR;未发现同一实现的重叠或重复 PR。待办审计已完成:规范、Starry syscall ABI、并发、测试布局/发现/失败传播、依赖、历史评论、CI、重复分析和 head 均已核对。修复此输出 flush 遗漏并增加回归后请重新请求审查。
Powered by gpt-5.6-terra
| } | ||
| TCFLSH => match arg { | ||
| TCIFLUSH => self.ldisc.lock().drain_input(), | ||
| TCOFLUSH => self.writer.discard_output()?, |
There was a problem hiding this comment.
阻塞(正确性):这里仅清理了底层 writer 队列,没有清理 line discipline 的 EchoQueue。该队列保存的是已经生成、但尚未交给 writer 的回显输出;worker 随后仍会调用 try_write() 把这些 ioctl 前的字节发出,因此 TCOFLUSH/TCIOFLUSH 成功返回后仍可能看到本应丢弃的输出,违反“written but not transmitted”的语义。当前测试使用 raw PTY,关闭了 ECHO,覆盖不到这条路径。请把 flush 放到能同时清理 deferred echo 和 backend 输出的边界,并补充回显队列受背压时的回归用例。
There was a problem hiding this comment.
本 PR 为 StarryOS TTY 修复:新增 TCFLSH 三个 selector 的处理,补齐 PTY/USB serial 的队列清理,并调整 reader/line-discipline 的输入清理与唤醒协作。它影响既有终端 ioctl/read 的用户可见 ABI;book/guideline/feature-development.md 不适用(既有行为修复,未新增公共能力),已按 Starry syscall 指南核对。
存在 1 个阻塞问题,见行内评论:通用 TCFLSH 分发同时覆盖 /dev/ttyS*,但 serial writer 没有输出 discard 实现,导致 TCOFLUSH/TCIOFLUSH 在该设备上返回 Unsupported,没有实现应有的输出丢弃语义。
前 3 轮评论已复核:PTY 输出 backend、input source-stage 和 deferred echo 的清理均已在当前 head 实现,并且新增用例覆盖了相应 PTY 路径;没有其他遗留问题。新增 test-tty-flush 的 qemu/system 布局、CMake 安装路径和 grouped wrapper 的成功/失败标记均符合现有规则。该用例只使用 PTY,不能覆盖本轮 serial 分支。
影响范围集中在 TTY line discipline、PTY/serial/USB serial 队列及 test-suit;未见公共 crate API 或 [patch.crates-io] 变更。基线已检索相关 TTY/TCFLSH 实现,并以 tty、TCFLSH、test-tty-flush 搜索开放 PR,未发现重叠或重复实现。
验证:prepare-review、本地最终 HEAD 和远端分支均为 b0a67a8124a39b062082c76a264528a8a37e6741;git diff --check origin/dev...HEAD、cargo fmt --check 以及新增 C 测试的 gcc -std=c11 -Wall -Wextra -Werror -fsyntax-only 均通过。cargo xtask starry test qemu --arch x86_64 -c qemu/system/test-tty-flush --list 成功构建 xtask 并确认该 grouped case 可发现。组织 CI 当前 head 的 76 个 check-run 为 39 success、37 skipped、0 failure;未取得该新增 case 实际运行的明确 CI 证据,且存在上述 serial 语义缺口,因此未以 CI 通过替代该阻塞审查。
Syscall/ABI 映射:ioctl(TCFLSH)—存在问题(本评论;依据 POSIX tcflush/Linux termios(3) 对 output 与 both selector 的定义);本次 shared TTY helper 没有发现其他直接 syscall 入口受影响。待办已审计完成:约束、ABI、并发、测试发现/失败传播、历史评论、CI、依赖、重复分析及 head 均已核对。请补齐 serial 输出队列清理及可验证覆盖后重新请求审查。
Powered by gpt-5.6-terra
| } | ||
| TCFLSH => match arg { | ||
| TCIFLUSH => self.ldisc.lock().drain_input(), | ||
| TCOFLUSH => self.ldisc.lock().discard_output(&self.writer)?, |
There was a problem hiding this comment.
阻塞(Linux/POSIX TTY 语义):TCFLSH 是所有 Tty 共用的分发,但 SerialWriter 没有覆盖 TtyWrite::discard_output(),所以这里对 /dev/ttyS* 调用 tcflush(TCOFLUSH) 或 TCIOFLUSH 会落到默认 Unsupported,而不是丢弃尚未传输的输出。PR 只为 SerialReader 加了输入清理,现有 PTY 用例也覆盖不到该设备类型。请在 serial backend 提供并接入 TX queue/FIFO 的 discard,或在完整支持前不要把该 ioctl 作为 serial 的成功路径;同时补充可验证该行为的覆盖。
There was a problem hiding this comment.
本 PR 为 StarryOS TTY 修复:补齐 TCFLSH 的三个 selector、清理延迟 echo/输出队列,并调整 reader 的检查与注册窗口。它影响用户可见的 ioctl(TCFLSH)/读唤醒 ABI;book/guideline/feature-development.md 不适用(既有行为修复,未扩展公共能力)。改动集中在 TTY line discipline、PTY/serial/USB serial 队列以及串口 runtime,没有发现公共 crate API 或 [patch.crates-io] 变更。
仍有 1 个阻塞正确性问题,见行内评论。 当前 /dev/ttyS* 的 TCIFLUSH 只清理已进入订阅队列的 RX 数据,无法丢弃 ioctl 前已到达但尚在 UART FIFO/worker 路径中的输入,因此成功返回后仍可能将旧字节交付给用户态。
历史评论复核:之前关于 TCOFLUSH/TCIOFLUSH 未清后端输出、未清延迟 echo、以及 PTY source-stage 输入的意见均合理且已在当前 head 通过 discard_output()、共享 PTY consumer 和 InputReader::discard_input() 处理;没有其他 issue/review 评论需要保留。新增 test-tty-flush 位于 test-suit/starryos/qemu/system/test-tty-flush/,根 CMake 的目录发现和 failure-marker 机制可覆盖它;本地 CMake 精确选择、编译该子用例通过,但该测试仅对 serial 执行空队列 ioctl,无法证明本评论中的 RX FIFO/worker interleaving。
验证:prepare-review、提交前本地 HEAD 和 GitHub PR head 均为 77b312521287bc01f44608c5000a56b221e95210;git diff --check origin/dev...HEAD、cargo fmt --check、以及 CMake 构建 test-tty-flush 通过。组织 CI(head 的 CI run 31254087877)无失败,格式/lint 与路径路由检查成功;矩阵中存在预期 skipped,未见此串口 RX 场景的运行证据。按已通过的组织 CI 未重复完整 QEMU 测试。局部 clippy:rdif-serial、some-serial 通过;starry-kernel --all-features 在未涉及的基线 feature 组合中被 ax-cpu userspace requires LinuxCurrent and cannot enable kernel TLS mode 阻断,未将其视为本 PR CI failure。
重复分析:已在基线检索 TTY/TCFLSH 和 serial runtime 既有实现,并以 TCFLSH、test-tty-flush、TTY flush 与 serial discard 搜索开放 PR;未发现同一实现的重叠或重复 PR。
Starry syscall/ABI 映射:
| Syscall | 评审结论 | 对应标准 | 简要依据 |
|---|---|---|---|
ioctl(TCFLSH) |
存在问题(F-001) | termios/tcflush(3) | TCIFLUSH 应丢弃已接收但未读取的输入;serial RX FIFO/worker 阶段未被同步清理。 |
待办审计:基线规范、TTY/serial 并发与硬件 FIFO、历史评论、CI、测试布局/发现/失败传播、依赖检查、重复分析和 head 均已完成。请为 serial RX 建立与 worker 串行化的硬件及软件队列丢弃边界,并添加确定性回归覆盖后重新请求审查。
Powered by gpt-5.6-terra
|
|
||
| fn discard_input(&mut self) { | ||
| let mut temp = [RxItem::default(); SERIAL_RX_DRAIN_CHUNK]; | ||
| while self.backend.drain_rx(&mut temp) != 0 {} |
There was a problem hiding this comment.
阻塞(TTY TCIFLUSH 语义):这里仅清空了已进入 SerialRxSubscription 的软件队列,未与 UART worker/硬件 RX FIFO 建立丢弃边界。一个在 ioctl 前已到达、但仍留在硬件 FIFO 中的字节,会在随后 IRQ worker 搬运后重新交付给用户态;TCFLSH(TCIFLUSH) 却已经成功返回。新加的控制命令只处理 TX,且 PTY 用例覆盖不到 /dev/ttyS*。请增加与 worker 串行化的 RX discard(同时清理 runtime 队列和 UART 接收 FIFO),并补充“字节先进入 source、后执行 flush”的串口回归测试。
There was a problem hiding this comment.
本 PR 为既有 StarryOS TTY ABI 修复:补齐 TCFLSH 的输入/输出清理,并将清理边界延伸到 PTY、串口 runtime 和 UART FIFO;新增 test-tty-flush 覆盖 selector、source-stage、延迟回显及 reader wakeup。feature-development.md 不适用(未新增公共能力),但 book/guideline/starry/syscall.md 适用,因为 TCFLSH 改变用户态 ioctl 可观察语义。
存在 1 个阻塞正确性问题,见行内评论:PL011 的 TCOFLUSH 通过同时控制收发 FIFO 的 FEN 位实现,导致本应只丢输出的 selector 也丢弃未读输入;TCIOFLUSH 才应清理双向数据。
历史评论复核:此前 PTY backend 输出、source-stage 输入和 deferred echo 的清理问题,当前已分别由共享 consumer、InputReader::discard_input()、EchoQueue::discard_pending() 和新用例处理;串口 RX 也加入 runtime/IRQ/FIFO 清理边界。上述 PL011 TX-only 语义仍未解决。新增 grouped-system C case 的布局正确:子目录含 CMakeLists.txt 和 src/,安装至 usr/bin/starry-test-suit,根 CMake 可发现;测试也包含 serial ioctl 成功路径,但没有验证“RX 预置后 TCOFLUSH 保持可读”,无法捕获本问题。
验证:helper prepare-review 确认本地 HEAD 为 ed7195fe1dac5222964ad2233772444b5028d194,helper 自测通过;git diff --check origin/dev...HEAD 与 cargo fmt --check 通过。组织当前 head 的 CI 共 76 个 check,39 success、37 expected skipped、0 failure;格式和相关路由成功,因此未重复完整本地 QEMU/全 workspace 构建。cargo xtask --help 在本机首次构建时超过环境时限,未将环境超时归因于 PR。CI 未提供本 PL011 selector 分离语义的专门执行证据。
重复/重叠分析:已查基线的 TCFLSH/serial discard 实现,以及开放 PR 的 TCFLSH、tcflush、test-tty-flush 关键词;未发现重复或依赖的开放 PR。无 issue 评论;既有五轮 review 评论已按当前 head 逐项复核。
syscall 标准映射:
| Syscall/ioctl | 结论 | 标准 | 依据 |
|---|---|---|---|
ioctl(TCFLSH, TCIFLUSH) |
未发现本轮新增问题 | POSIX tcflush | 当前清理 ldisc、reader source、runtime 与硬件 RX 边界。 |
ioctl(TCFLSH, TCOFLUSH) |
存在问题(F-001) | POSIX tcflush | PL011 FEN 清理会影响 RX FIFO。 |
ioctl(TCFLSH, TCIOFLUSH) |
存在问题(F-001) | POSIX tcflush | 输出半侧复用存在问题的 PL011 TX 清理。 |
待办审计:规范、ABI/并发、测试发现和失败传播、依赖 patch、历史评论、CI、重复分析及 head 均完成;本 F-001 是唯一未解决阻塞项。请改为真正的 TX-only 清理(或明确返回不支持),并补充 RX 保留回归后重新请求审查。
Powered by gpt-5.6-terra
|
|
||
| fn discard_tx(&mut self) { | ||
| let fifo_enabled = self.registers().uartlcr_h.is_set(UARTLCR_H::FEN); | ||
| self.registers().uartlcr_h.modify(UARTLCR_H::FEN::CLEAR); |
There was a problem hiding this comment.
阻塞(POSIX tcflush 语义):这里通过清除 UARTLCR_H.FEN 实现 discard_tx(),但 PL011 的 FEN 同时控制收发 FIFO;本驱动已有配置路径也把清除 FEN 作为 FIFO 清空。因此 /dev/ttyS* 上的 TCFLSH(TCOFLUSH) 会在成功返回时丢掉尚未读取的 RX 数据,实际退化成双向 flush,违反 TCOFLUSH 只能丢弃“已写入但未发送”的输出这一约定。请改用不会影响 RX FIFO 的 TX-only 清理;若硬件不能独立实现,应返回不支持而不能静默丢输入,并增加“预置 RX 后执行 TCOFLUSH 仍可读到 RX”的回归测试。
There was a problem hiding this comment.
本 PR 为既有 StarryOS TTY ABI 修复:补齐 TCFLSH 的输入/输出清理路径、收紧 reader 的检查/注册唤醒窗口,并添加 qemu/system/test-tty-flush 回归。feature-development.md 不适用(未新增能力);该改动影响 ioctl/read 唤醒语义,已按 Starry syscall 指南检查。直接受影响的入口为 TTY TCFLSH:PTY、USB serial 和 NS16550 的队列清理路径已覆盖;PL011 输出方向仍不能满足本 PR 的通用行为声明,详见行内阻塞项。
阻塞问题: PL011 的 discard_tx() 明确返回不支持,而新增跨架构 qemu/system case 无条件要求 /dev/ttyS0 的 TCOFLUSH 成功。因此该 case 在使用 PL011 的架构/平台会确定性失败,用户态也无法获得 PR 所宣称的 serial output flush。请实现不影响 RX 的 TX-only 清理并补充保留 RX 的回归,或显式将 case/能力声明限制为支持该操作的平台。
历史审查已复核:此前关于 PTY/USB 输出队列、source-reader 输入竞态和 deferred echo 的意见,当前通过 discard_output()、共享 reader/source 丢弃和 EchoQueue::discard_pending() 已有对应实现与测试;没有其他仍成立的旧项。开放 PR 和基线以 TCFLSH、tty-flush、相关路径检索,未发现重复或冲突实现;未发现 [patch.crates-io]。
验证:prepare-review、本地 HEAD 及 GitHub head 都是 47662f1ba161b8f56035f1a341a5b6040cb5c078;git diff --check origin/dev...HEAD 与 cargo fmt --check 通过。组织 CI 当前 76 个 check runs 中无 failure(成功与预期 matrix/path skip 并存);其结果不证明新增 TTY case 覆盖了 PL011。按已通过的组织 CI 未重复全量本地构建。新增 test-suit 的 system/<subcase>/CMakeLists.txt + src/ 布局、安装位置和 grouped runner 的失败传播均符合现有规则,但无条件 serial 断言是剩余测试缺口。
待办审计:规范、TTY ABI/并发、UART RX/TX 队列、测试发现与失败传播、历史评论、CI、依赖、重复分析和最终 head 已完成;上述 PL011 语义/跨架构测试问题阻止合并。建议后续由 MAINTAINERS 中匹配 drivers/、os/arceos/、test-suit/ 的 ZR233、ZCShou 跟进。
Powered by gpt-5.6-terra
| written | ||
| } | ||
|
|
||
| fn discard_tx(&mut self) -> bool { |
There was a problem hiding this comment.
阻塞(TTY ABI/跨平台回归):discard_tx() 在 PL011 上固定返回 false,因此共享的 TCFLSH(TCOFLUSH) 会对该平台的 /dev/ttyS* 返回 Unsupported。但新增的通用 system case 在 main.c 中无条件断言 /dev/ttyS0 的该 ioctl 成功;PL011 平台运行该 case 会确定性失败,且用户态也无法使用本 PR 宣称支持的输出 flush。请实现不影响 RX 的 PL011 TX-only discard 并增加保留 RX 的回归;若硬件确实无法支持,则必须把测试/能力声明改为平台感知,不能让通用 case 声称该行为可用。
There was a problem hiding this comment.
本 PR 为既有 StarryOS TTY 行为修复:实现 TCFLSH 的 TCIFLUSH、TCOFLUSH 和 TCIOFLUSH,将输入/输出清理串行化到 line discipline、PTY/USB/串口 runtime 与 UART 后端,并收紧 reader 的唤醒窗口。book/guideline/feature-development.md 不适用:这是既有 ioctl/读唤醒语义修复,未新增公共能力或接口。
实现影响集中在 TTY 输入状态、延迟回显、TX/RX 队列和 UART FIFO。已核对上一轮所有合理阻塞项:输入 source 与暂存阶段现在由 discard_input() 同步清理;延迟 echo 与 backend TX 均由 discard_output() 清理;serial RX 控制路径清理 runtime、IRQ 和硬件来源;PL011 对不可独立执行 TX-only discard 的情形返回 EOPNOTSUPP,不会误清 RX。变更与既有 TCSETSF/TCSETSF2 的输入清理共享错误传播。未发现 crates.io patch、公共 crate API 回归或同一 TTY/TCFLSH 开放 PR 重叠。
Starry syscall/ABI 映射(Linux man-pages tcflush(3):https://man7.org/linux/man-pages/man3/tcflush.3.html):
| 用户态入口 | 结论 | 依据 |
|---|---|---|
ioctl(TCFLSH, TCIFLUSH) / tcflush(fd, TCIFLUSH) |
符合 | 清理 ldisc、reader staged data、PTY/serial/USB source;新增测试覆盖 source-stage。 |
ioctl(TCFLSH, TCOFLUSH) / tcflush(fd, TCOFLUSH) |
符合 | 清理 deferred echo 与 backend TX;无法 TX-only 清理的 PL011 返回不支持且保留 RX。 |
ioctl(TCFLSH, TCIOFLUSH) / tcflush(fd, TCIOFLUSH) |
符合 | 在同一 ldisc 锁范围内执行输出后输入清理。 |
ioctl(TCSETSF) / ioctl(TCSETSF2) |
符合 | 既有 drain-input 路径现在传播 source 清理失败,不再静默成功。 |
测试位于 test-suit/starryos/qemu/system/test-tty-flush/,根 CMakeLists.txt 会发现其子目录;grouped runner 会捕获子测试非零退出并输出失败标记。实际执行 cargo xtask starry test qemu --arch x86_64 -c qemu/system/test-tty-flush:通过,包含 test-tty-flush: PASS 和 STARRY_GROUPED_TESTS_PASSED。同时 cargo fmt --check、git diff --check origin/dev...HEAD、cargo clippy --manifest-path drivers/serial/some-serial/Cargo.toml --all-features -- -D warnings、该 crate 的 47 个单元测试与 doctest,以及 cargo publish --workspace --dry-run --no-verify 均通过。
CI:当前 head 的组织 CI 已路由本变更。早前 Check formatting / run_host 的失败注释只有 exit 101;重跑后 host formatting/publish job 正在运行。该旧失败无法由本地完整 cargo fmt 和同一 publish dry-run 复现,未见 PR 引入的确定性 CI failure;本地精确 QEMU 回归提供了该新增 case 的执行证据。axruntime --all-features 组合被 ax-cpu 的既有互斥 userspace/kernel-TLS compile_error! 拒绝,非本改动诊断,未作为失败结论。
待办审计完成:规范、TTY/serial 并发与 ABI、测试布局/发现/失败传播、历史评论、依赖、重叠、CI 和当前 head 均已核对。没有剩余阻塞问题;本次改动看起来隔离且可合并。维护者匹配:drivers/ 对应 ZR233、test-suit/ 对应 ZCShou;本次不额外修改 reviewer 请求。
Powered by gpt-5.6-terra
修复 TTY 输入清理和唤醒问题: