1*f8ca5d45SAhmad Khalifa/*- 2*f8ca5d45SAhmad Khalifa * Copyright (c) 2013 The FreeBSD Foundation 3*f8ca5d45SAhmad Khalifa * Copyright (c) 2023 Ahmad Khalifa <ahmadkhalifa570@gmail.com> 4*f8ca5d45SAhmad Khalifa * 5*f8ca5d45SAhmad Khalifa * This software was developed by Benno Rice under sponsorship from 6*f8ca5d45SAhmad Khalifa * the FreeBSD Foundation. 7*f8ca5d45SAhmad Khalifa * Redistribution and use in source and binary forms, with or without 8*f8ca5d45SAhmad Khalifa * modification, are permitted provided that the following conditions 9*f8ca5d45SAhmad Khalifa * are met: 10*f8ca5d45SAhmad Khalifa * 1. Redistributions of source code must retain the above copyright 11*f8ca5d45SAhmad Khalifa * notice, this list of conditions and the following disclaimer. 12*f8ca5d45SAhmad Khalifa * 2. Redistributions in binary form must reproduce the above copyright 13*f8ca5d45SAhmad Khalifa * notice, this list of conditions and the following disclaimer in the 14*f8ca5d45SAhmad Khalifa * documentation and/or other materials provided with the distribution. 15*f8ca5d45SAhmad Khalifa * 16*f8ca5d45SAhmad Khalifa * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 17*f8ca5d45SAhmad Khalifa * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 18*f8ca5d45SAhmad Khalifa * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 19*f8ca5d45SAhmad Khalifa * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 20*f8ca5d45SAhmad Khalifa * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 21*f8ca5d45SAhmad Khalifa * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 22*f8ca5d45SAhmad Khalifa * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 23*f8ca5d45SAhmad Khalifa * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 24*f8ca5d45SAhmad Khalifa * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 25*f8ca5d45SAhmad Khalifa * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26*f8ca5d45SAhmad Khalifa * SUCH DAMAGE. 27*f8ca5d45SAhmad Khalifa */ 28*f8ca5d45SAhmad Khalifa 29*f8ca5d45SAhmad Khalifa#include <machine/asmacros.h> 30*f8ca5d45SAhmad Khalifa 31*f8ca5d45SAhmad Khalifa .text 32*f8ca5d45SAhmad Khalifa .globl amd64_tramp 33*f8ca5d45SAhmad Khalifa 34*f8ca5d45SAhmad Khalifa/* 35*f8ca5d45SAhmad Khalifa * void amd64_tramp(uint32_t stack, void *copy_finish, uint32_t kernend, 36*f8ca5d45SAhmad Khalifa * uint32_t modulep, uint32_t pagetable, uint32_t gdtr, uint64_t entry) 37*f8ca5d45SAhmad Khalifa */ 38*f8ca5d45SAhmad Khalifaamd64_tramp: 39*f8ca5d45SAhmad Khalifa cli /* Make sure we don't get interrupted. */ 40*f8ca5d45SAhmad Khalifa 41*f8ca5d45SAhmad Khalifa calll *8(%esp) /* Call copy_finish so we're all ready to go. */ 42*f8ca5d45SAhmad Khalifa 43*f8ca5d45SAhmad Khalifa movl %cr0, %eax /* Paging may be enabled, disable it. */ 44*f8ca5d45SAhmad Khalifa andl $0x7FFFFFFF, %eax 45*f8ca5d45SAhmad Khalifa movl %eax, %cr0 46*f8ca5d45SAhmad Khalifa 47*f8ca5d45SAhmad Khalifa movl %cr4, %eax /* PAE may be disabled, enable it. */ 48*f8ca5d45SAhmad Khalifa orl $0x20, %eax 49*f8ca5d45SAhmad Khalifa movl %eax, %cr4 50*f8ca5d45SAhmad Khalifa 51*f8ca5d45SAhmad Khalifa movl 20(%esp), %eax /* Swap page tables. */ 52*f8ca5d45SAhmad Khalifa movl %eax, %cr3 53*f8ca5d45SAhmad Khalifa 54*f8ca5d45SAhmad Khalifa movl $0xC0000080, %ecx /* Enable long mode. */ 55*f8ca5d45SAhmad Khalifa rdmsr 56*f8ca5d45SAhmad Khalifa orl $0x100, %eax 57*f8ca5d45SAhmad Khalifa wrmsr 58*f8ca5d45SAhmad Khalifa 59*f8ca5d45SAhmad Khalifa movl 12(%esp), %edi /* Stash the kernel and GDT values for later. */ 60*f8ca5d45SAhmad Khalifa movl 16(%esp), %esi 61*f8ca5d45SAhmad Khalifa movl 24(%esp), %ebx 62*f8ca5d45SAhmad Khalifa movl 28(%esp), %edx 63*f8ca5d45SAhmad Khalifa movl 32(%esp), %ebp 64*f8ca5d45SAhmad Khalifa 65*f8ca5d45SAhmad Khalifa movl 4(%esp), %esp /* Switch to our temporary stack. */ 66*f8ca5d45SAhmad Khalifa 67*f8ca5d45SAhmad Khalifa movl %cr0, %eax /* Enable paging and enter compatibility mode. */ 68*f8ca5d45SAhmad Khalifa orl $0x80000000, %eax 69*f8ca5d45SAhmad Khalifa movl %eax, %cr0 70*f8ca5d45SAhmad Khalifa 71*f8ca5d45SAhmad Khalifa lgdtl (%ebx) /* Load GDT. */ 72*f8ca5d45SAhmad Khalifa 73*f8ca5d45SAhmad Khalifa pushl %edi /* Push kernend. */ 74*f8ca5d45SAhmad Khalifa pushl %esi /* Push modulep. */ 75*f8ca5d45SAhmad Khalifa pushl $0x0 76*f8ca5d45SAhmad Khalifa pushl %ebp /* Push 64-bit entry address. */ 77*f8ca5d45SAhmad Khalifa pushl %edx 78*f8ca5d45SAhmad Khalifa 79*f8ca5d45SAhmad Khalifa calll 0f /* Find the address of ".longmode". */ 80*f8ca5d45SAhmad Khalifa0: popl %eax 81*f8ca5d45SAhmad Khalifa addl $(.longmode-0b), %eax 82*f8ca5d45SAhmad Khalifa 83*f8ca5d45SAhmad Khalifa pushl $0x8 /* Push CS. */ 84*f8ca5d45SAhmad Khalifa pushl %eax /* Push the address. */ 85*f8ca5d45SAhmad Khalifa lretl /* "Return" to 64-bit code. */ 86*f8ca5d45SAhmad Khalifa 87*f8ca5d45SAhmad Khalifa .code64 88*f8ca5d45SAhmad Khalifa 89*f8ca5d45SAhmad Khalifa.longmode: 90*f8ca5d45SAhmad Khalifa retq /* "Return" to kernel entry. */ 91*f8ca5d45SAhmad Khalifa 92*f8ca5d45SAhmad Khalifa .code32 93*f8ca5d45SAhmad Khalifa 94*f8ca5d45SAhmad Khalifa ALIGN_TEXT 95*f8ca5d45SAhmad Khalifaamd64_tramp_end: 96*f8ca5d45SAhmad Khalifa 97*f8ca5d45SAhmad Khalifa .data 98*f8ca5d45SAhmad Khalifa .globl amd64_tramp_size 99*f8ca5d45SAhmad Khalifaamd64_tramp_size: 100*f8ca5d45SAhmad Khalifa .long amd64_tramp_end-amd64_tramp 101