xref: /freebsd/sys/amd64/amd64/locore.S (revision f126890a)
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
33#include <machine/asmacros.h>
34#include <machine/psl.h>
35#include <machine/pmap.h>
36#include <machine/specialreg.h>
37
38#include "assym.inc"
39
40/*
41 * Compiled KERNBASE location
42 */
43	.globl	kernbase, kernload, dmapbase, dmapend
44	.set	kernbase,KERNBASE
45	.set    kernload,KERNLOAD
46	.set	dmapbase,DMAP_MIN_ADDRESS
47	.set	dmapend,DMAP_MAX_ADDRESS
48
49#define	BOOTSTACK_SIZE	(PAGE_SIZE * KSTACK_PAGES)
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 */
63ENTRY(btext)
64
65	/* Don't trust what the loader gives for rflags. */
66	pushq	$PSL_KERNEL
67	popfq
68
69	/* Get onto a stack that we can trust - there is no going back now. */
70	movq	%rsp, %rbp
71	movq	$bootstack,%rsp
72
73#ifdef KASAN
74	/* Bootstrap a shadow map for the boot stack. */
75	movq	$bootstack, %rdi
76	subq	$BOOTSTACK_SIZE, %rdi
77	movq	$BOOTSTACK_SIZE, %rsi
78	call	kasan_init_early
79#endif
80
81	/* Grab metadata pointers from the loader. */
82	movl	4(%rbp),%edi		/* modulep (arg 1) */
83	movl	8(%rbp),%esi		/* kernend (arg 2) */
84	xorq	%rbp, %rbp
85
86	call	hammer_time		/* set up cpu for unix operation */
87	movq	%rax,%rsp		/* set up kstack for mi_startup() */
88	call	mi_startup		/* autoconfiguration, mountroot etc */
890:	hlt
90	jmp	0b
91
92/* la57_trampoline(%rdi pml5) */
93ENTRY(la57_trampoline)
94	movq	%rsp,%r11
95	movq	%rbx,%r10
96	leaq	la57_trampoline_end(%rip),%rsp
97
98	movq	%cr0,%rdx
99	lgdtq	la57_trampoline_gdt_desc(%rip)
100
101	pushq	$(2<<3)
102	leaq	l1(%rip),%rax
103	leaq	l2(%rip),%rbx
104
105	pushq	%rax
106	lretq
107	.code32
108
109l1:	movl	$(3<<3),%eax
110	movl	%eax,%ss
111
112	movl	%edx,%eax
113	andl	$~CR0_PG,%eax
114	movl	%eax,%cr0
115
116	movl	%cr4,%eax
117	orl	$CR4_LA57,%eax
118	movl	%eax,%cr4
119
120	movl	%edi,%cr3
121	movl	%edx,%cr0
122
123	pushl	$(1<<3)
124	pushl	%ebx
125	lretl
126	.code64
127
128l2:	movq	%r11,%rsp
129	movq	%r10,%rbx
130	retq
131	.p2align 4,0
132ENTRY(la57_trampoline_gdt_desc)
133	.word	la57_trampoline_end - la57_trampoline_gdt
134	.long	0		/* filled by pmap_bootstrap_la57 */
135	.p2align 4,0
136ENTRY(la57_trampoline_gdt)
137	.long	0x00000000	/* null desc */
138	.long	0x00000000
139	.long	0x00000000	/* 64bit code */
140	.long	0x00209800
141	.long	0x0000ffff	/* 32bit code */
142	.long	0x00cf9b00
143	.long	0x0000ffff	/* universal data */
144	.long	0x00cf9300
145	.dcb.l	16,0
146ENTRY(la57_trampoline_end)
147
148	.bss
149	.p2align PAGE_SHIFT
150	.globl	bootstack
151	.space	BOOTSTACK_SIZE		/* space for bootstack - temporary stack */
152bootstack:
153