aboutsummaryrefslogtreecommitdiffstats
path: root/arch/cris
diff options
context:
space:
mode:
Diffstat (limited to 'arch/cris')
-rw-r--r--arch/cris/Kconfig8
-rw-r--r--arch/cris/arch-v10/kernel/signal.c50
-rw-r--r--arch/cris/arch-v32/kernel/signal.c66
-rw-r--r--arch/cris/arch-v32/kernel/smp.c14
-rw-r--r--arch/cris/include/asm/processor.h9
-rw-r--r--arch/cris/include/asm/thread_info.h6
-rw-r--r--arch/cris/kernel/process.c28
7 files changed, 38 insertions, 143 deletions
diff --git a/arch/cris/Kconfig b/arch/cris/Kconfig
index b3abfb08aa5c..22d34d64cc81 100644
--- a/arch/cris/Kconfig
+++ b/arch/cris/Kconfig
@@ -13,12 +13,6 @@ config RWSEM_GENERIC_SPINLOCK
13config RWSEM_XCHGADD_ALGORITHM 13config RWSEM_XCHGADD_ALGORITHM
14 bool 14 bool
15 15
16config GENERIC_CMOS_UPDATE
17 def_bool y
18
19config ARCH_USES_GETTIMEOFFSET
20 def_bool n
21
22config ARCH_HAS_ILOG2_U32 16config ARCH_HAS_ILOG2_U32
23 bool 17 bool
24 default n 18 default n
@@ -49,6 +43,8 @@ config CRIS
49 select HAVE_GENERIC_HARDIRQS 43 select HAVE_GENERIC_HARDIRQS
50 select GENERIC_IRQ_SHOW 44 select GENERIC_IRQ_SHOW
51 select GENERIC_IOMAP 45 select GENERIC_IOMAP
46 select GENERIC_SMP_IDLE_THREAD if ETRAX_ARCH_V32
47 select GENERIC_CMOS_UPDATE
52 48
53config HZ 49config HZ
54 int 50 int
diff --git a/arch/cris/arch-v10/kernel/signal.c b/arch/cris/arch-v10/kernel/signal.c
index 289c584ba499..e16f8f297f61 100644
--- a/arch/cris/arch-v10/kernel/signal.c
+++ b/arch/cris/arch-v10/kernel/signal.c
@@ -48,19 +48,11 @@ void do_signal(int canrestart, struct pt_regs *regs);
48 * dummy arguments to be able to reach the regs argument. (Note that this 48 * dummy arguments to be able to reach the regs argument. (Note that this
49 * arrangement relies on old_sigset_t occupying one register.) 49 * arrangement relies on old_sigset_t occupying one register.)
50 */ 50 */
51int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, 51int sys_sigsuspend(old_sigset_t mask)
52 long srp, struct pt_regs *regs)
53{ 52{
54 mask &= _BLOCKABLE; 53 sigset_t blocked;
55 spin_lock_irq(&current->sighand->siglock); 54 siginitset(&blocked, mask);
56 current->saved_sigmask = current->blocked; 55 return sigsuspend(&blocked);
57 siginitset(&current->blocked, mask);
58 recalc_sigpending();
59 spin_unlock_irq(&current->sighand->siglock);
60 current->state = TASK_INTERRUPTIBLE;
61 schedule();
62 set_thread_flag(TIF_RESTORE_SIGMASK);
63 return -ERESTARTNOHAND;
64} 56}
65 57
66int sys_sigaction(int sig, const struct old_sigaction __user *act, 58int sys_sigaction(int sig, const struct old_sigaction __user *act,
@@ -73,10 +65,10 @@ int sys_sigaction(int sig, const struct old_sigaction __user *act,
73 old_sigset_t mask; 65 old_sigset_t mask;
74 if (!access_ok(VERIFY_READ, act, sizeof(*act)) || 66 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
75 __get_user(new_ka.sa.sa_handler, &act->sa_handler) || 67 __get_user(new_ka.sa.sa_handler, &act->sa_handler) ||
76 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer)) 68 __get_user(new_ka.sa.sa_restorer, &act->sa_restorer) ||
69 __get_user(new_ka.sa.sa_flags, &act->sa_flags) ||
70 __get_user(mask, &act->sa_mask))
77 return -EFAULT; 71 return -EFAULT;
78 __get_user(new_ka.sa.sa_flags, &act->sa_flags);
79 __get_user(mask, &act->sa_mask);
80 siginitset(&new_ka.sa.sa_mask, mask); 72 siginitset(&new_ka.sa.sa_mask, mask);
81 } 73 }
82 74
@@ -85,10 +77,10 @@ int sys_sigaction(int sig, const struct old_sigaction __user *act,
85 if (!ret && oact) { 77 if (!ret && oact) {
86 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || 78 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
87 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) || 79 __put_user(old_ka.sa.sa_handler, &oact->sa_handler) ||
88 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer)) 80 __put_user(old_ka.sa.sa_restorer, &oact->sa_restorer) ||
81 __put_user(old_ka.sa.sa_flags, &oact->sa_flags) ||
82 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask))
89 return -EFAULT; 83 return -EFAULT;
90 __put_user(old_ka.sa.sa_flags, &oact->sa_flags);
91 __put_user(old_ka.sa.sa_mask.sig[0], &oact->sa_mask);
92 } 84 }
93 85
94 return ret; 86 return ret;
@@ -185,10 +177,7 @@ asmlinkage int sys_sigreturn(long r10, long r11, long r12, long r13, long mof,
185 goto badframe; 177 goto badframe;
186 178
187 sigdelsetmask(&set, ~_BLOCKABLE); 179 sigdelsetmask(&set, ~_BLOCKABLE);
188 spin_lock_irq(&current->sighand->siglock); 180 set_current_blocked(&set);
189 current->blocked = set;
190 recalc_sigpending();
191 spin_unlock_irq(&current->sighand->siglock);
192 181
193 if (restore_sigcontext(regs, &frame->sc)) 182 if (restore_sigcontext(regs, &frame->sc))
194 goto badframe; 183 goto badframe;
@@ -224,10 +213,7 @@ asmlinkage int sys_rt_sigreturn(long r10, long r11, long r12, long r13,
224 goto badframe; 213 goto badframe;
225 214
226 sigdelsetmask(&set, ~_BLOCKABLE); 215 sigdelsetmask(&set, ~_BLOCKABLE);
227 spin_lock_irq(&current->sighand->siglock); 216 set_current_blocked(&set);
228 current->blocked = set;
229 recalc_sigpending();
230 spin_unlock_irq(&current->sighand->siglock);
231 217
232 if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) 218 if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
233 goto badframe; 219 goto badframe;
@@ -469,15 +455,9 @@ static inline int handle_signal(int canrestart, unsigned long sig,
469 else 455 else
470 ret = setup_frame(sig, ka, oldset, regs); 456 ret = setup_frame(sig, ka, oldset, regs);
471 457
472 if (ret == 0) { 458 if (ret == 0)
473 spin_lock_irq(&current->sighand->siglock); 459 block_sigmask(ka, sig);
474 sigorsets(&current->blocked, &current->blocked, 460
475 &ka->sa.sa_mask);
476 if (!(ka->sa.sa_flags & SA_NODEFER))
477 sigaddset(&current->blocked, sig);
478 recalc_sigpending();
479 spin_unlock_irq(&current->sighand->siglock);
480 }
481 return ret; 461 return ret;
482} 462}
483 463
diff --git a/arch/cris/arch-v32/kernel/signal.c b/arch/cris/arch-v32/kernel/signal.c
index ce4ab1a5552c..b338d8fc0c12 100644
--- a/arch/cris/arch-v32/kernel/signal.c
+++ b/arch/cris/arch-v32/kernel/signal.c
@@ -59,19 +59,11 @@ void keep_debug_flags(unsigned long oldccs, unsigned long oldspc,
59 * dummy arguments to be able to reach the regs argument. 59 * dummy arguments to be able to reach the regs argument.
60 */ 60 */
61int 61int
62sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, 62sys_sigsuspend(old_sigset_t mask)
63 long srp, struct pt_regs *regs)
64{ 63{
65 mask &= _BLOCKABLE; 64 sigset_t blocked;
66 spin_lock_irq(&current->sighand->siglock); 65 siginitset(&blocked, mask);
67 current->saved_sigmask = current->blocked; 66 return sigsuspend(&blocked);
68 siginitset(&current->blocked, mask);
69 recalc_sigpending();
70 spin_unlock_irq(&current->sighand->siglock);
71 current->state = TASK_INTERRUPTIBLE;
72 schedule();
73 set_thread_flag(TIF_RESTORE_SIGMASK);
74 return -ERESTARTNOHAND;
75} 67}
76 68
77int 69int
@@ -87,11 +79,11 @@ sys_sigaction(int signal, const struct old_sigaction *act,
87 79
88 if (!access_ok(VERIFY_READ, act, sizeof(*act)) || 80 if (!access_ok(VERIFY_READ, act, sizeof(*act)) ||
89 __get_user(newk.sa.sa_handler, &act->sa_handler) || 81 __get_user(newk.sa.sa_handler, &act->sa_handler) ||
90 __get_user(newk.sa.sa_restorer, &act->sa_restorer)) 82 __get_user(newk.sa.sa_restorer, &act->sa_restorer) ||
83 __get_user(newk.sa.sa_flags, &act->sa_flags) ||
84 __get_user(mask, &act->sa_mask))
91 return -EFAULT; 85 return -EFAULT;
92 86
93 __get_user(newk.sa.sa_flags, &act->sa_flags);
94 __get_user(mask, &act->sa_mask);
95 siginitset(&newk.sa.sa_mask, mask); 87 siginitset(&newk.sa.sa_mask, mask);
96 } 88 }
97 89
@@ -100,11 +92,11 @@ sys_sigaction(int signal, const struct old_sigaction *act,
100 if (!retval && oact) { 92 if (!retval && oact) {
101 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) || 93 if (!access_ok(VERIFY_WRITE, oact, sizeof(*oact)) ||
102 __put_user(oldk.sa.sa_handler, &oact->sa_handler) || 94 __put_user(oldk.sa.sa_handler, &oact->sa_handler) ||
103 __put_user(oldk.sa.sa_restorer, &oact->sa_restorer)) 95 __put_user(oldk.sa.sa_restorer, &oact->sa_restorer) ||
96 __put_user(oldk.sa.sa_flags, &oact->sa_flags) ||
97 __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask))
104 return -EFAULT; 98 return -EFAULT;
105 99
106 __put_user(oldk.sa.sa_flags, &oact->sa_flags);
107 __put_user(oldk.sa.sa_mask.sig[0], &oact->sa_mask);
108 } 100 }
109 101
110 return retval; 102 return retval;
@@ -176,12 +168,7 @@ sys_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
176 goto badframe; 168 goto badframe;
177 169
178 sigdelsetmask(&set, ~_BLOCKABLE); 170 sigdelsetmask(&set, ~_BLOCKABLE);
179 spin_lock_irq(&current->sighand->siglock); 171 set_current_blocked(&set);
180
181 current->blocked = set;
182
183 recalc_sigpending();
184 spin_unlock_irq(&current->sighand->siglock);
185 172
186 if (restore_sigcontext(regs, &frame->sc)) 173 if (restore_sigcontext(regs, &frame->sc))
187 goto badframe; 174 goto badframe;
@@ -222,12 +209,7 @@ sys_rt_sigreturn(long r10, long r11, long r12, long r13, long mof, long srp,
222 goto badframe; 209 goto badframe;
223 210
224 sigdelsetmask(&set, ~_BLOCKABLE); 211 sigdelsetmask(&set, ~_BLOCKABLE);
225 spin_lock_irq(&current->sighand->siglock); 212 set_current_blocked(&set);
226
227 current->blocked = set;
228
229 recalc_sigpending();
230 spin_unlock_irq(&current->sighand->siglock);
231 213
232 if (restore_sigcontext(regs, &frame->uc.uc_mcontext)) 214 if (restore_sigcontext(regs, &frame->uc.uc_mcontext))
233 goto badframe; 215 goto badframe;
@@ -363,10 +345,7 @@ setup_frame(int sig, struct k_sigaction *ka, sigset_t *set,
363 return 0; 345 return 0;
364 346
365give_sigsegv: 347give_sigsegv:
366 if (sig == SIGSEGV) 348 force_sigsegv(sig, current);
367 ka->sa.sa_handler = SIG_DFL;
368
369 force_sig(SIGSEGV, current);
370 return -EFAULT; 349 return -EFAULT;
371} 350}
372 351
@@ -450,10 +429,7 @@ setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
450 return 0; 429 return 0;
451 430
452give_sigsegv: 431give_sigsegv:
453 if (sig == SIGSEGV) 432 force_sigsegv(sig, current);
454 ka->sa.sa_handler = SIG_DFL;
455
456 force_sig(SIGSEGV, current);
457 return -EFAULT; 433 return -EFAULT;
458} 434}
459 435
@@ -512,18 +488,8 @@ handle_signal(int canrestart, unsigned long sig,
512 else 488 else
513 ret = setup_frame(sig, ka, oldset, regs); 489 ret = setup_frame(sig, ka, oldset, regs);
514 490
515 if (ka->sa.sa_flags & SA_ONESHOT) 491 if (ret == 0)
516 ka->sa.sa_handler = SIG_DFL; 492 block_sigmask(ka, sig);
517
518 if (ret == 0) {
519 spin_lock_irq(&current->sighand->siglock);
520 sigorsets(&current->blocked, &current->blocked,
521 &ka->sa.sa_mask);
522 if (!(ka->sa.sa_flags & SA_NODEFER))
523 sigaddset(&current->blocked, sig);
524 recalc_sigpending();
525 spin_unlock_irq(&current->sighand->siglock);
526 }
527 493
528 return ret; 494 return ret;
529} 495}
diff --git a/arch/cris/arch-v32/kernel/smp.c b/arch/cris/arch-v32/kernel/smp.c
index 0b99df72d2a4..ebe2cb30bd11 100644
--- a/arch/cris/arch-v32/kernel/smp.c
+++ b/arch/cris/arch-v32/kernel/smp.c
@@ -108,17 +108,12 @@ void __init smp_cpus_done(unsigned int max_cpus)
108 108
109/* Bring one cpu online.*/ 109/* Bring one cpu online.*/
110static int __init 110static int __init
111smp_boot_one_cpu(int cpuid) 111smp_boot_one_cpu(int cpuid, struct task_struct idle)
112{ 112{
113 unsigned timeout; 113 unsigned timeout;
114 struct task_struct *idle;
115 cpumask_t cpu_mask; 114 cpumask_t cpu_mask;
116 115
117 cpumask_clear(&cpu_mask); 116 cpumask_clear(&cpu_mask);
118 idle = fork_idle(cpuid);
119 if (IS_ERR(idle))
120 panic("SMP: fork failed for CPU:%d", cpuid);
121
122 task_thread_info(idle)->cpu = cpuid; 117 task_thread_info(idle)->cpu = cpuid;
123 118
124 /* Information to the CPU that is about to boot */ 119 /* Information to the CPU that is about to boot */
@@ -142,9 +137,6 @@ smp_boot_one_cpu(int cpuid)
142 barrier(); 137 barrier();
143 } 138 }
144 139
145 put_task_struct(idle);
146 idle = NULL;
147
148 printk(KERN_CRIT "SMP: CPU:%d is stuck.\n", cpuid); 140 printk(KERN_CRIT "SMP: CPU:%d is stuck.\n", cpuid);
149 return -1; 141 return -1;
150} 142}
@@ -207,9 +199,9 @@ int setup_profiling_timer(unsigned int multiplier)
207 */ 199 */
208unsigned long cache_decay_ticks = 1; 200unsigned long cache_decay_ticks = 1;
209 201
210int __cpuinit __cpu_up(unsigned int cpu) 202int __cpuinit __cpu_up(unsigned int cpu, struct task_struct *tidle)
211{ 203{
212 smp_boot_one_cpu(cpu); 204 smp_boot_one_cpu(cpu, tidle);
213 return cpu_online(cpu) ? 0 : -ENOSYS; 205 return cpu_online(cpu) ? 0 : -ENOSYS;
214} 206}
215 207
diff --git a/arch/cris/include/asm/processor.h b/arch/cris/include/asm/processor.h
index 4210d72a6667..ef4e1bc3efc8 100644
--- a/arch/cris/include/asm/processor.h
+++ b/arch/cris/include/asm/processor.h
@@ -25,13 +25,12 @@ struct task_struct;
25 */ 25 */
26#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3)) 26#define TASK_UNMAPPED_BASE (PAGE_ALIGN(TASK_SIZE / 3))
27 27
28/* THREAD_SIZE is the size of the task_struct/kernel_stack combo. 28/* THREAD_SIZE is the size of the thread_info/kernel_stack combo.
29 * normally, the stack is found by doing something like p + THREAD_SIZE 29 * normally, the stack is found by doing something like p + THREAD_SIZE
30 * in CRIS, a page is 8192 bytes, which seems like a sane size 30 * in CRIS, a page is 8192 bytes, which seems like a sane size
31 */ 31 */
32
33#define THREAD_SIZE PAGE_SIZE 32#define THREAD_SIZE PAGE_SIZE
34#define KERNEL_STACK_SIZE PAGE_SIZE 33#define THREAD_SIZE_ORDER (0)
35 34
36/* 35/*
37 * At user->kernel entry, the pt_regs struct is stacked on the top of the kernel-stack. 36 * At user->kernel entry, the pt_regs struct is stacked on the top of the kernel-stack.
@@ -50,10 +49,6 @@ struct task_struct;
50#define task_pt_regs(task) user_regs(task_thread_info(task)) 49#define task_pt_regs(task) user_regs(task_thread_info(task))
51#define current_regs() task_pt_regs(current) 50#define current_regs() task_pt_regs(current)
52 51
53static inline void prepare_to_copy(struct task_struct *tsk)
54{
55}
56
57extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); 52extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);
58 53
59unsigned long get_wchan(struct task_struct *p); 54unsigned long get_wchan(struct task_struct *p);
diff --git a/arch/cris/include/asm/thread_info.h b/arch/cris/include/asm/thread_info.h
index 29b92884d793..5b1c448df5c0 100644
--- a/arch/cris/include/asm/thread_info.h
+++ b/arch/cris/include/asm/thread_info.h
@@ -65,12 +65,6 @@ struct thread_info {
65 65
66#define init_thread_info (init_thread_union.thread_info) 66#define init_thread_info (init_thread_union.thread_info)
67 67
68#define __HAVE_ARCH_THREAD_INFO_ALLOCATOR
69/* thread information allocation */
70#define alloc_thread_info_node(tsk, node) \
71 ((struct thread_info *) __get_free_pages(GFP_KERNEL, 1))
72#define free_thread_info(ti) free_pages((unsigned long) (ti), 1)
73
74#endif /* !__ASSEMBLY__ */ 68#endif /* !__ASSEMBLY__ */
75 69
76/* 70/*
diff --git a/arch/cris/kernel/process.c b/arch/cris/kernel/process.c
index 891dad85e8bd..66fd01728790 100644
--- a/arch/cris/kernel/process.c
+++ b/arch/cris/kernel/process.c
@@ -29,34 +29,6 @@
29//#define DEBUG 29//#define DEBUG
30 30
31/* 31/*
32 * Initial task structure. Make this a per-architecture thing,
33 * because different architectures tend to have different
34 * alignment requirements and potentially different initial
35 * setup.
36 */
37
38static struct signal_struct init_signals = INIT_SIGNALS(init_signals);
39static struct sighand_struct init_sighand = INIT_SIGHAND(init_sighand);
40/*
41 * Initial thread structure.
42 *
43 * We need to make sure that this is 8192-byte aligned due to the
44 * way process stacks are handled. This is done by having a special
45 * "init_task" linker map entry..
46 */
47union thread_union init_thread_union __init_task_data =
48 { INIT_THREAD_INFO(init_task) };
49
50/*
51 * Initial task structure.
52 *
53 * All other task structs will be allocated on slabs in fork.c
54 */
55struct task_struct init_task = INIT_TASK(init_task);
56
57EXPORT_SYMBOL(init_task);
58
59/*
60 * The hlt_counter, disable_hlt and enable_hlt is just here as a hook if 32 * The hlt_counter, disable_hlt and enable_hlt is just here as a hook if
61 * there would ever be a halt sequence (for power save when idle) with 33 * there would ever be a halt sequence (for power save when idle) with
62 * some largish delay when halting or resuming *and* a driver that can't 34 * some largish delay when halting or resuming *and* a driver that can't