1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
|
/*
* Copyright (C) 1999,2003,2007,2008,2009,2010 Free Software Foundation, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ANY
* DEVELOPER OR DISTRIBUTOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
* IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
/*
* Copyright 2016 Toomas Soome <tsoome@me.com>
*/
/*
* This header contains definitions for Multiboot 2 boot protocol, based on
* the reference implementation by grub 2.
*
* At the time this was written (Jan 2017), the Multiboot 2 documentation is in
* process of being rewritten and the information in the specification is not
* entirely correct. Instead, you must rely on grub 2 source code.
*
* This header provides essential support for the Multiboot 2 specification
* for illumos and makes it possible to pass the needed structures from the
* boot loader to the kernel.
*/
#ifndef _SYS_MULTIBOOT2_H
#define _SYS_MULTIBOOT2_H
#ifdef __cplusplus
extern "C" {
#endif
/* How many bytes from the start of the file we search for the header. */
#define MULTIBOOT_SEARCH 32768
#define MULTIBOOT_HEADER_ALIGN 8
/* The magic field should contain this. */
#define MULTIBOOT2_HEADER_MAGIC 0xe85250d6
/* This should be in %eax. */
#define MULTIBOOT2_BOOTLOADER_MAGIC 0x36d76289
/* Alignment of multiboot modules. */
#if defined(__i386) || defined(__amd64)
#define MULTIBOOT_MOD_ALIGN 0x00001000
#else
#error No architecture defined
#endif
/* Alignment of the multiboot info structure. */
#define MULTIBOOT_INFO_ALIGN 0x00000008
/* Flags set in the 'flags' member of the multiboot header. */
#define MULTIBOOT_TAG_ALIGN 8
#define MULTIBOOT_TAG_TYPE_END 0
#define MULTIBOOT_TAG_TYPE_CMDLINE 1
#define MULTIBOOT_TAG_TYPE_BOOT_LOADER_NAME 2
#define MULTIBOOT_TAG_TYPE_MODULE 3
#define MULTIBOOT_TAG_TYPE_BASIC_MEMINFO 4
#define MULTIBOOT_TAG_TYPE_BOOTDEV 5
#define MULTIBOOT_TAG_TYPE_MMAP 6
#define MULTIBOOT_TAG_TYPE_VBE 7
#define MULTIBOOT_TAG_TYPE_FRAMEBUFFER 8
#define MULTIBOOT_TAG_TYPE_ELF_SECTIONS 9
#define MULTIBOOT_TAG_TYPE_APM 10
#define MULTIBOOT_TAG_TYPE_EFI32 11
#define MULTIBOOT_TAG_TYPE_EFI64 12
#define MULTIBOOT_TAG_TYPE_SMBIOS 13
#define MULTIBOOT_TAG_TYPE_ACPI_OLD 14
#define MULTIBOOT_TAG_TYPE_ACPI_NEW 15
#define MULTIBOOT_TAG_TYPE_NETWORK 16
#define MULTIBOOT_TAG_TYPE_EFI_MMAP 17
#define MULTIBOOT_TAG_TYPE_EFI_BS 18
#define MULTIBOOT_TAG_TYPE_EFI32_IH 19
#define MULTIBOOT_TAG_TYPE_EFI64_IH 20
#define MULTIBOOT_TAG_TYPE_LOAD_BASE_ADDR 21
#define MULTIBOOT_HEADER_TAG_END 0
#define MULTIBOOT_HEADER_TAG_INFORMATION_REQUEST 1
#define MULTIBOOT_HEADER_TAG_ADDRESS 2
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS 3
#define MULTIBOOT_HEADER_TAG_CONSOLE_FLAGS 4
#define MULTIBOOT_HEADER_TAG_FRAMEBUFFER 5
#define MULTIBOOT_HEADER_TAG_MODULE_ALIGN 6
#define MULTIBOOT_HEADER_TAG_EFI_BS 7
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI32 8
#define MULTIBOOT_HEADER_TAG_ENTRY_ADDRESS_EFI64 9
#define MULTIBOOT_HEADER_TAG_RELOCATABLE 10
#define MULTIBOOT_ARCHITECTURE_I386 0
#define MULTIBOOT_ARCHITECTURE_MIPS32 4
#define MULTIBOOT_HEADER_TAG_OPTIONAL 1
/* Hints for relocatable kernel load preference */
#define MULTIBOOT_LOAD_PREFERENCE_NONE 0
#define MULTIBOOT_LOAD_PREFERENCE_LOW 1
#define MULTIBOOT_LOAD_PREFERENCE_HIGH 2
/* Values for console_flags field in tag multiboot_header_tag_console_flags. */
#define MULTIBOOT_CONSOLE_FLAGS_CONSOLE_REQUIRED 1
#define MULTIBOOT_CONSOLE_FLAGS_EGA_TEXT_SUPPORTED 2
#ifndef _ASM
#include <sys/stdint.h>
#pragma pack(1)
typedef struct multiboot_header_tag {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
} multiboot_header_tag_t;
typedef struct multiboot2_header {
/* Must be MULTIBOOT2_MAGIC - see above. */
uint32_t mb2_magic;
/* ISA */
uint32_t mb2_architecture;
/* Total header length. */
uint32_t mb2_header_length;
/* The above fields plus this one must equal 0 mod 2^32. */
uint32_t mb2_checksum;
multiboot_header_tag_t mb2_tags[];
} multiboot2_header_t;
typedef struct multiboot_header_tag_information_request {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_requests[];
} multiboot_header_tag_information_request_t;
typedef struct multiboot_header_tag_address {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_header_addr;
uint32_t mbh_load_addr;
uint32_t mbh_load_end_addr;
uint32_t mbh_bss_end_addr;
} multiboot_header_tag_address_t;
typedef struct multiboot_header_tag_entry_address {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_entry_addr;
} multiboot_header_tag_entry_address_t;
typedef struct multiboot_header_tag_console_flags {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_console_flags;
} multiboot_header_tag_console_flags_t;
typedef struct multiboot_header_tag_framebuffer {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_width;
uint32_t mbh_height;
uint32_t mbh_depth;
} multiboot_header_tag_framebuffer_t;
typedef struct multiboot_header_tag_module_align {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
} multiboot_header_tag_module_align_t;
typedef struct multiboot_header_tag_relocatable {
uint16_t mbh_type;
uint16_t mbh_flags;
uint32_t mbh_size;
uint32_t mbh_min_addr;
uint32_t mbh_max_addr;
uint32_t mbh_align;
uint32_t mbh_preference;
} multiboot_header_tag_relocatable_t;
typedef struct multiboot_color {
uint8_t mb_red;
uint8_t mb_green;
uint8_t mb_blue;
} multiboot_color_t;
typedef struct multiboot_mmap_entry {
uint64_t mmap_addr;
uint64_t mmap_len;
#define MULTIBOOT_MEMORY_AVAILABLE 1
#define MULTIBOOT_MEMORY_RESERVED 2
#define MULTIBOOT_MEMORY_ACPI_RECLAIMABLE 3
#define MULTIBOOT_MEMORY_NVS 4
#define MULTIBOOT_MEMORY_BADRAM 5
uint32_t mmap_type;
uint32_t mmap_reserved;
} multiboot_mmap_entry_t;
typedef struct multiboot_tag {
uint32_t mb_type;
uint32_t mb_size;
} multiboot_tag_t;
typedef struct multiboot2_info_header {
uint32_t mbi_total_size;
uint32_t mbi_reserved;
multiboot_tag_t mbi_tags[];
} multiboot2_info_header_t;
typedef struct multiboot_tag_string {
uint32_t mb_type;
uint32_t mb_size;
char mb_string[];
} multiboot_tag_string_t;
typedef struct multiboot_tag_module {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_mod_start;
uint32_t mb_mod_end;
char mb_cmdline[];
} multiboot_tag_module_t;
typedef struct multiboot_tag_basic_meminfo {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_mem_lower;
uint32_t mb_mem_upper;
} multiboot_tag_basic_meminfo_t;
typedef struct multiboot_tag_bootdev {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_biosdev;
uint32_t mb_slice;
uint32_t mb_part;
} multiboot_tag_bootdev_t;
typedef struct multiboot_tag_mmap {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_entry_size;
uint32_t mb_entry_version;
uint8_t mb_entries[];
} multiboot_tag_mmap_t;
struct multiboot_vbe_info_block {
uint8_t vbe_external_specification[512];
};
struct multiboot_vbe_mode_info_block {
uint8_t vbe_external_specification[256];
};
typedef struct multiboot_tag_vbe {
uint32_t mb_type;
uint32_t mb_size;
uint16_t vbe_mode;
uint16_t vbe_interface_seg;
uint16_t vbe_interface_off;
uint16_t vbe_interface_len;
struct multiboot_vbe_info_block vbe_control_info;
struct multiboot_vbe_mode_info_block vbe_mode_info;
} multiboot_tag_vbe_t;
struct multiboot_tag_framebuffer_common {
uint32_t mb_type;
uint32_t mb_size;
uint64_t framebuffer_addr;
uint32_t framebuffer_pitch;
uint32_t framebuffer_width;
uint32_t framebuffer_height;
uint8_t framebuffer_bpp;
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
uint8_t framebuffer_type;
uint16_t mb_reserved;
};
typedef struct multiboot_tag_framebuffer {
struct multiboot_tag_framebuffer_common framebuffer_common;
union {
struct {
uint16_t framebuffer_palette_num_colors;
multiboot_color_t framebuffer_palette[];
} fb1;
struct {
uint8_t framebuffer_red_field_position;
uint8_t framebuffer_red_mask_size;
uint8_t framebuffer_green_field_position;
uint8_t framebuffer_green_mask_size;
uint8_t framebuffer_blue_field_position;
uint8_t framebuffer_blue_mask_size;
} fb2;
} u;
} multiboot_tag_framebuffer_t;
typedef struct multiboot_tag_elf_sections {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_num;
uint32_t mb_entsize;
uint32_t mb_shndx;
char mb_sections[];
} multiboot_tag_elf_sections_t;
typedef struct multiboot_tag_apm {
uint32_t mb_type;
uint32_t mb_size;
uint16_t mb_version;
uint16_t mb_cseg;
uint32_t mb_offset;
uint16_t mb_cseg_16;
uint16_t mb_dseg;
uint16_t mb_flags;
uint16_t mb_cseg_len;
uint16_t mb_cseg_16_len;
uint16_t mb_dseg_len;
} multiboot_tag_apm_t;
typedef struct multiboot_tag_efi32 {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_pointer;
} multiboot_tag_efi32_t;
typedef struct multiboot_tag_efi64 {
uint32_t mb_type;
uint32_t mb_size;
uint64_t mb_pointer;
} multiboot_tag_efi64_t;
typedef struct multiboot_tag_smbios {
uint32_t mb_type;
uint32_t mb_size;
uint8_t mb_major;
uint8_t mb_minor;
uint8_t mb_reserved[6];
uint8_t mb_tables[];
} multiboot_tag_smbios_t;
typedef struct multiboot_tag_old_acpi {
uint32_t mb_type;
uint32_t mb_size;
uint8_t mb_rsdp[];
} multiboot_tag_old_acpi_t;
typedef struct multiboot_tag_new_acpi {
uint32_t mb_type;
uint32_t mb_size;
uint8_t mb_rsdp[];
} multiboot_tag_new_acpi_t;
typedef struct multiboot_tag_network {
uint32_t mb_type;
uint32_t mb_size;
uint8_t mb_dhcpack[];
} multiboot_tag_network_t;
typedef struct multiboot_tag_efi_mmap {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_descr_size;
uint32_t mb_descr_vers;
uint8_t mb_efi_mmap[];
} multiboot_tag_efi_mmap_t;
typedef struct multiboot_tag_efi32_ih {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_pointer;
} multiboot_tag_efi32_ih_t;
typedef struct multiboot_tag_efi64_ih {
uint32_t mb_type;
uint32_t mb_size;
uint64_t mb_pointer;
} multiboot_tag_efi64_ih_t;
typedef struct multiboot_tag_load_base_addr {
uint32_t mb_type;
uint32_t mb_size;
uint32_t mb_load_base_addr;
} multiboot_tag_load_base_addr_t;
#pragma pack()
#endif /* !_ASM */
#ifdef __cplusplus
}
#endif
#endif /* !_SYS_MULTIBOOT2_H */
|