void arch_run(Thread *t) { load_tss(t->kstack + PAGE_SIZE); lcr3(kva2pa(t->process->vm->arch_data)); kercall_stack = t->kstack + PAGE_SIZE; wrmsr(MSR_IA32_FS_BASE, t->tls_ptr); context_switch(&sched_context, t->arch_data.context); }
void kmain(void) { kernel_end = (uint64_t)heap_addr; kernel_heap_ptr = (uint8_t*)((uint64_t)&VMA + kernel_end + heap_size) ; UPD = (uint64_t*)((uint64_t)&VMA + kernel_end + 0x3000); KPD = (uint64_t*)((uint64_t)&VMA + kernel_end + 0x4000); PML4 = (uint64_t*)((uint64_t)&VMA + kernel_end); *(KPD + 511) = (kernel_end + 0x4000) | 3; map_mem(mboot_info); #if _GFX_ init_video(); #endif idt_install(); isr_install(); vmem_init(); serial.init(); extern void load_tss(void); load_tss(); extern uint64_t k_tss64_sp; *(uint64_t*)( (uint64_t)&VMA + (uint64_t)&k_tss64_sp ) = 0xFFFFFFFFC0008000; pit_set_freq(2000); // timer tick = 500 us pit_install(); irq_install(); extern void mouse_init(); //mouse_init(); extern void mouse_handler(void*); //irq_install_handler(12, mouse_handler); multiboot_module_t *mod = (multiboot_module_t*)(uint64_t)mboot_info->mods_addr; ramdev_private_t ramdev_private = (ramdev_private_t) { .ptr = (void*)((uint64_t)&VMA + mod->mod_start), .size = (uint32_t)(mod->mod_end - mod->mod_start), }; inode_t ramdisk_inode = (inode_t) { .name = "ramdisk", .type = FS_CHRDEV, .fs = &devfs, .dev = &ramdev, .p = &ramdev_private, }; vfs_create(&dev_root, "/", &ramdisk_inode); inode_t *rootfs = initramfs.load(&ramdisk_inode); vfs_mount_root(rootfs); irq_install_handler(1, kbd_handler); devman.init(); fsman.init(); #if _DBG_CON_ // We should disable debugging by this stage! serial.end(); #endif process_t *init = load_elf("/bin/init"); extern void spawn_init(process_t*); spawn_init(init); for(;;); }