diff -urN softirqref/arch/ppc/kernel/entry.S softirqref-ppc/arch/ppc/kernel/entry.S --- softirqref/arch/ppc/kernel/entry.S Thu Jun 21 08:03:32 2001 +++ softirqref-ppc/arch/ppc/kernel/entry.S Thu Jun 21 19:30:49 2001 @@ -310,7 +310,24 @@ beq restore .globl ret_from_except ret_from_except: - lwz r3,_MSR(r1) /* Returning to user mode? */ + lwz r5,_MSR(r1) + andi. r5,r5,MSR_EE + beq 2f + lis r4,irq_stat@ha /* &softirq_active for cpu 0 */ + addi r4,r4,irq_stat@l +#ifdef CONFIG_SMP + /* get processor # */ + lwz r3,PROCESSOR(r2) + slwi r3,r3,LG_CACHE_LINE_SIZE + add r4,r4,r3 +#endif /* CONFIG_SMP */ + lwz r5,0(r4) /* softirq_pending */ + and. r5,r5,r5 + beq+ 2f + bl do_softirq + .globl do_bottom_half_ret +do_bottom_half_ret: +2: lwz r3,_MSR(r1) /* Returning to user mode? */ andi. r3,r3,MSR_PR beq+ do_signal_ret /* if so, check need_resched and signals */ lwz r3,NEED_RESCHED(r2) diff -urN softirqref/include/asm-ppc/hardirq.h softirqref-ppc/include/asm-ppc/hardirq.h --- softirqref/include/asm-ppc/hardirq.h Thu Jun 21 08:03:53 2001 +++ softirqref-ppc/include/asm-ppc/hardirq.h Thu Jun 21 19:30:30 2001 @@ -20,6 +20,7 @@ unsigned int __local_bh_count; unsigned int __syscall_count; unsigned int __last_jiffy_stamp; + struct task_struct * __ksoftirqd_task; /* waitqueue is too large */ } ____cacheline_aligned irq_cpustat_t; #include /* Standard mappings for irq_cpustat_t above */ diff -urN softirqref/include/asm-ppc/softirq.h softirqref-ppc/include/asm-ppc/softirq.h --- softirqref/include/asm-ppc/softirq.h Thu Jun 21 08:03:53 2001 +++ softirqref-ppc/include/asm-ppc/softirq.h Thu Jun 21 19:30:30 2001 @@ -25,12 +25,8 @@ if (!--local_bh_count(smp_processor_id()) \ && softirq_pending(smp_processor_id())) { \ do_softirq(); \ - __sti(); \ } \ } while (0) - -#define __cpu_raise_softirq(cpu, nr) set_bit((nr), &softirq_pending(cpu)); -#define raise_softirq(nr) __cpu_raise_softirq(smp_processor_id(), (nr)) #define in_softirq() (local_bh_count(smp_processor_id()) != 0)