diff options
Diffstat (limited to 'arch/sparc/kernel')
| -rw-r--r-- | arch/sparc/kernel/head_64.S | 4 | ||||
| -rw-r--r-- | arch/sparc/kernel/ktlb.S | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/nmi.c | 21 | ||||
| -rw-r--r-- | arch/sparc/kernel/smp_64.c | 6 | ||||
| -rw-r--r-- | arch/sparc/kernel/sys32.S | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/sysfs.c | 2 | ||||
| -rw-r--r-- | arch/sparc/kernel/unaligned_64.c | 12 | 
7 files changed, 22 insertions, 27 deletions
| diff --git a/arch/sparc/kernel/head_64.S b/arch/sparc/kernel/head_64.S index 26b706a1867d..452f04fe8da6 100644 --- a/arch/sparc/kernel/head_64.S +++ b/arch/sparc/kernel/head_64.S @@ -282,8 +282,8 @@ sun4v_chip_type:  	stx	%l2, [%l4 + 0x0]  	ldx	[%sp + 2047 + 128 + 0x50], %l3	! physaddr low  	/* 4MB align */ -	srlx	%l3, 22, %l3 -	sllx	%l3, 22, %l3 +	srlx	%l3, ILOG2_4MB, %l3 +	sllx	%l3, ILOG2_4MB, %l3  	stx	%l3, [%l4 + 0x8]  	/* Leave service as-is, "call-method" */ diff --git a/arch/sparc/kernel/ktlb.S b/arch/sparc/kernel/ktlb.S index 542e96ac4d39..605d49204580 100644 --- a/arch/sparc/kernel/ktlb.S +++ b/arch/sparc/kernel/ktlb.S @@ -277,7 +277,7 @@ kvmap_dtlb_load:  #ifdef CONFIG_SPARSEMEM_VMEMMAP  kvmap_vmemmap:  	sub		%g4, %g5, %g5 -	srlx		%g5, 22, %g5 +	srlx		%g5, ILOG2_4MB, %g5  	sethi		%hi(vmemmap_table), %g1  	sllx		%g5, 3, %g5  	or		%g1, %lo(vmemmap_table), %g1 diff --git a/arch/sparc/kernel/nmi.c b/arch/sparc/kernel/nmi.c index 6479256fd5a4..337094556916 100644 --- a/arch/sparc/kernel/nmi.c +++ b/arch/sparc/kernel/nmi.c @@ -68,27 +68,16 @@ EXPORT_SYMBOL(touch_nmi_watchdog);  static void die_nmi(const char *str, struct pt_regs *regs, int do_panic)  { +	int this_cpu = smp_processor_id(); +  	if (notify_die(DIE_NMIWATCHDOG, str, regs, 0,  		       pt_regs_trap_type(regs), SIGINT) == NOTIFY_STOP)  		return; -	console_verbose(); -	bust_spinlocks(1); - -	printk(KERN_EMERG "%s", str); -	printk(" on CPU%d, ip %08lx, registers:\n", -	       smp_processor_id(), regs->tpc); -	show_regs(regs); -	dump_stack(); - -	bust_spinlocks(0); -  	if (do_panic || panic_on_oops) -		panic("Non maskable interrupt"); - -	nmi_exit(); -	local_irq_enable(); -	do_exit(SIGBUS); +		panic("Watchdog detected hard LOCKUP on cpu %d", this_cpu); +	else +		WARN(1, "Watchdog detected hard LOCKUP on cpu %d", this_cpu);  }  notrace __kprobes void perfctr_irq(int irq, struct pt_regs *regs) diff --git a/arch/sparc/kernel/smp_64.c b/arch/sparc/kernel/smp_64.c index 9781048161ab..745a3633ce14 100644 --- a/arch/sparc/kernel/smp_64.c +++ b/arch/sparc/kernel/smp_64.c @@ -149,7 +149,7 @@ void cpu_panic(void)  #define NUM_ROUNDS	64	/* magic value */  #define NUM_ITERS	5	/* likewise */ -static DEFINE_SPINLOCK(itc_sync_lock); +static DEFINE_RAW_SPINLOCK(itc_sync_lock);  static unsigned long go[SLAVE + 1];  #define DEBUG_TICK_SYNC	0 @@ -257,7 +257,7 @@ static void smp_synchronize_one_tick(int cpu)  	go[MASTER] = 0;  	membar_safe("#StoreLoad"); -	spin_lock_irqsave(&itc_sync_lock, flags); +	raw_spin_lock_irqsave(&itc_sync_lock, flags);  	{  		for (i = 0; i < NUM_ROUNDS*NUM_ITERS; i++) {  			while (!go[MASTER]) @@ -268,7 +268,7 @@ static void smp_synchronize_one_tick(int cpu)  			membar_safe("#StoreLoad");  		}  	} -	spin_unlock_irqrestore(&itc_sync_lock, flags); +	raw_spin_unlock_irqrestore(&itc_sync_lock, flags);  }  #if defined(CONFIG_SUN_LDOMS) && defined(CONFIG_HOTPLUG_CPU) diff --git a/arch/sparc/kernel/sys32.S b/arch/sparc/kernel/sys32.S index f7c72b6efc27..d066eb18650c 100644 --- a/arch/sparc/kernel/sys32.S +++ b/arch/sparc/kernel/sys32.S @@ -44,7 +44,7 @@ SIGN1(sys32_timer_settime, compat_sys_timer_settime, %o1)  SIGN1(sys32_io_submit, compat_sys_io_submit, %o1)  SIGN1(sys32_mq_open, compat_sys_mq_open, %o1)  SIGN1(sys32_select, compat_sys_select, %o0) -SIGN3(sys32_futex, compat_sys_futex, %o1, %o2, %o5) +SIGN1(sys32_futex, compat_sys_futex, %o1)  SIGN1(sys32_recvfrom, compat_sys_recvfrom, %o0)  SIGN1(sys32_recvmsg, compat_sys_recvmsg, %o0)  SIGN1(sys32_sendmsg, compat_sys_sendmsg, %o0) diff --git a/arch/sparc/kernel/sysfs.c b/arch/sparc/kernel/sysfs.c index a364000ca1aa..7f41d40b7e6e 100644 --- a/arch/sparc/kernel/sysfs.c +++ b/arch/sparc/kernel/sysfs.c @@ -151,7 +151,7 @@ static ssize_t store_mmustat_enable(struct device *s,  			size_t count)  {  	unsigned long val, err; -	int ret = sscanf(buf, "%ld", &val); +	int ret = sscanf(buf, "%lu", &val);  	if (ret != 1)  		return -EINVAL; diff --git a/arch/sparc/kernel/unaligned_64.c b/arch/sparc/kernel/unaligned_64.c index 3c1a7cb31579..35ab8b60d256 100644 --- a/arch/sparc/kernel/unaligned_64.c +++ b/arch/sparc/kernel/unaligned_64.c @@ -166,17 +166,23 @@ static unsigned long *fetch_reg_addr(unsigned int reg, struct pt_regs *regs)  unsigned long compute_effective_address(struct pt_regs *regs,  					unsigned int insn, unsigned int rd)  { +	int from_kernel = (regs->tstate & TSTATE_PRIV) != 0;  	unsigned int rs1 = (insn >> 14) & 0x1f;  	unsigned int rs2 = insn & 0x1f; -	int from_kernel = (regs->tstate & TSTATE_PRIV) != 0; +	unsigned long addr;  	if (insn & 0x2000) {  		maybe_flush_windows(rs1, 0, rd, from_kernel); -		return (fetch_reg(rs1, regs) + sign_extend_imm13(insn)); +		addr = (fetch_reg(rs1, regs) + sign_extend_imm13(insn));  	} else {  		maybe_flush_windows(rs1, rs2, rd, from_kernel); -		return (fetch_reg(rs1, regs) + fetch_reg(rs2, regs)); +		addr = (fetch_reg(rs1, regs) + fetch_reg(rs2, regs));  	} + +	if (!from_kernel && test_thread_flag(TIF_32BIT)) +		addr &= 0xffffffff; + +	return addr;  }  /* This is just to make gcc think die_if_kernel does return... */ | 

