2.2_EL0_IRQ_中断改造之入口

2.2 EL0_IRQ 中断改造之入口

2.2.1 el0_irq代码框架

首先沿着 vectors-> kernel_ventry 0,irq -> el0_irq 分析。I-pipe的主要修改点如图中红色字体所示。接下来会对el0_irq中的每一行展开分析。

在这里插入图片描述
当el0_irq发生时,被中断的用户态进程有两种:一种是Linux进程,一种是Xenomai进程。

2.2.2 kernel_entry 0 与kernel_exit 0

1. 概要

调用kernel_entry 0将进程运行的用户态现场按照struct pt_regs的格式存入进程内核栈。调用kernel_exit 0将已压入进程内核栈的用户态现场恢复到对应的寄存器。struct pt_regs定义在arch/arm64/include/asm/ptrace.h,其中用于保持用户态现场的结构为:

struct pt_regs {
	union {
		struct user_pt_regs user_regs;
		struct {
			u64 regs[31];
			u64 sp;
			u64 pc;
			u64 pstate;
		};
	};
	u64 orig_x0;
#ifdef __AARCH64EB__
	u32 unused2;
	s32 syscallno;
#else
	s32 syscallno;
	u32 unused2;
#endif

	u64 orig_addr_limit;
	u64 unused;	// maintain 16 byte alignment
	u64 stackframe[2];
};

在I-pipe中,没有对kernel_entry和kernel_exit做修改。如果已经对二者比较熟悉,可以跳过本节剩余章节。

2. kernel_entry 0

去掉32位的干扰,只保留入参el为0的情况,核心代码如下:

行号 指令 参数
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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值