void kernel_main(unsigned long magic, unsigned long addr) { multiboot_info_t *mbi; if (magic != MULTIBOOT_BOOTLOADER_MAGIC) return; mbi = (multiboot_info_t*)addr; /* kernel init */ serial_init(DEBUG_SERIAL_PORT, DEBUG_SERIAL_SPEED, UART_8BITS_WORD, UART_NO_PARITY, UART_1_STOP_BIT); cls(); cpu_cli(); printf("[x] interrupts disabled\n"); gdt_initialize(); printf("[x] gdt initialized\n"); idt_initialize(); printf("[x] idt initialized\n"); breakpoint_initialize(); #if defined(USE_APIC) apic_initialize(); serial_printl("[x] apic initialized\n"); #else pic_initialize(); serial_printl("[x] pic initialized\n"); #endif /* USE_APIC */ /* initialize the kernel */ { kernel_init(mbi); } /* memory initialization */ { phys_init(mbi); phys_debug(); /* vm_init(); */ /* unit_test_vm(); */ /* cpu_hlt(); */ } #if defined(USE_PCI) pci_initialize(); pci_list(); #endif cpu_sti(); #if defined(USE_TASK) { /* subsystems */ event_initialize(); sched_initialize(); task_initialize(); /* tasks */ idle_initialize(); muksh_initialize(); net_initialize(); /* task_test(); */ /* start scheduling */ sched_start(); } #endif /* endless loop */ serial_printl("[?] kernel loop\n"); while (1) { serial_printl("k"); cpu_hlt(); } }
void kernel(long magic, multiboot_info_t *multiboot_info_pointer) { if(magic != 0x2BADB002) { print("Multiboot isn't magic", COLOR_RED); reboot(); } memcpy(&multiboot_info, multiboot_info_pointer, sizeof(struct multiboot_info_t)); if((multiboot_info.flags & 0x40) == 0) { print("Can't get memory map", COLOR_RED); reboot(); } print("ASXSoft ", COLOR_GRAY); print("Nuke\r\n", COLOR_BLUE); print("================================================================================", COLOR_GRAY); print("Switching to ", COLOR_GRAY); print("Long Mode", COLOR_YELLOW); print("...", COLOR_GRAY); ewrin(); if(inb(0x03CC) == 0) { byte old = inb(0x03B4); outb(0x03B4, 0x0A); outb(0x03B5, 0x3F); outb(0x03B4, old); } else { byte old = inb(0x03D4); outb(0x03D4, 0x0A); outb(0x03D5, 0x3F); outb(0x03D4, old); } print("Setting up GDT...", COLOR_GRAY); gdt_initialize(); gdt_load(); gdt_flush_registers(0x08, 0x10, 0x10, 0x00, 0x00, 0x10); ewrin(); print("Setting up IDT...", COLOR_GRAY); idt_initialize(); idt_load(); ewrin(); while(1) { asm("hlt"); }; }