Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/stand/efi/loader/arch/riscv/start.S
34889 views
1
/*-
2
* SPDX-License-Identifier: BSD-2-Clause
3
*
4
* Copyright (c) 2020 Mitchell Horne <[email protected]>
5
*
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
8
* are met:
9
* 1. Redistributions of source code must retain the above copyright
10
* notice, this list of conditions and the following disclaimer.
11
* 2. Redistributions in binary form must reproduce the above copyright
12
* notice, this list of conditions and the following disclaimer in the
13
* documentation and/or other materials provided with the distribution.
14
*
15
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
16
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
19
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25
* SUCH DAMAGE.
26
*/
27
28
#include <machine/asm.h>
29
30
/*
31
* We need to be a PE32+ file for EFI. On some architectures we can use
32
* objcopy to create the correct file, however on RISC-V we need to do
33
* it ourselves.
34
*/
35
36
#define IMAGE_FILE_MACHINE_RISCV64 0x5064
37
38
#define IMAGE_SCN_CNT_CODE 0x00000020
39
#define IMAGE_SCN_CNT_INITIALIZED_DATA 0x00000040
40
#define IMAGE_SCN_MEM_DISCARDABLE 0x02000000
41
#define IMAGE_SCN_MEM_EXECUTE 0x20000000
42
#define IMAGE_SCN_MEM_READ 0x40000000
43
44
.section .peheader,"a"
45
efi_start:
46
/* The MS-DOS Stub, only used to get the offset of the COFF header */
47
.ascii "MZ"
48
.short 0
49
.space 0x38
50
.long pe_sig - efi_start
51
52
/* The PE32 Signature. Needs to be 8-byte aligned */
53
.align 3
54
pe_sig:
55
.ascii "PE"
56
.short 0
57
coff_head:
58
.short IMAGE_FILE_MACHINE_RISCV64 /* RISC-V 64 file */
59
.short 2 /* 2 Sections */
60
.long 0 /* Timestamp */
61
.long 0 /* No symbol table */
62
.long 0 /* No symbols */
63
.short section_table - optional_header /* Optional header size */
64
.short 0 /* Characteristics TODO: Fill in */
65
66
optional_header:
67
.short 0x020b /* PE32+ (64-bit addressing) */
68
.byte 0 /* Major linker version */
69
.byte 0 /* Minor linker version */
70
.long _edata - _end_header /* Code size */
71
.long 0 /* No initialized data */
72
.long 0 /* No uninitialized data */
73
.long _start - efi_start /* Entry point */
74
.long _end_header - efi_start /* Start of code */
75
76
optional_windows_header:
77
.quad 0 /* Image base */
78
.long 32 /* Section Alignment */
79
.long 8 /* File alignment */
80
.short 0 /* Major OS version */
81
.short 0 /* Minor OS version */
82
.short 0 /* Major image version */
83
.short 0 /* Minor image version */
84
.short 0 /* Major subsystem version */
85
.short 0 /* Minor subsystem version */
86
.long 0 /* Win32 version */
87
.long _edata - efi_start /* Image size */
88
.long _end_header - efi_start /* Header size */
89
.long 0 /* Checksum */
90
.short 0xa /* Subsystem (EFI app) */
91
.short 0 /* DLL Characteristics */
92
.quad 0 /* Stack reserve */
93
.quad 0 /* Stack commit */
94
.quad 0 /* Heap reserve */
95
.quad 0 /* Heap commit */
96
.long 0 /* Loader flags */
97
.long 6 /* Number of RVAs */
98
99
/* RVAs: */
100
.quad 0
101
.quad 0
102
.quad 0
103
.quad 0
104
.quad 0
105
.quad 0
106
107
section_table:
108
/* We need a .reloc section for EFI */
109
.ascii ".reloc"
110
.byte 0
111
.byte 0 /* Pad to 8 bytes */
112
.long 0 /* Virtual size */
113
.long 0 /* Virtual address */
114
.long 0 /* Size of raw data */
115
.long 0 /* Pointer to raw data */
116
.long 0 /* Pointer to relocations */
117
.long 0 /* Pointer to line numbers */
118
.short 0 /* Number of relocations */
119
.short 0 /* Number of line numbers */
120
.long (IMAGE_SCN_CNT_INITIALIZED_DATA | IMAGE_SCN_MEM_READ | \
121
IMAGE_SCN_MEM_DISCARDABLE) /* Characteristics */
122
123
/* The contents of the loader */
124
.ascii ".text"
125
.byte 0
126
.byte 0
127
.byte 0 /* Pad to 8 bytes */
128
.long _edata - _end_header /* Virtual size */
129
.long _end_header - efi_start /* Virtual address */
130
.long _edata - _end_header /* Size of raw data */
131
.long _end_header - efi_start /* Pointer to raw data */
132
.long 0 /* Pointer to relocations */
133
.long 0 /* Pointer to line numbers */
134
.short 0 /* Number of relocations */
135
.short 0 /* Number of line numbers */
136
.long (IMAGE_SCN_CNT_CODE | IMAGE_SCN_MEM_EXECUTE | \
137
IMAGE_SCN_MEM_READ) /* Characteristics */
138
_end_header:
139
140
.text
141
.globl _start
142
_start:
143
/* Save the boot params to the stack */
144
addi sp, sp, -16
145
sd a0, 0(sp)
146
sd a1, 8(sp)
147
148
/* Zero the BSS */
149
lla t0, __bss_start
150
lla t1, __bss_end
151
152
1: sd zero, 0(t0)
153
addi t0, t0, 8
154
bltu t0, t1, 1b
155
156
lla a0, ImageBase
157
lla a1, _DYNAMIC
158
call _C_LABEL(self_reloc)
159
160
ld a1, 8(sp)
161
ld a0, 0(sp)
162
tail _C_LABEL(efi_main)
163
164
/* NOTREACHED */
165
2: wfi
166
j 2b
167
168