Skip to content

fix(tty): handle input flush and wakeups - #1922

Open
Ivans-11 wants to merge 8 commits into
devfrom
fix/tty-input-flush-wakeups
Open

fix(tty): handle input flush and wakeups#1922
Ivans-11 wants to merge 8 commits into
devfrom
fix/tty-input-flush-wakeups

Conversation

@Ivans-11

@Ivans-11 Ivans-11 commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

修复 TTY 输入清理和唤醒问题:

  • 支持通过 TCFLSH 清理输入缓冲区
  • 简化 TTY reader 的事件唤醒机制,避免检查与休眠之间丢失唤醒

@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 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(),

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.

阻塞:TCFLSHTCOFLUSH 现在是成功的空操作,TCIOFLUSH 也只清输入。Linux 的 tcflush(..., TCOFLUSH) 必须丢弃尚未传输的输出,TCIOFLUSH 必须同时处理两侧;目前调用者会收到成功返回,却仍可能看到本应清除的排队输出。请在 writer/输出队列边界实现明确的 discard 操作,并用于这两个分支;如果后端暂不支持,至少应返回 Unsupported,不能静默成功。

@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 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 均为 bfa55180b1ec33704a1dced7341a68561be6dd1fgit diff --check origin/dev...HEAD 通过;cargo xtask starry test qemu --arch x86_64 -c qemu/system/test-tty-flush 实际构建、安装并通过(test-tty-flush: PASSSTARRY_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(),

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.

阻塞(正确性):这里的 TCIFLUSH 只清除了 line discipline 已交付的缓冲区,没有清理底层 reader 中“已经收到但尚未搬运”的数据。以 PTY 为例,master 写入后立即在 slave 上执行 ioctl 时,字节仍可能留在 master_to_slavePtyReader source ring;reader task 随后仍会把它交付给用户态,违反 tcflush(TCIFLUSH) 必须丢弃已接收、尚未读取输入的语义。新增用例在 flush 前先等待 slave 可读,恰好保证旧数据已经进入 buf_rx,覆盖不到该竞态。请为输入 source 和 InputReader 的暂存数据建立可同步的 discard/代际边界,并增加“不等待 ldisc 投递、直接 write 后 flush”的确定性回归用例。

@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 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: PASSSTARRY_GROUPED_TESTS_PASSED,故 failure marker 能传播到 runner。该用例验证三个 selector、非法 selector、reader 唤醒及 input source-stage,但 raw PTY 配置关闭 ECHO,未覆盖本评论中的 deferred echo 路径。

验证:prepare-review、本地最终 HEAD 与 GitHub PR head 均为 3621348b6993cadcb2544ec37ff67a607ac4bdd8git diff --check origin/dev...HEADcargo 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()?,

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.

阻塞(正确性):这里仅清理了底层 writer 队列,没有清理 line discipline 的 EchoQueue。该队列保存的是已经生成、但尚未交给 writer 的回显输出;worker 随后仍会调用 try_write() 把这些 ioctl 前的字节发出,因此 TCOFLUSH/TCIOFLUSH 成功返回后仍可能看到本应丢弃的输出,违反“written but not transmitted”的语义。当前测试使用 raw PTY,关闭了 ECHO,覆盖不到这条路径。请把 flush 放到能同时清理 deferred echo 和 backend 输出的边界,并补充回显队列受背压时的回归用例。

@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 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-flushqemu/system 布局、CMake 安装路径和 grouped wrapper 的成功/失败标记均符合现有规则。该用例只使用 PTY,不能覆盖本轮 serial 分支。

影响范围集中在 TTY line discipline、PTY/serial/USB serial 队列及 test-suit;未见公共 crate API 或 [patch.crates-io] 变更。基线已检索相关 TTY/TCFLSH 实现,并以 ttyTCFLSHtest-tty-flush 搜索开放 PR,未发现重叠或重复实现。

验证:prepare-review、本地最终 HEAD 和远端分支均为 b0a67a8124a39b062082c76a264528a8a37e6741git diff --check origin/dev...HEADcargo 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)?,

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.

阻塞(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 的成功路径;同时补充可验证该行为的覆盖。

@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 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 均为 77b312521287bc01f44608c5000a56b221e95210git diff --check origin/dev...HEADcargo fmt --check、以及 CMake 构建 test-tty-flush 通过。组织 CI(head 的 CI run 31254087877)无失败,格式/lint 与路径路由检查成功;矩阵中存在预期 skipped,未见此串口 RX 场景的运行证据。按已通过的组织 CI 未重复完整 QEMU 测试。局部 clippy:rdif-serialsome-serial 通过;starry-kernel --all-features 在未涉及的基线 feature 组合中被 ax-cpu userspace requires LinuxCurrent and cannot enable kernel TLS mode 阻断,未将其视为本 PR CI failure。

重复分析:已在基线检索 TTY/TCFLSH 和 serial runtime 既有实现,并以 TCFLSHtest-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 {}

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.

阻塞(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”的串口回归测试。

@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 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.txtsrc/,安装至 usr/bin/starry-test-suit,根 CMake 可发现;测试也包含 serial ioctl 成功路径,但没有验证“RX 预置后 TCOFLUSH 保持可读”,无法捕获本问题。

验证:helper prepare-review 确认本地 HEAD 为 ed7195fe1dac5222964ad2233772444b5028d194,helper 自测通过;git diff --check origin/dev...HEADcargo 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 的 TCFLSHtcflushtest-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

Comment thread drivers/serial/some-serial/src/pl011.rs Outdated

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);

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.

阻塞(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”的回归测试。

@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 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/ttyS0TCOFLUSH 成功。因此该 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 和基线以 TCFLSHtty-flush、相关路径检索,未发现重复或冲突实现;未发现 [patch.crates-io]

验证:prepare-review、本地 HEAD 及 GitHub head 都是 47662f1ba161b8f56035f1a341a5b6040cb5c078git diff --check origin/dev...HEADcargo 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 {

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.

阻塞(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 声称该行为可用。

@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 TTY 行为修复:实现 TCFLSHTCIFLUSHTCOFLUSHTCIOFLUSH,将输入/输出清理串行化到 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: PASSSTARRY_GROUPED_TESTS_PASSED。同时 cargo fmt --checkgit diff --check origin/dev...HEADcargo 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

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.

1 participant