2 #include <lwk/kernel.h>
3 #include <lwk/params.h>
4 #include <lwk/console.h>
5 #include <lwk/cpuinfo.h>
6 #include <lwk/percpu.h>
8 #include <lwk/cpuinfo.h>
10 #include <lwk/bootmem.h>
11 #include <lwk/aspace.h>
13 #include <lwk/sched.h>
14 #include <lwk/timer.h>
17 * Pristine copy of the LWK boot command line.
19 char lwk_command_line[COMMAND_LINE_SIZE];
23 * This is the architecture-independent kernel entry point. Before it is
24 * called, architecture-specific code has done the bare minimum initialization
25 * necessary. This function initializes the kernel and its various subsystems.
26 * It calls back to architecture-specific code at several well defined points,
27 * which all architectures must implement (e.g., setup_arch()).
37 * Parse the kernel boot command line.
38 * This is where boot-time configurable variables get set,
39 * e.g., the ones with param() and driver_param() specifiers.
41 parse_params(lwk_command_line);
44 * Initialize the console subsystem.
45 * printk()'s will be visible after this.
53 printk(KERN_DEBUG "%s\n", lwk_command_line);
56 * Do architecture specific initialization.
57 * This detects memory, CPUs, etc.
62 * Initialize the kernel memory subsystem. Up until now, the simple
63 * boot-time memory allocator (bootmem) has been used for all dynamic
64 * memory allocation. Here, the bootmem allocator is destroyed and all
65 * of the free pages it was managing are added to the kernel memory
66 * pool (kmem) or the user memory pool (umem).
68 * After this point, any use of the bootmem allocator will cause a
69 * kernel panic. The normal kernel memory subsystem API should be used
70 * instead (e.g., kmem_alloc() and kmem_free()).
75 * Initialize the address space management subsystem.
80 * Initialize the task management subsystem.
85 * Initialize the task scheduling subsystem.
90 * Initialize the task scheduling subsystem.
95 * Boot all of the other CPUs in the system, one at a time.
97 printk(KERN_INFO "Number of CPUs detected: %d\n", num_cpus());
98 for_each_cpu_mask(cpu, cpu_present_map) {
99 /* The bootstrap CPU (that's us) is already booted. */
101 cpu_set(cpu, cpu_online_map);
105 printk(KERN_DEBUG "Booting CPU %u.\n", cpu);
108 /* Wait for ACK that CPU has booted (5 seconds max). */
109 for (timeout = 0; timeout < 50000; timeout++) {
110 if (cpu_isset(cpu, cpu_online_map))
115 if (!cpu_isset(cpu, cpu_online_map))
116 panic("Failed to boot CPU %d.\n", cpu);
120 * Start up user-space...
122 printk(KERN_INFO "Loading initial user-level task (init_task)...\n");
123 if ((status = create_init_task()) != 0)
124 panic("Failed to create init_task (status=%d).", status);
126 schedule(); /* This should not return */