/* * Initial boot sequence. */ static void boot(void) { /* * The order of these is important! * Don't go changing it without thinking about the consequences. * * Among other things, be aware that console output gets * buffered up at first and does not actually appear until * mainbus_bootstrap() attaches the console device. This can * be remarkably confusing if a bug occurs at this point. So * don't put new code before mainbus_bootstrap if you don't * absolutely have to. * * Also note that the buffer for this is only 1k. If you * overflow it, the system will crash without printing * anything at all. You can make it larger though (it's in * dev/generic/console.c). */ kprintf("\n"); kprintf("OS/161 base system version %s\n", BASE_VERSION); kprintf("%s", harvard_copyright); kprintf("\n"); kprintf("Galactocalypse's system version %s (%s #%d)\n", GROUP_VERSION, buildconfig, buildversion); kprintf("\n"); /* Early initialization. */ ram_bootstrap(); thread_bootstrap(); hardclock_bootstrap(); vfs_bootstrap(); /* Probe and initialize devices. Interrupts should come on. */ kprintf("Device probe...\n"); KASSERT(curthread->t_curspl > 0); mainbus_bootstrap(); KASSERT(curthread->t_curspl == 0); /* Now do pseudo-devices. */ pseudoconfig(); kprintf("\n"); /* Late phase of initialization. */ vm_bootstrap(); kprintf_bootstrap(); thread_start_cpus(); /* Default bootfs - but ignore failure, in case emu0 doesn't exist */ vfs_setbootfs("emu0"); /* * Make sure various things aren't screwed up. */ COMPILE_ASSERT(sizeof(userptr_t) == sizeof(char *)); COMPILE_ASSERT(sizeof(*(userptr_t)0) == sizeof(char)); }
/* * Initial boot sequence. */ static void boot(void) { /* * The order of these is important! * Don't go changing it without thinking about the consequences. * * Among other things, be aware that console output gets * buffered up at first and does not actually appear until * dev_bootstrap() attaches the console device. This can be * remarkably confusing if a bug occurs at this point. So * don't put new code before dev_bootstrap if you don't * absolutely have to. * * Also note that the buffer for this is only 1k. If you * overflow it, the system will crash without printing * anything at all. You can make it larger though (it's in * dev/generic/console.c). */ kprintf("\n"); kprintf("OS/161 base system version %s\n", BASE_VERSION); kprintf("%s", harvard_copyright); kprintf("\n"); kprintf("CS350-036's system version %s (%s #%d)\n", GROUP_VERSION, buildconfig, buildversion); kprintf("\n"); #if OPT_A0 hello(); #endif /* OPT_A0 */ ram_bootstrap(); scheduler_bootstrap(); thread_bootstrap(); vfs_bootstrap(); dev_bootstrap(); #if OPT_A3 vmstats_init(); #endif vm_bootstrap(); kprintf_bootstrap(); /* Default bootfs - but ignore failure, in case emu0 doesn't exist */ vfs_setbootfs("emu0"); #if OPT_A3 initSwapOps(); #endif /* * Make sure various things aren't screwed up. */ assert(sizeof(userptr_t)==sizeof(char *)); assert(sizeof(*(userptr_t)0)==sizeof(char)); }
void platform_init(int argc, char **argv, char **envp, unsigned memsize) { /* clear BSS section */ bzero(__bss, __ebss - __bss); setup_kenv(argc, argv, envp); uart_init(); pcpu_init(); cpu_init(); tlb_init(); intr_init(); pm_bootstrap(memsize); thread_bootstrap(); kprintf("[startup] Switching to 'kernel-main' thread...\n"); }
/** * arm_init * * Initialize the core ARM subsystems, this routine is called from the * boot loader. A basic identity mapping is created in __start, however, * arm_vm_init will create new mappings. */ void arm_init(boot_args* args) { cpu_data_t* bootProcessorData; processor_t bootProcessor; uint32_t baMaxMem; uint64_t maxMem; thread_t thread; /* * Welcome to arm_init, may I take your order? */ PE_early_puts("arm_init: starting up\n"); /* * arm_init is only called on processor #0, the others will enter using arm_slave_init. */ bootProcessor = cpu_processor_alloc(TRUE); if(!bootProcessor) { panic("Something really wacky happened here with cpu_processor_alloc\n"); } /* * Pin the processor information to CPU #0. */ PE_early_puts("arm_init: calling cpu_bootstrap\n"); cpu_bootstrap(); /* * Initialize core processor data. */ bootProcessorData = current_cpu_datap(); bootProcessorData->cpu_number = 0; bootProcessorData->cpu_active_stack = &irqstack; bootProcessorData->cpu_phys_number = 0; bootProcessorData->cpu_preemption_level = 1; bootProcessorData->cpu_interrupt_level = 0; bootProcessorData->cpu_running = 1; /* * Initialize the core thread subsystem (This sets up a template * which will then be used to initialize the rest of the thread * system later.) * * Additionally, this also sets the current kernel thread register * to our bootstrap thread. */ PE_early_puts("arm_init: calling thread_bootstrap\n"); thread_bootstrap(); /* * CPU initialization. */ PE_early_puts("arm_init: calling cpu_init\n"); cpu_init(); /* * Mach processor bootstrap. */ PE_early_puts("arm_init: calling processor_bootstrap\n"); processor_bootstrap(); /* * Initialize the ARM platform expert. */ PE_early_puts("arm_init: calling PE_init_platform\n"); PE_init_platform(FALSE, (void*)args); /* * Initialize kprintf, but no VM is running yet. */ PE_init_kprintf(FALSE); /* * Set maximum memory size based on boot-args. */ if(!PE_parse_boot_argn("maxmem", &baMaxMem, sizeof(baMaxMem))) maxMem = 0; else maxMem = (uint64_t)baMaxMem * (1024 * 1024); /* * After this, we'll no longer be using physical mappings created by the bootloader. */ arm_vm_init(maxMem, args); /* * Kernel early bootstrap. */ kernel_early_bootstrap(); /* * PE platform init. */ PE_init_platform(TRUE, (void*)args); /* * Enable I+D cache. */ char tempbuf[16]; if(PE_parse_boot_argn("-no-cache", tempbuf, sizeof(tempbuf))) { kprintf("cache: No caching enabled (I+D).\n"); } else { kprintf("cache: initializing i+dcache\n"); cache_initialize(); kprintf("cache: done\n"); } /* * Start system timers. */ thread = current_thread(); thread->machine.preempt_count = 1; thread->machine.cpu_data = cpu_datap(cpu_number()); thread->kernel_stack = irqstack; timer_start(&thread->system_timer, mach_absolute_time()); /* * VFP/float initialization. */ init_vfp(); /* * Machine startup. */ machine_startup(); /* * If anything returns, bad things(tm) have happened. */ PE_early_puts("arm_init: Still alive\n"); panic("why are we still here, NOO"); while(1); }
/** * arm_init * * Initialize the core ARM subsystems, this routine is called from the * boot loader. A basic identity mapping is created in __start, however, * arm_vm_init will create new mappings. */ void arm_init(boot_args * args) { cpu_data_t *bootProcessorData; processor_t bootProcessor; uint32_t baMaxMem; uint64_t maxMem; thread_t thread; /* * We are in. */ PE_early_puts("arm_init: starting up\n"); /* * arm_init is only called on processor #0, the others will enter using arm_slave_init. */ bootProcessor = cpu_processor_alloc(TRUE); if (!bootProcessor) { panic("cpu_processor_alloc failed\n"); } /* * Pin the processor information to CPU #0. */ PE_early_puts("arm_init: calling cpu_bootstrap\n"); cpu_bootstrap(); /* * Initialize core processor data. */ bootProcessorData = current_cpu_datap(); bootProcessorData->cpu_number = 0; bootProcessorData->cpu_active_stack = (vm_offset_t)&irqstack; bootProcessorData->cpu_phys_number = 0; bootProcessorData->cpu_preemption_level = 1; bootProcessorData->cpu_interrupt_level = 0; bootProcessorData->cpu_running = 1; bootProcessorData->cpu_pending_ast = AST_NONE; /* * Initialize the core thread subsystem (This sets up a template * which will then be used to initialize the rest of the thread * system later.) * * Additionally, this also sets the current kernel thread register * to our bootstrap thread. */ PE_early_puts("arm_init: calling thread_bootstrap\n"); thread_bootstrap(); /* * CPU initialization. */ PE_early_puts("arm_init: calling cpu_init\n"); cpu_init(); /* * Mach processor bootstrap. */ PE_early_puts("arm_init: calling processor_bootstrap\n"); processor_bootstrap(); /* * Initialize the ARM platform expert. */ PE_early_puts("arm_init: calling PE_init_platform\n"); PE_init_platform(FALSE, (void *) args); /* * Initialize kprintf, but no VM is running yet. */ PE_init_kprintf(FALSE); /* * Set maximum memory size based on boot-args. */ if (!PE_parse_boot_argn("maxmem", &baMaxMem, sizeof(baMaxMem))) maxMem = 0; else maxMem = (uint64_t) baMaxMem *(1024 * 1024); /* * After this, we'll no longer be using physical mappings created by the bootloader. */ arm_vm_init(maxMem, args); /* * Kernel early bootstrap. */ kernel_early_bootstrap(); /* * PE platform init. */ PE_init_platform(TRUE, (void *) args); /* * Enable I+D cache. */ char tempbuf[16]; if (PE_parse_boot_argn("-no-cache", tempbuf, sizeof(tempbuf))) { kprintf("cache: No caching enabled (I+D).\n"); } else { kprintf("cache: initializing i+dcache ... "); cache_initialize(); kprintf("done\n"); } /* * Specify serial mode. */ serialmode = 0; if (PE_parse_boot_argn("serial", &serialmode, sizeof(serialmode))) { /* * We want a serial keyboard and/or console */ kprintf("Serial mode specified: %08X\n", serialmode); } if (serialmode & 1) { (void) switch_to_serial_console(); disableConsoleOutput = FALSE; /* Allow printfs to happen */ } /* * Start system timers. */ thread = current_thread(); thread->machine.preempt_count = 1; thread->machine.cpu_data = cpu_datap(cpu_number()); thread->kernel_stack = irqstack; timer_start(&thread->system_timer, mach_absolute_time()); /* * Processor identification. */ arm_processor_identify(); /* * VFP/float initialization. */ init_vfp(); /* * Machine startup. */ machine_startup(); /* * If we return, something very bad is happening. */ panic("20:02:14 <DHowett> wwwwwwwat is HAAAAAAAPPENING\n"); /* * Last chance. */ while (1) ; }
/* * Initial boot sequence. */ static void boot(void) { /* * The order of these is important! * Don't go changing it without thinking about the consequences. * * Among other things, be aware that console output gets * buffered up at first and does not actually appear until * mainbus_bootstrap() attaches the console device. This can * be remarkably confusing if a bug occurs at this point. So * don't put new code before mainbus_bootstrap if you don't * absolutely have to. * * Also note that the buffer for this is only 1k. If you * overflow it, the system will crash without printing * anything at all. You can make it larger though (it's in * dev/generic/console.c). */ #if OPT_A2 // Not sure if this is the best place to put this, but I'm not // sure where else we can initialize our process array early enough proc_array_init(); // Setting this to NULL to start so that boot threads don't increment // the value sem_runprogram = NULL; #endif kprintf("\n"); kprintf("OS/161 base system version %s\n", BASE_VERSION); kprintf("%s", harvard_copyright); kprintf("\n"); kprintf("Put-your-group-name-here's system version %s (%s #%d)\n", GROUP_VERSION, buildconfig, buildversion); kprintf("\n"); /* Early initialization. */ ram_bootstrap(); proc_bootstrap(); thread_bootstrap(); hardclock_bootstrap(); vfs_bootstrap(); #if OPT_A3 // vm_bootstrap();// already called elsewhere below #endif /* Probe and initialize devices. Interrupts should come on. */ kprintf("Device probe...\n"); KASSERT(curthread->t_curspl > 0); mainbus_bootstrap(); KASSERT(curthread->t_curspl == 0); /* Now do pseudo-devices. */ pseudoconfig(); kprintf("\n"); /* Late phase of initialization. */ vm_bootstrap(); kprintf_bootstrap(); thread_start_cpus(); /* Default bootfs - but ignore failure, in case emu0 doesn't exist */ vfs_setbootfs("emu0"); /* * Make sure various things aren't screwed up. */ COMPILE_ASSERT(sizeof(userptr_t) == sizeof(char *)); COMPILE_ASSERT(sizeof(*(userptr_t)0) == sizeof(char)); #if OPT_A2 // Now it is safe to let this be accessed sem_runprogram = sem_create("sem_runprogram", 0); #endif }
/* * Initial boot sequence. */ static void boot(void) { /* * The order of these is important! * Don't go changing it without thinking about the consequences. * * Among other things, be aware that console output gets * buffered up at first and does not actually appear until * dev_bootstrap() attaches the console device. This can be * remarkably confusing if a bug occurs at this point. So * don't put new code before dev_bootstrap if you don't * absolutely have to. * * Also note that the buffer for this is only 1k. If you * overflow it, the system will crash without printing * anything at all. You can make it larger though (it's in * dev/generic/console.c). */ /* remove compiler warning */ //size_t memsize; /* ASST2: get memsize from new vm_bootstrap */ kprintf("\n"); kprintf("OS/161 base system version %s\n", BASE_VERSION); kprintf("%s", harvard_copyright); kprintf("\n"); kprintf("Group 36 system version %s (%s #%d)\n", GROUP_VERSION, buildconfig, buildversion); kprintf("\n"); ram_bootstrap(); #if OPT_DUMBVM vm_bootstrap(); #else memsize = vm_bootstrap(); /* ASST2: get memsize from new vm_bootstrap */ #endif scheduler_bootstrap(); pid_bootstrap(); /* ASST1: initialize pid management before threads */ thread_bootstrap(); vfs_bootstrap(); dev_bootstrap(); #if !OPT_DUMBVM /* only initialize swap if not using dumbvm */ swap_bootstrap(memsize); /* ASST2: initialize swap file after devices */ #endif kprintf_bootstrap(); // DEMKE: ASST1 - initialize user program console I/O //dumb_consoleIO_bootstrap(); /* Default bootfs - but ignore failure, in case emu0 doesn't exist */ vfs_setbootfs("emu0"); /* * Make sure various things aren't screwed up. */ assert(sizeof(userptr_t)==sizeof(char *)); assert(sizeof(*(userptr_t)0)==sizeof(char)); }
/* * Initial boot sequence. */ static void boot(void) { /* * The order of these is important! * Don't go changing it without thinking about the consequences. * * Among other things, be aware that console output gets * buffered up at first and does not actually appear until * mainbus_bootstrap() attaches the console device. This can * be remarkably confusing if a bug occurs at this point. So * don't put new code before mainbus_bootstrap if you don't * absolutely have to. * * Also note that the buffer for this is only 1k. If you * overflow it, the system will crash without printing * anything at all. You can make it larger though (it's in * dev/generic/console.c). */ kprintf("\n"); kprintf("OS/161 base system version %s\n", BASE_VERSION); kprintf("%s", harvard_copyright); kprintf("\n"); // Stupid escape characters /* kprintf(" ,8\\\n"\ "=DDI~ ,88M\n"\ "`$D888$7~ ,D=8M\n"\ " 8N8...'8. +...7\n"\ " ~+D+...'8, ,N...7\n"\ " ~+N+...+----...7...8`\n"\ " ~~O.............7\n"\ " /.............7\n"\ " 8..88..........7\n"\ " 8##.........88..:\n"\ " .8##...####$.....# ~+',\n"\ " \\I...####$...###8...,+\n"\ " .~~~~,.7##7....##.....7\n"\ " /.......\\-......7....I..+I8DI~..\n"\ " |8........7-.....\\..+$...........O\\\n");*/ /*kprintf(" \\~.___.~7-.......?IZ$??+..........>\n"\ " \\.............D /=?????+....,8`\n"\ " I.............+~IO=?8:+ZDI?=8`\n"\ " /..............7$??+8 \\8/\n"\ " I...............8DZO,\n"\ " I................N8?\n"\ " .D??.......+++....8\n"\ " D?7???I$Z77??????.\n"\ " ,8$DDZ: ``~?NIMMIZ=\n"\ " `~I8?\n");*/ kprintf("PikachuOS's system version %s (%s #%d)\n", GROUP_VERSION, buildconfig, buildversion); kprintf("\n"); /* Early initialization. */ ram_bootstrap(); vm_bootstrap(); proc_bootstrap(); thread_bootstrap(); hardclock_bootstrap(); vfs_bootstrap(); kheap_nextgeneration(); /* Probe and initialize devices. Interrupts should come on. */ kprintf("Device probe...\n"); KASSERT(curthread->t_curspl > 0); mainbus_bootstrap(); KASSERT(curthread->t_curspl == 0); /* Now do pseudo-devices. */ pseudoconfig(); kprintf("\n"); kheap_nextgeneration(); /* Late phase of initialization. */ kprintf_bootstrap(); thread_start_cpus(); /* Buffer cache */ buffer_bootstrap(); /* Default bootfs - but ignore failure, in case emu0 doesn't exist */ vfs_setbootfs("emu0"); kheap_nextgeneration(); bs_bootstrap(); /* * Make sure various things aren't screwed up. */ COMPILE_ASSERT(sizeof(userptr_t) == sizeof(char *)); COMPILE_ASSERT(sizeof(*(userptr_t)0) == sizeof(char)); }