#include <platforms.h>
#include <mach_kdb.h>
#include <mach/i386/vm_param.h>
#include <string.h>
#include <mach/vm_param.h>
#include <mach/vm_prot.h>
#include <mach/machine.h>
#include <mach/time_value.h>
#include <kern/spl.h>
#include <kern/assert.h>
#include <kern/debug.h>
#include <kern/misc_protos.h>
#include <kern/startup.h>
#include <kern/clock.h>
#include <kern/pms.h>
#include <kern/xpr.h>
#include <kern/cpu_data.h>
#include <kern/processor.h>
#include <console/serial_protos.h>
#include <vm/vm_page.h>
#include <vm/pmap.h>
#include <vm/vm_kern.h>
#include <i386/fpu.h>
#include <i386/pmap.h>
#include <i386/ipl.h>
#include <i386/misc_protos.h>
#include <i386/cpuid.h>
#include <i386/mp.h>
#include <i386/mp_desc.h>
#include <i386/machine_routines.h>
#include <i386/machine_check.h>
#include <i386/postcode.h>
#include <i386/Diagnostics.h>
#include <i386/pmCPU.h>
#include <i386/tsc.h>
#include <i386/hpet.h>
#include <i386/locks.h>
#if MACH_KDB
#include <ddb/db_aout.h>
#endif
#include <ddb/tr.h>
static boot_args *kernelBootArgs;
int debug_task;
extern int disableConsoleOutput;
extern const char version[];
extern const char version_variant[];
extern int nx_enabled;
extern int noVMX;
void
i386_init(vm_offset_t boot_args_start)
{
unsigned int maxmem;
uint64_t maxmemtouse;
unsigned int cpus;
boolean_t legacy_mode;
postcode(I386_INIT_ENTRY);
i386_macho_zerofill();
mca_cpu_init();
kernelBootArgs = (boot_args *)
ml_static_ptovirt(boot_args_start);
kernelBootArgs->MemoryMap = (uint32_t)
ml_static_ptovirt((vm_offset_t)kernelBootArgs->MemoryMap);
kernelBootArgs->deviceTreeP = (uint32_t)
ml_static_ptovirt((vm_offset_t)kernelBootArgs->deviceTreeP);
master_cpu = 0;
(void) cpu_data_alloc(TRUE);
cpu_init();
postcode(CPU_INIT_D);
PE_init_platform(FALSE, kernelBootArgs);
postcode(PE_INIT_PLATFORM_D);
printf_init();
panic_init();
PE_init_kprintf(FALSE);
if (!PE_parse_boot_arg("diag", &dgWork.dgFlags))
dgWork.dgFlags = 0;
serialmode = 0;
if(PE_parse_boot_arg("serial", &serialmode)) {
kprintf("Serial mode specified: %08X\n", serialmode);
}
if(serialmode & 1) {
(void)switch_to_serial_console();
disableConsoleOutput = FALSE;
}
PE_init_printf(FALSE);
kprintf("version_variant = %s\n", version_variant);
kprintf("version = %s\n", version);
if (!PE_parse_boot_arg("maxmem", &maxmem))
maxmemtouse=0;
else
maxmemtouse = ((uint64_t)maxmem) * (uint64_t)(1024 * 1024);
if (PE_parse_boot_arg("cpus", &cpus)) {
if ((0 < cpus) && (cpus < max_ncpus))
max_ncpus = cpus;
}
if (!PE_parse_boot_arg("himemory_mode", &vm_himemory_mode))
vm_himemory_mode = 0;
if (!PE_parse_boot_arg("immediate_NMI", &force_immediate_debugger_NMI))
force_immediate_debugger_NMI = FALSE;
boolean_t IA32e = FALSE;
if (cpuid_extfeatures() & CPUID_EXTFEATURE_EM64T) {
kprintf("EM64T supported");
if (PE_parse_boot_arg("-legacy", &legacy_mode)) {
kprintf(" but legacy mode forced\n");
} else {
IA32e = TRUE;
kprintf(" and will be enabled\n");
}
}
if (!(cpuid_extfeatures() & CPUID_EXTFEATURE_XD))
nx_enabled = 0;
if (!PE_parse_boot_arg("lcks", &LcksOpts))
LcksOpts = 0;
i386_vm_init(maxmemtouse, IA32e, kernelBootArgs);
if ( ! PE_parse_boot_arg("novmx", &noVMX))
noVMX = 0;
tsc_init();
hpet_init();
power_management_init();
PE_init_platform(TRUE, kernelBootArgs);
PE_create_console();
processor_bootstrap();
thread_bootstrap();
machine_startup();
}