【发布时间】:2021-02-27 21:23:23
【问题描述】:
我正在开发一个裸机中断控制器。底层架构是 Virt,带有 QEMU,CPU Arm Cortex-72,aarch64。例如,我为您提供了 Makefile 的摘录:
run:
$(MAKE) kernel.elf
qemu-system-aarch64 -machine virt -cpu cortex-a72 -nographic -kernel kernel.elf
我定义了一个异常处理程序,每次发生异常时都会调用它。这是一段摘录(输出写在 UART 上):
void common_trap_handler(exception_frame *exc)
{
uart_puts("\nException Handler! (");
uint32_t val = raw_read_current_el();
uart_puts("\n\tCurrent EL = ");
uart_puthex(val);
uart_puts("\t");
uart_puts("exc_type : ");
uart_puthex(exc->exc_type);
val = raw_read_icc_iar1_el1();
uart_puts("\n\tICC IAR1 EL1 = ");
uart_puthex(val);
// rest of the exception handler
}
对寄存器的访问是通过汇编代码完成的。读取当前异常级别有效:
uint32_t raw_read_current_el(void)
{
uint32_t current_el;
__asm__ __volatile__("mrs %0, CurrentEL\n\t" : "=r" (current_el) : : "memory");
return current_el;
}
读取ICC_IAR1_EL1 寄存器不会(下面有更多详细信息):
uint32_t raw_read_icc_iar1_el1(void)
{
uint32_t icc_iar1_el1 = 0;
__asm__ __volatile__("mrs %0, s3_0_c12_c12_0\n\t" : "=r" (icc_iar1_el1) : : "memory");
return icc_iar1_el1;
}
其中s3_0_c12_c12_0 是根据arm 规范的ICC_IAR1_EL1 的ID,因为它被定义为“没有架构名称的寄存器”。
访问ICC_IAR1_EL1 会触发无限数量的其他异常。这是输出的摘录(重复多次):
Exception Handler! (
Current EL = 0x00000000 00000004 exc_type : 0x00000000 00000011
Exception Handler! (
Current EL = 0x00000000 00000004 exc_type : 0x00000000 00000011
Exception Handler! (
Current EL = 0x00000000 00000004 exc_type : 0x00000000 00000011
我不明白为什么。根据ICC_IAR1_EL1寄存器的名称,该寄存器应以EL1的最低权限访问。这由输出Current EL = 0x00000000 00000004 验证。你知道我怎样才能阅读ICC_IAR1_EL1寄存器的内容吗?不幸的是,the official ARM guide 没有帮助我
【问题讨论】: