#include <asm_defs.h>
#include <arch/x86/descriptors.h>
#define GDT_LIMIT 0x800
.code64
FUNCTION(arch_enter_kernel):
movq %rdi, %cr3
lgdtq gLongGDTR(%rip)
push $KERNEL_CODE_SELECTOR
lea .Llmode(%rip), %rax
push %rax
lretq
.align 8
.code64
.Llmode:
mov $KERNEL_DATA_SELECTOR, %ax
mov %ax, %ss
xor %ax, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %fs
mov %ax, %gs
movq %rdx, %rsp
xorq %rbp, %rbp
push $2
popf
mov %rsi, %rax
leaq gKernelArgs(%rip), %rdi
xorl %esi, %esi
call *%rax
.data
SYMBOL(gLongGDTR):
.word BOOT_GDT_SEGMENT_COUNT * 8 - 1
SYMBOL(gLongGDT):
.quad 0