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