aboutsummaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel/entry.S
diff options
context:
space:
mode:
Diffstat (limited to 'arch/mips/kernel/entry.S')
-rw-r--r--arch/mips/kernel/entry.S35
1 files changed, 17 insertions, 18 deletions
diff --git a/arch/mips/kernel/entry.S b/arch/mips/kernel/entry.S
index 5e9a44168681..be0354a14e26 100644
--- a/arch/mips/kernel/entry.S
+++ b/arch/mips/kernel/entry.S
@@ -19,11 +19,11 @@
19#include <asm/war.h> 19#include <asm/war.h>
20 20
21#ifdef CONFIG_PREEMPT 21#ifdef CONFIG_PREEMPT
22 .macro preempt_stop reg=t0 22 .macro preempt_stop
23 .endm 23 .endm
24#else 24#else
25 .macro preempt_stop reg=t0 25 .macro preempt_stop
26 local_irq_disable \reg 26 local_irq_disable
27 .endm 27 .endm
28#define resume_kernel restore_all 28#define resume_kernel restore_all
29#endif 29#endif
@@ -37,17 +37,17 @@ FEXPORT(ret_from_irq)
37 andi t0, t0, KU_USER 37 andi t0, t0, KU_USER
38 beqz t0, resume_kernel 38 beqz t0, resume_kernel
39 39
40FEXPORT(resume_userspace) 40resume_userspace:
41 local_irq_disable t0 # make sure we dont miss an 41 local_irq_disable # make sure we dont miss an
42 # interrupt setting need_resched 42 # interrupt setting need_resched
43 # between sampling and return 43 # between sampling and return
44 LONG_L a2, TI_FLAGS($28) # current->work 44 LONG_L a2, TI_FLAGS($28) # current->work
45 andi a2, _TIF_WORK_MASK # (ignoring syscall_trace) 45 andi t0, a2, _TIF_WORK_MASK # (ignoring syscall_trace)
46 bnez a2, work_pending 46 bnez t0, work_pending
47 j restore_all 47 j restore_all
48 48
49#ifdef CONFIG_PREEMPT 49#ifdef CONFIG_PREEMPT
50ENTRY(resume_kernel) 50resume_kernel:
51 lw t0, TI_PRE_COUNT($28) 51 lw t0, TI_PRE_COUNT($28)
52 bnez t0, restore_all 52 bnez t0, restore_all
53need_resched: 53need_resched:
@@ -59,10 +59,10 @@ need_resched:
59 beqz t0, restore_all 59 beqz t0, restore_all
60 li t0, PREEMPT_ACTIVE 60 li t0, PREEMPT_ACTIVE
61 sw t0, TI_PRE_COUNT($28) 61 sw t0, TI_PRE_COUNT($28)
62 local_irq_enable t0 62 local_irq_enable
63 jal schedule 63 jal schedule
64 sw zero, TI_PRE_COUNT($28) 64 sw zero, TI_PRE_COUNT($28)
65 local_irq_disable t0 65 local_irq_disable
66 b need_resched 66 b need_resched
67#endif 67#endif
68 68
@@ -88,13 +88,13 @@ FEXPORT(restore_partial) # restore partial frame
88 RESTORE_SP_AND_RET 88 RESTORE_SP_AND_RET
89 .set at 89 .set at
90 90
91FEXPORT(work_pending) 91work_pending:
92 andi t0, a2, _TIF_NEED_RESCHED 92 andi t0, a2, _TIF_NEED_RESCHED # a2 is preloaded with TI_FLAGS
93 beqz t0, work_notifysig 93 beqz t0, work_notifysig
94work_resched: 94work_resched:
95 jal schedule 95 jal schedule
96 96
97 local_irq_disable t0 # make sure need_resched and 97 local_irq_disable # make sure need_resched and
98 # signals dont change between 98 # signals dont change between
99 # sampling and return 99 # sampling and return
100 LONG_L a2, TI_FLAGS($28) 100 LONG_L a2, TI_FLAGS($28)
@@ -113,11 +113,10 @@ work_notifysig: # deal with pending signals and
113 113
114FEXPORT(syscall_exit_work_partial) 114FEXPORT(syscall_exit_work_partial)
115 SAVE_STATIC 115 SAVE_STATIC
116FEXPORT(syscall_exit_work) 116syscall_exit_work:
117 LONG_L t0, TI_FLAGS($28) 117 li t0, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT
118 li t1, _TIF_SYSCALL_TRACE | _TIF_SYSCALL_AUDIT 118 and t0, a2 # a2 is preloaded with TI_FLAGS
119 and t0, t1 119 beqz t0, work_pending # trace bit set?
120 beqz t0, work_pending # trace bit is set
121 local_irq_enable # could let do_syscall_trace() 120 local_irq_enable # could let do_syscall_trace()
122 # call schedule() instead 121 # call schedule() instead
123 move a0, sp 122 move a0, sp