Skip to content

feat(riscv64): support dynamic platform on QEMU and SG2002#961

Merged
ZR233 merged 26 commits into
rcore-os:devfrom
ZR233:feat/rv64-dyn2
May 27, 2026
Merged

feat(riscv64): support dynamic platform on QEMU and SG2002#961
ZR233 merged 26 commits into
rcore-os:devfrom
ZR233:feat/rv64-dyn2

Conversation

@ZR233

@ZR233 ZR233 commented May 26, 2026

Copy link
Copy Markdown
Member

背景

本 PR 补齐 RISC-V64 plat-dyn 路径,并把 ax-driver 的平台发现模式收敛为显式的 plat-static / plat-dyn。目标是让 QEMU virt、Axvisor RISC-V64 默认测试和 LicheeRV Nano SG2002 都走动态平台启动、FDT probe、IRQ/SMP/块设备初始化流程。

修改内容

  • ax-driver 增加 plat-static / plat-dyn 两个模式,移除旧的 pcifdtpci-fdt feature;PCI 和 INTC 作为基础能力保留,FDT 动态 probe 只在 plat-dyn 下编译。
  • 当 rust-analyzer 或 workspace 检查同时启用 ax-driver/plat-staticax-driver/plat-dyn 时,build script 不再 panic,而是按 plat-dyn 优先输出 cfg(plat_dyn),避免目标 riscv64imac-unknown-none-elf 下特性合并导致分析失败。
  • somehal::driver::rdrive_setup() 在运行时按 FDT 优先、ACPI RSDP 次之选择动态 source;无 source 时跳过 rdrive probe 并记录 warning。
  • rv64 PLIC 作为 rdif_intc::Intc 注册进 rdrive,解析 regriscv,ndevinterrupts-extended,为 FDT 设备提供 phandle IRQ specifier 到 IrqId 的转换。
  • 参照 aarch64 GIC,把 PLIC 设备本体保留在 rdrive,同时新增 ax_riscv_plic::PlicIrqHandler 作为 Send + Sync 的无锁 IRQ handler;trap 回调只用该 handler 执行 claim/complete,不持有 rdrive 设备锁。
  • RISC-V PLIC 当前 context 选择改为运行期优先使用 ax_plat::percpu::this_cpu_id,并保留 someboot hart-id 映射作为早期初始化 fallback,避免调度后 tp 被线程上下文覆盖时在外部中断路径 panic。
  • RISC-V trap/IRQ/IPI 支持完整 raw interrupt cause 转发;timer/IPI 走本地 IRQ slot,外部 IRQ 走 PLIC source,并通过 SBI hart mask 发送 IPI。
  • 按 Linux 命名增加 thead-mae feature,用于 T-Head MAE 非标准 PTE memory attribute;SG2002 dynamic 路径启用,QEMU rv64 dynamic 不启用。
  • SG2002 dynamic 路径通过 FDT probe 注册 CVSD 块设备,并增加 placeholder 驱动预映射相关 SG2002 MMIO 区域但不注册未实现设备。
  • 将 Starry/Axvisor 的 rv64 QEMU 默认和测试配置切换到 plat-dyn,并同步静态平台与测试配置里的 ax-driver/plat-static / ax-driver/plat-dyn feature。
  • 更新 axbuild 对 dynamic platform、PIE rv64 target、Starry/Axvisor rootfs 参数处理和相关单测。
  • 合并 upstream/dev 后适配 Starry 入口改为经 ax-runtime 路由,并补齐 rv64 someboot linker 的 .tdata/.tbss TLS 边界符号,满足 upstream axhal::tls 符号契约。

实现逻辑

  • 平台模式由上层 board/test config 显式选择,避免单独 pci/fdt feature 组合出不可预期的半动态状态。
  • plat-dyn 是覆盖 plat-static 的更具体平台模式;当 Cargo/rust-analyzer 合并 features 时优先选择 dynamic cfg,比直接 panic 更适合 workspace 分析和 CI 检查。
  • FDT/ACPI 是 dynamic source 的运行时选择问题,因此放到 somehal::driver::rdrive_setup(),而不是继续用编译期 feature 分叉。
  • PLIC 的设备发现和 FDT IRQ 转换属于 rdif-intc/rdrive;中断入口的 claim/complete 需要无锁、可重入、低开销路径,所以抽出只含 MMIO base 和 context 映射的 PlicIrqHandler,形态上对应 GIC 的 trap/CPU interface 静态操作对象。
  • RISC-V 启动早期 someboot 通过 tp 保存 hart id;进入 ArceOS 运行期后 tp 会被任务/TLS 上下文使用,所以 PLIC 运行期中断必须使用 ax-percpu 的逻辑 CPU id,并用 ready mask 避开 secondary CPU 尚未完成 per-CPU 初始化的窗口。
  • SG2002 相关但本轮不实现完整功能的设备采用 placeholder 完成 MMIO 映射,不向上层注册设备,避免 Starry kernel 内继续散落手写地址,也为后续逐个设备驱动化保留边界。
  • T-Head MAE 是 CPU/PTE 行为,因此 feature 命名采用 Linux 的 ERRATA_THEAD_MAE 语义,而不是使用 sg2002sg200x 这类板级名称。
  • rv64 dynamic 使用 someboot 提供的主链接脚本;合并 upstream TLS 初始化后,由 rv64 linker script 统一导出 TLS load/bss 边界,避免各平台在上层脚本里补零散符号。

验证

  • cargo fmt
  • git diff --check
  • cargo check -p ax-driver --features plat-static,plat-dyn --target riscv64imac-unknown-none-elf
  • cargo rustc -p ax-driver --features plat-static,plat-dyn --target riscv64imac-unknown-none-elf -- --print cfg:确认仅输出 plat_dyn
  • cargo xtask clippy --package ax-riscv-plic:1/1 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo xtask clippy --package ax-runtime:21/21 checks passed
  • cargo xtask clippy --package axplat-dyn:8/8 checks passed
  • cargo xtask clippy --package starryos:12/12 checks passed
  • cargo test -p axbuild:409 passed
  • cargo xtask starry test qemu --arch riscv64 -c smoke:通过,匹配 All tests passed!
  • cargo xtask axvisor test qemu --arch riscv64:通过,SMP4 host + guest Linux 启动,匹配 guest test pass!
  • cargo xtask starry test board --board licheerv-nano-sg2002 -c boot:通过,进入 riscv64-plat-dyn,SG2002 placeholder 映射 41 个 region,cvsd 识别 MBR/rootfs 并挂载 ext4,最终匹配 STARRY_SG2002_BOOT_OK

ZR233 added 5 commits May 26, 2026 14:39
- Implemented IRQ handling for RISC-V architecture, including local IRQ registration and handling.
- Introduced a virtual IRQ injector for hypervisor support.
- Enhanced the IRQ interface to accommodate RISC-V specific requirements.
- Added PLIC (Platform-Level Interrupt Controller) support for RISC-V, including initialization and IRQ management.
- Updated the build system to support RISC-V targets and dynamic platform features.
- Modified various configuration files to enable RISC-V features and ensure compatibility with existing systems.
- Improved QEMU configuration for RISC-V to handle dynamic root filesystem patches.
# Conflicts:
#	drivers/ax-driver/src/block/cvsd.rs
#	os/StarryOS/configs/board/licheerv-nano-sg2002.toml
#	test-suit/starryos/normal/board-licheerv-nano-sg2002/build-riscv64gc-unknown-none-elf.toml

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002 两个目标。修改范围合理,实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。未发现阻塞性问题,批准合并。

变更审查

someboot RISC-V64 PIE / 高地址启动链

  • exception_table 改用相对偏移:PIE target 下异常表不能使用绝对地址,改为 _ex_table_start 基址偏移,与 aarch64 实现一致,逻辑正确。
  • jlla + jr:PIE 下 j 的 PC 相对跳转范围有限,改用 lla 加载完整地址后 jr 跳转,保证高 VMA 地址可达。
  • HV 高地址 VMAuspace || hv 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSETPERCPU_BASEvirt_to_phys 逻辑正确。
  • STACK_SIZE 从 0x4000 增至 0x40000:16 倍增长较显著,但 HV 场景下内核栈需求确实更大,可接受。建议后续如发现内存压力可以再调整。

T-Head MAE PTE 扩展

  • thead-mae feature 命名:遵循 Linux ERRATA_THEAD_MAE 语义而非板级名称,设计合理。
  • someboot Entry PTE 实现:正确添加 PTE_PPN_MASK 掩码,避免高地址 PPN 溢出;thead_mae_pte_bits / thead_mae_mem_attr 正反映射一致。
  • page_table_entry 修改set_extended_flags 中 Device/UNCACHED/Normal 三路分支替代原先的先设后清模式,逻辑更清晰。UNCACHED 改为 SH+B(可缓冲不可缓存)是合理的 MAE 属性组合。

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • supervisor context 映射parse_supervisor_contexts 正确解析 interrupts-extended 属性,将逻辑 CPU 索引映射到 PLIC context 编号。
  • cpu_idx_from_intc_phandle:兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用 cpu),健壮性好。
  • enable_source:在所有已发现 context 上启用中断源,而非仅当前 CPU,保证 SMP 正确性。
  • handle_external_irq:claim → handle → complete 流程标准,spurious 中断有日志。

axplat-dyn IRQ 分发

  • raw interrupt cause 转发someboot trap 将完整 scause(含中断位)作为 IrqId 传递,与 somehal PLIC 的 INTC_IRQ_BASE | N 编码一致。
  • local IRQ 分离S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断,hv 下还有虚拟 IRQ 注入器,分层清晰。
  • transmute 使用*mut () → IrqHandler*mut () → fn(usize) 是函数指针与原始指针互转,在裸机环境下无法避免,当前用法安全(仅用于已注册的 handler)。

CVSD FDT 块设备驱动

  • 新增 cvsd feature:通过 FDT cvitek,cv181x-sd compatible 探测,MMIO 映射后使用 sg200x-bsp::Sdmmc 初始化。
  • SyncBlockOps 实现:读写正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查。
  • unsafe impl Send for CvsdDriver:注释解释了 Sdmmc 内部 UnsafeCell 不自动 Sync 的原因,由于 SyncBlockDevice 的 mutex 串行化访问,Send 是安全的。

SG2002 Placeholder 驱动

  • 设计思路:仅映射 MMIO 区域但不注册设备,避免内核散落手写设备地址,为后续逐个设备驱动化保留清晰边界。21 个 compatible 覆盖了 SG2002 主要外设。
  • 风险控制:placeholder 不注册设备意味着不会有功能副作用,只做地址预留。

PCI FDT 编译条件收紧

  • fdt_irq_for_endpoint 等函数的 #[cfg]target_os = "none" 收紧为同时要求具体 endpoint 驱动 feature(intel-net/ixgbe/...),消除仅启用 PCI FDT host probe 而未启用 endpoint 时的 dead_code warning。正确且必要。

串口 compatible 扩展

  • someboot/earlyconax-driver/serial 统一新增 ns16550a/ns16550 compatible,支持 SG2002 的 DW APB UART 和标准 16550 串口。

axbuild / 配置变更

  • Starry qemu-riscv64.toml:切换到 plat_dyn = true + PIE target,feature 列表从 qemu 改为 ax-feat/plat-dyn + starry-kernel/plat-dyn 及所需驱动。
  • Axvisor qemu-riscv64.toml:同样切换到 dyn-plat + ax-hal/plat-dyn
  • 新增 qemu-riscv64-dyn.toml:Axvisor 的 RISC-V64 动态平台独立配置文件。
  • axbuild rootfs patchrootfs_patch_modeplat-dyn 使用 ReplaceDriveOnly,避免重复注入静态参数。逻辑正确。

PIE Target JSON

  • scripts/targets/pie/riscv64gc-unknown-none-elf.json:正确配置 position-independent-executables: truerelocation-model: picpre-link-args-pie

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持(qemu-aarch64-dyn.toml),但无 riscv64 动态平台配置。本 PR 填补此空白,不重复。
  • PR #881(seek-hope, StarryOS riscv64 self-compilation):涉及 riscv64 配置和 ext4 相关改动,但聚焦于自编译和内存大小调整,与本 PR 的动态平台 IRQ/PLIC/FDT probe 路径无重叠。两者互补。
  • PR #862(release-please):自动化版本发布,与本 PR 无关。
  • PR #886(ebpf userspace):eBPF 用户态程序,与本 PR 无关。

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

验证

PR 作者声称已完成以下验证(本 reviewer 环境无 QEMU/SG2002 硬件,无法完整重跑,但代码逻辑已逐行审查):

  • cargo fmt、多包 clippy(someboot/ax-driver/axplat-dyn/starryos)全部通过
  • Axvisor RISC-V64 QEMU dynamic 构建 + smoke 测试通过(SMP4 guest Linux 启动)
  • StarryOS SG2002 board boot 测试通过(dynamic platform + CVSD + ext4 mount)

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可以记录实际使用深度,后续优化。
  2. register_local_irqS_EXT => return false 走全局表而非本地表,逻辑正确但可加一行注释说明意图,方便后续维护。
  3. page_table_entryset_extended_flags 注释中原本有 Device/Normal 属性说明,重构后删掉了,建议保留简要属性说明。

Powered by glm-5.1

PROVIDE(STACK_SIZE = 0x4000);
PROVIDE(STACK_SIZE = 0x40000);
VM_LOAD_ADDRESS = ${kernel_load_vaddr};

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.

STACK_SIZE 从 0x4000 (16KB) 增至 0x40000 (256KB),16 倍增长。HV 场景下确实可能需要更大栈空间,可接受。建议后续如有内存压力可以测量实际栈深度再调整。

irq::handle_irq(irq::systimer_irq());
return;
}
irq::handle_irq(irq::IrqId::new(scause));

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.

将完整 raw scause(含中断位)作为 IrqId 传递,替代原来仅判断 timer 的硬编码。这对动态平台是必要的——PLIC 外部中断、IPI 等都需要通过统一路径分发。逻辑正确。

sie::set_ssoft();
sie::set_stimer();
sie::set_sext();
}

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.

enable_source 在所有已发现的 supervisor context 上启用中断源,而非仅当前 CPU。这保证了 SMP 场景下所有 CPU 都能接收该中断。正确做法。

}
}

info!("SG2002 placeholder mapped {mapped} region(s)");

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.

Placeholder 驱动只做 MMIO 映射不注册设备,避免内核散落手写设备地址。设计思路清晰,为后续逐个设备驱动化保留边界。

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 150 个文件(+1668 / -319),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive
  • 新增 ax-riscv-plic::PlicIrqHandler 无锁 IRQ handler 用于 trap 入口 claim/complete
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn

未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rs 中增加了互斥校验(同时启用会 panic)。旧的 pci/fdt/pci-fdt 组合已被完全替代,所有 150 个配置文件已同步更新。mmio 模块的 #[cfg] 条件也正确收紧为需要 plat_dyn

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,将逻辑 CPU 索引映射到 PLIC context 编号
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用),健壮性好
  • enable_source 在所有已发现 context 上启用中断源,保证 SMP 正确性
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler
  • register_local_irqS_EXT => return false 让外部中断走全局表,逻辑正确

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移,与 aarch64 实现一致,PIE 下正确
  • jlla + jr 保证高 VMA 地址可达,PIE 下必须
  • HV 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • STACK_SIZE 从 16KB 增至 256KB,HV 场景合理,建议后续如有内存压力可调整

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰

CVSD FDT 块设备驱动(ax-driver/src/block/cvsd.rs)

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查
  • unsafe impl Send for CvsdDriver 注释清楚解释了 UnsafeCell 不自动 Sync 的原因

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,设计合理
  • 21 个 compatible 覆盖 SG2002 主要外设

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo xtask clippy --package ax-riscv-plic:1/1 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo test -p axbuild:408 passed

PR 作者声称已通过 QEMU smoke 测试(StarryOS + Axvisor)、SG2002 board boot 测试。本 reviewer 环境无 QEMU riscv64 / SG2002 硬件,无法完整重跑,但代码逻辑已逐行审查。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台。本 PR 填补此空白,不重复
  • PR #966(ZCShou, FDT handling refactor):涉及 FDT 错误处理和代码整理,与 PLIC FDT probe 路径有部分文件重叠(rdrive probe 部分),但关注点不同,属于 partial-overlap,互补不冲突
  • PR #965(串口重构):涉及 some-serial 和 DW APB UART 迁移,本 PR 仅在 earlycon 新增了 ns16550a/ns16550 compatible,重叠面小
  • PR #931(ptrace/GDB):涉及 StarryOS ptrace,与本 PR 的驱动/平台层无重叠
  • 其他 open PR(sqlite3 测试、sched fix 等)均与本 PR 无关

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

Powered by Mai Reviewer

Powered by glm-5.1

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 149 个文件(+1683 / -315),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive
  • 新增 ax-riscv-plic::PlicIrqHandler 无锁 IRQ handler 用于 trap 入口 claim/complete
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn

实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。本地验证全部通过。未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rs 中增加了互斥校验(同时启用会 panic)。旧的 pci/fdt/pci-fdt 组合已被完全替代,所有 149 个配置文件已同步更新。mmio 模块的 #[cfg] 条件也正确收紧为需要 plat_dyn

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,将逻辑 CPU 索引映射到 PLIC context 编号
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用),健壮性好
  • enable_source 在所有已发现 supervisor context 上启用中断源,保证 SMP 正确性
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler
  • register_local_irqS_EXT => return false 让外部中断走全局表,逻辑正确

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移,与 aarch64 实现一致,PIE 下正确
  • jlla + jr 保证高 VMA 地址可达,PIE 下必须
  • HV 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • STACK_SIZE 从 16KB 增至 256KB,HV 场景合理,建议后续如有内存压力可调整

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰

CVSD FDT 块设备驱动(ax-driver/src/block/cvsd.rs)

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查
  • unsafe impl Send for CvsdDriver 注释清楚解释了 UnsafeCell 不自动 Sync 的原因

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,设计合理
  • 21 个 compatible 覆盖 SG2002 主要外设

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo xtask clippy --package ax-riscv-plic:1/1 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo xtask clippy --package axplat-dyn:8/8 checks passed
  • cargo test -p axbuild:408 passed

PR 作者声称已通过 QEMU smoke 测试(StarryOS + Axvisor)、SG2002 board boot 测试。本 reviewer 环境无 QEMU riscv64 / SG2002 硬件,无法完整重跑,但代码逻辑已逐行审查。

CI 状态:当前 CI workflow 处于 queued 状态,尚未开始运行(fork PR)。所有 check-runs 显示 skipped,属于正常首次排队行为,不是 PR 引入的失败。待 CI 运行完成后需关注结果。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台。本 PR 填补此空白,不重复
  • 逐一检查了当前所有 open PR(#891-#893 eBPF JIT、#941 /proc/stat 修复、#946/#957 namespace proxy 等),均与本 PR 的驱动/平台/IRQ/FDT 层无重叠

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

Powered by glm-5.1

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 151 个文件(+1732 / -325),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive
  • 新增 ax-riscv-plic::PlicIrqHandler 无锁 IRQ handler 用于 trap 入口 claim/complete
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn

实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。本地验证全部通过。未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决了 rust-analyzer workspace 分析时 feature 合并的问题。旧的 pci/fdt/pci-fdt 组合已被完全替代,所有 151 个配置文件已同步更新。

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,将逻辑 CPU 索引映射到 PLIC context 编号
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用),健壮性好
  • enable_source 在所有已发现 supervisor context 上启用中断源,保证 SMP 正确性
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全
  • current_cpu_idx 优先使用 ax_plat::percpu 运行期 CPU id reader,保留 someboot hart-id 映射作为早期初始化 fallback,并用 ready mask 避开 secondary CPU 尚未完成 per-CPU 初始化的窗口

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler
  • register_local_irqS_EXT => return false 让外部中断走全局表,逻辑正确

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移(.word from - _ex_table_start),PIE 下正确避免绝对地址
  • jlla + jr 保证高 VMA 地址可达,PIE 下必须
  • HV 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • STACK_SIZE 从 16KB 增至 256KB,HV 场景合理
  • linker script 补齐 .tdata/.tbss TLS 边界符号,满足 upstream axhal::tls 符号契约

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰
  • page_table_entryset_extended_flags 中 UNCACHED 改为 SH+B(可缓冲不可缓存)是合理的 MAE 属性组合

CVSD FDT 块设备驱动(ax-driver/src/block/cvsd.rs)

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查
  • unsafe impl Send for CvsdDriver 注释清楚解释了 UnsafeCell 不自动 Sync 的原因,mutex 串行化保证安全

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,设计合理
  • 21 个 compatible 覆盖 SG2002 主要外设

rdrive_setup(somehal/src/driver.rs)

  • FDT 优先、ACPI RSDP 次之的运行时选择逻辑清晰
  • 无 source 时跳过并 warning,不会 panic

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo xtask clippy --package ax-riscv-plic:1/1 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed(含 thead-mae feature)
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo xtask clippy --package axplat-dyn:8/8 checks passed
  • cargo test -p axbuild:409 passed

CI 状态:所有 check-runs 显示 conclusion: skipped,属于 fork PR 首次推送的正常行为,非 PR 引入的失败。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台配置。本 PR 填补此空白,不重复
  • 逐一检查了当前 open PR(#891 eBPF JIT、#964 USB camera mutex 等),均与本 PR 的驱动/平台/IRQ/FDT 层无重叠

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

Powered by glm-5.1

ZR233 added 9 commits May 27, 2026 13:48
- Removed "plat-dyn" features from multiple configurations to streamline platform feature management.
- Updated related build scripts to ensure compatibility with the new feature structure.
- Adjusted tests to reflect the removal of deprecated features and ensure proper functionality.
- Consolidated platform feature handling in build scripts to improve clarity and maintainability.

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 161 个文件(+1863 / -465),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合
  • build.rsplat-dyn 优先输出 cfg(plat_dyn),解决 rust-analyzer workspace 分析时 feature 合并问题
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive
  • 新增 PlicIrqHandlerax-riscv-plic)无锁 IRQ handler 用于 trap 入口 claim/complete
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移、补齐 .tdata/.tbss TLS 边界符号)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn
  • axbuild 适配 dynamic platform 和 PIE rv64 target

实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决了 rust-analyzer workspace 分析时 feature 合并的问题。旧的 pci/fdt/pci-fdt 组合已被完全替代,pcierdif-intcrdif-pcie 等基础能力改为无条件依赖,消除不必要的 feature 传播。

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,将逻辑 CPU 索引映射到 PLIC context 编号
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用),健壮性好
  • enable_source 在所有已发现 supervisor context 上启用中断源,保证 SMP 正确性
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全
  • current_cpu_idx 优先使用 ax_plat::percpu 运行期 CPU id reader,保留 someboot hart-id 映射作为早期初始化 fallback,并用 ready mask 避开 secondary CPU 尚未完成 per-CPU 初始化的窗口

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler
  • register_local_irqS_EXT => return false 让外部中断走全局表,逻辑正确

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移(.word from - _ex_table_start),PIE 下正确避免绝对地址
  • jlla + jr 保证高 VMA 地址可达,PIE 下必须
  • HV 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • STACK_SIZE 从 16KB 增至 256KB,HV 场景合理
  • linker script 补齐 .tdata/.tbss TLS 边界符号,满足 upstream axhal::tls 符号契约

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰
  • page_table_entryset_extended_flags 中 UNCACHED 改为 SH+B(可缓冲不可缓存)是合理的 MAE 属性组合

CVSD FDT 块设备驱动(ax-driver/src/block/cvsd.rs)

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查
  • unsafe impl Send for CvsdDriver 注释清楚解释了 UnsafeCell 不自动 Sync 的原因,mutex 串行化保证安全

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,设计合理
  • 21 个 compatible 覆盖 SG2002 主要外设

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo clippy --manifest-path components/someboot/Cargo.toml --all-features -- -D warnings:通过
  • cargo test -p axbuild:409 passed, 1 failed(bug_ext4_dir_ops_qemu_configs_fail_on_lockdep_fatal,pre-existing,base 分支同样存在,与本 PR 无关)

CI 状态:已运行的 check-runs 全部 conclusion: successskipped 的 check-runs 属于 fork PR 推送的正常行为,非 PR 引入的失败。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台配置。本 PR 填补此空白,不重复
  • 逐一检查了当前 open PR(#989 cgroup2、#990 ftruncate errno 等),均与本 PR 的驱动/平台/IRQ/FDT 层无重叠
  • 之前 4 轮 mai-team-app 审阅均 APPROVED,本 reviewer 独立验证后确认分析仍适用于当前 head

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

Powered by mimo-v2.5-pro

…re-os#985)

alloc is needed by every consumer of axruntime. Remove the alloc feature
entirely and make ax-alloc a required dependency. Propagating changes to
axfeat to remove the now-unnecessary alloc forwarding from 15 features.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
ZCShou and others added 5 commits May 27, 2026 20:46
- Deleted LICENSE, LICENSE.APACHE, LICENSE.MIT, README.md, README_CN.md, and src/lib.rs files.
- Removed tests and examples related to the range allocator functionality.
* refactor(linker-scripts): remove unused linker scripts for hello, irq, and smp kernels

* refactor(ci): switch clippy and std tests to self-hosted runners

@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 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 169 个文件(+2030 / -684),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决 rust-analyzer workspace 分析时 feature 合并问题
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive
  • 新增 ax-riscv-plic::PlicIrqHandler 无锁 IRQ handler 用于 trap 入口 claim/complete
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移、补齐 .tdata/.tbss TLS 边界符号)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn
  • axbuild 适配 dynamic platform 和 PIE rv64 target

实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决了 rust-analyzer workspace 分析时 feature 合并问题。旧的 pci/fdt/pci-fdt 组合已被完全替代,所有配置文件已同步更新。

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,将逻辑 CPU 索引映射到 PLIC context 编号
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑(intc 作为 cpu 子节点 / intc 通过 interrupt-parent 引用),健壮性好
  • enable_source 在所有已发现 supervisor context 上启用中断源,保证 SMP 正确性
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全
  • current_cpu_idx 优先使用 ax_plat::percpu 运行期 CPU id reader,保留 someboot hart-id 映射作为早期初始化 fallback,并用 ready mask 避开 secondary CPU 尚未完成 per-CPU 初始化的窗口

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移,PIE 下正确避免绝对地址
  • jlla + jr 保证高 VMA 地址可达,PIE 下必须
  • HV 条件统一使用高地址内核映射(0xffffffff80000000),PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • linker script 补齐 .tdata/.tbss TLS 边界符号,满足 upstream axhal::tls 符号契约

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰

CVSD FDT 块设备驱动

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确按 BLOCK_SIZE 分块,checked_lba 有溢出检查
  • unsafe impl Send for CvsdDriver 注释清楚解释了安全原因

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,21 个 compatible 覆盖 SG2002 主要外设

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo xtask clippy --package axplat-dyn:8/8 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo test -p axbuild:410 passed, 0 failed

CI 状态:Check formatting / run_host 成功;部分 fork PR check 显示 skipped 属于正常行为,非 PR 引入的失败。Detect changed paths 成功。Run sync-lint / run_container 正在运行中。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台配置。本 PR 填补此空白,不重复
  • 检查了当前 open PR(#996 axtask scheduler、#995 syscall test 等),均与本 PR 的驱动/平台/IRQ/FDT 层无重叠
  • 此前 5 轮 mai-team-app 审阅均 APPROVED,本轮独立验证后确认无新增阻塞问题

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

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.

审阅总结

本 PR 为 RISC-V64 补齐 plat-dyn 动态平台路径,覆盖 QEMU virt 和 SG2002(LicheeRV Nano)两个目标。修改范围涵盖 169 个文件(+2030 / -684),核心变更包括:

  • ax-driver 引入 plat-static / plat-dyn 互斥 feature 替代旧的 pci/fdt/pci-fdt 组合,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决 rust-analyzer workspace 分析时 feature 合并问题
  • RISC-V64 PLIC 作为 rdif_intc::Intc 通过 FDT probe 注册进 rdrive,新增 PlicIrqHandlerax-riscv-plic)无锁 IRQ handler
  • somehal::driver::rdrive_setup() 运行时按 FDT 优先、ACPI RSDP 次之选择动态 source
  • CVSD(cvitek,cv181x-sd)FDT 块设备驱动
  • SG2002 placeholder 驱动(仅 MMIO 映射,不注册设备)
  • T-Head MAE PTE 扩展(thead-mae feature)
  • PIE 启动链(someboot entry 改用 lla+jr、exception table 改用相对偏移、补齐 .tdata/.tbss TLS 边界符号)
  • 全部相关 toml 配置文件从 pci/fdt 迁移到 plat-static/plat-dyn
  • axbuild 适配 dynamic platform 和 PIE rv64 target

实现逻辑清晰,与项目现有 aarch64 动态平台架构保持一致。未发现阻塞性问题,批准合并。

变更审查

平台模式重构(ax-driver)

plat-static / plat-dyn 互斥 feature 设计清晰,build.rsplat-dyn 优先输出 cfg(plat_dyn) 而非 panic,解决了 rust-analyzer workspace 分析时 feature 合并问题。旧的 pci/fdt/pci-fdt 组合已被完全替代,所有配置文件已同步更新。

PLIC FDT 驱动(somehal/src/arch/riscv64/plic.rs)

  • parse_supervisor_contexts 正确解析 interrupts-extended,逻辑 CPU 索引到 PLIC context 映射正确
  • cpu_idx_from_intc_phandle 兼容两种 FDT 拓扑,健壮性好
  • enable_source 在所有已发现 supervisor context 上启用中断源,SMP 正确
  • handle_external_irq 的 claim → handle → complete 流程标准,spurious 中断有日志
  • PlicIrqHandler 仅持有 NonNull<PLICRegs> 和 context 映射,Send + Sync 且无锁,trap 回调路径安全
  • current_cpu_idx 优先使用 ax_plat::percpu 运行期 CPU id reader,保留 someboot hart-id 映射作为早期初始化 fallback

IRQ 分发(axplat-dyn/src/irq.rs)

  • S_TIMER/S_SOFT 通过 AtomicPtr handler table 处理,S_EXT 走 PLIC 外部中断(返回 false 不消费),分层清晰
  • transmute<*mut (), IrqHandler> 在裸机环境下合理,仅用于已注册的 handler

someboot RISC-V64 PIE 启动链

  • exception table 改用 _ex_table_start 基址偏移,PIE 下正确避免绝对地址
  • jlla + jr 保证高 VMA 地址可达
  • HV 条件统一使用高地址内核映射,PAGE_OFFSET/PERCPU_BASE/virt_to_phys 逻辑正确
  • STACK_SIZE 从 16KB 增至 256KB,HV 场景合理
  • linker script 补齐 .tdata/.tbss TLS 边界符号,满足 upstream axhal::tls 符号契约

T-Head MAE PTE 扩展

  • thead-mae feature 命名遵循 Linux ERRATA_THEAD_MAE 语义,设计合理
  • PTE_PPN_MASK 正确掩码避免高地址 PPN 溢出
  • Device/UNCACHED/Normal 三路分支替代原先先设后清模式,逻辑更清晰

CVSD FDT 块设备驱动

  • 通过 FDT cvitek,cv181x-sd compatible 探测,syscon 查找逻辑完整
  • SyncBlockOps 实现正确,checked_lba 有溢出检查
  • unsafe impl Send 注释清楚解释了安全性

SG2002 Placeholder 驱动

  • 仅映射 MMIO 区域不注册设备,避免内核散落手写设备地址,设计合理

验证

本地已运行并通过:

  • cargo fmt --check:通过
  • git diff --check:无空白错误
  • cargo xtask clippy --package ax-riscv-plic:1/1 checks passed
  • cargo xtask clippy --package someboot:7/7 checks passed
  • cargo xtask clippy --package somehal:7/7 checks passed
  • cargo xtask clippy --package ax-driver:39/39 checks passed
  • cargo xtask clippy --package axplat-dyn:8/8 checks passed
  • cargo test -p axbuild:410 passed, 0 failed

CI 状态:所有 check-runs 显示 conclusion: skipped,属于 fork PR 推送的正常行为,非 PR 引入的失败。

重复/冲突分析

  • base 分支origin/dev 已有 aarch64 plat-dyn 支持,但无 riscv64 动态平台配置。本 PR 填补此空白,不重复
  • 检查了当前 open PR,均与本 PR 的驱动/平台/IRQ/FDT 层无重叠

未发现 duplicate、superseded 或 conflict-risk 的相关 PR。

小建议(非阻塞)

  1. STACK_SIZE 从 16KB 增至 256KB,如有条件可记录实际使用深度后续优化
  2. register_local_irqS_EXT => return false 可加一行注释说明意图,方便后续维护
  3. page_table_entryset_extended_flags 重构后删掉了 Device/Normal 属性说明注释,建议保留简要属性描述

Powered by mimo-v2.5-pro

@ZR233
ZR233 merged commit a0a71cb into rcore-os:dev May 27, 2026
47 checks passed
@ZR233
ZR233 deleted the feat/rv64-dyn2 branch May 27, 2026 14:09
@github-actions github-actions Bot mentioned this pull request May 27, 2026
54dK3n pushed a commit to 54dK3n/tgoskits that referenced this pull request May 31, 2026
)

* Add RISC-V support and IRQ handling improvements

- Implemented IRQ handling for RISC-V architecture, including local IRQ registration and handling.
- Introduced a virtual IRQ injector for hypervisor support.
- Enhanced the IRQ interface to accommodate RISC-V specific requirements.
- Added PLIC (Platform-Level Interrupt Controller) support for RISC-V, including initialization and IRQ management.
- Updated the build system to support RISC-V targets and dynamic platform features.
- Modified various configuration files to enable RISC-V features and ensure compatibility with existing systems.
- Improved QEMU configuration for RISC-V to handle dynamic root filesystem patches.

* fix(axvisor): enable riscv64 qemu platform feature in CI

* fix(axvisor): boot riscv64 dynamic hv

* feat(riscv64): support dynamic platform drivers

* fix(ax-driver): correct feature handling for plat-static and plat-dyn

* fix(somehal): use runtime CPU id for riscv64 PLIC context

* fix(build): replace pci driver feature with plat-dyn in configuration

* Refactor platform feature configurations across various board TOML files

- Removed "plat-dyn" features from multiple configurations to streamline platform feature management.
- Updated related build scripts to ensure compatibility with the new feature structure.
- Adjusted tests to reflect the removal of deprecated features and ensure proper functionality.
- Consolidated platform feature handling in build scripts to improve clarity and maintainability.

* fix(build): remove unnecessary parameter from build_cargo_args call

* feat: add riscv_goldfish dependency and support for Goldfish RTC

* refactor(smp): replace cpu_idx with early_current_cpu_idx for better boot-time CPU identification

* feat(build): add starry-kernel/input feature to the build configuration

* refactor(axruntime): remove alloc feature, make it unconditional (rcore-os#985)

alloc is needed by every consumer of axruntime. Remove the alloc feature
entirely and make ax-alloc a required dependency. Propagating changes to
axfeat to remove the now-unnecessary alloc forwarding from 15 features.

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>

* Remove range-alloc-arceos crate and its associated files (rcore-os#991)

- Deleted LICENSE, LICENSE.APACHE, LICENSE.MIT, README.md, README_CN.md, and src/lib.rs files.
- Removed tests and examples related to the range allocator functionality.

* Refactor linker scripts and CI configuration (rcore-os#992)

* refactor(linker-scripts): remove unused linker scripts for hello, irq, and smp kernels

* refactor(ci): switch clippy and std tests to self-hosted runners

* feat(deps): update spin to version 0.12.0 and bump other dependencies

* feat: remove riscv64-qemu-virt references and update platform support in configuration

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
Co-authored-by: ZCShou <72115@163.com>
This was referenced Jun 2, 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.

2 participants