-
Notifications
You must be signed in to change notification settings - Fork 52
Open
Description
问题描述
在 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
]
原因分析
直接原因:
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
Labels
No labels