summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/sparc/Kconfig7
-rw-r--r--arch/sparc/defconfig53
-rw-r--r--arch/sparc/kernel/asm-offsets.c2
-rw-r--r--arch/sparc/kernel/entry.S51
-rw-r--r--arch/sparc/kernel/process.c10
-rw-r--r--arch/sparc/kernel/ptrace.c7
-rw-r--r--arch/sparc/kernel/sclow.S21
-rw-r--r--arch/sparc/kernel/smp.c10
-rw-r--r--arch/sparc/kernel/sparc_ksyms.c5
-rw-r--r--arch/sparc/kernel/traps.c8
-rw-r--r--arch/sparc64/kernel/process.c11
-rw-r--r--drivers/scsi/esp.c25
-rw-r--r--include/asm-sparc/bitops.h48
-rw-r--r--include/asm-sparc/bug.h26
-rw-r--r--include/asm-sparc/io-unit.h2
-rw-r--r--include/asm-sparc/smp.h3
16 files changed, 168 insertions, 121 deletions
diff --git a/arch/sparc/Kconfig b/arch/sparc/Kconfig
index 97c736a6c668..c020ac0d729e 100644
--- a/arch/sparc/Kconfig
+++ b/arch/sparc/Kconfig
@@ -1000,6 +1000,13 @@ config DEBUG_SPINLOCK_SLEEP
If you say Y here, various routines which may sleep will become very
noisy if they are called with a spinlock held.
+config DEBUG_BUGVERBOSE
+ bool "Verbose BUG() reporting (adds 70K)"
+ help
+ Say Y here to make BUG() panics output the file name and line number
+ of the BUG call as well as the EIP and oops trace. This aids
+ debugging but costs about 70-100K of memory.
+
endmenu
source "security/Kconfig"
diff --git a/arch/sparc/defconfig b/arch/sparc/defconfig
index 1d8dc08cff90..38ed5c0e08fb 100644
--- a/arch/sparc/defconfig
+++ b/arch/sparc/defconfig
@@ -2,7 +2,6 @@
# Automatically generated make config: don't edit
#
CONFIG_MMU=y
-CONFIG_SWAP=y
CONFIG_UID16=y
CONFIG_HIGHMEM=y
CONFIG_GENERIC_ISA_DMA=y
@@ -15,10 +14,11 @@ CONFIG_EXPERIMENTAL=y
#
# General setup
#
-CONFIG_NET=y
+CONFIG_SWAP=y
CONFIG_SYSVIPC=y
# CONFIG_BSD_PROCESS_ACCT is not set
CONFIG_SYSCTL=y
+CONFIG_LOG_BUF_SHIFT=14
#
# Loadable module support
@@ -26,6 +26,8 @@ CONFIG_SYSCTL=y
CONFIG_MODULES=y
CONFIG_MODULE_UNLOAD=y
# CONFIG_MODULE_FORCE_UNLOAD is not set
+CONFIG_OBSOLETE_MODPARM=y
+# CONFIG_MODVERSIONS is not set
CONFIG_KMOD=y
#
@@ -45,6 +47,7 @@ CONFIG_RWSEM_GENERIC_SPINLOCK=y
CONFIG_SUN_PM=y
# CONFIG_SUN4 is not set
CONFIG_PCI=y
+# CONFIG_PCI_LEGACY_PROC is not set
# CONFIG_PCI_NAMES is not set
CONFIG_SUN_OPENPROMFS=m
CONFIG_KCORE_ELF=y
@@ -59,15 +62,17 @@ CONFIG_SUNOS_EMUL=y
# CONFIG_PARPORT is not set
#
-# Console drivers
+# Graphics support
#
-# CONFIG_PROM_CONSOLE is not set
-CONFIG_DUMMY_CONSOLE=y
+# CONFIG_FB is not set
#
-# Frame-buffer support
+# Console display driver support
#
-# CONFIG_FB is not set
+# CONFIG_VGA_CONSOLE is not set
+# CONFIG_MDA_CONSOLE is not set
+# CONFIG_PROM_CONSOLE is not set
+CONFIG_DUMMY_CONSOLE=y
#
# Memory Technology Devices (MTD)
@@ -130,7 +135,32 @@ CONFIG_BLK_DEV_INITRD=y
#
# SCSI support
#
-# CONFIG_SCSI is not set
+CONFIG_SCSI=y
+
+#
+# SCSI support type (disk, tape, CDrom)
+#
+CONFIG_BLK_DEV_SD=y
+CONFIG_SD_EXTRA_DEVS=40
+# CONFIG_CHR_DEV_ST is not set
+# CONFIG_CHR_DEV_OSST is not set
+CONFIG_BLK_DEV_SR=m
+# CONFIG_BLK_DEV_SR_VENDOR is not set
+CONFIG_SR_EXTRA_DEVS=2
+CONFIG_CHR_DEV_SG=m
+
+#
+# Some SCSI devices (e.g. CD jukebox) support multiple LUNs
+#
+# CONFIG_SCSI_MULTI_LUN is not set
+# CONFIG_SCSI_CONSTANTS is not set
+# CONFIG_SCSI_LOGGING is not set
+
+#
+# SCSI low-level drivers
+#
+CONFIG_SCSI_SUNESP=y
+CONFIG_SCSI_QLOGICPTI=m
#
# Fibre Channel support
@@ -138,6 +168,11 @@ CONFIG_BLK_DEV_INITRD=y
# CONFIG_FC4 is not set
#
+# Networking support
+#
+CONFIG_NET=y
+
+#
# Networking options
#
CONFIG_PACKET=y
@@ -389,6 +424,7 @@ CONFIG_NLS_DEFAULT="iso8859-1"
# USB support
#
# CONFIG_USB is not set
+# CONFIG_USB_GADGET is not set
#
# Bluetooth support
@@ -407,6 +443,7 @@ CONFIG_DEBUG_SLAB=y
CONFIG_MAGIC_SYSRQ=y
CONFIG_DEBUG_SPINLOCK=y
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
+CONFIG_DEBUG_BUGVERBOSE=y
#
# Security options
diff --git a/arch/sparc/kernel/asm-offsets.c b/arch/sparc/kernel/asm-offsets.c
index fa2e8a95ca45..74be5fd861a1 100644
--- a/arch/sparc/kernel/asm-offsets.c
+++ b/arch/sparc/kernel/asm-offsets.c
@@ -22,8 +22,6 @@
int foo(void)
{
DEFINE(AOFF_task_thread, offsetof(struct task_struct, thread));
- DEFINE(AOFF_task_ptrace, offsetof(struct task_struct, ptrace));
- DEFINE(AOFF_task_blocked, offsetof(struct task_struct, blocked));
BLANK();
/* XXX This is the stuff for sclow.S, kill it. */
DEFINE(AOFF_task_pid, offsetof(struct task_struct, pid));
diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
index 42eaa7f01de7..952195a76fb5 100644
--- a/arch/sparc/kernel/entry.S
+++ b/arch/sparc/kernel/entry.S
@@ -359,11 +359,11 @@ maybe_smp4m_msg:
andcc %o1, %o4, %g0
be,a smp4m_ticker
cmp %l7, 14
- cmp %l7, 13
+ sethi %hi(0x40000000), %o2
add %o5, %o3, %o5
- bne,a 1f
- sethi %hi(0x40000000), %o2
- sethi %hi(0x20000000), %o2
+ andcc %o1, %o2, %g0
+ be,a 1f
+ sethi %hi(0x20000000), %o2
1:
st %o2, [%o5 + 0x4]
WRITE_PAUSE
@@ -374,7 +374,8 @@ maybe_smp4m_msg:
WRITE_PAUSE
wr %l4, PSR_ET, %psr
WRITE_PAUSE
- cmp %l7, 13
+ srl %o2, (16+14), %o2
+ tst %o2
bne 2f
nop
call C_LABEL(smp_reschedule_irq)
@@ -1245,9 +1246,8 @@ C_LABEL(sys_ptrace):
call C_LABEL(do_ptrace)
add %sp, STACKFRAME_SZ, %o0
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1296,9 +1296,8 @@ C_LABEL(sys_sigpause):
call C_LABEL(do_sigpause)
add %sp, STACKFRAME_SZ, %o1
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1315,9 +1314,8 @@ C_LABEL(sys_sigsuspend):
call C_LABEL(do_sigsuspend)
add %sp, STACKFRAME_SZ, %o0
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1335,9 +1333,8 @@ C_LABEL(sys_rt_sigsuspend):
call C_LABEL(do_rt_sigsuspend)
add %sp, STACKFRAME_SZ, %o2
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1354,9 +1351,8 @@ C_LABEL(sys_sigreturn):
call C_LABEL(do_sigreturn)
add %sp, STACKFRAME_SZ, %o0
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1375,9 +1371,8 @@ C_LABEL(sys_rt_sigreturn):
call C_LABEL(do_rt_sigreturn)
add %sp, STACKFRAME_SZ, %o0
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
- andcc %l5, 0x02, %g0
+ ld [%curptr + TI_FLAGS], %l5
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
be 1f
nop
@@ -1511,10 +1506,9 @@ syscall_is_too_hard:
mov %i1, %o1
mov %i2, %o2
- ld [%curptr + TI_TASK], %l5
- ld [%l5 + AOFF_task_ptrace], %l5
+ ld [%curptr + TI_FLAGS], %l5
mov %i3, %o3
- andcc %l5, 0x02, %g0
+ andcc %l5, _TIF_SYSCALL_TRACE, %g0
mov %i4, %o4
bne linux_syscall_trace
mov %i0, %l5
@@ -1526,13 +1520,12 @@ syscall_is_too_hard:
.globl C_LABEL(ret_sys_call)
C_LABEL(ret_sys_call):
- ld [%curptr + TI_TASK], %l6
- ld [%l6 + AOFF_task_ptrace], %l6
+ ld [%curptr + TI_FLAGS], %l6
cmp %o0, -ENOIOCTLCMD
ld [%sp + STACKFRAME_SZ + PT_PSR], %g3
set PSR_C, %g2
bgeu 1f
- andcc %l6, 0x02, %l6
+ andcc %l6, _TIF_SYSCALL_TRACE, %g0
/* System call success, clear Carry condition code. */
andn %g3, %g2, %g3
diff --git a/arch/sparc/kernel/process.c b/arch/sparc/kernel/process.c
index 37efbfbdd54a..3608f9408eb8 100644
--- a/arch/sparc/kernel/process.c
+++ b/arch/sparc/kernel/process.c
@@ -403,7 +403,6 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
{
unsigned long parent_tid_ptr = 0;
unsigned long child_tid_ptr = 0;
- struct task_struct *p;
clone_flags &= ~CLONE_IDLETASK;
@@ -411,11 +410,10 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
parent_tid_ptr = regs->u_regs[UREG_G2];
child_tid_ptr = regs->u_regs[UREG_G3];
}
- p = do_fork(clone_flags, stack_start,
- regs, stack_size,
- (int *) parent_tid_ptr,
- (int *) child_tid_ptr);
- return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+ return do_fork(clone_flags, stack_start,
+ regs, stack_size,
+ (int *) parent_tid_ptr,
+ (int *) child_tid_ptr);
}
/* Copy a Sparc thread. The fork() return value conventions
diff --git a/arch/sparc/kernel/ptrace.c b/arch/sparc/kernel/ptrace.c
index fcc3fb80109e..1a14bf4c9cd7 100644
--- a/arch/sparc/kernel/ptrace.c
+++ b/arch/sparc/kernel/ptrace.c
@@ -521,7 +521,7 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
addr = 1;
case PTRACE_CONT: { /* restart after signal. */
- if ((unsigned long) data > _NSIG) {
+ if (data > _NSIG) {
pt_error_return(regs, EIO);
goto out_tsk;
}
@@ -545,11 +545,10 @@ asmlinkage void do_ptrace(struct pt_regs *regs)
child->exit_code = data;
#ifdef DEBUG_PTRACE
- printk("CONT: %s [%d]: set exit_code = %x %x %x\n", child->comm,
- child->pid, child->exit_code,
+ printk("CONT: %s [%d]: set exit_code = %x %lx %lx\n",
+ child->comm, child->pid, child->exit_code,
child->thread.kregs->pc,
child->thread.kregs->npc);
-
#endif
wake_up_process(child);
pt_succ_return(regs, 0);
diff --git a/arch/sparc/kernel/sclow.S b/arch/sparc/kernel/sclow.S
index 4e60e5dcf628..cb9198302b8d 100644
--- a/arch/sparc/kernel/sclow.S
+++ b/arch/sparc/kernel/sclow.S
@@ -67,27 +67,6 @@ LABEL(sunosgdtsize):
mov 256, %i0
CC_AND_RETT
- .globl LABEL(sunossblock)
-LABEL(sunossblock):
- LOAD_CURRENT(l4, l5)
- ld [%l4 + TI_TASK], %l4
- set -65793, %l5
- and %i0, %l5, %l5
- ld [%l4 + AOFF_task_blocked], %i0
- or %i0, %l5, %l5
- st %l5, [%l4 + AOFF_task_blocked]
- CC_AND_RETT
-
- .globl LABEL(sunossmask)
-LABEL(sunossmask):
- LOAD_CURRENT(l4, l5)
- ld [%l4 + TI_TASK], %l4
- set -65793, %l5
- and %i0, %l5, %l5
- ld [%l4 + AOFF_task_blocked], %i0
- st %l5, [%l4 + AOFF_task_blocked]
- CC_AND_RETT
-
.globl LABEL(getpagesize)
LABEL(getpagesize):
set PAGE_SIZE, %i0
diff --git a/arch/sparc/kernel/smp.c b/arch/sparc/kernel/smp.c
index 330c8e9a8e3b..1e4d1597ef6c 100644
--- a/arch/sparc/kernel/smp.c
+++ b/arch/sparc/kernel/smp.c
@@ -133,6 +133,16 @@ void __init smp_boot_cpus(void)
smp4d_boot_cpus();
}
+void smp_send_reschedule(int cpu)
+{
+ smp_message_pass (cpu, MSG_RESCHEDULE, 0, 0);
+}
+
+void smp_send_stop(void)
+{
+ smp_message_pass (MSG_ALL_BUT_SELF, MSG_STOP_CPU, 0, 0);
+}
+
void smp_flush_cache_all(void)
{
xc0((smpfunc_t) BTFIXUP_CALL(local_flush_cache_all));
diff --git a/arch/sparc/kernel/sparc_ksyms.c b/arch/sparc/kernel/sparc_ksyms.c
index ad08eb2eddf9..58a369d72529 100644
--- a/arch/sparc/kernel/sparc_ksyms.c
+++ b/arch/sparc/kernel/sparc_ksyms.c
@@ -53,6 +53,7 @@
#endif
#include <asm/a.out.h>
#include <asm/io-unit.h>
+#include <asm/bug.h>
extern spinlock_t rtc_lock;
@@ -312,5 +313,9 @@ EXPORT_SYMBOL_DOT(umul);
EXPORT_SYMBOL_DOT(div);
EXPORT_SYMBOL_DOT(udiv);
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+EXPORT_SYMBOL(do_BUG);
+#endif
+
/* Sun Power Management Idle Handler */
EXPORT_SYMBOL(pm_idle);
diff --git a/arch/sparc/kernel/traps.c b/arch/sparc/kernel/traps.c
index 17add64c9af2..f2fb91343b80 100644
--- a/arch/sparc/kernel/traps.c
+++ b/arch/sparc/kernel/traps.c
@@ -463,6 +463,14 @@ void handle_hw_divzero(struct pt_regs *regs, unsigned long pc, unsigned long npc
send_sig_info(SIGFPE, &info, current);
}
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+void do_BUG(const char *file, int line)
+{
+ // bust_spinlocks(1); XXX Not in our original BUG()
+ printk("kernel BUG at %s:%d!\n", file, line);
+}
+#endif
+
/* Since we have our mappings set up, on multiprocessors we can spin them
* up here so that timer interrupts work during initialization.
*/
diff --git a/arch/sparc64/kernel/process.c b/arch/sparc64/kernel/process.c
index 8c0f80c7835a..6326ab3761ea 100644
--- a/arch/sparc64/kernel/process.c
+++ b/arch/sparc64/kernel/process.c
@@ -568,7 +568,6 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
struct pt_regs *regs,
unsigned long stack_size)
{
- struct task_struct *p;
unsigned long parent_tid_ptr = 0;
unsigned long child_tid_ptr = 0;
@@ -583,12 +582,10 @@ asmlinkage int sparc_do_fork(unsigned long clone_flags,
}
}
- p = do_fork(clone_flags, stack_start,
- regs, stack_size,
- (int *) parent_tid_ptr,
- (int *) child_tid_ptr);
-
- return IS_ERR(p) ? PTR_ERR(p) : p->pid;
+ return do_fork(clone_flags, stack_start,
+ regs, stack_size,
+ (int *) parent_tid_ptr,
+ (int *) child_tid_ptr);
}
/* Copy a Sparc thread. The fork() return value conventions
diff --git a/drivers/scsi/esp.c b/drivers/scsi/esp.c
index f0bb5d3a065f..0995760533b8 100644
--- a/drivers/scsi/esp.c
+++ b/drivers/scsi/esp.c
@@ -1215,11 +1215,33 @@ static int __init esp_detect(Scsi_Host_Template *tpnt)
#endif /* !CONFIG_SUN4 */
+/*
+ */
+static int esp_release(struct Scsi_Host *host)
+{
+ struct esp *esp = (struct esp *) host->hostdata;
+
+ ESP_INTSOFF(esp->dregs);
+#if 0
+ esp_reset_dma(esp);
+ esp_reset_esp(esp);
+#endif
+
+ free_irq(esp->ehost->irq, esp);
+ sbus_free_consistent(esp->sdev, 16,
+ (void *) esp->esp_command, esp->esp_command_dvma);
+ sbus_iounmap(esp->eregs, ESP_REG_SIZE);
+ esp->dma->allocated = 0;
+ esp_chain_del(esp);
+
+ return 0;
+}
+
/* The info function will return whatever useful
* information the developer sees fit. If not provided, then
* the name field will be used instead.
*/
-const char *esp_info(struct Scsi_Host *host)
+static const char *esp_info(struct Scsi_Host *host)
{
struct esp *esp;
@@ -4370,6 +4392,7 @@ static Scsi_Host_Template driver_template = {
.detect = esp_detect,
.slave_alloc = esp_slave_alloc,
.slave_destroy = esp_slave_destroy,
+ .release = esp_release,
.info = esp_info,
.command = esp_command,
.queuecommand = esp_queue,
diff --git a/include/asm-sparc/bitops.h b/include/asm-sparc/bitops.h
index 5b3226834489..4340bddccabb 100644
--- a/include/asm-sparc/bitops.h
+++ b/include/asm-sparc/bitops.h
@@ -20,7 +20,7 @@
* within the first byte. Sparc is BIG-Endian. Unless noted otherwise
* all bit-ops return 0 if bit was previously clear and != 0 otherwise.
*/
-static __inline__ int test_and_set_bit(unsigned long nr, volatile void *addr)
+static __inline__ int test_and_set_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -39,7 +39,7 @@ static __inline__ int test_and_set_bit(unsigned long nr, volatile void *addr)
return mask != 0;
}
-static __inline__ void set_bit(unsigned long nr, volatile void *addr)
+static __inline__ void set_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -56,7 +56,7 @@ static __inline__ void set_bit(unsigned long nr, volatile void *addr)
: "g3", "g4", "g5", "g7", "cc");
}
-static __inline__ int test_and_clear_bit(unsigned long nr, volatile void *addr)
+static __inline__ int test_and_clear_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -75,7 +75,7 @@ static __inline__ int test_and_clear_bit(unsigned long nr, volatile void *addr)
return mask != 0;
}
-static __inline__ void clear_bit(unsigned long nr, volatile void *addr)
+static __inline__ void clear_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -92,7 +92,7 @@ static __inline__ void clear_bit(unsigned long nr, volatile void *addr)
: "g3", "g4", "g5", "g7", "cc");
}
-static __inline__ int test_and_change_bit(unsigned long nr, volatile void *addr)
+static __inline__ int test_and_change_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -111,7 +111,7 @@ static __inline__ int test_and_change_bit(unsigned long nr, volatile void *addr)
return mask != 0;
}
-static __inline__ void change_bit(unsigned long nr, volatile void *addr)
+static __inline__ void change_bit(unsigned long nr, volatile unsigned long *addr)
{
register unsigned long mask asm("g2");
register unsigned long *ADDR asm("g1");
@@ -131,7 +131,7 @@ static __inline__ void change_bit(unsigned long nr, volatile void *addr)
/*
* non-atomic versions
*/
-static __inline__ void __set_bit(int nr, volatile void *addr)
+static __inline__ void __set_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -139,7 +139,7 @@ static __inline__ void __set_bit(int nr, volatile void *addr)
*p |= mask;
}
-static __inline__ void __clear_bit(int nr, volatile void *addr)
+static __inline__ void __clear_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -147,7 +147,7 @@ static __inline__ void __clear_bit(int nr, volatile void *addr)
*p &= ~mask;
}
-static __inline__ void __change_bit(int nr, volatile void *addr)
+static __inline__ void __change_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -155,7 +155,7 @@ static __inline__ void __change_bit(int nr, volatile void *addr)
*p ^= mask;
}
-static __inline__ int __test_and_set_bit(int nr, volatile void *addr)
+static __inline__ int __test_and_set_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -165,7 +165,7 @@ static __inline__ int __test_and_set_bit(int nr, volatile void *addr)
return (old & mask) != 0;
}
-static __inline__ int __test_and_clear_bit(int nr, volatile void *addr)
+static __inline__ int __test_and_clear_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -175,7 +175,7 @@ static __inline__ int __test_and_clear_bit(int nr, volatile void *addr)
return (old & mask) != 0;
}
-static __inline__ int __test_and_change_bit(int nr, volatile void *addr)
+static __inline__ int __test_and_change_bit(int nr, volatile unsigned long *addr)
{
unsigned long mask = 1UL << (nr & 0x1f);
unsigned long *p = ((unsigned long *)addr) + (nr >> 5);
@@ -189,9 +189,9 @@ static __inline__ int __test_and_change_bit(int nr, volatile void *addr)
#define smp_mb__after_clear_bit() do { } while(0)
/* The following routine need not be atomic. */
-static __inline__ int test_bit(int nr, __const__ void *addr)
+static __inline__ int test_bit(int nr, __const__ volatile unsigned long *addr)
{
- return (1 & (((__const__ unsigned int *) addr)[nr >> 5] >> (nr & 31))) != 0;
+ return (1UL & (((unsigned long *)addr)[nr >> 5] >> (nr & 31))) != 0UL;
}
/* The easy/cheese version for now. */
@@ -288,9 +288,10 @@ static __inline__ int ffs(int x)
* 'size' bits, starting the search at bit 'offset'. This is largely based
* on Linus's ALPHA routines, which are pretty portable BTW.
*/
-static __inline__ unsigned long find_next_zero_bit(void *addr, unsigned long size, unsigned long offset)
+static __inline__ unsigned long find_next_zero_bit(unsigned long *addr,
+ unsigned long size, unsigned long offset)
{
- unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+ unsigned long *p = addr + (offset >> 5);
unsigned long result = offset & ~31UL;
unsigned long tmp;
@@ -361,7 +362,7 @@ static __inline__ int find_next_bit(unsigned long *addr, int size, int offset)
/*
*/
-static __inline__ int test_le_bit(int nr, __const__ void * addr)
+static __inline__ int test_le_bit(int nr, __const__ unsigned long * addr)
{
__const__ unsigned char *ADDR = (__const__ unsigned char *) addr;
return (ADDR[nr >> 3] >> (nr & 7)) & 1;
@@ -370,7 +371,7 @@ static __inline__ int test_le_bit(int nr, __const__ void * addr)
/*
* non-atomic versions
*/
-static __inline__ void __set_le_bit(int nr, void *addr)
+static __inline__ void __set_le_bit(int nr, unsigned long *addr)
{
unsigned char *ADDR = (unsigned char *)addr;
@@ -378,7 +379,7 @@ static __inline__ void __set_le_bit(int nr, void *addr)
*ADDR |= 1 << (nr & 0x07);
}
-static __inline__ void __clear_le_bit(int nr, void *addr)
+static __inline__ void __clear_le_bit(int nr, unsigned long *addr)
{
unsigned char *ADDR = (unsigned char *)addr;
@@ -386,7 +387,7 @@ static __inline__ void __clear_le_bit(int nr, void *addr)
*ADDR &= ~(1 << (nr & 0x07));
}
-static __inline__ int __test_and_set_le_bit(int nr, void *addr)
+static __inline__ int __test_and_set_le_bit(int nr, unsigned long *addr)
{
int mask, retval;
unsigned char *ADDR = (unsigned char *)addr;
@@ -398,7 +399,7 @@ static __inline__ int __test_and_set_le_bit(int nr, void *addr)
return retval;
}
-static __inline__ int __test_and_clear_le_bit(int nr, void *addr)
+static __inline__ int __test_and_clear_le_bit(int nr, unsigned long *addr)
{
int mask, retval;
unsigned char *ADDR = (unsigned char *)addr;
@@ -410,9 +411,10 @@ static __inline__ int __test_and_clear_le_bit(int nr, void *addr)
return retval;
}
-static __inline__ unsigned long find_next_zero_le_bit(void *addr, unsigned long size, unsigned long offset)
+static __inline__ unsigned long find_next_zero_le_bit(unsigned long *addr,
+ unsigned long size, unsigned long offset)
{
- unsigned long *p = ((unsigned long *) addr) + (offset >> 5);
+ unsigned long *p = addr + (offset >> 5);
unsigned long result = offset & ~31UL;
unsigned long tmp;
diff --git a/include/asm-sparc/bug.h b/include/asm-sparc/bug.h
index 2100cc50f97c..41dc0abaa624 100644
--- a/include/asm-sparc/bug.h
+++ b/include/asm-sparc/bug.h
@@ -2,24 +2,18 @@
#ifndef _SPARC_BUG_H
#define _SPARC_BUG_H
-/*
- * XXX I am hitting compiler bugs with __builtin_trap. This has
- * hit me before and rusty was blaming his netfilter bugs on
- * this so lets disable it. - Anton
- */
-#if 0
-/* We need the mb()'s so we don't trigger a compiler bug - Anton */
-#define BUG() do { \
- mb(); \
- __builtin_trap(); \
- mb(); \
-} while(0)
-#else
-#define BUG() do { \
- printk("kernel BUG at %s:%d!\n", __FILE__, __LINE__); *(int *)0=0; \
+#ifdef CONFIG_DEBUG_BUGVERBOSE
+extern void do_BUG(const char *file, int line);
+#define BUG() do { \
+ do_BUG(__FILE__, __LINE__); \
+ __builtin_trap(); \
} while (0)
+#else
+#define BUG() __builtin_trap()
#endif
-#define PAGE_BUG(page) BUG()
+#define PAGE_BUG(page) do { \
+ BUG(); \
+} while (0)
#endif
diff --git a/include/asm-sparc/io-unit.h b/include/asm-sparc/io-unit.h
index bd5fc063444b..96823b47fd45 100644
--- a/include/asm-sparc/io-unit.h
+++ b/include/asm-sparc/io-unit.h
@@ -41,7 +41,7 @@
#define IOUPTE_PARITY 0x00000001 /* Parity is checked during DVMA */
struct iounit_struct {
- unsigned int bmap[(IOUNIT_DMA_SIZE >> (PAGE_SHIFT + 3)) / sizeof(unsigned int)];
+ unsigned long bmap[(IOUNIT_DMA_SIZE >> (PAGE_SHIFT + 3)) / sizeof(unsigned long)];
spinlock_t lock;
iopte_t *page_table;
unsigned long rotor[3];
diff --git a/include/asm-sparc/smp.h b/include/asm-sparc/smp.h
index f32a11f8a113..b9959928eabf 100644
--- a/include/asm-sparc/smp.h
+++ b/include/asm-sparc/smp.h
@@ -169,9 +169,6 @@ extern __inline__ int hard_smp_processor_id(void)
#endif
#define smp_processor_id() hard_smp_processor_id()
-/* XXX We really need to implement this now. -DaveM */
-extern __inline__ void smp_send_reschedule(int cpu) { }
-extern __inline__ void smp_send_stop(void) { }
#endif /* !(__ASSEMBLY__) */