summaryrefslogtreecommitdiff
path: root/OvmfPkg/Library/LoadLinuxLib/X64/JumpToKernel.S
blob: edc6e7bd707dd107a0b37b32b721c4166562eea6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
#------------------------------------------------------------------------------
#
# Copyright (c) 2006 - 2013, Intel Corporation. All rights reserved.<BR>
#
# This program and the accompanying materials
# are licensed and made available under the terms and conditions of the BSD License
# which accompanies this distribution.  The full text of the license may be found at
# http://opensource.org/licenses/bsd-license.php.
#
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
#
#------------------------------------------------------------------------------

ASM_GLOBAL ASM_PFX(JumpToKernel)

#------------------------------------------------------------------------------
# VOID
# EFIAPI
# JumpToKernel (
#   VOID *KernelStart,         // %rcx
#   VOID *KernelBootParams     // %rdx
#   );
#------------------------------------------------------------------------------
ASM_PFX(JumpToKernel):

    // Set up for executing kernel. BP in %esi, entry point on the stack
    // (64-bit when the 'ret' will use it as 32-bit, but we're little-endian)
    movq    %rdx, %rsi
    pushq   %rcx

    // Jump into the compatibility mode CS
    pushq   $0x10
    leaq    1f(%rip), %rax
    pushq   %rax
    .byte   0x48, 0xcb                      // retfq

1:  // Now in compatibility mode
.code32
    movl    $0x18, %eax
    movl    %eax, %ds
    movl    %eax, %es
    movl    %eax, %fs
    movl    %eax, %gs
    movl    %eax, %ss

    // Disable paging
    movl    %cr0, %eax
    btcl    $31, %eax
    movl    %eax, %cr0

    // Disable long mode in EFER
    movl    $0x0c0000080, %ecx
    rdmsr
    btcl    $8, %eax
    wrmsr

    // Disable PAE
    movl    %cr4, %eax
    btcl    $5, %eax
    movl    %eax, %cr4

    // Zero registers and 'return' to kernel
    xorl    %ebp, %ebp
    xorl    %edi, %edi
    xorl    %ebx, %ebx
    ret
.code64