飞腾CPU体系结构之系统调用(el0_sync)

飞腾CPU体系结构之系统调用(el0_sync)

1. 汇编宏kernel_ventry

该汇编宏主要是用于异常响应向量表中,每个向量的宽度为0x80字节,即0x20条指令(每条指令4字节);而且每个向量入口点地址必须按照0x80对齐,即地址低7位为零。由于0x20条指令不可能完成异常处理过程,因此在这0x20条指令之内一定要跳转到到其他函数执行。

一般情况下,kernel_ventry的实现如下:

.macro kernel_ventry, el, label, regsize = 64
.align = 7   // 地址对齐要求
sub sp, sp, #S_FRAME_SIZE   //堆栈指针处理
b el\()\el\()_\label        //跳转
.endm

系统调用是从“kernel_ventry 0, sync”进入,即el=0,label=sync。因此最终跳转进入el0_sync汇编

其中" \()"是汇编符号连接,\el和\label是汇编宏的参数引用。

2. 汇编宏el0_sync

        汇编宏el0_sync主要分为两部分:第一部分实现从用户空间到内核空间的上下文切换, kernel_entry 0;第二部是根据异常症状寄存器esr_el1判断异常原因,然后再进入具体处理函数。系统调用是用户态执行SVC指令导致的,因此要进入el0_svc处理函数。

/*
 * EL0 mode handlers.
 */
        .align  6
el0_sync:
        kernel_entry 0
        mrs     x25, esr_el1                    // read the syndrome register
        lsr     x24, x25, #ESR_ELx_EC_SHIFT     // exception class
        cmp     x24, #ESR_ELx_EC_SVC64          // SVC in 64-bit state 
        b.eq    el0_svc                         // 这系统调用入口
        cmp     x24, #ESR_ELx_EC_DABT_LOW       // data abort in EL0
        b.eq    el0_da
        cmp     x24, #ESR_ELx_EC_IABT_LOW       // instruction abort in EL0
        b.eq    el0_ia
        cmp     x24, #ESR_ELx_EC_FP_ASIMD       // FP/ASIMD access
        b.eq    el0_fpsimd_acc
        cmp     x24, #ESR_ELx_EC_SVE            // SVE access
        b.eq    el0_sve_acc
        cmp     x24, #ESR_ELx_EC_FP_EXC64       // FP/ASIMD exception
        b.eq    el0_fpsimd_exc
        cmp     x24, #ESR_ELx_EC_SYS64          // configurable trap
        ccmp    x24, #ESR_ELx_EC_WFx, #4, ne
        b.eq    el0_sys
        cmp     x24, #ESR_ELx_EC_SP_ALIGN       // stack alignment exception
        b.eq    el0_sp
        cmp     x24, #ESR_ELx_EC_PC_ALIGN       // pc alignment exception
        b.eq    el0_pc
        cmp     x24, #ESR_ELx_EC_UNKNOWN        // unknown exception in EL0
        b.eq    el0_undef
        cmp     x24, #ESR_ELx_EC_BREAKPT_LOW    // debug exception in EL0
        b.ge    el0_dbg
        b       el0_inv

猜你喜欢

转载自blog.csdn.net/lsshao/article/details/117956860