xref: /haiku/src/system/boot/platform/efi/arch/x86_64/entry.S (revision 04f1baa7711fb400ad209a9e331153cec200f981)
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