2.5 EL1_IRQ 中断改造
2.5.1 el1_irq代码框架

2.5.2 kernel_entry 1与kernel_exit 1
1. 概要
调用 kernel_entry 1 将进程运行的内核态现场按照 struct pt_regs 的格式存入进程内核栈。对于el1_irq 来说,中断发生时,进程运行在内核态,正在使用进程的内核栈并且可能在进程内核栈中存在多级函数调用关系。因此,kernel_entry 1 保存 struct pg_regs 的位置,并不是进程内核栈的栈底位置,而是根据实际情况,在进程内核栈中间的某个位置。
调用 kernel_exit 1 将已压入进程内核栈的内核态现场恢复到对应的寄存器。
在I-pipe中,没有对 kernel_entry 和 kernel_exit 做修改。如果已经对二者比较熟悉,可以跳过本节剩余章节。
2. kernel entry 1
去掉32位的干扰,只保留入参el为1的情况,核心代码如下:
1 .macro kernel_entry, el, regsize = 64
2 stp x0, x1, [sp, #16 * 0]
3 stp x2, x3, [sp, #16 * 1]
4 stp x4, x5, [sp, #16 * 2]
5 stp x6, x7, [sp, #16 * 3]
6 stp x8, x9, [sp, #16 * 4]
7 stp x10, x11, [sp, #16 * 5]
8 stp x12, x13, [sp, #16 * 6]
9 stp x14, x15, [sp, #16 * 7]
10 stp x16, x17, [sp, #16 * 8]
11 stp x18, x19, [sp, #16 * 9]
12 stp x20, x21, [sp, #16 * 10]
13 stp x22, x23, [sp, #16 * 11]
14 stp x24, x25, [sp, #16 * 12]
15 stp x26, x27, [sp, #16 * 13]
16 stp x28, x29, [sp, #16 * 14]
17
18 add x21, sp, #S_FRAME_SIZE
19 get_thread_info tsk
20 /* Save the task's original addr_limit and set USER_DS */
21 ldr x20, [tsk, #TSK_TI_ADDR_LIMIT]
22 str x20, [sp, #S_ORIG_ADDR_LIMIT]
23 mov x20, #USER_DS
24 str x20, [tsk, #TSK_TI_ADDR_LIMIT]
25 /* No need to reset PSTATE.UAO, hardware's already set it to 0 for us */
26
27 mrs x22, elr_el1
28 mrs x23, spsr_el1
29 stp lr, x21, [sp, #S_LR]
30

最低0.47元/天 解锁文章
608

被折叠的 条评论
为什么被折叠?



