diff options
Diffstat (limited to 'arch/mips/kernel/entry.S')
-rw-r--r-- | arch/mips/kernel/entry.S | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S index 4353d323f017..af41ba6db960 100644 --- a/arch/mips/kernel/entry.S +++ b/arch/mips/kernel/entry.S | |||
@@ -46,6 +46,11 @@ resume_userspace: | |||
46 | local_irq_disable # make sure we dont miss an | 46 | local_irq_disable # make sure we dont miss an |
47 | # interrupt setting need_resched | 47 | # interrupt setting need_resched |
48 | # between sampling and return | 48 | # between sampling and return |
49 | #ifdef CONFIG_MIPSR2_TO_R6_EMULATOR | ||
50 | lw k0, TI_R2_EMUL_RET($28) | ||
51 | bnez k0, restore_all_from_r2_emul | ||
52 | #endif | ||
53 | |||
49 | LONG_L a2, TI_FLAGS($28) # current->work | 54 | LONG_L a2, TI_FLAGS($28) # current->work |
50 | andi t0, a2, _TIF_WORK_MASK # (ignoring syscall_trace) | 55 | andi t0, a2, _TIF_WORK_MASK # (ignoring syscall_trace) |
51 | bnez t0, work_pending | 56 | bnez t0, work_pending |
@@ -114,6 +119,19 @@ restore_partial: # restore partial frame | |||
114 | RESTORE_SP_AND_RET | 119 | RESTORE_SP_AND_RET |
115 | .set at | 120 | .set at |
116 | 121 | ||
122 | #ifdef CONFIG_MIPSR2_TO_R6_EMULATOR | ||
123 | restore_all_from_r2_emul: # restore full frame | ||
124 | .set noat | ||
125 | sw zero, TI_R2_EMUL_RET($28) # reset it | ||
126 | RESTORE_TEMP | ||
127 | RESTORE_AT | ||
128 | RESTORE_STATIC | ||
129 | RESTORE_SOME | ||
130 | LONG_L sp, PT_R29(sp) | ||
131 | eretnc | ||
132 | .set at | ||
133 | #endif | ||
134 | |||
117 | work_pending: | 135 | work_pending: |
118 | andi t0, a2, _TIF_NEED_RESCHED # a2 is preloaded with TI_FLAGS | 136 | andi t0, a2, _TIF_NEED_RESCHED # a2 is preloaded with TI_FLAGS |
119 | beqz t0, work_notifysig | 137 | beqz t0, work_notifysig |
@@ -158,7 +176,8 @@ syscall_exit_work: | |||
158 | jal syscall_trace_leave | 176 | jal syscall_trace_leave |
159 | b resume_userspace | 177 | b resume_userspace |
160 | 178 | ||
161 | #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_MIPS_MT) | 179 | #if defined(CONFIG_CPU_MIPSR2) || defined(CONFIG_CPU_MIPSR6) || \ |
180 | defined(CONFIG_MIPS_MT) | ||
162 | 181 | ||
163 | /* | 182 | /* |
164 | * MIPS32R2 Instruction Hazard Barrier - must be called | 183 | * MIPS32R2 Instruction Hazard Barrier - must be called |
@@ -171,4 +190,4 @@ LEAF(mips_ihb) | |||
171 | nop | 190 | nop |
172 | END(mips_ihb) | 191 | END(mips_ihb) |
173 | 192 | ||
174 | #endif /* CONFIG_CPU_MIPSR2 or CONFIG_MIPS_MT */ | 193 | #endif /* CONFIG_CPU_MIPSR2 or CONFIG_CPU_MIPSR6 or CONFIG_MIPS_MT */ |