diff options
Diffstat (limited to 'arch/cris')
-rw-r--r-- | arch/cris/Kconfig | 8 | ||||
-rw-r--r-- | arch/cris/arch-v10/kernel/signal.c | 50 | ||||
-rw-r--r-- | arch/cris/arch-v32/kernel/signal.c | 66 | ||||
-rw-r--r-- | arch/cris/arch-v32/kernel/smp.c | 14 | ||||
-rw-r--r-- | arch/cris/include/asm/processor.h | 9 | ||||
-rw-r--r-- | arch/cris/include/asm/thread_info.h | 6 | ||||
-rw-r--r-- | arch/cris/kernel/process.c | 28 |
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 | |||
13 | config RWSEM_XCHGADD_ALGORITHM | 13 | config RWSEM_XCHGADD_ALGORITHM |
14 | bool | 14 | bool |
15 | 15 | ||
16 | config GENERIC_CMOS_UPDATE | ||
17 | def_bool y | ||
18 | |||
19 | config ARCH_USES_GETTIMEOFFSET | ||
20 | def_bool n | ||
21 | |||
22 | config ARCH_HAS_ILOG2_U32 | 16 | config 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 | ||
53 | config HZ | 49 | config 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 | */ |
51 | int sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, | 51 | int 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(¤t->sighand->siglock); | 54 | siginitset(&blocked, mask); |
56 | current->saved_sigmask = current->blocked; | 55 | return sigsuspend(&blocked); |
57 | siginitset(¤t->blocked, mask); | ||
58 | recalc_sigpending(); | ||
59 | spin_unlock_irq(¤t->sighand->siglock); | ||
60 | current->state = TASK_INTERRUPTIBLE; | ||
61 | schedule(); | ||
62 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
63 | return -ERESTARTNOHAND; | ||
64 | } | 56 | } |
65 | 57 | ||
66 | int sys_sigaction(int sig, const struct old_sigaction __user *act, | 58 | int 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(¤t->sighand->siglock); | 180 | set_current_blocked(&set); |
189 | current->blocked = set; | ||
190 | recalc_sigpending(); | ||
191 | spin_unlock_irq(¤t->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(¤t->sighand->siglock); | 216 | set_current_blocked(&set); |
228 | current->blocked = set; | ||
229 | recalc_sigpending(); | ||
230 | spin_unlock_irq(¤t->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(¤t->sighand->siglock); | 459 | block_sigmask(ka, sig); |
474 | sigorsets(¤t->blocked, ¤t->blocked, | 460 | |
475 | &ka->sa.sa_mask); | ||
476 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
477 | sigaddset(¤t->blocked, sig); | ||
478 | recalc_sigpending(); | ||
479 | spin_unlock_irq(¤t->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 | */ |
61 | int | 61 | int |
62 | sys_sigsuspend(old_sigset_t mask, long r11, long r12, long r13, long mof, | 62 | sys_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(¤t->sighand->siglock); | 65 | siginitset(&blocked, mask); |
67 | current->saved_sigmask = current->blocked; | 66 | return sigsuspend(&blocked); |
68 | siginitset(¤t->blocked, mask); | ||
69 | recalc_sigpending(); | ||
70 | spin_unlock_irq(¤t->sighand->siglock); | ||
71 | current->state = TASK_INTERRUPTIBLE; | ||
72 | schedule(); | ||
73 | set_thread_flag(TIF_RESTORE_SIGMASK); | ||
74 | return -ERESTARTNOHAND; | ||
75 | } | 67 | } |
76 | 68 | ||
77 | int | 69 | int |
@@ -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(¤t->sighand->siglock); | 171 | set_current_blocked(&set); |
180 | |||
181 | current->blocked = set; | ||
182 | |||
183 | recalc_sigpending(); | ||
184 | spin_unlock_irq(¤t->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(¤t->sighand->siglock); | 212 | set_current_blocked(&set); |
226 | |||
227 | current->blocked = set; | ||
228 | |||
229 | recalc_sigpending(); | ||
230 | spin_unlock_irq(¤t->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 | ||
365 | give_sigsegv: | 347 | give_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 | ||
452 | give_sigsegv: | 431 | give_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(¤t->sighand->siglock); | ||
520 | sigorsets(¤t->blocked, ¤t->blocked, | ||
521 | &ka->sa.sa_mask); | ||
522 | if (!(ka->sa.sa_flags & SA_NODEFER)) | ||
523 | sigaddset(¤t->blocked, sig); | ||
524 | recalc_sigpending(); | ||
525 | spin_unlock_irq(¤t->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.*/ |
110 | static int __init | 110 | static int __init |
111 | smp_boot_one_cpu(int cpuid) | 111 | smp_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 | */ |
208 | unsigned long cache_decay_ticks = 1; | 200 | unsigned long cache_decay_ticks = 1; |
209 | 201 | ||
210 | int __cpuinit __cpu_up(unsigned int cpu) | 202 | int __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 | ||
53 | static inline void prepare_to_copy(struct task_struct *tsk) | ||
54 | { | ||
55 | } | ||
56 | |||
57 | extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); | 52 | extern int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags); |
58 | 53 | ||
59 | unsigned long get_wchan(struct task_struct *p); | 54 | unsigned 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 | |||
38 | static struct signal_struct init_signals = INIT_SIGNALS(init_signals); | ||
39 | static 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 | */ | ||
47 | union 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 | */ | ||
55 | struct task_struct init_task = INIT_TASK(init_task); | ||
56 | |||
57 | EXPORT_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 |