diff options
Diffstat (limited to 'include/asm-m68k')
-rw-r--r-- | include/asm-m68k/atomic.h | 2 | ||||
-rw-r--r-- | include/asm-m68k/bitops.h | 24 | ||||
-rw-r--r-- | include/asm-m68k/current.h | 8 | ||||
-rw-r--r-- | include/asm-m68k/dsp56k.h | 35 | ||||
-rw-r--r-- | include/asm-m68k/elf.h | 2 | ||||
-rw-r--r-- | include/asm-m68k/fpu.h | 20 | ||||
-rw-r--r-- | include/asm-m68k/hardirq.h | 17 | ||||
-rw-r--r-- | include/asm-m68k/init.h | 16 | ||||
-rw-r--r-- | include/asm-m68k/keyboard.h | 38 | ||||
-rw-r--r-- | include/asm-m68k/namei.h | 21 | ||||
-rw-r--r-- | include/asm-m68k/pgtable.h | 4 | ||||
-rw-r--r-- | include/asm-m68k/poll.h | 21 | ||||
-rw-r--r-- | include/asm-m68k/processor.h | 14 | ||||
-rw-r--r-- | include/asm-m68k/ptrace.h | 2 | ||||
-rw-r--r-- | include/asm-m68k/semaphore.h | 72 | ||||
-rw-r--r-- | include/asm-m68k/sigcontext.h | 4 | ||||
-rw-r--r-- | include/asm-m68k/smp_lock.h | 14 | ||||
-rw-r--r-- | include/asm-m68k/softirq.h | 63 | ||||
-rw-r--r-- | include/asm-m68k/spinlock.h | 31 | ||||
-rw-r--r-- | include/asm-m68k/system.h | 1 | ||||
-rw-r--r-- | include/asm-m68k/unistd.h | 8 |
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; |