ARM64 用户空间时发生中断el0_irq

来源:互联网 发布:浮云淘宝小号出售平台 编辑:程序博客网 时间:2024/05/16 15:42
 

 .align 6el0_irq: kernel_entry 0el0_irq_naked: enable_dbg#ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_off#endif

 ct_user_exit irq_handler

#ifdef CONFIG_TRACE_IRQFLAGS bl trace_hardirqs_on#endif b ret_to_userENDPROC(el0_irq)

 
 
/* * "slow" syscall return path. */ret_to_user: disable_irq    // disable interrupts ldr x1, [tsk, #TI_FLAGS] and x2, x1, #_TIF_WORK_MASK cbnz x2, work_pendingfinish_ret_to_user: enable_step_tsk x1, x2 kernel_exit 0ENDPROC(ret_to_user)
 
 .macro enable_step_tsk, flgs, tmp tbz \flgs, #TIF_SINGLESTEP, 9990f disable_dbg mrs \tmp, mdscr_el1 orr \tmp, \tmp, #1 msr mdscr_el1, \tmp9990: .endm
 
 
 
 

 .macro kernel_exit, el .if \el != 0 /* Restore the task's original addr_limit. */ ldr x20, [sp, #S_ORIG_ADDR_LIMIT] str x20, [tsk, #TI_ADDR_LIMIT]

 /* No need to restore UAO, it will be restored from SPSR_EL1 */ .endif

 

 ldp x21, x22, [sp, #S_PC]  // load ELR, SPSR

 .if \el == 0 ct_user_enter ldr x23, [sp, #S_SP]  // load return stack pointer msr sp_el0, x23

#ifdef CONFIG_ARM64_ERRATUM_845719alternative_if ARM64_WORKAROUND_845719 tbz x22, #4, 1f#ifdef CONFIG_PID_IN_CONTEXTIDR mrs x29, contextidr_el1 msr contextidr_el1, x29#else msr contextidr_el1, xzr#endif

1:alternative_else_nop_endif#endif .endif

 msr elr_el1, x21   // set up the return data msr spsr_el1, x22 ldp x0, x1, [sp, #16 * 0] ldp x2, x3, [sp, #16 * 1] ldp x4, x5, [sp, #16 * 2] ldp x6, x7, [sp, #16 * 3] ldp x8, x9, [sp, #16 * 4] ldp x10, x11, [sp, #16 * 5] ldp x12, x13, [sp, #16 * 6] ldp x14, x15, [sp, #16 * 7] ldp x16, x17, [sp, #16 * 8] ldp x18, x19, [sp, #16 * 9] ldp x20, x21, [sp, #16 * 10] ldp x22, x23, [sp, #16 * 11] ldp x24, x25, [sp, #16 * 12] ldp x26, x27, [sp, #16 * 13] ldp x28, x29, [sp, #16 * 14]

 ldr lr, [sp, #S_LR] add sp, sp, #S_FRAME_SIZE  // restore sp eret     // return to kernel

 .endm

0 0