Armv8:request_irq但收到意外中断

问题描述 投票:0回答:1

我想在arm64 linux内核模块中注册一个IRQ处理程序,内核版本是5.4.0,我使用

request_irq
并且可以注册。但是当 IRQ 发生时,linux 会报告
Unexpected interrupt received!
。所以我不知道如何解决。

我正在尝试使用

request_irq
在 arm64 Linux 中注册 IRQ 处理程序 ko:

    err = request_irq(40, irq_handler, IRQF_SHARED, "hvisor", &hvisor_misc_dev);

一切正常,没有错误。但是当我从 el2 向 el1 注入 IRQ

40
时,Linux 会报告一条消息:

[   87.294702] Unexpected interrupt received!
[   87.295733] WARNING: CPU: 0 PID: 0 at drivers/irqchip/irq-gic-v3.c:650 gic_handle_irq+0x124/0x158

为什么会发生这种情况以及如何解决?谁能帮帮我,万分感谢!

linux interrupt
1个回答
0
投票

我已经找到解决办法了。必须在 dtb 中添加一个假设备,如下所示:

    xxx {
        compatible = "xxx";
        interrupts = <0x00 0x?? 0x01>;
    };

哪里?是减去 32 后的 irq 号。然后在 linux ko 中我们必须使用函数

of_find_node_by_path
of_irq_get
来检索 irq 号,如下所示:

    struct device_node *node = NULL;
    node = of_find_node_by_path("/xxx");
    int irq = of_irq_get(node, 0);
    request_irq(irq, ....);

那么一切就OK了!

© www.soinside.com 2019 - 2024. All rights reserved.