/* * Copyright 2021 Haiku, Inc. All rights reserved. * Released under the terms of the MIT License. */ #include #include .text .code32 /* extern "C" void arch_enter_kernel(uint32_t pageDirectory, addr_t kernelArgs, addr_t kernelEntry, addr_t kernelStackTop, struct gdt_idt_descr *gdtDescriptor); */ FUNCTION(arch_enter_kernel): movl 4(%esp), %edx // pageDirectory movl 8(%esp), %ecx // kernelArgs movl 12(%esp), %ebx // kernelEntry movl 16(%esp), %eax // kernelStackTop movl 20(%esp), %esi // gdtDescriptor // initialize stack movl %eax, %esp // ensure that Paging is disabled movl %cr0, %eax andl $0x7fffffff, %eax movl %eax, %cr0 // ensure that PAE is disabled movl %cr4, %eax andl $0xffffffdf, %eax movl %eax, %cr4 // set page directory movl %edx, %eax movl %eax, %cr3 // disable interrupts cli // clear direction flag cld // initialize floating point unit fninit movl %esi, %eax lgdt (%eax) // initialize CR0 // - bit #31: Enable Paging // - bit #16: Write Protect // - bit #5: Numeric Error Handling // - bit #0: Protected Mode movl $0x80010021, %eax movl %eax, %cr0 // Set data segments. movw $KERNEL_DATA_SELECTOR, %ax movw %ax, %ss movw %ax, %ds movw %ax, %es movw %ax, %fs movw %ax, %gs pushl $0x0 // currentCpu pushl %ecx // kernelArgs pushl $0x0 // fake return address pushl $KERNEL_CODE_SELECTOR pushl %ebx // kernelEntry lret //return movl $-1, %eax ret FUNCTION_END(arch_enter_kernel)