summaryrefslogtreecommitdiffstats
path: root/include/asm-m68k
diff options
context:
space:
mode:
Diffstat (limited to 'include/asm-m68k')
-rw-r--r--include/asm-m68k/atomic.h2
-rw-r--r--include/asm-m68k/bitops.h24
-rw-r--r--include/asm-m68k/current.h8
-rw-r--r--include/asm-m68k/dsp56k.h35
-rw-r--r--include/asm-m68k/elf.h2
-rw-r--r--include/asm-m68k/fpu.h20
-rw-r--r--include/asm-m68k/hardirq.h17
-rw-r--r--include/asm-m68k/init.h16
-rw-r--r--include/asm-m68k/keyboard.h38
-rw-r--r--include/asm-m68k/namei.h21
-rw-r--r--include/asm-m68k/pgtable.h4
-rw-r--r--include/asm-m68k/poll.h21
-rw-r--r--include/asm-m68k/processor.h14
-rw-r--r--include/asm-m68k/ptrace.h2
-rw-r--r--include/asm-m68k/semaphore.h72
-rw-r--r--include/asm-m68k/sigcontext.h4
-rw-r--r--include/asm-m68k/smp_lock.h14
-rw-r--r--include/asm-m68k/softirq.h63
-rw-r--r--include/asm-m68k/spinlock.h31
-rw-r--r--include/asm-m68k/system.h1
-rw-r--r--include/asm-m68k/unistd.h8
21 files changed, 137 insertions, 280 deletions
diff --git a/include/asm-m68k/atomic.h b/include/asm-m68k/atomic.h
index b57cc9cb0..39236e060 100644
--- a/include/asm-m68k/atomic.h
+++ b/include/asm-m68k/atomic.h
@@ -11,7 +11,7 @@
*/
typedef struct { int counter; } atomic_t;
-#define ATOMIC_INIT { 0 }
+#define ATOMIC_INIT(i) { (i) }
#define atomic_read(v) ((v)->counter)
#define atomic_set(v, i) (((v)->counter) = i)
diff --git a/include/asm-m68k/bitops.h b/include/asm-m68k/bitops.h
index b63496040..00e23b352 100644
--- a/include/asm-m68k/bitops.h
+++ b/include/asm-m68k/bitops.h
@@ -14,7 +14,7 @@
* They use the standard big-endian m680x0 bit ordering.
*/
-extern __inline__ int set_bit(int nr,void * vaddr)
+extern __inline__ int test_and_set_bit(int nr,void * vaddr)
{
char retval;
@@ -24,7 +24,13 @@ extern __inline__ int set_bit(int nr,void * vaddr)
return retval;
}
-extern __inline__ int clear_bit(int nr, void * vaddr)
+extern __inline__ void set_bit(int nr, void * vaddr)
+{
+ __asm__ __volatile__ ("bfset %1@{%0:#1}"
+ : : "d" (nr^31), "a" (vaddr));
+}
+
+extern __inline__ int test_and_clear_bit(int nr, void * vaddr)
{
char retval;
@@ -34,7 +40,13 @@ extern __inline__ int clear_bit(int nr, void * vaddr)
return retval;
}
-extern __inline__ int change_bit(int nr, void * vaddr)
+extern __inline__ void clear_bit(int nr, void * vaddr)
+{
+ __asm__ __volatile__ ("bfclr %1@{%0:#1}"
+ : : "d" (nr^31), "a" (vaddr));
+}
+
+extern __inline__ int test_and_change_bit(int nr, void * vaddr)
{
char retval;
@@ -44,6 +56,12 @@ extern __inline__ int change_bit(int nr, void * vaddr)
return retval;
}
+extern __inline__ void change_bit(int nr, void * vaddr)
+{
+ __asm__ __volatile__ ("bfchg %1@{%0:#1}"
+ : : "d" (nr^31), "a" (vaddr));
+}
+
extern __inline__ int test_bit(int nr, const void * vaddr)
{
return ((1UL << (nr & 31)) & (((const unsigned int *) vaddr)[nr >> 5])) != 0;
diff --git a/include/asm-m68k/current.h b/include/asm-m68k/current.h
index 9d542c79d..8de8f8ced 100644
--- a/include/asm-m68k/current.h
+++ b/include/asm-m68k/current.h
@@ -1,12 +1,6 @@
#ifndef _M68K_CURRENT_H
#define _M68K_CURRENT_H
-/* Some architectures may want to do something "clever" here since
- * this is the most frequently accessed piece of data in the entire
- * kernel. For an example, see the Sparc implementation where an
- * entire register is hard locked to contain the value of current.
- */
-extern struct task_struct *current_set[NR_CPUS];
-#define current (current_set[smp_processor_id()]) /* Current on this processor */
+register struct task_struct *current __asm__("%a2");
#endif /* !(_M68K_CURRENT_H) */
diff --git a/include/asm-m68k/dsp56k.h b/include/asm-m68k/dsp56k.h
index e035055bc..ab3dd33e2 100644
--- a/include/asm-m68k/dsp56k.h
+++ b/include/asm-m68k/dsp56k.h
@@ -33,38 +33,3 @@ struct dsp56k_host_flags {
#define DSP56K_SET_RX_WSIZE 3 /* Host receive word size (1-4) */
#define DSP56K_HOST_FLAGS 4 /* Host flag registers */
#define DSP56K_HOST_CMD 5 /* Trig Host Command (0-31) */
-/*
- * linux/include/asm-m68k/dsp56k.h - defines and declarations for
- * DSP56k device driver
- *
- * Copyright (C) 1996,1997 Fredrik Noring, lars brinkhoff & Tomas Berndtsson
- *
- * This file is subject to the terms and conditions of the GNU General Public
- * License. See the file COPYING in the main directory of this archive
- * for more details.
- */
-
-
-/* Used for uploading DSP binary code */
-struct dsp56k_upload {
- int len;
- char *bin;
-};
-
-/* For the DSP host flags */
-struct dsp56k_host_flags {
- int dir; /* Bit field. 1 = write output bit, 0 = do nothing.
- * 0x0000 means reading only, 0x0011 means
- * writing the bits stored in `out' on HF0 and HF1.
- * Note that HF2 and HF3 can only be read.
- */
- int out; /* Bit field like above. */
- int status; /* Host register's current state is returned */
-};
-
-/* ioctl command codes */
-#define DSP56K_UPLOAD 1 /* Upload DSP binary program */
-#define DSP56K_SET_TX_WSIZE 2 /* Host transmit word size (1-4) */
-#define DSP56K_SET_RX_WSIZE 3 /* Host receive word size (1-4) */
-#define DSP56K_HOST_FLAGS 4 /* Host flag registers */
-#define DSP56K_HOST_CMD 5 /* Trig Host Command (0-31) */
diff --git a/include/asm-m68k/elf.h b/include/asm-m68k/elf.h
index 8ccf73858..570521687 100644
--- a/include/asm-m68k/elf.h
+++ b/include/asm-m68k/elf.h
@@ -44,6 +44,7 @@ typedef struct user_m68kfp_struct elf_fpregset_t;
pr_reg[4] = regs->d5; \
pr_reg[7] = regs->a0; \
pr_reg[8] = regs->a1; \
+ pr_reg[9] = regs->a2; \
pr_reg[14] = regs->d0; \
pr_reg[15] = rdusp(); \
pr_reg[16] = regs->orig_d0; \
@@ -54,7 +55,6 @@ typedef struct user_m68kfp_struct elf_fpregset_t;
struct switch_stack *sw = ((struct switch_stack *)regs) - 1; \
pr_reg[5] = sw->d6; \
pr_reg[6] = sw->d7; \
- pr_reg[9] = sw->a2; \
pr_reg[10] = sw->a3; \
pr_reg[11] = sw->a4; \
pr_reg[12] = sw->a5; \
diff --git a/include/asm-m68k/fpu.h b/include/asm-m68k/fpu.h
index fc47dac02..717ecfa7f 100644
--- a/include/asm-m68k/fpu.h
+++ b/include/asm-m68k/fpu.h
@@ -18,23 +18,3 @@
#endif
#endif /* __M68K_FPU_H */
-#ifndef __M68K_FPU_H
-#define __M68K_FPU_H
-
-#include <linux/config.h>
-
-/*
- * MAX floating point unit state size (FSAVE/FRESTORE)
- */
-
-#if defined(CONFIG_M68020) || defined(CONFIG_M68030)
-#define FPSTATESIZE (216/sizeof(unsigned char))
-#elif defined(CONFIG_M68040)
-#define FPSTATESIZE (96/sizeof(unsigned char))
-#elif defined(CONFIG_M68060)
-#define FPSTATESIZE (12/sizeof(unsigned char))
-#else
-#define FPSTATESIZE error no_cpu_type_configured
-#endif
-
-#endif /* __M68K_FPU_H */
diff --git a/include/asm-m68k/hardirq.h b/include/asm-m68k/hardirq.h
index e9d0136c3..512e0b054 100644
--- a/include/asm-m68k/hardirq.h
+++ b/include/asm-m68k/hardirq.h
@@ -1,24 +1,13 @@
#ifndef __M68K_HARDIRQ_H
#define __M68K_HARDIRQ_H
-extern unsigned int local_irq_count[NR_CPUS];
-#define in_interrupt() (local_irq_count[smp_processor_id()] != 0)
-
-#define hardirq_trylock(cpu) ((cpu)==0) /* always true */
-#define hardirq_endlock(cpu) do { } while (0)
-
-#define hardirq_enter(cpu) (local_irq_count[cpu]++)
-#define hardirq_exit(cpu) (local_irq_count[cpu]--)
-
-#endif
-#ifndef __M68K_HARDIRQ_H
-#define __M68K_HARDIRQ_H
+#include <linux/tasks.h>
extern unsigned int local_irq_count[NR_CPUS];
#define in_interrupt() (local_irq_count[smp_processor_id()] != 0)
-#define hardirq_trylock(cpu) ((cpu)==0) /* always true */
-#define hardirq_endlock(cpu) do { } while (0)
+#define hardirq_trylock(cpu) (++local_irq_count[cpu], (cpu) == 0)
+#define hardirq_endlock(cpu) (--local_irq_count[cpu])
#define hardirq_enter(cpu) (local_irq_count[cpu]++)
#define hardirq_exit(cpu) (local_irq_count[cpu]--)
diff --git a/include/asm-m68k/init.h b/include/asm-m68k/init.h
index 42938ae89..93a323fd6 100644
--- a/include/asm-m68k/init.h
+++ b/include/asm-m68k/init.h
@@ -1,14 +1,14 @@
#ifndef _M68K_INIT_H
#define _M68K_INIT_H
-/* Throwing the initialization code and data out is not supported yet... */
-
-#define __init
-#define __initdata
-#define __initfunc(__arginit) __arginit
+#define __init __attribute__ ((__section__ (".text.init")))
+#define __initdata __attribute__ ((__section__ (".data.init")))
+#define __initfunc(__arginit) \
+ __arginit __init; \
+ __arginit
/* For assembly routines */
-#define __INIT
-#define __FINIT
-#define __INITDATA
+#define __INIT .section ".text.init",#alloc,#execinstr
+#define __FINIT .previous
+#define __INITDATA .section ".data.init",#alloc,#write
#endif
diff --git a/include/asm-m68k/keyboard.h b/include/asm-m68k/keyboard.h
index 6c8c0abff..e4c602263 100644
--- a/include/asm-m68k/keyboard.h
+++ b/include/asm-m68k/keyboard.h
@@ -13,10 +13,44 @@
#ifdef __KERNEL__
-#define TRANSLATE_SCANCODES 0
-#define USE_MACHDEP_ABSTRACTION 1
#include <asm/machdep.h>
+static __inline__ int kbd_setkeycode(unsigned int scancode,
+ unsigned int keycode)
+{
+ return -EOPNOTSUPP;
+}
+
+static __inline__ int kbd_getkeycode(unsigned int scancode)
+{
+ return -EOPNOTSUPP;
+}
+
+static __inline__ int kbd_pretranslate(unsigned char scancode, char raw_mode)
+{
+ return 1;
+}
+
+static __inline__ int kbd_translate(unsigned char scancode,
+ unsigned char *keycode, char raw_mode)
+{
+ *keycode = scancode;
+ return 1;
+}
+
+static __inline__ char kbd_unexpected_up(unsigned char keycode)
+{
+ return 0200;
+}
+
+static __inline__ void kbd_leds(unsigned char leds)
+{
+ if (mach_kbd_leds)
+ mach_kbd_leds(leds);
+}
+
+#define kbd_init_hw mach_keyb_init
+
#endif /* __KERNEL__ */
#endif /* __ASMm68k_KEYBOARD_H */
diff --git a/include/asm-m68k/namei.h b/include/asm-m68k/namei.h
index 516066f1a..13502e13e 100644
--- a/include/asm-m68k/namei.h
+++ b/include/asm-m68k/namei.h
@@ -19,24 +19,3 @@
do { } while (0)
#endif
-/*
- * linux/include/asm-m68k/namei.h
- *
- * Included from linux/fs/namei.c
- */
-
-#ifndef __M68K_NAMEI_H
-#define __M68K_NAMEI_H
-
-/* These dummy routines maybe changed to something useful
- * for /usr/gnemul/ emulation stuff.
- * Look at asm-sparc/namei.h for details.
- */
-
-#define translate_namei(pathname, base, follow_links, res_inode) \
- do { } while (0)
-
-#define translate_open_namei(pathname, flag, mode, res_inode, base) \
- do { } while (0)
-
-#endif
diff --git a/include/asm-m68k/pgtable.h b/include/asm-m68k/pgtable.h
index cd5cef191..9463700a3 100644
--- a/include/asm-m68k/pgtable.h
+++ b/include/asm-m68k/pgtable.h
@@ -175,7 +175,7 @@ extern inline void flush_pages_to_ram (unsigned long address, int n)
}
/*
- * flush all atc entries (user-space entries only for the 680[46]0).
+ * flush all user-space atc entries.
*/
static inline void __flush_tlb(void)
{
@@ -184,7 +184,7 @@ static inline void __flush_tlb(void)
"pflushan\n\t"
".chip 68k");
else
- __asm__ __volatile__("pflusha");
+ __asm__ __volatile__("pflush #0,#4");
}
static inline void __flush_tlb_one(unsigned long addr)
diff --git a/include/asm-m68k/poll.h b/include/asm-m68k/poll.h
index 9b52915d0..f66153a74 100644
--- a/include/asm-m68k/poll.h
+++ b/include/asm-m68k/poll.h
@@ -19,24 +19,3 @@ struct pollfd {
};
#endif
-#ifndef __m68k_POLL_H
-#define __m68k_POLL_H
-
-#define POLLIN 1
-#define POLLPRI 2
-#define POLLOUT 4
-#define POLLERR 8
-#define POLLHUP 16
-#define POLLNVAL 32
-#define POLLRDNORM 64
-#define POLLWRNORM POLLOUT
-#define POLLRDBAND 128
-#define POLLWRBAND 256
-
-struct pollfd {
- int fd;
- short events;
- short revents;
-};
-
-#endif
diff --git a/include/asm-m68k/processor.h b/include/asm-m68k/processor.h
index 7b6622e89..9ec6df6e8 100644
--- a/include/asm-m68k/processor.h
+++ b/include/asm-m68k/processor.h
@@ -44,10 +44,10 @@ struct thread_struct {
unsigned char fpstate[FPSTATESIZE]; /* floating point state */
};
-#define INIT_MMAP { &init_mm, 0, 0x40000000, __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED), VM_READ | VM_WRITE | VM_EXEC }
+#define INIT_MMAP { &init_mm, 0, 0x40000000, __pgprot(_PAGE_PRESENT|_PAGE_ACCESSED), VM_READ | VM_WRITE | VM_EXEC, NULL, &init_mm.mmap }
#define INIT_TSS { \
- sizeof(init_kernel_stack) + (long) init_kernel_stack, 0, \
+ sizeof(init_stack) + (unsigned long) init_stack, 0, \
PS_S, KERNEL_DS, \
{0, 0}, 0, {0,}, {0, 0, 0}, {0,}, \
}
@@ -93,10 +93,12 @@ extern inline unsigned long thread_saved_pc(struct thread_struct *t)
}
/* Allocation and freeing of basic task resources. */
-#define alloc_task_struct() kmalloc(sizeof(struct task_struct), GFP_KERNEL)
-#define alloc_kernel_stack(p) __get_free_page(GFP_KERNEL)
-#define free_task_struct(p) kfree(p)
-#define free_kernel_stack(page) free_page((page))
+#define alloc_task_struct() \
+ ((struct task_struct *) __get_free_pages(GFP_KERNEL,1,0))
+#define free_task_struct(p) free_pages((unsigned long)(p),1)
+
+#define init_task (init_task_union.task)
+#define init_stack (init_task_union.stack)
/*
* Return_address is a replacement for __builtin_return_address(count)
diff --git a/include/asm-m68k/ptrace.h b/include/asm-m68k/ptrace.h
index 449b7bd8e..e0c9d0ac2 100644
--- a/include/asm-m68k/ptrace.h
+++ b/include/asm-m68k/ptrace.h
@@ -34,6 +34,7 @@ struct pt_regs {
long d5;
long a0;
long a1;
+ long a2;
long d0;
long orig_d0;
long stkadj;
@@ -50,7 +51,6 @@ struct pt_regs {
struct switch_stack {
unsigned long d6;
unsigned long d7;
- unsigned long a2;
unsigned long a3;
unsigned long a4;
unsigned long a5;
diff --git a/include/asm-m68k/semaphore.h b/include/asm-m68k/semaphore.h
index c4e3068fa..7890c4f19 100644
--- a/include/asm-m68k/semaphore.h
+++ b/include/asm-m68k/semaphore.h
@@ -1,6 +1,7 @@
#ifndef _M68K_SEMAPHORE_H
#define _M68K_SEMAPHORE_H
+#include <linux/config.h>
#include <linux/linkage.h>
#include <asm/system.h>
#include <asm/atomic.h>
@@ -38,6 +39,7 @@ static inline void wake_one_more(struct semaphore * sem)
static inline int waking_non_zero(struct semaphore *sem)
{
+#ifndef CONFIG_RMW_INSNS
unsigned long flags;
int ret = 0;
@@ -48,6 +50,21 @@ static inline int waking_non_zero(struct semaphore *sem)
ret = 1;
}
restore_flags(flags);
+#else
+ int ret, tmp;
+
+ __asm__ __volatile__
+ ("1: movel %2,%0\n"
+ " jeq 3f\n"
+ "2: movel %0,%1\n"
+ " subql #1,%1\n"
+ " casl %0,%1,%2\n"
+ " jeq 3f\n"
+ " tstl %0\n"
+ " jne 2b\n"
+ "3:"
+ : "=d" (ret), "=d" (tmp), "=m" (sem->waking));
+#endif
return ret;
}
@@ -56,41 +73,26 @@ static inline int waking_non_zero(struct semaphore *sem)
* "down_failed" is a special asm handler that calls the C
* routine that actually waits. See arch/m68k/lib/semaphore.S
*/
-extern inline void down(struct semaphore * sem)
+extern inline void do_down(struct semaphore * sem, void (*failed)(void))
{
register struct semaphore *sem1 __asm__ ("%a1") = sem;
__asm__ __volatile__(
"| atomic down operation\n\t"
- "lea %%pc@(1f),%%a0\n\t"
"subql #1,%0@\n\t"
- "jmi " SYMBOL_NAME_STR(__down_failed) "\n"
- "1:"
+ "jmi 2f\n"
+ "1:\n"
+ ".section .text.lock,\"ax\"\n"
+ ".even\n"
+ "2:\tpea 1b\n\t"
+ "jbra %1\n"
+ ".previous"
: /* no outputs */
- : "a" (sem1)
- : "%a0", "memory");
+ : "a" (sem1), "m" (*(unsigned char *)failed)
+ : "memory");
}
-/*
- * This version waits in interruptible state so that the waiting
- * process can be killed. The down_failed_interruptible routine
- * returns negative for signalled and zero for semaphore acquired.
- */
-extern inline int down_interruptible(struct semaphore * sem)
-{
- register int ret __asm__ ("%d0");
- register struct semaphore *sem1 __asm__ ("%a1") = sem;
- __asm__ __volatile__(
- "| atomic interruptible down operation\n\t"
- "lea %%pc@(1f),%%a0\n\t"
- "subql #1,%1@\n\t"
- "jmi " SYMBOL_NAME_STR(__down_failed_interruptible) "\n\t"
- "clrl %0\n"
- "1:"
- : "=d" (ret)
- : "a" (sem1)
- : "%d0", "%a0", "memory");
- return ret;
-}
+#define down(sem) do_down((sem),__down_failed)
+#define down_interruptible(sem) do_down((sem),__down_failed_interruptible)
/*
* Note! This is subtle. We jump to wake people up only if
@@ -103,13 +105,17 @@ extern inline void up(struct semaphore * sem)
register struct semaphore *sem1 __asm__ ("%a1") = sem;
__asm__ __volatile__(
"| atomic up operation\n\t"
- "lea %%pc@(1f),%%a0\n\t"
- "addql #1,%0\n\t"
- "jle " SYMBOL_NAME_STR(__up_wakeup) "\n"
- "1:"
+ "addql #1,%0@\n\t"
+ "jle 2f\n"
+ "1:\n"
+ ".section .text.lock,\"ax\"\n"
+ ".even\n"
+ "2:\tpea 1b\n\t"
+ "jbra %1\n"
+ ".previous"
: /* no outputs */
- : "m" (sem->count), "a" (sem1)
- : "%a0", "memory");
+ : "a" (sem1), "m" (*(unsigned char *)__up_wakeup)
+ : "memory");
}
#endif
diff --git a/include/asm-m68k/sigcontext.h b/include/asm-m68k/sigcontext.h
index 9c13b0951..a2d28c218 100644
--- a/include/asm-m68k/sigcontext.h
+++ b/include/asm-m68k/sigcontext.h
@@ -1,8 +1,6 @@
#ifndef _ASM_M68k_SIGCONTEXT_H
#define _ASM_M68k_SIGCONTEXT_H
-#include<asm/fpu.h>
-
struct sigcontext {
unsigned long sc_mask; /* old sigmask */
unsigned long sc_usp; /* old user stack pointer */
@@ -15,7 +13,7 @@ struct sigcontext {
unsigned short sc_formatvec;
unsigned long sc_fpregs[2*3]; /* room for two fp registers */
unsigned long sc_fpcntl[3];
- unsigned char sc_fpstate[FPSTATESIZE];
+ unsigned char sc_fpstate[216];
};
#endif
diff --git a/include/asm-m68k/smp_lock.h b/include/asm-m68k/smp_lock.h
index 158de0988..6bc9a781b 100644
--- a/include/asm-m68k/smp_lock.h
+++ b/include/asm-m68k/smp_lock.h
@@ -12,17 +12,3 @@
#define reacquire_kernel_lock(task, cpu, depth) do { } while(0)
#endif
-#ifndef __M68K_SMPLOCK_H
-#define __M68K_SMPLOCK_H
-
-/*
- * We don't do SMP so this is again one of these silly dummy files
- * to keep the kernel source looking nice ;-(.
- */
-
-#define lock_kernel() do { } while(0)
-#define unlock_kernel() do { } while(0)
-#define release_kernel_lock(task, cpu, depth) ((depth) = 1)
-#define reaquire_kernel_lock(task, cpu, depth) do { } while(0)
-
-#endif
diff --git a/include/asm-m68k/softirq.h b/include/asm-m68k/softirq.h
index 32f12c0d5..1cc0cbb81 100644
--- a/include/asm-m68k/softirq.h
+++ b/include/asm-m68k/softirq.h
@@ -4,6 +4,9 @@
/*
* Software interrupts.. no SMP here either.
*/
+
+#include <asm/atomic.h>
+
#define get_active_bhs() (bh_mask & bh_active)
#define clear_active_bhs(x) atomic_clear_mask((x),&bh_active)
@@ -14,12 +17,6 @@ extern inline void init_bh(int nr, void (*routine)(void))
bh_mask |= 1 << nr;
}
-extern inline void remove_bh(int nr)
-{
- bh_base[nr] = NULL;
- bh_mask &= ~(1 << nr);
-}
-
extern inline void mark_bh(int nr)
{
set_bit(nr, &bh_active);
@@ -41,60 +38,10 @@ extern inline void enable_bh(int nr)
bh_mask |= 1 << nr;
}
-extern int __m68k_bh_counter;
-
-extern inline void start_bh_atomic(void)
-{
- __m68k_bh_counter++;
- barrier();
-}
-
-extern inline void end_bh_atomic(void)
-{
- barrier();
- __m68k_bh_counter--;
-}
-
-/* These are for the irq's testing the lock */
-#define softirq_trylock() (__m68k_bh_counter ? 0 : (__m68k_bh_counter=1))
-#define softirq_endlock() (__m68k_bh_counter = 0)
-
-#endif
-#ifndef __M68K_SOFTIRQ_H
-#define __M68K_SOFTIRQ_H
-
-/*
- * Software interrupts.. no SMP here either.
- */
-#define get_active_bhs() (bh_mask & bh_active)
-#define clear_active_bhs(x) atomic_clear_mask((x),&bh_active)
-
-extern inline void init_bh(int nr, void (*routine)(void))
-{
- bh_base[nr] = routine;
- bh_mask_count[nr] = 0;
- bh_mask |= 1 << nr;
-}
-
-extern inline void mark_bh(int nr)
-{
- set_bit(nr, &bh_active);
-}
-
-/*
- * These use a mask count to correctly handle
- * nested disable/enable calls
- */
-extern inline void disable_bh(int nr)
+extern inline void remove_bh(int nr)
{
+ bh_base[nr] = NULL;
bh_mask &= ~(1 << nr);
- bh_mask_count[nr]++;
-}
-
-extern inline void enable_bh(int nr)
-{
- if (!--bh_mask_count[nr])
- bh_mask |= 1 << nr;
}
extern int __m68k_bh_counter;
diff --git a/include/asm-m68k/spinlock.h b/include/asm-m68k/spinlock.h
index cbae3d62d..83a04ac7f 100644
--- a/include/asm-m68k/spinlock.h
+++ b/include/asm-m68k/spinlock.h
@@ -5,8 +5,8 @@
* We don't do SMP on the m68k .... at least not yet.
*/
-typedef struct { } spinlock_t;
-#define SPIN_LOCK_UNLOCKED { }
+typedef struct { int dummy; } spinlock_t;
+#define SPIN_LOCK_UNLOCKED { 0 }
#define spin_lock_init(lock) do { } while(0)
#define spin_lock(lock) do { } while(0)
@@ -31,8 +31,8 @@ typedef struct { } spinlock_t;
* irq-safe write-lock, but readers can get non-irqsafe
* read-locks.
*/
-typedef struct { } rwlock_t;
-#define RW_LOCK_UNLOCKED { }
+typedef struct { int dummy; } rwlock_t;
+#define RW_LOCK_UNLOCKED { 0 }
#define read_lock(lock) do { } while(0)
#define read_unlock(lock) do { } while(0)
@@ -49,26 +49,3 @@ typedef struct { } rwlock_t;
#define write_unlock_irqrestore(lock, flags) restore_flags(flags)
#endif
-#ifndef __M68K_SPINLOCK_H
-#define __M68K_SPINLOCK_H
-
-/*
- * We don't do SMP on the m68k .... at least not yet.
- */
-
-typedef struct { } spinlock_t;
-#define SPIN_LOCK_UNLOCKED { }
-
-#define spin_lock_init(lock) do { } while(0)
-#define spin_lock(lock) do { } while(0)
-#define spin_trylock(lock) do { } while(0)
-#define spin_unlock(lock) do { } while(0)
-#define spin_lock_irq(lock) cli()
-#define spin_unlock_irq(lock) sti()
-
-#define spin_lock_irqsave(lock, flags) \
- do { save_flags(flags); cli(); } while (0)
-#define spin_unlock_irqrestore(lock, flags) \
- restore_flags(flags)
-
-#endif
diff --git a/include/asm-m68k/system.h b/include/asm-m68k/system.h
index dc9024b73..fd2eb8991 100644
--- a/include/asm-m68k/system.h
+++ b/include/asm-m68k/system.h
@@ -83,6 +83,7 @@ __asm__ __volatile__("movew %0,%/sr": /* no outputs */ :"d" (x) : "memory")
#define sti() __sti()
#define save_flags(x) __save_flags(x)
#define restore_flags(x) __restore_flags(x)
+#define save_and_cli(flags) do { save_flags(flags); cli(); } while(0)
#ifndef CONFIG_RMW_INSNS
static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int size)
diff --git a/include/asm-m68k/unistd.h b/include/asm-m68k/unistd.h
index c526da9ef..9ebe62ff4 100644
--- a/include/asm-m68k/unistd.h
+++ b/include/asm-m68k/unistd.h
@@ -322,9 +322,11 @@ static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long f
set_fs (KERNEL_DS);
__asm__ __volatile__
- ("trap #0\n\t" /* Linux/m68k system call */
+ ("clrl %%d2\n\t"
+ "trap #0\n\t" /* Linux/m68k system call */
"tstl %0\n\t" /* child or parent */
"jne 1f\n\t" /* parent - jump */
+ "lea %%sp@(-8192),%6\n\t" /* reload current */
"movel %3,%%sp@-\n\t" /* push argument */
"jsr %4@\n\t" /* call fn */
"movel %0,%%d1\n\t" /* pass exit value */
@@ -333,8 +335,8 @@ static inline pid_t kernel_thread(int (*fn)(void *), void * arg, unsigned long f
"1:"
: "=d" (retval)
: "0" (__NR_clone), "i" (__NR_exit),
- "r" (arg), "a" (fn), "d" (clone_arg)
- : "d0");
+ "r" (arg), "a" (fn), "d" (clone_arg), "r" (current)
+ : "d0", "d2");
set_fs (fs);
return retval;