18ee963f9SAlexander von Gluck IV/* 28ee963f9SAlexander von Gluck IV * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. 38ee963f9SAlexander von Gluck IV * Copyright 2014, Henry Harrington, henry.harrington@gmail.com. 48ee963f9SAlexander von Gluck IV * Distributed under the terms of the MIT License. 58ee963f9SAlexander von Gluck IV */ 68ee963f9SAlexander von Gluck IV 78ee963f9SAlexander von Gluck IV 88ee963f9SAlexander von Gluck IV#include <asm_defs.h> 98ee963f9SAlexander von Gluck IV 108ee963f9SAlexander von Gluck IV#include <arch/x86/descriptors.h> 118ee963f9SAlexander von Gluck IV 128ee963f9SAlexander von Gluck IV 138ee963f9SAlexander von Gluck IV#define GDT_LIMIT 0x800 148ee963f9SAlexander von Gluck IV 158ee963f9SAlexander von Gluck IV 168ee963f9SAlexander von Gluck IV.code64 178ee963f9SAlexander von Gluck IV 188ee963f9SAlexander von Gluck IV 19*04f1baa7SAlexander von Gluck IV/*! void arch_enter_kernel(uint64 pml4, uint64 entry_point, uint64 stackTop); */ 20*04f1baa7SAlexander von Gluck IVFUNCTION(arch_enter_kernel): 218ee963f9SAlexander von Gluck IV // Point CR3 to the kernel's PML4. 228ee963f9SAlexander von Gluck IV movq %rdi, %cr3 238ee963f9SAlexander von Gluck IV 248ee963f9SAlexander von Gluck IV // Load 64-bit enabled GDT 258ee963f9SAlexander von Gluck IV lgdtq gLongGDTR(%rip) 268ee963f9SAlexander von Gluck IV 278ee963f9SAlexander von Gluck IV // Jump into the 64-bit code segment. 288ee963f9SAlexander von Gluck IV push $KERNEL_CODE_SELECTOR 298ee963f9SAlexander von Gluck IV lea .Llmode(%rip), %rax 308ee963f9SAlexander von Gluck IV push %rax 318ee963f9SAlexander von Gluck IV lretq 328ee963f9SAlexander von Gluck IV.align 8 338ee963f9SAlexander von Gluck IV.code64 348ee963f9SAlexander von Gluck IV.Llmode: 358ee963f9SAlexander von Gluck IV // Set data segments. 368ee963f9SAlexander von Gluck IV mov $KERNEL_DATA_SELECTOR, %ax 378ee963f9SAlexander von Gluck IV mov %ax, %ss 388ee963f9SAlexander von Gluck IV xor %ax, %ax 398ee963f9SAlexander von Gluck IV mov %ax, %ds 408ee963f9SAlexander von Gluck IV mov %ax, %es 418ee963f9SAlexander von Gluck IV mov %ax, %fs 428ee963f9SAlexander von Gluck IV mov %ax, %gs 438ee963f9SAlexander von Gluck IV 448ee963f9SAlexander von Gluck IV // Set the stack pointer. 458ee963f9SAlexander von Gluck IV movq %rdx, %rsp 468ee963f9SAlexander von Gluck IV 478ee963f9SAlexander von Gluck IV // Clear the stack frame/RFLAGS. 488ee963f9SAlexander von Gluck IV xorq %rbp, %rbp 498ee963f9SAlexander von Gluck IV push $2 508ee963f9SAlexander von Gluck IV popf 518ee963f9SAlexander von Gluck IV 528ee963f9SAlexander von Gluck IV // Get arguments and call the kernel entry point. 538ee963f9SAlexander von Gluck IV mov %rsi, %rax // entry point 548ee963f9SAlexander von Gluck IV leaq gKernelArgs(%rip), %rdi 558ee963f9SAlexander von Gluck IV xorl %esi, %esi // current cpu 568ee963f9SAlexander von Gluck IV call *%rax 578ee963f9SAlexander von Gluck IV 588ee963f9SAlexander von Gluck IV 598ee963f9SAlexander von Gluck IV.data 608ee963f9SAlexander von Gluck IV 618ee963f9SAlexander von Gluck IV 628ee963f9SAlexander von Gluck IVSYMBOL(gLongGDTR): 638ee963f9SAlexander von Gluck IV .word BOOT_GDT_SEGMENT_COUNT * 8 - 1 648ee963f9SAlexander von Gluck IVSYMBOL(gLongGDT): 658ee963f9SAlexander von Gluck IV .quad 0 66