]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/locore.S
Merge llvm-project main llvmorg-13-init-16847-g88e66fa60ae5
[FreeBSD/FreeBSD.git] / sys / amd64 / amd64 / locore.S
1 /*-
2  * Copyright (c) 2003 Peter Wemm <peter@FreeBSD.org>
3  * All rights reserved.
4  *
5  * Copyright (c) 2020, 2021 The FreeBSD Foundation
6  *
7  * Portions of this software were developed by
8  * Konstantin Belousov <kib@FreeBSD.org> under sponsorship from
9  * the FreeBSD Foundation.
10  *
11  * Redistribution and use in source and binary forms, with or without
12  * modification, are permitted provided that the following conditions
13  * are met:
14  * 1. Redistributions of source code must retain the above copyright
15  *    notice, this list of conditions and the following disclaimer.
16  * 2. Redistributions in binary form must reproduce the above copyright
17  *    notice, this list of conditions and the following disclaimer in the
18  *    documentation and/or other materials provided with the distribution.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  *
32  * $FreeBSD$
33  */
34
35 #include <machine/asmacros.h>
36 #include <machine/psl.h>
37 #include <machine/pmap.h>
38 #include <machine/specialreg.h>
39
40 #include "assym.inc"
41
42 /*
43  * Compiled KERNBASE location
44  */
45         .globl  kernbase, kernload, dmapbase, dmapend
46         .set    kernbase,KERNBASE
47         .set    kernload,KERNLOAD
48         .set    dmapbase,DMAP_MIN_ADDRESS
49         .set    dmapend,DMAP_MAX_ADDRESS
50
51         .text
52 /**********************************************************************
53  *
54  * This is where the loader trampoline start us, set the ball rolling...
55  *
56  * We are called with the stack looking like this:
57  * 0(%rsp) = 32 bit return address (cannot be used)
58  * 4(%rsp) = 32 bit modulep
59  * 8(%rsp) = 32 bit kernend
60  *
61  * We are already in long mode, on a 64 bit %cs and running at KERNBASE.
62  */
63 ENTRY(btext)
64
65         /* Don't trust what the loader gives for rflags. */
66         pushq   $PSL_KERNEL
67         popfq
68
69         /* Find the metadata pointers before we lose them */
70         movq    %rsp, %rbp
71         movl    4(%rbp),%edi            /* modulep (arg 1) */
72         movl    8(%rbp),%esi            /* kernend (arg 2) */
73
74         /* Get onto a stack that we can trust - there is no going back now. */
75         movq    $bootstack,%rsp
76         xorl    %ebp, %ebp
77
78         call    hammer_time             /* set up cpu for unix operation */
79         movq    %rax,%rsp               /* set up kstack for mi_startup() */
80         call    mi_startup              /* autoconfiguration, mountroot etc */
81 0:      hlt
82         jmp     0b
83
84 /* la57_trampoline(%rdi pml5) */
85 ENTRY(la57_trampoline)
86         movq    %rsp,%r11
87         movq    %rbx,%r10
88         leaq    la57_trampoline_end(%rip),%rsp
89
90         movq    %cr0,%rdx
91         lgdtq   la57_trampoline_gdt_desc(%rip)
92
93         pushq   $(2<<3)
94         leaq    l1(%rip),%rax
95         leaq    l2(%rip),%rbx
96
97         pushq   %rax
98         lretq
99         .code32
100
101 l1:     movl    $(3<<3),%eax
102         movl    %eax,%ss
103
104         movl    %edx,%eax
105         andl    $~CR0_PG,%eax
106         movl    %eax,%cr0
107
108         movl    %cr4,%eax
109         orl     $CR4_LA57,%eax
110         movl    %eax,%cr4
111
112         movl    %edi,%cr3
113         movl    %edx,%cr0
114
115         pushl   $(1<<3)
116         pushl   %ebx
117         lretl
118         .code64
119
120 l2:     movq    %r11,%rsp
121         movq    %r10,%rbx
122         retq
123         .p2align 4,0
124 ENTRY(la57_trampoline_gdt_desc)
125         .word   la57_trampoline_end - la57_trampoline_gdt
126         .long   0               /* filled by pmap_bootstrap_la57 */
127         .p2align 4,0
128 ENTRY(la57_trampoline_gdt)
129         .long   0x00000000      /* null desc */
130         .long   0x00000000
131         .long   0x00000000      /* 64bit code */
132         .long   0x00209800
133         .long   0x0000ffff      /* 32bit code */
134         .long   0x00cf9b00
135         .long   0x0000ffff      /* universal data */
136         .long   0x00cf9300
137         .dcb.l  16,0
138 ENTRY(la57_trampoline_end)
139
140         .bss
141         ALIGN_DATA                      /* just to be sure */
142         .globl  bootstack
143         .space  0x1000                  /* space for bootstack - temporary stack */
144 bootstack: