You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GICv2禁用安全扩展后Group1配置时钟中断失效的疑问咨询

GICv2禁用安全扩展后Group1配置时钟中断失效的疑问咨询

大家好,我目前正在学习GIC相关的内容,最近在QEMU上调试自己写的GICv2初始化代码时遇到了一个困惑,想请教一下各位大佬。

我的QEMU启动命令是:
qemu-system-aarch64 -machine virt,secure=off,gic-version=2 -cpu cortex-a53 -nographic -kernel kernel.elf

参考的文档是IHI0048B GIC架构规范,现在遇到的问题是:
当我禁用安全扩展(通过启动参数secure=off),并把中断组配置为Group1时,时钟中断完全无法触发;但如果我将中断组设置为Group0,时钟中断就能正常工作。

但根据IHI0048B GIC架构规范的描述,只有支持安全扩展的系统才能配置Group0,这就和我实际测试的结果矛盾了,我怀疑是不是自己对规范的理解有偏差?

下面是我写的GICv2初始化代码,以及相关的调试逻辑:

void gicv2_init() {
    int value;
    __asm__ volatile("ldr %w0, [%1]" : "=r"(value) : "r"(GICD_TYPER));
    printf("Security Extensions: %d\n", SECURITY_SUPPORT(value));

    int interrupts;
    interrupts = ((value & 0xF) + 1) * 32;
    if (interrupts > 1020) {
        interrupts = 1020; // 1020 ~ 1023 are reserved
    }
    printf("Max interrupt numbers: %d\n", interrupts);

    // Disable interrupt forwarding
    __asm__ volatile("str %w0, [%1]" : : "r"(0), "r"(GICD_CTLR) : "memory");

    // Disable 0~31 interrupt, except permanently interrupt
    __asm__ volatile("str %w0, [%1]" : : "r"(0xffffffff), "r"(GICD_ICENABLERn) : "memory");

    if (SECURITY_SUPPORT(value)) {
        // TODO: secure access or non-secure access configure
    } else {
        // set 0-31 interrupt Group1
        __asm__ volatile("str %w0, [%1]" :: "r"(0xFFFFFFFFU), "r"(GICD_IGROUPRn) : "memory");
        // clear 0~31 interrupt pending state
        __asm__ volatile("str %w0, [%1]" : : "r"(0xFFFFFFFFU), "r"(GICD_ICPENDRn) : "memory");
        // clear 0~31 interrupt active state
        __asm__ volatile("str %w0, [%1]" : : "r"(0xFFFFFFFFU), "r"(GICD_ICACTIVERn) : "memory");

        // Enable GICD Group0/1
        __asm__ volatile("str %w0, [%1]" : : "r"(3), "r"(GICD_CTLR) : "memory");
        // Enable GICC Group0/1
        __asm__ volatile("ldr %w0, [%1]" : "=r"(value) : "r"(GICC_CTLR));
        value |= (1 << 1 | 1 << 0);
        __asm__ volatile("str %w0, [%1]" :: "r"(value), "r"(GICC_CTLR) : "memory");
    }

    __asm__ volatile("str %w0, [%1]" :: "r"(0xff), "r"(GICC_PMR) : "memory");
}

补充一下,代码里的SECURITY_SUPPORT宏是用来解析GICD_TYPER寄存器中的安全扩展支持位的,目前调试输出显示Security Extensions: 0,说明系统确实处于禁用安全扩展的状态。

有没有大佬能帮我分析一下,到底是我对规范的理解错了,还是代码里有什么没注意到的问题?


内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.07 07:28:02