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>
16 #include <palacios/vmm.h>
19 * Pristine copy of the LWK boot command line.
21 char lwk_command_line[COMMAND_LINE_SIZE];
25 * This is the architecture-independent kernel entry point. Before it is
26 * called, architecture-specific code has done the bare minimum initialization
27 * necessary. This function initializes the kernel and its various subsystems.
28 * It calls back to architecture-specific code at several well defined points,
29 * which all architectures must implement (e.g., setup_arch()).
39 * Parse the kernel boot command line.
40 * This is where boot-time configurable variables get set,
41 * e.g., the ones with param() and driver_param() specifiers.
43 parse_params(lwk_command_line);
46 * Initialize the console subsystem.
47 * printk()'s will be visible after this.
55 printk(KERN_DEBUG "%s\n", lwk_command_line);
58 * Do architecture specific initialization.
59 * This detects memory, CPUs, etc.
64 * Initialize the kernel memory subsystem. Up until now, the simple
65 * boot-time memory allocator (bootmem) has been used for all dynamic
66 * memory allocation. Here, the bootmem allocator is destroyed and all
67 * of the free pages it was managing are added to the kernel memory
68 * pool (kmem) or the user memory pool (umem).
70 * After this point, any use of the bootmem allocator will cause a
71 * kernel panic. The normal kernel memory subsystem API should be used
72 * instead (e.g., kmem_alloc() and kmem_free()).
77 * Initialize the address space management subsystem.
82 * Initialize the task management subsystem.
87 * Initialize the task scheduling subsystem.
92 * Initialize the task scheduling subsystem.
97 * Boot all of the other CPUs in the system, one at a time.
99 printk(KERN_INFO "Number of CPUs detected: %d\n", num_cpus());
100 for_each_cpu_mask(cpu, cpu_present_map) {
101 /* The bootstrap CPU (that's us) is already booted. */
103 cpu_set(cpu, cpu_online_map);
107 printk(KERN_DEBUG "Booting CPU %u.\n", cpu);
110 /* Wait for ACK that CPU has booted (5 seconds max). */
111 for (timeout = 0; timeout < 50000; timeout++) {
112 if (cpu_isset(cpu, cpu_online_map))
117 if (!cpu_isset(cpu, cpu_online_map))
118 panic("Failed to boot CPU %d.\n", cpu);
122 struct v3_os_hooks os_hooks;
123 struct v3_ctrl_ops v3_ops;
124 struct guest_info * vm_info = 0;
125 struct v3_vm_config vm_config;
127 memset(&os_hooks, 0, sizeof(struct v3_os_hooks));
128 memset(&v3_ops, 0, sizeof(struct v3_ctrl_ops));
129 memset(&vm_config, 0, sizeof(struct v3_vm_config));
131 Init_V3(&os_hooks, &v3_ops);
135 * Start up user-space...
137 printk(KERN_INFO "Loading initial user-level task (init_task)...\n");
138 if ((status = create_init_task()) != 0)
139 panic("Failed to create init_task (status=%d).", status);
141 schedule(); /* This should not return */