/* See COPYRIGHT for copyright information. */ #include #include #include #include #include #include #include #include #include #include void sysenter_handler(); void i386_init(void) { extern char edata[], end[]; // Before doing anything else, complete the ELF loading process. // Clear the uninitialized global data (BSS) section of our program. // This ensures that all static/global variables start out zero. memset(edata, 0, end - edata); // Initialize the console. // Can't call cprintf until after we do this! cons_init(); cprintf("444544 decimal is %o octal!\n", 444544); cprintf("\33[31m" "C" "\33[33m" "o" "\33[32m" "l" "\33[36m" "o" "\33[34m" "r" "\33[0m" " Works!" "\n"); write_msr(MSR_IA32_SYSENTER_EIP, (uint32_t) sysenter_handler, 0); write_msr(MSR_IA32_SYSENTER_ESP, KSTACKTOP, 0); write_msr(MSR_IA32_SYSENTER_CS, GD_KT, 0); // Lab 2 memory management initialization functions mem_init(); // Lab 3 user environment initialization functions env_init(); trap_init(); #if defined(TEST) // Don't touch -- used by grading script! ENV_CREATE(TEST, ENV_TYPE_USER); #else // Touch all you want. ENV_CREATE(user_hello, ENV_TYPE_USER); #endif // TEST* // We only have one user environment for now, so just run it. env_run(&envs[0]); } /* * Variable panicstr contains argument to first call to panic; used as flag * to indicate that the kernel has already called panic. */ const char *panicstr; /* * Panic is called on unresolvable fatal errors. * It prints "panic: mesg", and then enters the kernel monitor. */ void _panic(const char *file, int line, const char *fmt,...) { va_list ap; if (panicstr) goto dead; panicstr = fmt; // Be extra sure that the machine is in as reasonable state asm volatile("cli; cld"); va_start(ap, fmt); cprintf("kernel panic at %s:%d: ", file, line); vcprintf(fmt, ap); cprintf("\n"); va_end(ap); dead: /* break into the kernel monitor */ while (1) monitor(NULL); } /* like panic, but don't */ void _warn(const char *file, int line, const char *fmt,...) { va_list ap; va_start(ap, fmt); cprintf("kernel warning at %s:%d: ", file, line); vcprintf(fmt, ap); cprintf("\n"); va_end(ap); }