Skip to content

[Feature/Bug] Full GICv3 ITS Support: Missing logic in arm-gic-driver & mapping in axdriver #338

@Iscreamx

Description

@Iscreamx

问题描述

在 AxVisor 中启用 GICv3 ITS (配置 gppt-gits)时,Hypervisor 在初始化阶段(配置Guest)发生 Panic。

emu_devices = [
  ["gppt-gicd", 0x0800_0000, 0x1_0000, 0, 0x21, []],
  ["gppt-gicr", 0x080a_0000, 0x2_0000, 0, 0x20, [1, 0x2_0000, 0]], # 1 vcpu, stride 0x20000, starts with pcpu 0
  ["gppt-gits", 0x0808_0000, 0x2_0000, 0, 0x22, [0x0808_0000]], # host_gits_base
]
Image

原因分析

直接原因:
axdriver 在通过 FDT 探测 GICv3 设备时,硬编码仅获取并映射了前两个寄存器区域 GICD 和 GICR 的 MMIO 区域,而未处理 GITS 区域。当 axdevice 尝试访问物理 ITS 寄存器进行初始化时,由于该物理地址在 EL2 页表中不存在映射,导致触发 Stage 1 Translation Fault 并崩溃

// axvisor/modules/axruntime/src/lib.rs
...
#[cfg(feature = "driver-dyn")]
axdriver::setup(arg);
...
// arceos/modules/axdriver/src/dyn_drivers/intc/gicv3.rs
fn probe_gic(info: FdtInfo<'_>, dev: PlatformDevice) -> Result<(), OnProbeError> {
    let mut reg = info.node.reg().ok_or(OnProbeError::other(format!(
        "[{}] has no reg",
        info.node.name()
    )))?;

    let gicd_reg = reg.next().unwrap();
    let gicr_reg = reg.next().unwrap();

    let gicd = iomap(...)?;
    let gicr = iomap(...)?;

    let gic = unsafe { Gic::new(gicd.into(), gicr.into()) };

    dev.register(rdif_intc::Intc::new(gic));

    Ok(())
}

核心问题存在于两个层面:

  • 底层库缺失:rcore-os/arm-gic-driver目前仅实现了 GICD 和 GICR,虽然具备检测 LPI 能力的函数,但缺失 ITS 控制器实体、寄存器定义及初始化逻辑。
  • 上层驱动缺失:axdriver 在探测设备树时,未处理 ITS 的 MMIO 区域映射,导致 Hypervisor 访问物理 ITS 地址时触发 Stage 1 Translation Fault。

修复建议

虽然虚拟化层 arm_vgic 已经提供了较为完整的 ITS 模拟支持,但要让其正常运行还需要修复Host 侧的映射和底层驱动支持。

  • 修复arceos/axdriver
    • 增加兼容性匹配。在 module_driver! 宏的 compatibles 列表中添加 "arm,gic-v3-its"。
    • 修改 probe_gic 逻辑。在 probe_gic 函数中增加分支判断。如果当前探测到的节点是 ITS 节点,则仅需映射其 MMIO 区域即可
    • 执行 iomap,确保 ITS 的物理基地址在 EL2 页表中建立映射。
  • 扩展 arm-gic-driver
    • 同步寄存器定义。将 arm_vgic 中已有的 ITS 寄存器定义同步下沉到底层库。
    • 实现初始化接口。添加对 ITS 硬件的基础管理支持。

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions