2.5_EL1_IRQ_中断改造

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
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值