xref: /freebsd/sys/amd64/amd64/locore.S (revision 1f474190)
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 */
56NON_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 */
770:	hlt
78	jmp	0b
79
80/* la57_trampoline(%rdi pml5) */
81NON_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
97l1:	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
116l2:	movq	%r11,%rsp
117	movq	%r10,%rbx
118	retq
119	.p2align 4,0
120NON_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
124NON_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
134NON_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 */
140bootstack:
141