#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* 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 #if !defined(__x86_64__) # error "nrvn needs to be compiled with a x86_64 compiler" #endif int oct2bin(char *str, int size) { int n = 0; while (size--) { n *= 8; n += *str - '0'; str++; } return n; } void kernel_main(void) { vga_init(); vga_puts("hello world\n"); vga_puts("welcome to nirvanna\n\n"); vga_puts("initializing interrupt tables..."); idt_init(); vga_puts("interrupt tables initialized\n"); vga_puts("initializing the pic..."); pic_init(); vga_puts("pic initialized\n"); vga_puts("initializing memory pages... "); if (paging_init()) { vga_puts("memory pages allocated\n"); } else { vga_puts("failed to allocate memory pages\n"); } vga_puts("initializing ps/2...\n"); if (ps2_init(NULL)) vga_puts("ps/2 initialized.\n"); else vga_puts("ps/2 initialization failed.\n"); vga_puts("initializing pci...\n"); if (pci_init()) vga_puts("pci initialized.\n"); else vga_puts("pci initialization failed.\n"); struct disk *disk = get_disk(0); struct gpt_header *gpt = read_gpt_disk(disk); if (!gpt) while (1); struct gpt_entry *entry = get_gpt_entry(disk, gpt, 0); if (!entry) while (1); char *archive = read_gpt_entry(disk, entry); while (!memcmp(archive + 257, "ustar", 5)) { int size = oct2bin(archive + 0x7c, 11); vga_puts(archive[156] == '0' ? "filename: " : "directory: "); vga_puts(archive); vga_puts(", size: "); vga_putn(size); vga_putc('\n'); if (size > 0) { vga_puts("contents: "); vga_puts(archive + 512); vga_putc('\n'); } archive += 512 + (size > 0 ? 512 : 0); } while (1); }