diff options
Diffstat (limited to 'include/asm-arm26')
-rw-r--r-- | include/asm-arm26/atomic.h | 2 | ||||
-rw-r--r-- | include/asm-arm26/cache.h | 3 | ||||
-rw-r--r-- | include/asm-arm26/futex.h | 49 | ||||
-rw-r--r-- | include/asm-arm26/ioctl.h | 75 | ||||
-rw-r--r-- | include/asm-arm26/system.h | 12 | ||||
-rw-r--r-- | include/asm-arm26/thread_info.h | 12 |
6 files changed, 21 insertions, 132 deletions
diff --git a/include/asm-arm26/atomic.h b/include/asm-arm26/atomic.h index 3074b0e76343..1552c8653990 100644 --- a/include/asm-arm26/atomic.h +++ b/include/asm-arm26/atomic.h | |||
@@ -76,6 +76,8 @@ static inline int atomic_cmpxchg(atomic_t *v, int old, int new) | |||
76 | return ret; | 76 | return ret; |
77 | } | 77 | } |
78 | 78 | ||
79 | #define atomic_xchg(v, new) (xchg(&((v)->counter), new)) | ||
80 | |||
79 | static inline int atomic_add_unless(atomic_t *v, int a, int u) | 81 | static inline int atomic_add_unless(atomic_t *v, int a, int u) |
80 | { | 82 | { |
81 | int ret; | 83 | int ret; |
diff --git a/include/asm-arm26/cache.h b/include/asm-arm26/cache.h index f52ca1b808cd..8c3abcf728fe 100644 --- a/include/asm-arm26/cache.h +++ b/include/asm-arm26/cache.h | |||
@@ -4,7 +4,8 @@ | |||
4 | #ifndef __ASMARM_CACHE_H | 4 | #ifndef __ASMARM_CACHE_H |
5 | #define __ASMARM_CACHE_H | 5 | #define __ASMARM_CACHE_H |
6 | 6 | ||
7 | #define L1_CACHE_BYTES 32 | 7 | #define L1_CACHE_SHIFT 5 |
8 | #define L1_CACHE_BYTES (1 << L1_CACHE_SHIFT) | ||
8 | #define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)) | 9 | #define L1_CACHE_ALIGN(x) (((x)+(L1_CACHE_BYTES-1))&~(L1_CACHE_BYTES-1)) |
9 | #define SMP_CACHE_BYTES L1_CACHE_BYTES | 10 | #define SMP_CACHE_BYTES L1_CACHE_BYTES |
10 | 11 | ||
diff --git a/include/asm-arm26/futex.h b/include/asm-arm26/futex.h index 9feff4ce1424..6a332a9f099c 100644 --- a/include/asm-arm26/futex.h +++ b/include/asm-arm26/futex.h | |||
@@ -1,53 +1,6 @@ | |||
1 | #ifndef _ASM_FUTEX_H | 1 | #ifndef _ASM_FUTEX_H |
2 | #define _ASM_FUTEX_H | 2 | #define _ASM_FUTEX_H |
3 | 3 | ||
4 | #ifdef __KERNEL__ | 4 | #include <asm-generic/futex.h> |
5 | 5 | ||
6 | #include <linux/futex.h> | ||
7 | #include <asm/errno.h> | ||
8 | #include <asm/uaccess.h> | ||
9 | |||
10 | static inline int | ||
11 | futex_atomic_op_inuser (int encoded_op, int __user *uaddr) | ||
12 | { | ||
13 | int op = (encoded_op >> 28) & 7; | ||
14 | int cmp = (encoded_op >> 24) & 15; | ||
15 | int oparg = (encoded_op << 8) >> 20; | ||
16 | int cmparg = (encoded_op << 20) >> 20; | ||
17 | int oldval = 0, ret; | ||
18 | if (encoded_op & (FUTEX_OP_OPARG_SHIFT << 28)) | ||
19 | oparg = 1 << oparg; | ||
20 | |||
21 | if (! access_ok (VERIFY_WRITE, uaddr, sizeof(int))) | ||
22 | return -EFAULT; | ||
23 | |||
24 | inc_preempt_count(); | ||
25 | |||
26 | switch (op) { | ||
27 | case FUTEX_OP_SET: | ||
28 | case FUTEX_OP_ADD: | ||
29 | case FUTEX_OP_OR: | ||
30 | case FUTEX_OP_ANDN: | ||
31 | case FUTEX_OP_XOR: | ||
32 | default: | ||
33 | ret = -ENOSYS; | ||
34 | } | ||
35 | |||
36 | dec_preempt_count(); | ||
37 | |||
38 | if (!ret) { | ||
39 | switch (cmp) { | ||
40 | case FUTEX_OP_CMP_EQ: ret = (oldval == cmparg); break; | ||
41 | case FUTEX_OP_CMP_NE: ret = (oldval != cmparg); break; | ||
42 | case FUTEX_OP_CMP_LT: ret = (oldval < cmparg); break; | ||
43 | case FUTEX_OP_CMP_GE: ret = (oldval >= cmparg); break; | ||
44 | case FUTEX_OP_CMP_LE: ret = (oldval <= cmparg); break; | ||
45 | case FUTEX_OP_CMP_GT: ret = (oldval > cmparg); break; | ||
46 | default: ret = -ENOSYS; | ||
47 | } | ||
48 | } | ||
49 | return ret; | ||
50 | } | ||
51 | |||
52 | #endif | ||
53 | #endif | 6 | #endif |
diff --git a/include/asm-arm26/ioctl.h b/include/asm-arm26/ioctl.h index 2cbb7d0e9dc6..b279fe06dfe5 100644 --- a/include/asm-arm26/ioctl.h +++ b/include/asm-arm26/ioctl.h | |||
@@ -1,74 +1 @@ | |||
1 | /* | #include <asm-generic/ioctl.h> | |
2 | * linux/ioctl.h for Linux by H.H. Bergman. | ||
3 | */ | ||
4 | |||
5 | #ifndef _ASMARM_IOCTL_H | ||
6 | #define _ASMARM_IOCTL_H | ||
7 | |||
8 | /* ioctl command encoding: 32 bits total, command in lower 16 bits, | ||
9 | * size of the parameter structure in the lower 14 bits of the | ||
10 | * upper 16 bits. | ||
11 | * Encoding the size of the parameter structure in the ioctl request | ||
12 | * is useful for catching programs compiled with old versions | ||
13 | * and to avoid overwriting user space outside the user buffer area. | ||
14 | * The highest 2 bits are reserved for indicating the ``access mode''. | ||
15 | * NOTE: This limits the max parameter size to 16kB -1 ! | ||
16 | */ | ||
17 | |||
18 | /* | ||
19 | * The following is for compatibility across the various Linux | ||
20 | * platforms. The i386 ioctl numbering scheme doesn't really enforce | ||
21 | * a type field. De facto, however, the top 8 bits of the lower 16 | ||
22 | * bits are indeed used as a type field, so we might just as well make | ||
23 | * this explicit here. Please be sure to use the decoding macros | ||
24 | * below from now on. | ||
25 | */ | ||
26 | #define _IOC_NRBITS 8 | ||
27 | #define _IOC_TYPEBITS 8 | ||
28 | #define _IOC_SIZEBITS 14 | ||
29 | #define _IOC_DIRBITS 2 | ||
30 | |||
31 | #define _IOC_NRMASK ((1 << _IOC_NRBITS)-1) | ||
32 | #define _IOC_TYPEMASK ((1 << _IOC_TYPEBITS)-1) | ||
33 | #define _IOC_SIZEMASK ((1 << _IOC_SIZEBITS)-1) | ||
34 | #define _IOC_DIRMASK ((1 << _IOC_DIRBITS)-1) | ||
35 | |||
36 | #define _IOC_NRSHIFT 0 | ||
37 | #define _IOC_TYPESHIFT (_IOC_NRSHIFT+_IOC_NRBITS) | ||
38 | #define _IOC_SIZESHIFT (_IOC_TYPESHIFT+_IOC_TYPEBITS) | ||
39 | #define _IOC_DIRSHIFT (_IOC_SIZESHIFT+_IOC_SIZEBITS) | ||
40 | |||
41 | /* | ||
42 | * Direction bits. | ||
43 | */ | ||
44 | #define _IOC_NONE 0U | ||
45 | #define _IOC_WRITE 1U | ||
46 | #define _IOC_READ 2U | ||
47 | |||
48 | #define _IOC(dir,type,nr,size) \ | ||
49 | (((dir) << _IOC_DIRSHIFT) | \ | ||
50 | ((type) << _IOC_TYPESHIFT) | \ | ||
51 | ((nr) << _IOC_NRSHIFT) | \ | ||
52 | ((size) << _IOC_SIZESHIFT)) | ||
53 | |||
54 | /* used to create numbers */ | ||
55 | #define _IO(type,nr) _IOC(_IOC_NONE,(type),(nr),0) | ||
56 | #define _IOR(type,nr,size) _IOC(_IOC_READ,(type),(nr),sizeof(size)) | ||
57 | #define _IOW(type,nr,size) _IOC(_IOC_WRITE,(type),(nr),sizeof(size)) | ||
58 | #define _IOWR(type,nr,size) _IOC(_IOC_READ|_IOC_WRITE,(type),(nr),sizeof(size)) | ||
59 | |||
60 | /* used to decode ioctl numbers.. */ | ||
61 | #define _IOC_DIR(nr) (((nr) >> _IOC_DIRSHIFT) & _IOC_DIRMASK) | ||
62 | #define _IOC_TYPE(nr) (((nr) >> _IOC_TYPESHIFT) & _IOC_TYPEMASK) | ||
63 | #define _IOC_NR(nr) (((nr) >> _IOC_NRSHIFT) & _IOC_NRMASK) | ||
64 | #define _IOC_SIZE(nr) (((nr) >> _IOC_SIZESHIFT) & _IOC_SIZEMASK) | ||
65 | |||
66 | /* ...and for the drivers/sound files... */ | ||
67 | |||
68 | #define IOC_IN (_IOC_WRITE << _IOC_DIRSHIFT) | ||
69 | #define IOC_OUT (_IOC_READ << _IOC_DIRSHIFT) | ||
70 | #define IOC_INOUT ((_IOC_WRITE|_IOC_READ) << _IOC_DIRSHIFT) | ||
71 | #define IOCSIZE_MASK (_IOC_SIZEMASK << _IOC_SIZESHIFT) | ||
72 | #define IOCSIZE_SHIFT (_IOC_SIZESHIFT) | ||
73 | |||
74 | #endif /* _ASMARM_IOCTL_H */ | ||
diff --git a/include/asm-arm26/system.h b/include/asm-arm26/system.h index f23fac1938f3..ca4ccfc4b578 100644 --- a/include/asm-arm26/system.h +++ b/include/asm-arm26/system.h | |||
@@ -111,10 +111,20 @@ extern struct task_struct *__switch_to(struct task_struct *, struct thread_info | |||
111 | 111 | ||
112 | #define switch_to(prev,next,last) \ | 112 | #define switch_to(prev,next,last) \ |
113 | do { \ | 113 | do { \ |
114 | last = __switch_to(prev,prev->thread_info,next->thread_info); \ | 114 | last = __switch_to(prev,task_thread_info(prev),task_thread_info(next)); \ |
115 | } while (0) | 115 | } while (0) |
116 | 116 | ||
117 | /* | 117 | /* |
118 | * On SMP systems, when the scheduler does migration-cost autodetection, | ||
119 | * it needs a way to flush as much of the CPU's caches as possible. | ||
120 | * | ||
121 | * TODO: fill this in! | ||
122 | */ | ||
123 | static inline void sched_cacheflush(void) | ||
124 | { | ||
125 | } | ||
126 | |||
127 | /* | ||
118 | * Save the current interrupt enable state & disable IRQs | 128 | * Save the current interrupt enable state & disable IRQs |
119 | */ | 129 | */ |
120 | #define local_irq_save(x) \ | 130 | #define local_irq_save(x) \ |
diff --git a/include/asm-arm26/thread_info.h b/include/asm-arm26/thread_info.h index aff3e5699c64..9b367ebe515d 100644 --- a/include/asm-arm26/thread_info.h +++ b/include/asm-arm26/thread_info.h | |||
@@ -80,20 +80,16 @@ static inline struct thread_info *current_thread_info(void) | |||
80 | return (struct thread_info *)(sp & ~0x1fff); | 80 | return (struct thread_info *)(sp & ~0x1fff); |
81 | } | 81 | } |
82 | 82 | ||
83 | /* FIXME - PAGE_SIZE < 32K */ | 83 | #define THREAD_SIZE PAGE_SIZE |
84 | #define THREAD_SIZE (8*32768) // FIXME - this needs attention (see kernel/fork.c which gets a nice div by zero if this is lower than 8*32768 | 84 | #define task_pt_regs(task) ((struct pt_regs *)(task_stack_page(task) + THREAD_SIZE - 8) - 1) |
85 | #define __get_user_regs(x) (((struct pt_regs *)((unsigned long)(x) + THREAD_SIZE - 8)) - 1) | ||
86 | 85 | ||
87 | extern struct thread_info *alloc_thread_info(struct task_struct *task); | 86 | extern struct thread_info *alloc_thread_info(struct task_struct *task); |
88 | extern void free_thread_info(struct thread_info *); | 87 | extern void free_thread_info(struct thread_info *); |
89 | 88 | ||
90 | #define get_thread_info(ti) get_task_struct((ti)->task) | ||
91 | #define put_thread_info(ti) put_task_struct((ti)->task) | ||
92 | |||
93 | #define thread_saved_pc(tsk) \ | 89 | #define thread_saved_pc(tsk) \ |
94 | ((unsigned long)(pc_pointer((tsk)->thread_info->cpu_context.pc))) | 90 | ((unsigned long)(pc_pointer(task_thread_info(tsk)->cpu_context.pc))) |
95 | #define thread_saved_fp(tsk) \ | 91 | #define thread_saved_fp(tsk) \ |
96 | ((unsigned long)((tsk)->thread_info->cpu_context.fp)) | 92 | ((unsigned long)(task_thread_info(tsk)->cpu_context.fp)) |
97 | 93 | ||
98 | #else /* !__ASSEMBLY__ */ | 94 | #else /* !__ASSEMBLY__ */ |
99 | 95 | ||