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
This commit is contained in:
commit
c07724e5b8
3
Makefile
3
Makefile
|
@ -204,6 +204,9 @@ ifeq ($(ARCH),x86_64)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
# Additional ARCH settings for sparc
|
# Additional ARCH settings for sparc
|
||||||
|
ifeq ($(ARCH),sparc32)
|
||||||
|
SRCARCH := sparc
|
||||||
|
endif
|
||||||
ifeq ($(ARCH),sparc64)
|
ifeq ($(ARCH),sparc64)
|
||||||
SRCARCH := sparc
|
SRCARCH := sparc
|
||||||
endif
|
endif
|
||||||
|
|
|
@ -22,8 +22,6 @@ config SPARC
|
||||||
select RTC_CLASS
|
select RTC_CLASS
|
||||||
select RTC_DRV_M48T59
|
select RTC_DRV_M48T59
|
||||||
select HAVE_IRQ_WORK
|
select HAVE_IRQ_WORK
|
||||||
select HAVE_PERF_EVENTS
|
|
||||||
select PERF_USE_VMALLOC
|
|
||||||
select HAVE_DMA_ATTRS
|
select HAVE_DMA_ATTRS
|
||||||
select HAVE_DMA_API_DEBUG
|
select HAVE_DMA_API_DEBUG
|
||||||
select HAVE_ARCH_JUMP_LABEL
|
select HAVE_ARCH_JUMP_LABEL
|
||||||
|
@ -50,7 +48,6 @@ config SPARC64
|
||||||
select RTC_DRV_BQ4802
|
select RTC_DRV_BQ4802
|
||||||
select RTC_DRV_SUN4V
|
select RTC_DRV_SUN4V
|
||||||
select RTC_DRV_STARFIRE
|
select RTC_DRV_STARFIRE
|
||||||
select HAVE_IRQ_WORK
|
|
||||||
select HAVE_PERF_EVENTS
|
select HAVE_PERF_EVENTS
|
||||||
select PERF_USE_VMALLOC
|
select PERF_USE_VMALLOC
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
#include <asm/system.h>
|
|
||||||
|
|
||||||
#define JUMP_LABEL_NOP_SIZE 4
|
#define JUMP_LABEL_NOP_SIZE 4
|
||||||
|
|
||||||
|
|
|
@ -365,7 +365,7 @@ static int request_fast_irq(unsigned int irq,
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
unsigned int cpu_irq;
|
unsigned int cpu_irq;
|
||||||
int ret;
|
int ret;
|
||||||
#ifdef CONFIG_SMP
|
#if defined CONFIG_SMP && !defined CONFIG_SPARC_LEON
|
||||||
struct tt_entry *trap_table;
|
struct tt_entry *trap_table;
|
||||||
extern struct tt_entry trapbase_cpu1, trapbase_cpu2, trapbase_cpu3;
|
extern struct tt_entry trapbase_cpu1, trapbase_cpu2, trapbase_cpu3;
|
||||||
#endif
|
#endif
|
||||||
|
@ -425,7 +425,7 @@ static int request_fast_irq(unsigned int irq,
|
||||||
table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_four = SPARC_NOP;
|
table[SP_TRAP_IRQ1+(cpu_irq-1)].inst_four = SPARC_NOP;
|
||||||
|
|
||||||
INSTANTIATE(sparc_ttable)
|
INSTANTIATE(sparc_ttable)
|
||||||
#ifdef CONFIG_SMP
|
#if defined CONFIG_SMP && !defined CONFIG_SPARC_LEON
|
||||||
trap_table = &trapbase_cpu1; INSTANTIATE(trap_table)
|
trap_table = &trapbase_cpu1; INSTANTIATE(trap_table)
|
||||||
trap_table = &trapbase_cpu2; INSTANTIATE(trap_table)
|
trap_table = &trapbase_cpu2; INSTANTIATE(trap_table)
|
||||||
trap_table = &trapbase_cpu3; INSTANTIATE(trap_table)
|
trap_table = &trapbase_cpu3; INSTANTIATE(trap_table)
|
||||||
|
|
|
@ -56,8 +56,8 @@ void __init leon_configure_cache_smp(void);
|
||||||
static inline unsigned long do_swap(volatile unsigned long *ptr,
|
static inline unsigned long do_swap(volatile unsigned long *ptr,
|
||||||
unsigned long val)
|
unsigned long val)
|
||||||
{
|
{
|
||||||
__asm__ __volatile__("swapa [%1] %2, %0\n\t" : "=&r"(val)
|
__asm__ __volatile__("swapa [%2] %3, %0\n\t" : "=&r"(val)
|
||||||
: "r"(ptr), "i"(ASI_LEON_DCACHE_MISS)
|
: "0"(val), "r"(ptr), "i"(ASI_LEON_DCACHE_MISS)
|
||||||
: "memory");
|
: "memory");
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
|
@ -78,9 +78,9 @@ signal_p:
|
||||||
call do_notify_resume
|
call do_notify_resume
|
||||||
add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr
|
add %sp, STACKFRAME_SZ, %o0 ! pt_regs ptr
|
||||||
|
|
||||||
/* Fall through. */
|
b signal_p
|
||||||
ld [%sp + STACKFRAME_SZ + PT_PSR], %t_psr
|
ld [%curptr + TI_FLAGS], %g2
|
||||||
clr %l6
|
|
||||||
ret_trap_continue:
|
ret_trap_continue:
|
||||||
sethi %hi(PSR_SYSCALL), %g1
|
sethi %hi(PSR_SYSCALL), %g1
|
||||||
andn %t_psr, %g1, %t_psr
|
andn %t_psr, %g1, %t_psr
|
||||||
|
|
|
@ -34,37 +34,9 @@ __handle_preemption:
|
||||||
__handle_user_windows:
|
__handle_user_windows:
|
||||||
call fault_in_user_windows
|
call fault_in_user_windows
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
wrpr %g0, RTRAP_PSTATE, %pstate
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
ba,pt %xcc, __handle_preemption_continue
|
||||||
/* Redo sched+sig checks */
|
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
||||||
ldx [%g6 + TI_FLAGS], %l0
|
|
||||||
andcc %l0, _TIF_NEED_RESCHED, %g0
|
|
||||||
|
|
||||||
be,pt %xcc, 1f
|
|
||||||
nop
|
|
||||||
call schedule
|
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
|
||||||
ldx [%g6 + TI_FLAGS], %l0
|
|
||||||
|
|
||||||
1: andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0
|
|
||||||
be,pt %xcc, __handle_user_windows_continue
|
|
||||||
nop
|
|
||||||
mov %l5, %o1
|
|
||||||
add %sp, PTREGS_OFF, %o0
|
|
||||||
mov %l0, %o2
|
|
||||||
|
|
||||||
call do_notify_resume
|
|
||||||
wrpr %g0, RTRAP_PSTATE, %pstate
|
|
||||||
wrpr %g0, RTRAP_PSTATE_IRQOFF, %pstate
|
|
||||||
/* Signal delivery can modify pt_regs tstate, so we must
|
|
||||||
* reload it.
|
|
||||||
*/
|
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
|
||||||
sethi %hi(0xf << 20), %l4
|
|
||||||
and %l1, %l4, %l4
|
|
||||||
ba,pt %xcc, __handle_user_windows_continue
|
|
||||||
|
|
||||||
andn %l1, %l4, %l1
|
|
||||||
__handle_userfpu:
|
__handle_userfpu:
|
||||||
rd %fprs, %l5
|
rd %fprs, %l5
|
||||||
andcc %l5, FPRS_FEF, %g0
|
andcc %l5, FPRS_FEF, %g0
|
||||||
|
@ -87,7 +59,7 @@ __handle_signal:
|
||||||
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
ldx [%sp + PTREGS_OFF + PT_V9_TSTATE], %l1
|
||||||
sethi %hi(0xf << 20), %l4
|
sethi %hi(0xf << 20), %l4
|
||||||
and %l1, %l4, %l4
|
and %l1, %l4, %l4
|
||||||
ba,pt %xcc, __handle_signal_continue
|
ba,pt %xcc, __handle_preemption_continue
|
||||||
andn %l1, %l4, %l1
|
andn %l1, %l4, %l1
|
||||||
|
|
||||||
/* When returning from a NMI (%pil==15) interrupt we want to
|
/* When returning from a NMI (%pil==15) interrupt we want to
|
||||||
|
@ -177,11 +149,9 @@ __handle_preemption_continue:
|
||||||
bne,pn %xcc, __handle_preemption
|
bne,pn %xcc, __handle_preemption
|
||||||
andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0
|
andcc %l0, _TIF_DO_NOTIFY_RESUME_MASK, %g0
|
||||||
bne,pn %xcc, __handle_signal
|
bne,pn %xcc, __handle_signal
|
||||||
__handle_signal_continue:
|
|
||||||
ldub [%g6 + TI_WSAVED], %o2
|
ldub [%g6 + TI_WSAVED], %o2
|
||||||
brnz,pn %o2, __handle_user_windows
|
brnz,pn %o2, __handle_user_windows
|
||||||
nop
|
nop
|
||||||
__handle_user_windows_continue:
|
|
||||||
sethi %hi(TSTATE_PEF), %o0
|
sethi %hi(TSTATE_PEF), %o0
|
||||||
andcc %l1, %o0, %g0
|
andcc %l1, %o0, %g0
|
||||||
|
|
||||||
|
|
|
@ -539,6 +539,12 @@ do_sigbus:
|
||||||
__do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address);
|
__do_fault_siginfo(BUS_ADRERR, SIGBUS, tsk->thread.kregs, address);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void check_stack_aligned(unsigned long sp)
|
||||||
|
{
|
||||||
|
if (sp & 0x7UL)
|
||||||
|
force_sig(SIGILL, current);
|
||||||
|
}
|
||||||
|
|
||||||
void window_overflow_fault(void)
|
void window_overflow_fault(void)
|
||||||
{
|
{
|
||||||
unsigned long sp;
|
unsigned long sp;
|
||||||
|
@ -547,6 +553,8 @@ void window_overflow_fault(void)
|
||||||
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
||||||
force_user_fault(sp + 0x38, 1);
|
force_user_fault(sp + 0x38, 1);
|
||||||
force_user_fault(sp, 1);
|
force_user_fault(sp, 1);
|
||||||
|
|
||||||
|
check_stack_aligned(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_underflow_fault(unsigned long sp)
|
void window_underflow_fault(unsigned long sp)
|
||||||
|
@ -554,6 +562,8 @@ void window_underflow_fault(unsigned long sp)
|
||||||
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
||||||
force_user_fault(sp + 0x38, 0);
|
force_user_fault(sp + 0x38, 0);
|
||||||
force_user_fault(sp, 0);
|
force_user_fault(sp, 0);
|
||||||
|
|
||||||
|
check_stack_aligned(sp);
|
||||||
}
|
}
|
||||||
|
|
||||||
void window_ret_fault(struct pt_regs *regs)
|
void window_ret_fault(struct pt_regs *regs)
|
||||||
|
@ -564,4 +574,6 @@ void window_ret_fault(struct pt_regs *regs)
|
||||||
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
if(((sp + 0x38) & PAGE_MASK) != (sp & PAGE_MASK))
|
||||||
force_user_fault(sp + 0x38, 0);
|
force_user_fault(sp + 0x38, 0);
|
||||||
force_user_fault(sp, 0);
|
force_user_fault(sp, 0);
|
||||||
|
|
||||||
|
check_stack_aligned(sp);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue