void pre_new_sweb_assert(uint32 condition, uint32 line, char* file) { char *error_string = "KERNEL PANIC: Assertion Failed in File: on Line: "; char line_string[5]; if (!condition) { uint8 * fb = (uint8*)0xC00B8000; uint32 s=0; uint32 i=0; for (s=0; s<40; ++s) { fb[i++] = error_string[s]; fb[i++] = 0x9f; } writeLine2Bochs((uint8*) error_string); writeChar2Bochs((uint8) '\n'); writeLine2Bochs((uint8*) file); writeChar2Bochs((uint8) '\n'); while (file && *file) { fb[i++] = *file++; fb[i++] = 0x9f; } for (s=40; s<54; ++s) { fb[i++] = error_string[s]; fb[i++] = 0x9f; } i-=4; for (s=0; s<5; ++s) { line_string[s]=' '; } line_string[s]='\0'; while (line>0) { fb[i++] = (uint8) ( 0x30 + (line%10) ); fb[i] = 0x9f; line_string[--s] = ( 0x30 + (line%10) ); i-=3; line /= 10; } writeLine2Bochs((uint8*) line_string); writeChar2Bochs((uint8) '\n'); for (;;); } }
extern "C" void startup() { #ifdef DEBUG //software breakpoint for debugging writeLine2Bochs("Wait for GDB!\n"); bool cont = false; while(!cont); #endif writeLine2Bochs("Removing Boot Time Ident Mapping...\n"); removeBootTimeIdentMapping(); system_state = BOOTING; PageManager::instance(); writeLine2Bochs("PageManager and KernelMemoryManager created \n"); main_console = ArchCommon::createConsole(1); writeLine2Bochs("Console created \n"); Terminal *term_0 = main_console->getTerminal(0); // add more if you need more... term_0->initTerminalColors(Console::GREEN, Console::BLACK); kprintfd("Init debug printf\n"); term_0->writeString("This is on term 0, you should see me now\n"); main_console->setActiveTerminal(0); kprintf("Kernel end address is %p\n", &kernel_end_address); Scheduler::instance(); //needs to be done after scheduler and terminal, but prior to enableInterrupts kprintf_init(); debug(MAIN, "Threads init\n"); ArchThreads::initialise(); debug(MAIN, "Interupts init\n"); ArchInterrupts::initialise(); ArchInterrupts::setTimerFrequency(IRQ0_TIMER_FREQUENCY); ArchCommon::initDebug(); vfs.initialize(); debug(MAIN, "Mounting DeviceFS under /dev/\n"); DeviceFSType *devfs = new DeviceFSType(); vfs.registerFileSystem(devfs); default_working_dir = vfs.root_mount("devicefs", 0); debug(MAIN, "Block Device creation\n"); BDManager::getInstance()->doDeviceDetection(); debug(MAIN, "Block Device done\n"); for (BDVirtualDevice* bdvd : BDManager::getInstance()->device_list_) { debug(MAIN, "Detected Device: %s :: %d\n", bdvd->getName(), bdvd->getDeviceNumber()); } // initialise global and static objects extern ustl::list<FileDescriptor*> global_fd; new (&global_fd) ustl::list<FileDescriptor*>(); extern Mutex global_fd_lock; new (&global_fd_lock) Mutex("global_fd_lock"); debug(MAIN, "make a deep copy of FsWorkingDir\n"); main_console->setWorkingDirInfo(new FileSystemInfo(*default_working_dir)); debug(MAIN, "main_console->setWorkingDirInfo done\n"); ustl::coutclass::init(); debug(MAIN, "default_working_dir root name: %s\t pwd name: %s\n", default_working_dir->getRoot()->getName(), default_working_dir->getPwd()->getName()); if (main_console->getWorkingDirInfo()) { delete main_console->getWorkingDirInfo(); } main_console->setWorkingDirInfo(default_working_dir); debug(MAIN, "Timer enable\n"); ArchInterrupts::enableTimer(); KeyboardManager::instance(); ArchInterrupts::enableKBD(); debug(MAIN, "Adding Kernel threads\n"); Scheduler::instance()->addNewThread(main_console); Scheduler::instance()->addNewThread(new ProcessRegistry(new FileSystemInfo(*default_working_dir), user_progs /*see user_progs.h*/)); Scheduler::instance()->printThreadList(); kprintf("Now enabling Interrupts...\n"); system_state = RUNNING; ArchInterrupts::enableInterrupts(); Scheduler::instance()->yield(); //not reached assert(false); }