/* Check if the compiler thinks you are targeting the wrong operating system. */ #if defined(__linux__) #error "You are not using a cross-compiler, you will most certainly run into trouble" #endif /* This tutorial will only work for the 32-bit ix86 targets. */ #if !defined(__i386__) #error "This kernel needs to be compiled with a ix86-elf compiler" #endif #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /*#include */ #include #include #include /*#include */ #include #include #include #include #include #include extern void _hang_asm(void); extern void _sti_asm(void); void idle_task(void) { while (1) asm volatile("hlt"); } void kernel_main(multiboot_info_t* mbd, uint32_t magic) { /* --- BEGIN INITIALIZATION SECTION --- */ /* We need to initialize the terminal so that any error/debugging messages show. */ terminal_initialize(); printf("Loading Espresso %s... ", KERNEL_VERSION); #ifdef _DEBUG printf("[ DEBUG BUILD ]"); #endif printf("\n"); terminal_setcolor(VGA_COLOR_RED); /* Make sure the magic number matches for memory mapping */ if(magic != MULTIBOOT_BOOTLOADER_MAGIC) { printf("[ ERROR ] invalid magic number!\n"); _hang_asm(); } /* Check bit 6 to see if we have a valid memory map */ if(!(mbd->flags >> 6 & 0x1)) { printf("[ ERROR ] invalid memory map given by GRUB bootloader\n"); _hang_asm(); } gdt_install(false); pic_remap(); /* must be done before idt_init() */ idt_init(); _sti_asm(); irq_init(); /* MUST be done after pic_remap() and idt_init() */ terminal_setcolor(VGA_COLOR_GREEN); pmm_init(mbd); paging_init(); heap_init(0xC2000000, 0x80000); #ifdef _DEBUG printd("Testing SSE...\n"); #endif int32_t sse_test_result = test_sse(); if (sse_test_result != 0) { printf("[ SSE ] SSE test failed with RV %d\n", sse_test_result); } else { #ifdef _DEBUG printd("SSE test passed\n"); #endif } pit_init(); keyboard_init(); ide_initialize(); pci_init(); scheduler_init(); /* --- END INITIALIZATION SECTION --- */ terminal_setcolor(VGA_COLOR_LIGHT_GREEN); printf("Guten tag and welcome to Espresso %s\n", KERNEL_VERSION); //terminal_clear(); create_task(kshell_start); create_task(idle_task); extern task_t* task_list; extern task_t* current_task; current_task = task_list; printf("in kernel_main\n"); /*extern void terminal_clear(void); terminal_clear(); kshell_start(1, NULL);*/ for(;;) /* Loop infinitely. We only do something when an interrupt/syscall happens now. */ { asm volatile("hlt" ::: "memory"); } }