Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/davem/sparc-2.6:
kbuild: add ARCH=sparc32 target
sparc32: fix build failure on CONFIG_SPARC_LEON
sparc: Fixed random SPARC/LEON SMP CPU Stuck problem.
sparc32: remove CONFIG_HAVE_PERF_EVENTS option
sparc: don't #include asm/system.h in asm/jump_label.h
sparc32: Fix unaligned stack handling on trap return.
sparc: keep calling do_signal() as long as pending signals remain

+25 -44
+3
Makefile
··· 204 204 endif 205 205 206 206 # Additional ARCH settings for sparc 207 + ifeq ($(ARCH),sparc32) 208 + SRCARCH := sparc 209 + endif 207 210 ifeq ($(ARCH),sparc64) 208 211 SRCARCH := sparc 209 212 endif
-3
arch/sparc/Kconfig
··· 22 22 select RTC_CLASS 23 23 select RTC_DRV_M48T59 24 24 select HAVE_IRQ_WORK 25 - select HAVE_PERF_EVENTS 26 - select PERF_USE_VMALLOC 27 25 select HAVE_DMA_ATTRS 28 26 select HAVE_DMA_API_DEBUG 29 27 select HAVE_ARCH_JUMP_LABEL ··· 48 50 select RTC_DRV_BQ4802 49 51 select RTC_DRV_SUN4V 50 52 select RTC_DRV_STARFIRE 51 - select HAVE_IRQ_WORK 52 53 select HAVE_PERF_EVENTS 53 54 select PERF_USE_VMALLOC 54 55
-1
arch/sparc/include/asm/jump_label.h
··· 4 4 #ifdef __KERNEL__ 5 5 6 6 #include <linux/types.h> 7 - #include <asm/system.h> 8 7 9 8 #define JUMP_LABEL_NOP_SIZE 4 10 9
+2 -2
arch/sparc/kernel/irq_32.c
··· 365 365 unsigned long flags; 366 366 unsigned int cpu_irq; 367 367 int ret; 368 - #ifdef CONFIG_SMP 368 + #if defined CONFIG_SMP && !defined CONFIG_SPARC_LEON 369 369 struct tt_entry *trap_table; 370 370 extern struct tt_entry trapbase_cpu1, trapbase_cpu2, trapbase_cpu3; 371 371 #endif ··· 425 425 table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_four = SPARC_NOP; 426 426 427 427 INSTANTIATE(sparc_ttable) 428 - #ifdef CONFIG_SMP 428 + #if defined CONFIG_SMP && !defined CONFIG_SPARC_LEON 429 429 trap_table = &trapbase_cpu1; INSTANTIATE(trap_table) 430 430 trap_table = &trapbase_cpu2; INSTANTIATE(trap_table) 431 431 trap_table = &trapbase_cpu3; INSTANTIATE(trap_table)
+2 -2
arch/sparc/kernel/leon_smp.c
··· 56 56 static inline unsigned long do_swap(volatile unsigned long *ptr, 57 57 unsigned long val) 58 58 { 59 - __asm__ __volatile__("swapa [%1] %2, %0\n\t" : "=&r"(val) 60 - : "r"(ptr), "i"(ASI_LEON_DCACHE_MISS) 59 + __asm__ __volatile__("swapa [%2] %3, %0\n\t" : "=&r"(val) 60 + : "0"(val), "r"(ptr), "i"(ASI_LEON_DCACHE_MISS) 61 61 : "memory"); 62 62 return val; 63 63 }
+3 -3
arch/sparc/kernel/rtrap_32.S
··· 78 78 call do_notify_resume 79 79 add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr 80 80 81 - /* Fall through. */ 82 - ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr 83 - clr %l6 81 + b signal_p 82 + ld [%curptr + TI_FLAGS], %g2 83 + 84 84 ret_trap_continue: 85 85 sethi %hi(PSR_SYSCALL), %g1 86 86 andn %t_psr, %g1, %t_psr
+3 -33
arch/sparc/kernel/rtrap_64.S
··· 34 34 __handle_user_windows: 35 35 call fault_in_user_windows 36 36 wrpr %g0, RTRAP_PSTATE, %pstate 37 - wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate 38 - /* Redo sched+sig checks */ 39 - ldx [%g6 + TI_FLAGS], %l0 40 - andcc %l0, _TIF_NEED_RESCHED, %g0 37 + ba,pt %xcc, __handle_preemption_continue 38 + wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate 41 39 42 - be,pt %xcc, 1f 43 - nop 44 - call schedule 45 - wrpr %g0, RTRAP_PSTATE, %pstate 46 - wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate 47 - ldx [%g6 + TI_FLAGS], %l0 48 - 49 - 1: andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0 50 - be,pt %xcc, __handle_user_windows_continue 51 - nop 52 - mov %l5, %o1 53 - add %sp, PTREGS_OFF, %o0 54 - mov %l0, %o2 55 - 56 - call do_notify_resume 57 - wrpr %g0, RTRAP_PSTATE, %pstate 58 - wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate 59 - /* Signal delivery can modify pt_regs tstate, so we must 60 - * reload it. 61 - */ 62 - ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 63 - sethi %hi(0xf << 20), %l4 64 - and %l1, %l4, %l4 65 - ba,pt %xcc, __handle_user_windows_continue 66 - 67 - andn %l1, %l4, %l1 68 40 __handle_userfpu: 69 41 rd %fprs, %l5 70 42 andcc %l5, FPRS_FEF, %g0 ··· 59 87 ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1 60 88 sethi %hi(0xf << 20), %l4 61 89 and %l1, %l4, %l4 62 - ba,pt %xcc, __handle_signal_continue 90 + ba,pt %xcc, __handle_preemption_continue 63 91 andn %l1, %l4, %l1 64 92 65 93 /* When returning from a NMI (%pil==15) interrupt we want to ··· 149 177 bne,pn %xcc, __handle_preemption 150 178 andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0 151 179 bne,pn %xcc, __handle_signal 152 - __handle_signal_continue: 153 180 ldub [%g6 + TI_WSAVED], %o2 154 181 brnz,pn %o2, __handle_user_windows 155 182 nop 156 - __handle_user_windows_continue: 157 183 sethi %hi(TSTATE_PEF), %o0 158 184 andcc %l1, %o0, %g0 159 185
+12
arch/sparc/mm/fault_32.c
··· 539 539 __do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address); 540 540 } 541 541 542 + static void check_stack_aligned(unsigned long sp) 543 + { 544 + if (sp & 0x7UL) 545 + force_sig(SIGILL, current); 546 + } 547 + 542 548 void window_overflow_fault(void) 543 549 { 544 550 unsigned long sp; ··· 553 547 if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) 554 548 force_user_fault(sp + 0x38, 1); 555 549 force_user_fault(sp, 1); 550 + 551 + check_stack_aligned(sp); 556 552 } 557 553 558 554 void window_underflow_fault(unsigned long sp) ··· 562 554 if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) 563 555 force_user_fault(sp + 0x38, 0); 564 556 force_user_fault(sp, 0); 557 + 558 + check_stack_aligned(sp); 565 559 } 566 560 567 561 void window_ret_fault(struct pt_regs *regs) ··· 574 564 if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK)) 575 565 force_user_fault(sp + 0x38, 0); 576 566 force_user_fault(sp, 0); 567 + 568 + check_stack_aligned(sp); 577 569 }