diff options
Diffstat (limited to 'arch/mips/kernel/entry.S')
-rw-r--r-- | arch/mips/kernel/entry.S | 35 |
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 | ||
40 | FEXPORT(resume_userspace) | 40 | resume_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 |
50 | ENTRY(resume_kernel) | 50 | resume_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 |
53 | need_resched: | 53 | need_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 | ||
91 | FEXPORT(work_pending) | 91 | work_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 |
94 | work_resched: | 94 | work_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 | ||
114 | FEXPORT(syscall_exit_work_partial) | 114 | FEXPORT(syscall_exit_work_partial) |
115 | SAVE_STATIC | 115 | SAVE_STATIC |
116 | FEXPORT(syscall_exit_work) | 116 | syscall_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 |