diff options
| author | Paul Mackerras <paulus@samba.org> | 2003-05-25 15:44:51 +1000 |
|---|---|---|
| committer | Paul Mackerras <paulus@samba.org> | 2003-05-25 15:44:51 +1000 |
| commit | d8e48cd0dcd3ec778b241fccd04f89dc39740713 (patch) | |
| tree | d3c4cac74053086a9f4c489e834b032f4aa277f3 /arch/ppc/kernel/entry.S | |
| parent | af75709ac2e8fc62ee00be0078bff1f72deb16e7 (diff) | |
Fix preempt on PPC32 - have to set PREEMPT_ACTIVE when preempting kernel stuff.
Diffstat (limited to 'arch/ppc/kernel/entry.S')
| -rw-r--r-- | arch/ppc/kernel/entry.S | 32 |
1 files changed, 20 insertions, 12 deletions
diff --git a/arch/ppc/kernel/entry.S b/arch/ppc/kernel/entry.S index 04d274804278..463ed868c626 100644 --- a/arch/ppc/kernel/entry.S +++ b/arch/ppc/kernel/entry.S @@ -531,12 +531,27 @@ restore_user: resume_kernel: /* check current_thread_info->preempt_count */ rlwinm r9,r1,0,0,18 - lwz r3,TI_PREEMPT(r9) - cmpwi 0,r3,0 /* if non-zero, just restore regs and return */ + lwz r0,TI_PREEMPT(r9) + cmpwi 0,r0,0 /* if non-zero, just restore regs and return */ bne restore - lwz r9,TI_FLAGS(r9) - andi. r0,r9,_TIF_NEED_RESCHED - bne do_resched + lwz r0,TI_FLAGS(r9) + andi. r0,r0,_TIF_NEED_RESCHED + beq+ restore + andi. r0,r3,MSR_EE /* interrupts off? */ + beq restore /* don't schedule if so */ +1: lis r0,PREEMPT_ACTIVE@h + stw r0,TI_PREEMPT(r9) + ori r10,r10,MSR_EE + SYNC + MTMSRD(r10) /* hard-enable interrupts */ + bl schedule + LOAD_MSR_KERNEL(r10,MSR_KERNEL) + SYNC + MTMSRD(r10) /* disable interrupts */ + rlwinm r9,r1,0,0,18 + lwz r0,TI_FLAGS(r9) + andi. r0,r0,_TIF_NEED_RESCHED + bne- 1b #else resume_kernel: #endif /* CONFIG_PREEMPT */ @@ -740,13 +755,6 @@ recheck: lwz r9,TI_FLAGS(r9) andi. r0,r9,_TIF_NEED_RESCHED bne- do_resched - -#ifdef CONFIG_PREEMPT - lwz r0,_MSR(r1) - andi. r0,r0,MSR_PR - beq restore -#endif - andi. r0,r9,_TIF_SIGPENDING beq restore_user do_user_signal: /* r10 contains MSR_KERNEL here */ |
