-
Notifications
You must be signed in to change notification settings - Fork 0
/
multiboot.h
233 lines (215 loc) · 7.43 KB
/
multiboot.h
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
#ifndef __MULTIBOOT_H__
#define __MULTIBOOT_H__
// Prototypy
void multiboot_initialize(void);
void multiboot_full_initialize(void);
struct multiboot_info *multiboot_get_struct(void);
void multiboot_debug_report_memory(void);
// Procedura assemblerowa
extern unsigned int get_multibot_info(void);
// Plik znaleziony w dokumentacji multiboot
// https://www.gnu.org/software/grub/manual/multiboot/html_node/multiboot_002eh.html
// How many bytes from the start of the file we search for the header
#define MULTIBOOT_SEARCH 8192
#define MULTIBOOT_HEADER_ALIGN 4
// The magic field should contain this
#define MULTIBOOT_HEADER_MAGIC 0x1BADB002
// This should be in %eax
#define MULTIBOOT_BOOTLOADER_MAGIC 0x2BADB002
// Alignment of multiboot modules
#define MULTIBOOT_MOD_ALIGN 0x00001000
// Alignment of the multiboot info structure
#define MULTIBOOT_INFO_ALIGN 0x00000004
// Flags set in the ’flags’ member of the multiboot header
// Align all boot modules on i386 page (4KB) boundaries
#define MULTIBOOT_PAGE_ALIGN 0x00000001
// Must pass memory information to OS
#define MULTIBOOT_MEMORY_INFO 0x00000002
// Must pass video information to OS
#define MULTIBOOT_VIDEO_MODE 0x00000004
// This flag indicates the use of the address fields in the header
#define MULTIBOOT_AOUT_KLUDGE 0x00010000
// Flags to be set in the ’flags’ member of the multiboot info structure
// is there basic lower/upper memory information?
#define MULTIBOOT_INFO_MEMORY 0x00000001
// is there a boot device set?
#define MULTIBOOT_INFO_BOOTDEV 0x00000002
// is the command-line defined?
#define MULTIBOOT_INFO_CMDLINE 0x00000004
// are there modules to do something with?
#define MULTIBOOT_INFO_MODS 0x00000008
// These next two are mutually exclusive
// is there a symbol table loaded?
#define MULTIBOOT_INFO_AOUT_SYMS 0x00000010
// is there an ELF section header table?
#define MULTIBOOT_INFO_ELF_SHDR 0X00000020
// is there a full memory map?
#define MULTIBOOT_INFO_MEM_MAP 0x00000040
// Is there drive info?
#define MULTIBOOT_INFO_DRIVE_INFO 0x00000080
// Is there a config table?
#define MULTIBOOT_INFO_CONFIG_TABLE 0x00000100
// Is there a boot loader name?
#define MULTIBOOT_INFO_BOOT_LOADER_NAME 0x00000200
// Is there a APM table?
#define MULTIBOOT_INFO_APM_TABLE 0x00000400
// Is there video information?
#define MULTIBOOT_INFO_VBE_INFO 0x00000800
#define MULTIBOOT_INFO_FRAMEBUFFER_INFO 0x00001000
// Framebuffer Types
#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
// Memory Types
#define MULTIBOOT_FRAMEBUFFER_TYPE_INDEXED 0
#define MULTIBOOT_FRAMEBUFFER_TYPE_RGB 1
#define MULTIBOOT_FRAMEBUFFER_TYPE_EGA_TEXT 2
#ifndef ASM_FILE
typedef unsigned char multiboot_uint8_t;
typedef unsigned short multiboot_uint16_t;
typedef unsigned int multiboot_uint32_t;
typedef unsigned long long multiboot_uint64_t;
struct multiboot_header
{
// Must be MULTIBOOT_MAGIC - see above.
multiboot_uint32_t magic;
// Feature flags.
multiboot_uint32_t flags;
// The above fields plus this one must equal 0 mod 2^32.
multiboot_uint32_t checksum;
// These are only valid if MULTIBOOT_AOUT_KLUDGE is set.
multiboot_uint32_t header_addr;
multiboot_uint32_t load_addr;
multiboot_uint32_t load_end_addr;
multiboot_uint32_t bss_end_addr;
multiboot_uint32_t entry_addr;
// These are only valid if MULTIBOOT_VIDEO_MODE is set.
multiboot_uint32_t mode_type;
multiboot_uint32_t width;
multiboot_uint32_t height;
multiboot_uint32_t depth;
};
// The symbol table for a.out.
struct multiboot_aout_symbol_table
{
multiboot_uint32_t tabsize;
multiboot_uint32_t strsize;
multiboot_uint32_t addr;
multiboot_uint32_t reserved;
};
typedef struct multiboot_aout_symbol_table multiboot_aout_symbol_table_t;
// The section header table for ELF.
struct multiboot_elf_section_header_table
{
multiboot_uint32_t num;
multiboot_uint32_t size;
multiboot_uint32_t addr;
multiboot_uint32_t shndx;
};
typedef struct multiboot_elf_section_header_table multiboot_elf_section_header_table_t;
struct multiboot_info
{
// Multiboot info version number
multiboot_uint32_t flags;
// Available memory from BIOS
multiboot_uint32_t mem_lower;
multiboot_uint32_t mem_upper;
// "root" partition
multiboot_uint32_t boot_device;
// Kernel command line
multiboot_uint32_t cmdline;
// Boot-Module list
multiboot_uint32_t mods_count;
multiboot_uint32_t mods_addr;
union
{
multiboot_aout_symbol_table_t aout_sym;
multiboot_elf_section_header_table_t elf_sec;
} u;
// Memory Mapping buffer
multiboot_uint32_t mmap_length;
multiboot_uint32_t mmap_addr;
// Drive Info buffer
multiboot_uint32_t drives_length;
multiboot_uint32_t drives_addr;
// ROM configuration table
multiboot_uint32_t config_table;
// Boot Loader Name
multiboot_uint32_t boot_loader_name;
// APM table
multiboot_uint32_t apm_table;
// Video
multiboot_uint32_t vbe_control_info;
multiboot_uint32_t vbe_mode_info;
multiboot_uint16_t vbe_mode;
multiboot_uint16_t vbe_interface_seg;
multiboot_uint16_t vbe_interface_off;
multiboot_uint16_t vbe_interface_len;
// Video
multiboot_uint64_t framebuffer_addr;
multiboot_uint32_t framebuffer_pitch;
multiboot_uint32_t framebuffer_width;
multiboot_uint32_t framebuffer_height;
multiboot_uint8_t framebuffer_bpp;
multiboot_uint8_t framebuffer_type;
union
{
struct
{
multiboot_uint32_t framebuffer_palette_addr;
multiboot_uint16_t framebuffer_palette_num_colors;
};
struct
{
multiboot_uint8_t framebuffer_red_field_position;
multiboot_uint8_t framebuffer_red_mask_size;
multiboot_uint8_t framebuffer_green_field_position;
multiboot_uint8_t framebuffer_green_mask_size;
multiboot_uint8_t framebuffer_blue_field_position;
multiboot_uint8_t framebuffer_blue_mask_size;
};
};
};
typedef struct multiboot_info multiboot_info_t;
struct multiboot_color
{
multiboot_uint8_t red;
multiboot_uint8_t green;
multiboot_uint8_t blue;
};
struct multiboot_mmap_entry
{
multiboot_uint32_t size;
multiboot_uint64_t addr;
multiboot_uint64_t len;
multiboot_uint32_t type;
} __attribute__((packed));
typedef struct multiboot_mmap_entry multiboot_memory_map_t;
struct multiboot_mod_list
{
// the memory used goes from bytes ’mod_start’ to ’mod_end-1’ inclusive
multiboot_uint32_t mod_start;
multiboot_uint32_t mod_end;
// Module command line
multiboot_uint32_t cmdline;
// padding to take it to 16 bytes (must be zero)
multiboot_uint32_t pad;
};
typedef struct multiboot_mod_list multiboot_module_t;
// APM BIOS info.
struct multiboot_apm_info
{
multiboot_uint16_t version;
multiboot_uint16_t cseg;
multiboot_uint32_t offset;
multiboot_uint16_t cseg_16;
multiboot_uint16_t dseg;
multiboot_uint16_t flags;
multiboot_uint16_t cseg_len;
multiboot_uint16_t cseg_16_len;
multiboot_uint16_t dseg_len;
};
#endif // ! ASM_FILE
#endif // ! MULTIBOOT_HEADER