int main () { int *p; p = get_gd (); set_gd (3); if (*p != 3 || !test_gd (3)) abort (); p = get_ld (); set_ld (4); if (*p != 4 || !test_ld (4)) abort (); printf ("PASS\n"); return 0; }
static int do_test (void) { int *p; p = get_gd (); set_gd (3); if (*p != 3 || !test_gd (3)) abort (); p = get_ld (); set_ld (4); if (*p != 4 || !test_ld (4)) abort (); printf ("PASS\n"); return 0; }
// Kernel void kernel(dword magic, dword addr) { dword * t; byte * buffer; multiboot_info_t * multiboot_info; // Print something clrscr(); puts("Starting...\n"); // MBoot check if(magic != MULTIBOOT_BOOTLOADER_MAGIC) { puts("Invalid magic number!\n"); for(;;); } multiboot_info = (multiboot_info_t *)addr; if (CHECK_FLAG(multiboot_info -> flags, 4) && CHECK_FLAG(multiboot_info -> flags, 5)) { puts("Invalid! Both bits 4 and 5 are set!\n"); for(;;); } printf("multiboot_info_flags = 0x%x\n", multiboot_info -> flags); if(CHECK_FLAG(multiboot_info -> flags, 0)) { printf("mem_lower = 0x%x KiB\n", multiboot_info -> mem_lower); printf("mem_upper = 0x%x KiB\n", multiboot_info -> mem_upper); } if(CHECK_FLAG(multiboot_info -> flags, 1)) { printf("boot_device = 0x%x\n", multiboot_info -> boot_device); } if(CHECK_FLAG(multiboot_info -> flags, 2)) { printf("cmdline = %s\n", (char *)multiboot_info -> cmdline); } // Init GDT set_gd(gd + 0, 0x0, 0x0, 0x0); // zero set_gd(gd + 1, 0x0, 0xcfffff, 0x9a); // cs set_gd(gd + 2, 0x0, 0xcfffff, 0x92); // ds gdtr.limit = 0x2000; gdtr.gd = gd; asm("lgdt %0"::"m"(gdtr)); // Init IRQ init_irq(); // Init IDT populate_idt(id); idtr.limit = 0x7ff; idtr.id = id; asm("lidt %0"::"m"(idtr)); // Init paging init_paging(); asm ("" : :"a"(pdbr)); asm("mov %eax, %cr3"); asm("mov %cr0, %eax"); asm("bts $0x1f, %eax"); asm("mov %eax, %cr0"); asm("jmp . + 2"); // Test FAT fat_init(& media_read, 30); buffer = malloc(512); fat_loadfile("test", buffer, 512); puts((char *)buffer); // Permit int asm("sti"); // Test paging t = (dword *)0x900000; *t = 7; // LOOP for(;;); }