1 // Copyright 2016 The Fuchsia Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #pragma once
6
7 #ifndef __ASSEMBLER__
8 #include <zircon/compiler.h>
9 #include <stdbool.h>
10 #include <stdint.h>
11 #endif
12
13 // lsw of sha256("bootdata")
14 #define BOOTDATA_MAGIC (0x868cf7e6)
15
16 // lsw of sha256("bootitem")
17 #define BOOTITEM_MAGIC (0xb5781729)
18
19 // Round n up to the next 8 byte boundary
20 #define BOOTDATA_ALIGN(n) (((n) + 7) & (~7))
21
22 #define BOOTITEM_NO_CRC32 (0x4a87e8d6)
23
24 // This flag is required.
25 #define BOOTDATA_FLAG_V2 (0x00010000)
26
27 // Bootdata items with the CRC32 flag must have a valid crc32.
28 // Otherwise their crc32 field must contain BOOTITEM_NO_CRC32
29 #define BOOTDATA_FLAG_CRC32 (0x00020000)
30
31 // Bootdata types that have least significant byte set to 'm'
32 // are reserved for driver metadata
33 #define BOOTDATA_KIND_METADATA (0x0000006D)
34 #define BOOTDATA_KIND_MASK (0x000000FF)
35
36 // Containers are used to wrap a set of bootdata items
37 // written to a file or partition. The "length" is the
38 // length of the set of following bootdata items. The
39 // "extra" is the value BOOTDATA_MAGIC and "flags" is
40 // set to 0.
41 #define BOOTDATA_CONTAINER (0x544f4f42) // BOOT
42
43 // BOOTFS images. The "extra" field is the decompressed
44 // size of the image, if compressed, otherwise the same
45 // as the "length" field.
46 #define BOOTDATA_BOOTFS_BOOT (0x42534642) // BFSB
47 #define BOOTDATA_BOOTFS_SYSTEM (0x53534642) // BFSS
48 #define BOOTDATA_BOOTFS_DISCARD (0x58534642) // BFSX
49
50 #define BOOTDATA_BOOTFS_MASK (0x00FFFFFF)
51 #define BOOTDATA_BOOTFS_TYPE (0x00534642) // BFS\0
52
53 // Virtual disk images. The header fields and compression protocol
54 // are the same as for the BOOTFS types, but the payload before
55 // compression is a raw disk image rather than BOOTFS format.
56 #define BOOTDATA_RAMDISK (0x4b534452) // RDSK
57
58 // A Zircon Kernel Image
59 // Content: bootdata_kernel_t
60 #define BOOTDATA_KERNEL (0x4c4e524b) // KRNL
61
62 // A Zircon Partition Map
63 // Content: bootdata_partition_map_t
64 // The bootdata_t.extra field is used as a board specific index
65 // to specify which device the partition map applies to.
66 #define BOOTDATA_PARTITION_MAP (0x5452506D) // mPRT
67
68 // MAC Address for Ethernet, Wifi, Bluetooth, etc.
69 // Content: uint8_t[] (variable length based on type of MAC address)
70 // The bootdata_t.extra field is used as a board specific index
71 // to specify which device the MAC address applies to.
72 #define BOOTDATA_MAC_ADDRESS (0x43414D6D) // mMAC
73
74 // Flag indicating that the bootfs is compressed.
75 #define BOOTDATA_BOOTFS_FLAG_COMPRESSED (1 << 0)
76
77
78 // These items are for passing from bootloader to kernel
79
80 // Kernel Command Line String
81 // Content: uint8_t[]
82 #define BOOTDATA_CMDLINE (0x4c444d43) // CMDL
83
84 // ACPI Root Table Pointer
85 // Content: uint64_t phys addr
86 #define BOOTDATA_ACPI_RSDP (0x50445352) // RSDP
87
88 // SMBIOS entry point pointer
89 // Content: uint64_t phys addr
90 #define BOOTDATA_SMBIOS (0x49424d53) // SMBI
91
92 // Framebuffer Parameters
93 // Content: bootdata_swfb_t
94 #define BOOTDATA_FRAMEBUFFER (0x42465753) // SWFB
95
96 // Debug Serial Port
97 // Content: bootdata_uart_t
98 #define BOOTDATA_DEBUG_UART (0x54524155) // UART
99
100 // Platform ID Information
101 // Content: bootdata_platform_id_t
102 #define BOOTDATA_PLATFORM_ID (0x44494C50) // PLID
103
104 // Memory which will persist across warm boots
105 // Content bootdata_lastlog_nvram_t
106 #define BOOTDATA_LASTLOG_NVRAM (0x4c4c564e) // NVLL
107
108 // This reflects a typo we need to support for a while
109 #define BOOTDATA_LASTLOG_NVRAM2 (0x4c4c5643) // CVLL
110
111 // E820 Memory Table
112 // Content: e820entry[]
113 #define BOOTDATA_E820_TABLE (0x30323845) // E820
114
115 // EFI Memory Map
116 // Content: a uint64_t entrysz followed by a set of
117 // efi_memory_descriptor aligned on entrysz
118 #define BOOTDATA_EFI_MEMORY_MAP (0x4d494645) // EFIM
119
120 // EFI System Table
121 // Content: a uint64_t physical address of the table
122 #define BOOTDATA_EFI_SYSTEM_TABLE (0x53494645) // EFIS
123
124 // Last crashlog
125 // Content: ascii/utf8 log data from previous boot
126 #define BOOTDATA_LAST_CRASHLOG (0x4d4f4f42) // BOOM
127
128 // CPU configuration
129 // Content: bootdata_cpu_config_t
130 #define BOOTDATA_CPU_CONFIG (0x43555043) // CPUC
131
132 // Memory configuration
133 // Content: one or more of bootdata_mem_range_t (count determined by bootdata_t length)
134 #define BOOTDATA_MEM_CONFIG (0x434D454D) // MEMC
135
136 // Kernel driver configuration
137 // Content: driver specific struct, with type determined by bootdata "extra" field
138 #define BOOTDATA_KERNEL_DRIVER (0x5652444B) // KDRV
139
140 #define BOOTDATA_IGNORE (0x50494b53) // SKIP
141
142 #ifndef __ASSEMBLER__
143 __BEGIN_CDECLS;
144
145 // BootData header, describing the type and size of data
146 // used to initialize the system. All fields are little-endian.
147 //
148 // BootData headers in a stream must be 8-byte-aligned.
149 //
150 // The length field specifies the actual payload length
151 // and does not include the size of padding.
152 typedef struct {
153 // Boot data type
154 uint32_t type;
155
156 // Size of the payload following this header
157 uint32_t length;
158
159 // type-specific extra data
160 // For CONTAINER this is MAGIC.
161 // For BOOTFS this is the decompressed size.
162 uint32_t extra;
163
164 // Flags for the boot data. See flag descriptions for each type.
165 uint32_t flags;
166
167 // For future expansion. Set to 0.
168 uint32_t reserved0;
169 uint32_t reserved1;
170
171 // Must be BOOTITEM_MAGIC
172 uint32_t magic;
173
174 // Must be the CRC32 of payload if FLAG_CRC32 is set,
175 // otherwise must be BOOTITEM_NO_CRC32
176 uint32_t crc32;
177 } bootdata_t;
178
179 typedef struct {
180 uint64_t base; // physical base addr
181 uint32_t width;
182 uint32_t height;
183 uint32_t stride;
184 uint32_t format;
185 } bootdata_swfb_t;
186
187 typedef struct {
188 uint64_t entry64;
189 uint64_t reserved;
190 } bootdata_kernel_t;
191
192 #define BOOTDATA_PART_NAME_LEN 32
193 #define BOOTDATA_PART_GUID_LEN 16
194
195 typedef struct {
196 uint8_t type_guid[BOOTDATA_PART_GUID_LEN];
197 uint8_t uniq_guid[BOOTDATA_PART_GUID_LEN];
198 uint64_t first_block;
199 uint64_t last_block;
200 uint64_t flags;
201 char name[BOOTDATA_PART_NAME_LEN];
202 } bootdata_partition_t;
203
204 typedef struct {
205 uint64_t block_count;
206 uint64_t block_size;
207 uint32_t partition_count;
208 uint32_t reserved;
209 char guid[BOOTDATA_PART_GUID_LEN];
210 bootdata_partition_t partitions[];
211 } bootdata_partition_map_t;
212
213 typedef struct {
214 uint64_t base;
215 uint64_t length;
216 } bootdata_nvram_t;
217
218 #define BOOTDATA_UART_NONE 0
219 #define BOOTDATA_UART_PC_PORT 1
220 #define BOOTDATA_UART_PC_MMIO 2
221 typedef struct {
222 uint64_t base;
223 uint32_t type;
224 uint32_t irq;
225 } bootdata_uart_t;
226
227 typedef struct {
228 uint32_t vid;
229 uint32_t pid;
230 char board_name[32];
231 } bootdata_platform_id_t;
232
233 typedef struct {
234 uint32_t cpu_count; // number of CPU cores in the cluster
235 uint32_t type; // for future use
236 uint32_t flags; // for future use
237 uint32_t reserved;
238 } bootdata_cpu_cluster_t;
239
240 typedef struct {
241 uint32_t cluster_count;
242 uint32_t reserved[3];
243 bootdata_cpu_cluster_t clusters[];
244 } bootdata_cpu_config_t;
245
246 #define BOOTDATA_MEM_RANGE_RAM 1
247 #define BOOTDATA_MEM_RANGE_PERIPHERAL 2
248 #define BOOTDATA_MEM_RANGE_RESERVED 3
249 typedef struct {
250 uint64_t paddr;
251 uint64_t length;
252 uint32_t type;
253 uint32_t reserved;
254 } bootdata_mem_range_t;
255
256 /* EFI Variable for Crash Log */
257 #define ZIRCON_VENDOR_GUID \
258 {0x82305eb2, 0xd39e, 0x4575, {0xa0, 0xc8, 0x6c, 0x20, 0x72, 0xd0, 0x84, 0x4c}}
259 #define ZIRCON_CRASHLOG_EFIVAR \
260 { 'c', 'r', 'a', 's', 'h', 'l', 'o', 'g', 0 };
261 #define ZIRCON_CRASHLOG_EFIATTR \
262 (EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS)
263
264 __END_CDECLS;
265
266
267 // BOOTFS is a trivial "filesystem" format
268 //
269 // It consists of a bootfs_header_t
270 //
271 // Followed by a series of bootfs_entry_t's of:
272 // name length (32bit le)
273 // data size (32bit le)
274 // data offset (32bit le)
275 // namedata (namelength bytes, includes \0)
276 //
277 // - data offsets must be page aligned (multiple of 4096)
278 // - entries start on uint32 boundaries
279
280 //lsw of sha256("bootfs")
281 #define BOOTFS_MAGIC (0xa56d3ff9)
282
283 #define BOOTFS_PAGE_SIZE (4096)
284 #define BOOTFS_PAGE_ALIGN(size) \
285 (((size) + BOOTFS_PAGE_SIZE - 1) & -BOOTFS_PAGE_SIZE)
286
287 #define BOOTFS_MAX_NAME_LEN 256
288
289 typedef struct bootfs_header {
290 // magic value BOOTFS_MAGIC
291 uint32_t magic;
292
293 // total size of all bootfs_entry_t's
294 // does not include the size of the bootfs_header_t
295 uint32_t dirsize;
296
297 // 0, 0
298 uint32_t reserved0;
299 uint32_t reserved1;
300 } bootfs_header_t;
301
302 typedef struct bootfs_entry {
303 uint32_t name_len;
304 uint32_t data_len;
305 uint32_t data_off;
306 char name[];
307 } bootfs_entry_t;
308
309 #define BOOTFS_ALIGN(nlen) (((nlen) + 3) & (~3))
310 #define BOOTFS_RECSIZE(entry) \
311 (sizeof(bootfs_entry_t) + BOOTFS_ALIGN(entry->name_len))
312
bootdata_is_metadata(uint32_t type)313 static inline bool bootdata_is_metadata(uint32_t type) {
314 return ((type & BOOTDATA_KIND_MASK) == BOOTDATA_KIND_METADATA);
315 }
316
317 #endif
318