1
2
3
4
5
6
7
8
9
10
11
12#define __KERNEL_SYSCALLS__
13
14#include <linux/types.h>
15#include <linux/module.h>
16#include <linux/proc_fs.h>
17#include <linux/kernel.h>
18#include <linux/syscalls.h>
19#include <linux/string.h>
20#include <linux/ctype.h>
21#include <linux/delay.h>
22#include <linux/utsname.h>
23#include <linux/ioport.h>
24#include <linux/init.h>
25#include <linux/smp_lock.h>
26#include <linux/initrd.h>
27#include <linux/hdreg.h>
28#include <linux/bootmem.h>
29#include <linux/tty.h>
30#include <linux/gfp.h>
31#include <linux/percpu.h>
32#include <linux/kmod.h>
33#include <linux/kernel_stat.h>
34#include <linux/security.h>
35#include <linux/workqueue.h>
36#include <linux/profile.h>
37#include <linux/rcupdate.h>
38#include <linux/moduleparam.h>
39#include <linux/kallsyms.h>
40#include <linux/writeback.h>
41#include <linux/cpu.h>
42#include <linux/cpuset.h>
43#include <linux/efi.h>
44#include <linux/taskstats_kern.h>
45#include <linux/delayacct.h>
46#include <linux/unistd.h>
47#include <linux/rmap.h>
48#include <linux/mempolicy.h>
49#include <linux/key.h>
50#include <linux/unwind.h>
51#include <linux/buffer_head.h>
52#include <linux/debug_locks.h>
53#include <linux/lockdep.h>
54
55#include <asm/io.h>
56#include <asm/bugs.h>
57#include <asm/setup.h>
58#include <asm/sections.h>
59#include <asm/cacheflush.h>
60
61#ifdef CONFIG_X86_LOCAL_APIC
62#include <asm/smp.h>
63#endif
64
65
66
67
68
69
70
71
72
73
74#if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 2)
75#error Sorry, your GCC is too old. It builds incorrect kernels.
76#endif
77
78static int init(void *);
79
80extern void init_IRQ(void);
81extern void fork_init(unsigned long);
82extern void mca_init(void);
83extern void sbus_init(void);
84extern void sysctl_init(void);
85extern void signals_init(void);
86extern void pidhash_init(void);
87extern void pidmap_init(void);
88extern void prio_tree_init(void);
89extern void radix_tree_init(void);
90extern void free_initmem(void);
91extern void populate_rootfs(void);
92extern void driver_init(void);
93extern void prepare_namespace(void);
94#ifdef CONFIG_ACPI
95extern void acpi_early_init(void);
96#else
97static inline void acpi_early_init(void) { }
98#endif
99#ifndef CONFIG_DEBUG_RODATA
100static inline void mark_rodata_ro(void) { }
101#endif
102
103#ifdef CONFIG_TC
104extern void tc_init(void);
105#endif
106
107enum system_states system_state;
108EXPORT_SYMBOL(system_state);
109
110
111
112
113#define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
114#define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
115
116extern void time_init(void);
117
118void (*late_time_init)(void);
119extern void softirq_init(void);
120
121
122char saved_command_line[COMMAND_LINE_SIZE];
123
124static char *execute_command;
125static char *ramdisk_execute_command;
126
127
128static unsigned int max_cpus = NR_CPUS;
129
130
131
132
133
134
135
136
137
138
139
140static int __init nosmp(char *str)
141{
142 max_cpus = 0;
143 return 1;
144}
145
146__setup("nosmp", nosmp);
147
148static int __init maxcpus(char *str)
149{
150 get_option(&str, &max_cpus);
151 return 1;
152}
153
154__setup("maxcpus=", maxcpus);
155
156static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
157char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
158static const char *panic_later, *panic_param;
159
160extern struct obs_kernel_param __setup_start[], __setup_end[];
161
162static int __init obsolete_checksetup(char *line)
163{
164 struct obs_kernel_param *p;
165
166 p = __setup_start;
167 do {
168 int n = strlen(p->str);
169 if (!strncmp(line, p->str, n)) {
170 if (p->early) {
171
172
173 if (line[n] == '\0' || line[n] == '=')
174 return 1;
175 } else if (!p->setup_func) {
176 printk(KERN_WARNING "Parameter %s is obsolete,"
177 " ignored\n", p->str);
178 return 1;
179 } else if (p->setup_func(line + n))
180 return 1;
181 }
182 p++;
183 } while (p < __setup_end);
184 return 0;
185}
186
187
188
189
190
191unsigned long loops_per_jiffy = (1<<12);
192
193EXPORT_SYMBOL(loops_per_jiffy);
194
195static int __init debug_kernel(char *str)
196{
197 if (*str)
198 return 0;
199 console_loglevel = 10;
200 return 1;
201}
202
203static int __init quiet_kernel(char *str)
204{
205 if (*str)
206 return 0;
207 console_loglevel = 4;
208 return 1;
209}
210
211__setup("debug", debug_kernel);
212__setup("quiet", quiet_kernel);
213
214static int __init loglevel(char *str)
215{
216 get_option(&str, &console_loglevel);
217 return 1;
218}
219
220__setup("loglevel=", loglevel);
221
222
223
224
225
226static int __init unknown_bootoption(char *param, char *val)
227{
228
229 if (val) {
230
231 if (val == param+strlen(param)+1)
232 val[-1] = '=';
233 else if (val == param+strlen(param)+2) {
234 val[-2] = '=';
235 memmove(val-1, val, strlen(val)+1);
236 val--;
237 } else
238 BUG();
239 }
240
241
242 if (obsolete_checksetup(param))
243 return 0;
244
245
246
247
248
249 if (strchr(param, '.') && (!val || strchr(param, '.') < val)) {
250 printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param);
251 return 0;
252 }
253
254 if (panic_later)
255 return 0;
256
257 if (val) {
258
259 unsigned int i;
260 for (i = 0; envp_init[i]; i++) {
261 if (i == MAX_INIT_ENVS) {
262 panic_later = "Too many boot env vars at `%s'";
263 panic_param = param;
264 }
265 if (!strncmp(param, envp_init[i], val - param))
266 break;
267 }
268 envp_init[i] = param;
269 } else {
270
271 unsigned int i;
272 for (i = 0; argv_init[i]; i++) {
273 if (i == MAX_INIT_ARGS) {
274 panic_later = "Too many boot init vars at `%s'";
275 panic_param = param;
276 }
277 }
278 argv_init[i] = param;
279 }
280 return 0;
281}
282
283static int __init init_setup(char *str)
284{
285 unsigned int i;
286
287 execute_command = str;
288
289
290
291
292
293
294 for (i = 1; i < MAX_INIT_ARGS; i++)
295 argv_init[i] = NULL;
296 return 1;
297}
298__setup("init=", init_setup);
299
300static int __init rdinit_setup(char *str)
301{
302 unsigned int i;
303
304 ramdisk_execute_command = str;
305
306 for (i = 1; i < MAX_INIT_ARGS; i++)
307 argv_init[i] = NULL;
308 return 1;
309}
310__setup("rdinit=", rdinit_setup);
311
312#ifndef CONFIG_SMP
313
314#ifdef CONFIG_X86_LOCAL_APIC
315static void __init smp_init(void)
316{
317 APIC_init_uniprocessor();
318}
319#else
320#define smp_init() do { } while (0)
321#endif
322
323static inline void setup_per_cpu_areas(void) { }
324static inline void smp_prepare_cpus(unsigned int maxcpus) { }
325
326#else
327
328#ifdef __GENERIC_PER_CPU
329unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
330
331EXPORT_SYMBOL(__per_cpu_offset);
332
333static void __init setup_per_cpu_areas(void)
334{
335 unsigned long size, i;
336 char *ptr;
337 unsigned long nr_possible_cpus = num_possible_cpus();
338
339
340 size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
341#ifdef CONFIG_MODULES
342 if (size < PERCPU_ENOUGH_ROOM)
343 size = PERCPU_ENOUGH_ROOM;
344#endif
345 ptr = alloc_bootmem(size * nr_possible_cpus);
346
347 for_each_possible_cpu(i) {
348 __per_cpu_offset[i] = ptr - __per_cpu_start;
349 memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
350 ptr += size;
351 }
352}
353#endif
354
355#include <linux/ext3_fs_i.h>
356#include <linux/skbuff.h>
357
358
359static void __init smp_init(void)
360{
361 unsigned int i;
362
363
364 for_each_present_cpu(i) {
365 if (num_online_cpus() >= max_cpus)
366 break;
367 if (!cpu_online(i))
368 cpu_up(i);
369 }
370
371
372 printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
373 smp_cpus_done(max_cpus);
374#if 0
375
376
377 smp_commence();
378#endif
379
380 printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct));
381 printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page));
382 printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode));
383 printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry));
384 printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info));
385 printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head));
386 printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff));
387}
388
389#endif
390
391
392
393
394
395
396
397
398
399
400static void noinline rest_init(void)
401 __releases(kernel_lock)
402{
403 kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
404 numa_default_policy();
405 unlock_kernel();
406
407
408
409
410
411 preempt_enable_no_resched();
412 schedule();
413 preempt_disable();
414
415
416 cpu_idle();
417}
418
419
420static int __init do_early_param(char *param, char *val)
421{
422 struct obs_kernel_param *p;
423
424 for (p = __setup_start; p < __setup_end; p++) {
425 if (p->early && strcmp(param, p->str) == 0) {
426 if (p->setup_func(val) != 0)
427 printk(KERN_WARNING
428 "Malformed early option '%s'\n", param);
429 }
430 }
431
432 return 0;
433}
434
435
436void __init parse_early_param(void)
437{
438 static __initdata int done = 0;
439 static __initdata char tmp_cmdline[COMMAND_LINE_SIZE];
440
441 if (done)
442 return;
443
444
445 strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE);
446 parse_args("early options", tmp_cmdline, NULL, 0, do_early_param);
447 done = 1;
448}
449
450
451
452
453
454static void __init boot_cpu_init(void)
455{
456 int cpu = smp_processor_id();
457
458 cpu_set(cpu, cpu_online_map);
459 cpu_set(cpu, cpu_present_map);
460 cpu_set(cpu, cpu_possible_map);
461}
462
463void __init __attribute__((weak)) smp_setup_processor_id(void)
464{
465}
466
467asmlinkage void __init start_kernel(void)
468{
469 char * command_line;
470 extern struct kernel_param __start___param[], __stop___param[];
471
472 smp_setup_processor_id();
473
474
475
476
477
478 unwind_init();
479 lockdep_init();
480
481 local_irq_disable();
482 early_boot_irqs_off();
483 early_init_irq_lock_class();
484
485
486
487
488
489 lock_kernel();
490 boot_cpu_init();
491 page_address_init();
492 printk(KERN_NOTICE);
493 printk(linux_banner);
494 setup_arch(&command_line);
495 setup_per_cpu_areas();
496 smp_prepare_boot_cpu();
497
498
499
500
501
502
503 sched_init();
504
505
506
507
508 preempt_disable();
509 build_all_zonelists();
510 page_alloc_init();
511 printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line);
512 parse_early_param();
513 parse_args("Booting kernel", command_line, __start___param,
514 __stop___param - __start___param,
515 &unknown_bootoption);
516 sort_main_extable();
517 trap_init();
518 rcu_init();
519 init_IRQ();
520 pidhash_init();
521 init_timers();
522 hrtimers_init();
523 softirq_init();
524 timekeeping_init();
525 time_init();
526 profile_init();
527 if (!irqs_disabled())
528 printk("start_kernel(): bug: interrupts were enabled early\n");
529 early_boot_irqs_on();
530 local_irq_enable();
531
532
533
534
535
536
537 console_init();
538 if (panic_later)
539 panic(panic_later, panic_param);
540
541 lockdep_info();
542
543
544
545
546
547
548 locking_selftest();
549
550#ifdef CONFIG_BLK_DEV_INITRD
551 if (initrd_start && !initrd_below_start_ok &&
552 initrd_start < min_low_pfn << PAGE_SHIFT) {
553 printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
554 "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
555 initrd_start = 0;
556 }
557#endif
558 vfs_caches_init_early();
559 cpuset_init_early();
560 mem_init();
561 kmem_cache_init();
562 setup_per_cpu_pageset();
563 numa_policy_init();
564 if (late_time_init)
565 late_time_init();
566 calibrate_delay();
567 pidmap_init();
568 pgtable_cache_init();
569 prio_tree_init();
570 anon_vma_init();
571#ifdef CONFIG_X86
572 if (efi_enabled)
573 efi_enter_virtual_mode();
574#endif
575 fork_init(num_physpages);
576 proc_caches_init();
577 buffer_init();
578 unnamed_dev_init();
579 key_init();
580 security_init();
581 vfs_caches_init(num_physpages);
582 radix_tree_init();
583 signals_init();
584
585 page_writeback_init();
586#ifdef CONFIG_PROC_FS
587 proc_root_init();
588#endif
589 cpuset_init();
590 taskstats_init_early();
591 delayacct_init();
592
593 check_bugs();
594
595 acpi_early_init();
596
597
598 rest_init();
599}
600
601static int __initdata initcall_debug;
602
603static int __init initcall_debug_setup(char *str)
604{
605 initcall_debug = 1;
606 return 1;
607}
608__setup("initcall_debug", initcall_debug_setup);
609
610#ifdef CONFIG_BOOT_DELAY
611
612unsigned int boot_delay = 0;
613extern long preset_lpj;
614unsigned long long printk_delay_msec = 0;
615
616static int __init boot_delay_setup(char *str)
617{
618 unsigned long lpj = preset_lpj ? preset_lpj : 1000000;
619 unsigned long long loops_per_msec = lpj / 1000 * CONFIG_HZ;
620
621 get_option(&str, &boot_delay);
622 if (boot_delay > 10 * 1000)
623 boot_delay = 0;
624
625 printk_delay_msec = loops_per_msec;
626 printk("boot_delay: %u, preset_lpj: %ld, lpj: %lu, CONFIG_HZ: %d, printk_delay_msec: %llu\n",
627 boot_delay, preset_lpj, lpj, CONFIG_HZ, printk_delay_msec);
628
629 return 1;
630}
631__setup("boot_delay=", boot_delay_setup);
632
633#endif
634
635struct task_struct *child_reaper = &init_task;
636
637extern initcall_t __initcall_start[], __initcall_end[];
638
639static void __init do_initcalls(void)
640{
641 initcall_t *call;
642 int count = preempt_count();
643
644 for (call = __initcall_start; call < __initcall_end; call++) {
645 char *msg = NULL;
646 char msgbuf[40];
647 int result;
648
649 if (initcall_debug) {
650 printk("Calling initcall 0x%p", *call);
651 print_fn_descriptor_symbol(": %s()",
652 (unsigned long) *call);
653 printk("\n");
654 }
655
656 result = (*call)();
657
658 if (result && result != -ENODEV && initcall_debug) {
659 sprintf(msgbuf, "error code %d", result);
660 msg = msgbuf;
661 }
662 if (preempt_count() != count) {
663 msg = "preemption imbalance";
664 preempt_count() = count;
665 }
666 if (irqs_disabled()) {
667 msg = "disabled interrupts";
668 local_irq_enable();
669 }
670 if (msg) {
671 printk(KERN_WARNING "initcall at 0x%p", *call);
672 print_fn_descriptor_symbol(": %s()",
673 (unsigned long) *call);
674 printk(": returned with %s\n", msg);
675 }
676 }
677
678
679 flush_scheduled_work();
680}
681
682
683
684
685
686
687
688
689static void __init do_basic_setup(void)
690{
691
692 init_workqueues();
693 usermodehelper_init();
694 driver_init();
695
696#ifdef CONFIG_SYSCTL
697 sysctl_init();
698#endif
699
700 do_initcalls();
701}
702
703static int __initdata nosoftlockup;
704
705static int __init nosoftlockup_setup(char *str)
706{
707 nosoftlockup = 1;
708 return 1;
709}
710__setup("nosoftlockup", nosoftlockup_setup);
711
712static void do_pre_smp_initcalls(void)
713{
714 extern int spawn_ksoftirqd(void);
715#ifdef CONFIG_SMP
716 extern int migration_init(void);
717
718 migration_init();
719#endif
720 spawn_ksoftirqd();
721 if (!nosoftlockup)
722 spawn_softlockup_task();
723}
724
725static void run_init_process(char *init_filename)
726{
727 argv_init[0] = init_filename;
728 execve(init_filename, argv_init, envp_init);
729}
730
731static int init(void * unused)
732{
733 lock_kernel();
734
735
736
737 set_cpus_allowed(current, CPU_MASK_ALL);
738
739
740
741
742
743
744
745
746 child_reaper = current;
747
748 smp_prepare_cpus(max_cpus);
749
750 do_pre_smp_initcalls();
751
752 smp_init();
753 sched_init_smp();
754
755 cpuset_init_smp();
756
757
758
759
760
761 populate_rootfs();
762
763 do_basic_setup();
764
765
766
767
768
769
770 if (!ramdisk_execute_command)
771 ramdisk_execute_command = "/init";
772
773 if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
774 ramdisk_execute_command = NULL;
775 prepare_namespace();
776 }
777
778
779
780
781
782
783 free_initmem();
784 unlock_kernel();
785 mark_rodata_ro();
786 system_state = SYSTEM_RUNNING;
787 numa_default_policy();
788
789 if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
790 printk(KERN_WARNING "Warning: unable to open an initial console.\n");
791
792 (void) sys_dup(0);
793 (void) sys_dup(0);
794
795 if (ramdisk_execute_command) {
796 run_init_process(ramdisk_execute_command);
797 printk(KERN_WARNING "Failed to execute %s\n",
798 ramdisk_execute_command);
799 }
800
801
802
803
804
805
806
807 if (execute_command) {
808 run_init_process(execute_command);
809 printk(KERN_WARNING "Failed to execute %s. Attempting "
810 "defaults...\n", execute_command);
811 }
812 run_init_process("/sbin/init");
813 run_init_process("/etc/init");
814 run_init_process("/bin/init");
815 run_init_process("/bin/sh");
816
817 panic("No init found. Try passing init= option to kernel.");
818}
819