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>
15 #include <lwk/palacios.h>
18 * Pristine copy of the LWK boot command line.
20 char lwk_command_line[COMMAND_LINE_SIZE];
24 * This is the architecture-independent kernel entry point. Before it is
25 * called, architecture-specific code has done the bare minimum initialization
26 * necessary. This function initializes the kernel and its various subsystems.
27 * It calls back to architecture-specific code at several well defined points,
28 * which all architectures must implement (e.g., setup_arch()).
38 * Parse the kernel boot command line.
39 * This is where boot-time configurable variables get set,
40 * e.g., the ones with param() and driver_param() specifiers.
42 parse_params(lwk_command_line);
45 * Initialize the console subsystem.
46 * printk()'s will be visible after this.
54 printk(KERN_DEBUG "%s\n", lwk_command_line);
57 * Do architecture specific initialization.
58 * This detects memory, CPUs, etc.
63 * Initialize the kernel memory subsystem. Up until now, the simple
64 * boot-time memory allocator (bootmem) has been used for all dynamic
65 * memory allocation. Here, the bootmem allocator is destroyed and all
66 * of the free pages it was managing are added to the kernel memory
67 * pool (kmem) or the user memory pool (umem).
69 * After this point, any use of the bootmem allocator will cause a
70 * kernel panic. The normal kernel memory subsystem API should be used
71 * instead (e.g., kmem_alloc() and kmem_free()).
76 * Initialize the address space management subsystem.
81 * Initialize the task management subsystem.
86 * Initialize the task scheduling subsystem.
91 * Initialize the task scheduling subsystem.
96 * Boot all of the other CPUs in the system, one at a time.
98 printk(KERN_INFO "Number of CPUs detected: %d\n", num_cpus());
99 for_each_cpu_mask(cpu, cpu_present_map) {
100 /* The bootstrap CPU (that's us) is already booted. */
102 cpu_set(cpu, cpu_online_map);
106 printk(KERN_DEBUG "Booting CPU %u.\n", cpu);
109 /* Wait for ACK that CPU has booted (5 seconds max). */
110 for (timeout = 0; timeout < 50000; timeout++) {
111 if (cpu_isset(cpu, cpu_online_map))
116 if (!cpu_isset(cpu, cpu_online_map))
117 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 printk( KERN_INFO "Calling Init_V3\n" );
132 Init_V3(&os_hooks, &v3_ops);
133 printk( KERN_INFO "Rombios: %p @ %d\n",
135 &rombios_end - &rombios_start,
138 printk( KERN_INFO "VGA Bios: %p @ %d\n",
140 &vgabios_end - &vgabios_start
146 * Start up user-space...
148 printk(KERN_INFO "Loading initial user-level task (init_task)...\n");
149 if ((status = create_init_task()) != 0)
150 panic("Failed to create init_task (status=%d).", status);
152 schedule(); /* This should not return */