arm64

时间:2015-09-29 06:35:20

标签: interrupt-handling arm64 bare-metal

我正在尝试在程序集中为arm64(AArch64)编写FIQ处理程序。我已经写了一个IRQ处理程序,到目前为止运行良好。我只是想知道我的FIQ处理程序是否应该与我的IRQ看起来不同。

  • 我的FIQ处理程序执行以下操作:

    • 将寄存器推入堆栈
    • 读取GIC中断确认寄存器以识别中断号
    • 检查它是否不是虚假中断。如果它是假的分支到irq处理程序的结尾。
    • 分支到相应的高级C ISR以进行中断服务。
    • 编写GIC EOIR以标记中断完成
    • 从堆栈中弹出寄存器。
    • 返回主码。

在AArh32中,FIQ曾经有存储寄存器R8-R12,LR,SP;不需要推到堆栈上。所以这与AArch32中的IRQ有一点不同,其中所有寄存器(LR,SP除外)都需要推入堆栈。

但我无法找到arm64中存储的寄存器(LR和SP除外)。 有人可以告诉我我的FIQ for arm64应该怎么做。如果有人可以指导我使用arm64的示例FIQ处理程序,那就更好了。

1 个答案:

答案 0 :(得分:1)

理论上,您只需要在中断处理程序中保存那些被破坏的寄存器。但是从一般性的角度来看,你应该保存所有的通用寄存器(X0到X30)。

LR(链接寄存器)是arm64中X30的别名。您不需要保存SP,但是必须确保从FIQ处理程序返回时SP未更改,尤其是在使用汇编语言编写FIQ处理程序时。 C编译器将处理堆栈指针,因此您不必担心C ISR。