Skip to content

refactor(axdevice): replace errno contracts#1595

Merged
ZR233 merged 1 commit into
devfrom
codex/axdevice-typed-errors
Jul 13, 2026
Merged

refactor(axdevice): replace errno contracts#1595
ZR233 merged 1 commit into
devfrom
codex/axdevice-typed-errors

Conversation

@ZR233

@ZR233 ZR233 commented Jul 13, 2026

Copy link
Copy Markdown
Member

问题

虚拟化设备路径中的 axdevice_baseaxdevicearm_vgicriscv_vplic 与测试 crate 仍直接依赖 ax-errno,导致设备访问、资源注册和 IRQ 路由错误被压缩为通用 errno,调用方无法按领域分类处理,也缺少总线、地址、宽度、IRQ line 等诊断上下文。

改动

  • axdevice_base 中完善 DeviceErrorRegistryError,新增 DeviceResultIrqErrorIrqResult,并将设备及 IRQ trait 迁移到领域结果类型。
  • axdevice 中新增 DeviceManagerError/DeviceManagerResult,覆盖配置、资源、分配、访问、IRQ、注册、fw_cfg 与 IVC 失败。
  • arm_vgicriscv_vplic 分别新增 VgicError/VgicResultVplicError/VplicResult,将非法 IRQ、上下文、访问宽度和区域配置改为可匹配错误,避免断言或通用错误。
  • 在 AxVM 边界按设备、IRQ、资源冲突、内存不足和不支持操作映射到对应 AxVmError
  • 更新 virtualization-tests 的 mock 与断言,并删除目标 crate 对 ax-errno 的直接依赖。
  • 增加错误契约与 Display 上下文测试。

实现逻辑

下层错误本身已经携带完整语义时,通过 From<LowerError> for UpperError 配合 ? 直接传播;只有需要补充当前操作、总线地址、访问宽度或 VM 领域分类时才在边界显式构造上层错误。这样减少重复的 map_err,同时保留可匹配的错误类型与完整上下文。VM、设备、内存和中断的运行策略保持不变。

验证

  • cargo fmt --all --check
  • cargo test -p axdevice_base -p axdevice -p arm_vgic -p riscv_vplic --features arm_vgic/vgicv3
  • cargo test -p axvm
  • cargo check -p virtualization-tests --tests
  • cargo test -p virtualization-tests --test axdevice
  • cargo xtask clippy --package axdevice_base
  • cargo xtask clippy --package axdevice
  • cargo xtask clippy --package arm_vgic
  • cargo xtask clippy --package riscv_vplic
  • cargo xtask clippy --package axvm
  • cargo xtask axvisor build --arch x86_64
  • cargo xtask axvisor build --arch aarch64
  • cargo xtask axvisor build --arch riscv64
  • cargo xtask axvisor build --arch loongarch64

@ZR233
ZR233 marked this pull request as ready for review July 13, 2026 09:29

@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 将虚拟化设备路径中 axdevice_baseaxdevicearm_vgicriscv_vplic 以及测试 crate 的 ax-errno 依赖替换为领域类型错误枚举(通过 thiserror),并建立完整的错误传播链。变更范围清晰,实现质量高。

实现逻辑

  • axdevice_base:扩展 DeviceError 新增 InvalidInputInvalidDataInvalidStateUnsupportedOutOfMemoryResourceBusyBackend 等变体,并为 DeviceErrorRegistryErrorInvalidResourceReason 添加 thiserror::Error derive 与 Display 实现。新增 DeviceResult 类型别名。同时为 IrqLine/IrqSink 新增 IrqError/IrqResult,将原先的 AxError::InvalidInput 替换为携带 IRQ line、触发模式、操作类型等上下文的 IrqError::InvalidTriggerMode
  • axdevice:新增 DeviceManagerError/DeviceManagerResult,覆盖配置错误、资源冲突、分配失败、总线访问失败、IRQ 路由失败等场景,并实现 From<DeviceManagerError> for DeviceError 做上层映射。
  • arm_vgic:新增 VgicError/VgicResult,将 panic! 替换为可匹配的 InvalidIrq 错误,assign_irq 返回 VgicResult 而非无返回值;内部 handle_read/handle_write 改为 ? 传播错误。
  • riscv_vplic:新增 VplicError/VplicResult,覆盖非法 IRQ、上下文字段、访问宽度和区域配置等场景。
  • axvm:新增 From<DeviceError> for AxVmErrorFrom<IrqError> for AxVmErrorFrom<RegistryError> for AxVmErrorFrom<DeviceManagerError> for AxVmError 四个转换实现,将下层领域错误映射到 VM 层语义,保留可匹配的错误类型。
  • 所有原先的 expect() 调用替换为通过 config_argument() 辅助方法的 ? 传播;ax_err! 宏调用替换为类型化错误构造。

验证结果

验证项 结果
cargo fmt --check ✅ 通过
cargo test -p axdevice_base --all-features ✅ 7 测试通过
cargo test -p axdevice --all-features ✅ 23 测试通过
cargo test -p arm_vgic --all-features ✅ 3 测试通过
cargo test -p riscv_vplic --all-features ✅ 11 测试通过
cargo test -p axvm ✅ 22 测试通过
cargo test -p virtualization-tests --test axdevice ✅ 25 测试通过
cargo xtask clippy --package axdevice_base ✅ 3 检查通过
cargo xtask clippy --package axdevice ✅ 1 检查通过
cargo xtask clippy --package arm_vgic ✅ 2 检查通过
cargo xtask clippy --package riscv_vplic ✅ 1 检查通过
cargo xtask clippy --package axvm ✅ 6 检查通过

CI 状态

GitHub Actions CI workflow run #29239061906 结论为 success。个别 job 显示 skipped 是因为矩阵中 run_host/run_container 互斥择一或路径过滤的正常行为,不影响整体 CI 结论。

测试覆盖

PR 为 4 个 crate(axdevice_baseaxdevicearm_vgicriscv_vplic)新增了 error_contract 测试,验证:

  1. Cargo.toml 和源码中不再依赖 ax-errno
  2. 错误变体可正确匹配和转换
  3. 原先 panic! 的路径现在返回可匹配错误

这些测试正确地放置在各自 crate 的 tests/ 目录中,被 cargo test 自动发现和执行。

重复/重叠分析

  • 在当前 origin/dev 基础分支上搜索,未发现等价的类型化错误实现。
  • 在开放 PR 中搜索,未发现与本 PR 冲突或重叠的 PR。PR #1076(Starry 自编译)和 #1594(JPU pipeline)与本次变更完全无关。

审查意见

无阻塞性问题。该 PR 设计合理:

  • 错误类型层次清晰,DeviceErrorDeviceManagerErrorAxVmError 的转换链保留了可匹配性和上下文
  • IrqError::InvalidTriggerMode 携带 line/operation/expected/actual 比原先 AxError::InvalidInput 更有诊断价值
  • assign_irqpanic! 改为返回 Result 是正确性改进
  • [patch.crates-io] 变更
  • axhvcaxvmconfig 中仍保留 ax-errno 依赖属于本次变更范围外的 crate,不应阻塞合并

环境限制

book/guideline/code-quality.md 读取被容器策略阻止,但代码变更已通过 Rust 编码标准检查(fmt + clippy),且错误类型设计符合 TGOSKits 分层模式。未能在当前 x86_64 环境中执行 cargo xtask axvisor build --arch aarch64/riscv64/loongarch64 的交叉编译验证,但 CI 已涵盖这些架构的构建与测试。

Powered by deepseek-v4-pro

@mai-team-app
mai-team-app Bot requested a review from YanLien July 13, 2026 10:25
@ZR233
ZR233 merged commit 11a4caf into dev Jul 13, 2026
66 of 69 checks passed
@ZR233
ZR233 deleted the codex/axdevice-typed-errors branch July 13, 2026 12:24
@github-actions github-actions Bot mentioned this pull request Jul 13, 2026
@github-actions github-actions Bot mentioned this pull request Jul 21, 2026
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