gem5-salam加速器中的boot.s文件是为基于ARM架构的系统编写的汇编代码,主要用于设置和处理中断。下面是对代码进行分析
.section INTERRUPT_VECTOR, "x"
首先定义了一个名为INTERRUPT_VECTOR的段(section),用"x"标记表示这部分是可执行的。这通常是程序的开始处,包含了中断向量表。
.global _Reset
_Reset:
B Reset_Handler /* Reset */
B . /* Undefined */
B . /* SWI */
B . /* Prefetch Abort */
B . /* Data Abort */
B . /* reserved */
B irq_handler /* IRQ */
B . /* FIQ */
定义了各种中断向量的入口点。这包括了重置、未定义指令、软件中断、预取中止、数据中止、保留、IRQ(普通中断请求)和FIQ(快速中断请求)。
“ B . ” 表示对当前位置的分支,实际上是个占位符,通常会被替换为具体的中断处理函数的地址。
.equ Len_Stack, 0x1000; // 4kB of stack memory
.equ Len_IRQ_Stack, 0x1000; // 4kB of stack memory for IRQ Mode
进行栈的初始化,定义了两个等值标签(equ),分别为常规栈和IRQ模式下栈的大小
.equ GIC_Dist_Base, 0x2c001000
.equ set_enable1, 0x104
.equ set_enable2, 0x108
.equ timer_irq_id, 131 // 36 <64 => set_enable1 Reg
.equ kmio_irq_id, 44
.equ uart0_irq_id, 37
.equ rtc_irq_id, 36
.equ top_dev_id, 68
进行GIC配置,定义了与GIC(Generic Interrupt Controller)配置相关的一些基地址和偏移量,以及几个特定设备的中断ID。
.global Reset_Handler
Reset_Handler:
mov R1, #0b11010010 // interrupts masked, MODE = IRQ
msr CPSR, R1 // change to IRQ mode
ldr SP, =stack_base + Len_Stack + Len_IRQ_Stack // set IRQ stack
将处理器切换到IRQ模式,并设置IRQ模式下的栈指针
mov R1, #0b11010011 // interrupts masked, MODE = SVC
msr CPSR, R1 // change to SVC mode
ldr SP, =stack_base + Len_Stack // set stack
切换到SVC(超级调用)模式,并设置SVC模式下的栈指针。
bl config_gic_dist
bl config_gic_cpu_interface
调用函数配置GIC的分布式接口和CPU接口。
ldr r0, =GIC_Dist_Base
mov r1, #1
str r1, [r0]
mov R1, #0b01010011 // IRQ not masked, MODE = SVC
msr CPSR, R1
启用GIC,允许接收中断,并将处理器状态切换回SVC模式,准备接收中断。
bl main
B .
跳转到main函数开始程序的主体执行,然后进入无限循环等待中断发生。
这段代码首先设置处理器状态和栈,然后配置GIC分布式控制器和CPU接口,最后进入主函数main。这里用到了改变当前处理器状态寄存器(CPSR)的值来切换处理器模式,并设置栈指针(SP)。
.global config_gic_dist
config_gic_dist:
...
.global config_gic_cpu_interface
config_gic_cpu_interface:
...
config_gic_dist 和 config_gic_cpu_interface 函数负责配置GIC。这包括启用特定的中断并配置CPU接口以接收中断。
.global irq_handler
irq_handler:
...
irq_handler是IRQ中断的通用处理函数。它首先保存当前的上下文,然后根据中断号(从GIC的中断确认寄存器读取)执行相应的处理。处理完成后,向GIC的中断结束寄存器写入以结束中断,并恢复上下文。
整体而言,这段代码展示了在基于ARM的系统中如何设置中断向量表,初始化栈和中断控制器,以及如何处理中断。它为深入理解ARM架构下的低级中断处理提供了实践基础。