ARM64 用户空间时发生中断el0_irq

 

 .align 6 el0_irq:  kernel_entry 0 el0_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_user ENDPROC(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_pending
finish_ret_to_user:
 enable_step_tsk x1, x2
 kernel_exit 0
ENDPROC(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, \tmp
9990:
 .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_845719 alternative_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

你可能感兴趣的:(ARM64,体系架构)