1 /* 2 * This file is subject to the terms and condi 3 * License. See the file "COPYING" in the mai 4 * for more details. 5 * 6 * Copyright (C) 1994 - 2000, 2001, 2003 Ralf 7 * Copyright (C) 1999, 2000 Silicon Graphics, 8 * Copyright (C) 2001 MIPS Technologies, Inc. 9 */ 10 11 #include <asm/asm.h> 12 #include <asm/asmmacro.h> 13 #include <asm/compiler.h> 14 #include <asm/irqflags.h> 15 #include <asm/regdef.h> 16 #include <asm/mipsregs.h> 17 #include <asm/stackframe.h> 18 #include <asm/isadep.h> 19 #include <asm/thread_info.h> 20 21 #ifndef CONFIG_PREEMPTION 22 #define resume_kernel restore_all 23 #else 24 #define __ret_from_irq ret_from_exception 25 #endif 26 27 .text 28 .align 5 29 #ifndef CONFIG_PREEMPTION 30 FEXPORT(ret_from_exception) 31 local_irq_disable 32 b __ret_from_irq 33 #endif 34 FEXPORT(ret_from_irq) 35 LONG_S s0, TI_REGS($28) 36 FEXPORT(__ret_from_irq) 37 /* 38 * We can be coming here from a syscall done i 39 * e.g. a failed kernel_execve(). 40 */ 41 resume_userspace_check: 42 LONG_L t0, PT_STATUS(sp) 43 andi t0, t0, KU_USER 44 beqz t0, resume_kernel 45 46 resume_userspace: 47 local_irq_disable # make 48 # inte 49 # betw 50 LONG_L a2, TI_FLAGS($28) # curr 51 andi t0, a2, _TIF_WORK_MASK # (ign 52 bnez t0, work_pending 53 j restore_all 54 55 #ifdef CONFIG_PREEMPTION 56 resume_kernel: 57 local_irq_disable 58 lw t0, TI_PRE_COUNT($28) 59 bnez t0, restore_all 60 LONG_L t0, TI_FLAGS($28) 61 andi t1, t0, _TIF_NEED_RESCHED 62 beqz t1, restore_all 63 LONG_L t0, PT_STATUS(sp) 64 andi t0, 1 65 beqz t0, restore_all 66 PTR_LA ra, restore_all 67 j preempt_schedule_irq 68 #endif 69 70 FEXPORT(ret_from_kernel_thread) 71 jal schedule_tail # a0 = 72 move a0, s1 73 jal s0 74 j syscall_exit 75 76 FEXPORT(ret_from_fork) 77 jal schedule_tail # a0 = 78 79 FEXPORT(syscall_exit) 80 #ifdef CONFIG_DEBUG_RSEQ 81 move a0, sp 82 jal rseq_syscall 83 #endif 84 local_irq_disable # make 85 # sign 86 # samp 87 LONG_L a2, TI_FLAGS($28) # curr 88 li t0, _TIF_ALLWORK_MASK 89 and t0, a2, t0 90 bnez t0, syscall_exit_work 91 92 restore_all: # rest 93 .set noat 94 RESTORE_TEMP 95 RESTORE_AT 96 RESTORE_STATIC 97 restore_partial: # restore part 98 #ifdef CONFIG_TRACE_IRQFLAGS 99 SAVE_STATIC 100 SAVE_AT 101 SAVE_TEMP 102 LONG_L v0, PT_STATUS(sp) 103 #if defined(CONFIG_CPU_R3000) 104 and v0, ST0_IEP 105 #else 106 and v0, ST0_IE 107 #endif 108 beqz v0, 1f 109 jal trace_hardirqs_on 110 b 2f 111 1: jal trace_hardirqs_off 112 2: 113 RESTORE_TEMP 114 RESTORE_AT 115 RESTORE_STATIC 116 #endif 117 RESTORE_SOME 118 RESTORE_SP_AND_RET 119 .set at 120 121 work_pending: 122 andi t0, a2, _TIF_NEED_RESCHED # a2 123 beqz t0, work_notifysig 124 work_resched: 125 TRACE_IRQS_OFF 126 jal schedule 127 128 local_irq_disable # make 129 # sign 130 # samp 131 LONG_L a2, TI_FLAGS($28) 132 andi t0, a2, _TIF_WORK_MASK # is t 133 # othe 134 beqz t0, restore_all 135 andi t0, a2, _TIF_NEED_RESCHED 136 bnez t0, work_resched 137 138 work_notifysig: # deal 139 # noti 140 move a0, sp 141 li a1, 0 142 jal do_notify_resume # a2 a 143 j resume_userspace_check 144 145 FEXPORT(syscall_exit_partial) 146 #ifdef CONFIG_DEBUG_RSEQ 147 move a0, sp 148 jal rseq_syscall 149 #endif 150 local_irq_disable # make 151 # chan 152 LONG_L a2, TI_FLAGS($28) # curr 153 li t0, _TIF_ALLWORK_MASK 154 and t0, a2 155 beqz t0, restore_partial 156 SAVE_STATIC 157 syscall_exit_work: 158 LONG_L t0, PT_STATUS(sp) 159 andi t0, t0, KU_USER 160 beqz t0, resume_kernel 161 li t0, _TIF_WORK_SYSCALL_EXIT 162 and t0, a2 # a2 i 163 beqz t0, work_pending # trac 164 local_irq_enable # coul 165 # call 166 TRACE_IRQS_ON 167 move a0, sp 168 jal syscall_trace_leave 169 b resume_userspace 170 171 #if defined(CONFIG_CPU_MIPSR2) || defined(CONF 172 defined(CONFIG_CPU_MIPSR6) || defined(CONF 173 174 /* 175 * MIPS32R2 Instruction Hazard Barrier - must 176 * 177 * For C code use the inline version named ins 178 */ 179 LEAF(mips_ihb) 180 .set MIPS_ISA_LEVEL_RAW 181 jr.hb ra 182 nop 183 END(mips_ihb) 184 185 #endif /* CONFIG_CPU_MIPSR2 - CONFIG_CPU_MIPSR
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.