飞腾CPU体系结构之系统调用(异常入口分析)

本文详细介绍了飞腾CPU的异常向量表,包括不同模式下的异常处理,如EL1操作系统对同步、IRQ、FIQ和错误异常的响应。Linux内核将FIQ异常标记为无效,并且不支持AArch64EL1t模式的异常。对于AArch32异常,需要启用COMPAT配置。此外,还展示了如何设置处理器的异常向量表基地址寄存器,并指出系统调用作为EL0下的同步异常入口。
摘要由CSDN通过智能技术生成

飞腾CPU体系结构之系统调用(异常入口分析)

异常向量表

/*
 * Exception vectors.
 */
        .pushsection ".entry.text", "ax"      //异常向量表专属代码段

        .align  11							   //地址对齐要求, 地址低11为0
ENTRY(vectors)
        kernel_ventry   1, sync_invalid                 // Synchronous EL1t
        kernel_ventry   1, irq_invalid                  // IRQ EL1t
        kernel_ventry   1, fiq_invalid                  // FIQ EL1t
        kernel_ventry   1, error_invalid                // Error EL1t

        kernel_ventry   1, sync                         // Synchronous EL1h
        kernel_ventry   1, irq                          // IRQ EL1h
        kernel_ventry   1, fiq_invalid                  // FIQ EL1h
        kernel_ventry   1, error                        // Error EL1h

        kernel_ventry   0, sync                         // Synchronous 64-bit EL0
        kernel_ventry   0, irq                          // IRQ 64-bit EL0
        kernel_ventry   0, fiq_invalid                  // FIQ 64-bit EL0
        kernel_ventry   0, error                        // Error 64-bit EL0

#ifdef CONFIG_COMPAT
        kernel_ventry   0, sync_compat, 32              // Synchronous 32-bit EL0
        kernel_ventry   0, irq_compat, 32               // IRQ 32-bit EL0
        kernel_ventry   0, fiq_invalid_compat, 32       // FIQ 32-bit EL0
        kernel_ventry   0, error_compat, 32             // Error 32-bit EL0
#else
        kernel_ventry   0, sync_invalid, 32             // Synchronous 32-bit EL0
        kernel_ventry   0, irq_invalid, 32              // IRQ 32-bit EL0
        kernel_ventry   0, fiq_invalid, 32              // FIQ 32-bit EL0
        kernel_ventry   0, error_invalid, 32            // Error 32-bit EL0
#endif
END(vectors)

上面是EL1操作系统响应的异常向量表格式,AArch64 EL1t模式下能可以响应来自AArch64 EL1t、AArch64 EL1h、AArch64 EL0t和AArch32 EL0四个模式下触发的异常。由于异常又分为同步、IRQ、FIQ和系统错误四种类型,因此EL1操作系统响应的异常向量有4x4=16个入口点。

根据代码可以看出

  1. Linux操作系统FIQ异常全部处理为invalid;
  2. Linux操作系统不支持来自AArch64 EL1t模式触发的异常,全部处理为invalid。
  3. 来自AArch32的异常需要专门配置内核选项参数COMPAT,否则也全部处理为invalid。

每个处理器的异常向量表基地址寄存器设置


//第一个CPU的vbar_el1寄存器设置代码
__primary_switched:
		...//省去其他代码
        adr_l   x8, vectors                     // load VBAR_EL1 with virtual
        msr     vbar_el1, x8                    // vector table address
        isb
//第二/三/.../个CPU的bar_el1寄存器设置代码
__secondary_switched:
        adr_l   x5, vectors
        msr     vbar_el1, x5
        isb

adr_l是伪汇编代码,主要是获取变量vectors的虚拟地址(MMU已经初始化完成),并赋值给x8。

adrp    x8, vectors							//以4K页为粒度的地址偏移量
 add    x8, x8, :lo12:vectors				//再加上4K页内部地址偏移量

系统调用入口点

系统调用属于EL0下的同步类型异常,不考虑AArch32 EL0情况下,也就是
第九个入口点

kernel_ventry	0, sync
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值