]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/amd64/amd64/locore.S
amd64: use register macros for gdb_cpu_getreg()
[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, kernload, loc_PTmap, loc_PDmap, loc_PDPmap, dmapbase, dmapend
40         .set    kernbase,KERNBASE
41         .set    kernload,KERNLOAD
42         .set    dmapbase,DMAP_MIN_ADDRESS
43         .set    dmapend,DMAP_MAX_ADDRESS
44
45         .text
46 /**********************************************************************
47  *
48  * This is where the loader trampoline start us, set the ball rolling...
49  *
50  * We are called with the stack looking like this:
51  * 0(%rsp) = 32 bit return address (cannot be used)
52  * 4(%rsp) = 32 bit modulep
53  * 8(%rsp) = 32 bit kernend
54  *
55  * We are already in long mode, on a 64 bit %cs and running at KERNBASE.
56  */
57 NON_GPROF_ENTRY(btext)
58
59         /* Tell the bios to warmboot next time */
60         movw    $0x1234,0x472
61
62         /* Don't trust what the loader gives for rflags. */
63         pushq   $PSL_KERNEL
64         popfq
65
66         /* Find the metadata pointers before we lose them */
67         movq    %rsp, %rbp
68         movl    4(%rbp),%edi            /* modulep (arg 1) */
69         movl    8(%rbp),%esi            /* kernend (arg 2) */
70
71         /* Get onto a stack that we can trust - there is no going back now. */
72         movq    $bootstack,%rsp
73         xorl    %ebp, %ebp
74
75         call    hammer_time             /* set up cpu for unix operation */
76         movq    %rax,%rsp               /* set up kstack for mi_startup() */
77         call    mi_startup              /* autoconfiguration, mountroot etc */
78 0:      hlt
79         jmp     0b
80
81 /* la57_trampoline(%rdi pml5) */
82 NON_GPROF_ENTRY(la57_trampoline)
83         movq    %rsp,%r11
84         movq    %rbx,%r10
85         leaq    la57_trampoline_end(%rip),%rsp
86
87         movq    %cr0,%rdx
88         lgdtq   la57_trampoline_gdt_desc(%rip)
89
90         pushq   $(2<<3)
91         leaq    l1(%rip),%rax
92         leaq    l2(%rip),%rbx
93
94         pushq   %rax
95         lretq
96         .code32
97
98 l1:     movl    $(3<<3),%eax
99         movl    %eax,%ss
100
101         movl    %edx,%eax
102         andl    $~CR0_PG,%eax
103         movl    %eax,%cr0
104
105         movl    %cr4,%eax
106         orl     $CR4_LA57,%eax
107         movl    %eax,%cr4
108
109         movl    %edi,%cr3
110         movl    %edx,%cr0
111
112         pushl   $(1<<3)
113         pushl   %ebx
114         lretl
115         .code64
116
117 l2:     movq    %r11,%rsp
118         movq    %r10,%rbx
119         retq
120         .p2align 4,0
121 NON_GPROF_ENTRY(la57_trampoline_gdt_desc)
122         .word   la57_trampoline_end - la57_trampoline_gdt
123         .long   0               /* filled by pmap_bootstrap_la57 */
124         .p2align 4,0
125 NON_GPROF_ENTRY(la57_trampoline_gdt)
126         .long   0x00000000      /* null desc */
127         .long   0x00000000
128         .long   0x00000000      /* 64bit code */
129         .long   0x00209800
130         .long   0x0000ffff      /* 32bit code */
131         .long   0x00cf9b00
132         .long   0x0000ffff      /* universal data */
133         .long   0x00cf9300
134         .dcb.l  16,0
135 NON_GPROF_ENTRY(la57_trampoline_end)
136
137         .bss
138         ALIGN_DATA                      /* just to be sure */
139         .globl  bootstack
140         .space  0x1000                  /* space for bootstack - temporary stack */
141 bootstack: