FrostWing
A lightweight raw-control operating system.
Loading...
Searching...
No Matches
limine.h
1/* BSD Zero Clause License */
2
3/* Copyright (C) 2022-2023 mintsuki and contributors.
4 *
5 * Permission to use, copy, modify, and/or distribute this software for any
6 * purpose with or without fee is hereby granted.
7 *
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
11 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
13 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
14 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15 */
16
17#ifndef _LIMINE_H
18#define _LIMINE_H 1
19
20#ifdef __cplusplus
21extern "C" {
22#endif
23
24#include <stdint.h>
25
26/* Misc */
27
28#ifdef LIMINE_NO_POINTERS
29# define LIMINE_PTR(TYPE) uint64_t
30#else
31# define LIMINE_PTR(TYPE) TYPE
32#endif
33
34#ifdef __GNUC__
35# define LIMINE_DEPRECATED __attribute__((__deprecated__))
36# define LIMINE_DEPRECATED_IGNORE_START \
37 _Pragma("GCC diagnostic push") \
38 _Pragma("GCC diagnostic ignored \"-Wdeprecated-declarations\"")
39# define LIMINE_DEPRECATED_IGNORE_END \
40 _Pragma("GCC diagnostic pop")
41#else
42# define LIMINE_DEPRECATED
43# define LIMINE_DEPRECATED_IGNORE_START
44# define LIMINE_DEPRECATED_IGNORE_END
45#endif
46
47#define LIMINE_BASE_REVISION(N) \
48 uint64_t limine_base_revision[3] = { 0xf9562b2d5c95a6c8, 0x6a7b384944536bdc, (N) };
49
50#define LIMINE_BASE_REVISION_SUPPORTED (limine_base_revision[2] == 0)
51
52#define LIMINE_COMMON_MAGIC 0xc7b1dd30df4c8b88, 0x0a82e883a194f07b
53
55 uint32_t a;
56 uint16_t b;
57 uint16_t c;
58 uint8_t d[8];
59};
60
61#define LIMINE_MEDIA_TYPE_GENERIC 0
62#define LIMINE_MEDIA_TYPE_OPTICAL 1
63#define LIMINE_MEDIA_TYPE_TFTP 2
64
66 uint64_t revision;
67 LIMINE_PTR(void *) address;
68 uint64_t size;
69 LIMINE_PTR(char *) path;
70 LIMINE_PTR(char *) cmdline;
71 uint32_t media_type;
72 uint32_t unused;
73 uint32_t tftp_ip;
74 uint32_t tftp_port;
75 uint32_t partition_index;
76 uint32_t mbr_disk_id;
77 struct limine_uuid gpt_disk_uuid;
78 struct limine_uuid gpt_part_uuid;
79 struct limine_uuid part_uuid;
80};
81
82/* Boot info */
83
84#define LIMINE_BOOTLOADER_INFO_REQUEST { LIMINE_COMMON_MAGIC, 0xf55038d8e2a1202f, 0x279426fcf5f59740 }
85
87 uint64_t revision;
88 LIMINE_PTR(char *) name;
89 LIMINE_PTR(char *) version;
90};
91
93 uint64_t id[4];
94 uint64_t revision;
95 LIMINE_PTR(struct limine_bootloader_info_response *) response;
96};
97
98/* Stack size */
99
100#define LIMINE_STACK_SIZE_REQUEST { LIMINE_COMMON_MAGIC, 0x224ef0460a8e8926, 0xe1cb0fc25f46ea3d }
101
103 uint64_t revision;
104};
105
107 uint64_t id[4];
108 uint64_t revision;
109 LIMINE_PTR(struct limine_stack_size_response *) response;
110 uint64_t stack_size;
111};
112
113/* HHDM */
114
115#define LIMINE_HHDM_REQUEST { LIMINE_COMMON_MAGIC, 0x48dcf1cb8ad2b852, 0x63984e959a98244b }
116
118 uint64_t revision;
119 uint64_t offset;
120};
121
123 uint64_t id[4];
124 uint64_t revision;
125 LIMINE_PTR(struct limine_hhdm_response *) response;
126};
127
128/* Framebuffer */
129
130#define LIMINE_FRAMEBUFFER_REQUEST { LIMINE_COMMON_MAGIC, 0x9d5827dcd881dd75, 0xa3148604f6fab11b }
131
132#define LIMINE_FRAMEBUFFER_RGB 1
133
135 uint64_t pitch;
136 uint64_t width;
137 uint64_t height;
138 uint16_t bpp;
139 uint8_t memory_model;
140 uint8_t red_mask_size;
141 uint8_t red_mask_shift;
142 uint8_t green_mask_size;
143 uint8_t green_mask_shift;
144 uint8_t blue_mask_size;
145 uint8_t blue_mask_shift;
146};
147
149 LIMINE_PTR(void *) address;
150 uint64_t width;
151 uint64_t height;
152 uint64_t pitch;
153 uint16_t bpp;
154 uint8_t memory_model;
155 uint8_t red_mask_size;
156 uint8_t red_mask_shift;
157 uint8_t green_mask_size;
158 uint8_t green_mask_shift;
159 uint8_t blue_mask_size;
160 uint8_t blue_mask_shift;
161 uint8_t unused[7];
162 uint64_t edid_size;
163 LIMINE_PTR(void *) edid;
164 /* Response revision 1 */
165 uint64_t mode_count;
166 LIMINE_PTR(struct limine_video_mode **) modes;
167};
168
170 uint64_t revision;
171 uint64_t framebuffer_count;
172 LIMINE_PTR(struct limine_framebuffer **) framebuffers;
173};
174
176 uint64_t id[4];
177 uint64_t revision;
178 LIMINE_PTR(struct limine_framebuffer_response *) response;
179};
180
181/* Terminal */
182
183#define LIMINE_TERMINAL_REQUEST { LIMINE_COMMON_MAGIC, 0xc8ac59310c2b0844, 0xa68d0c7265d38878 }
184
185#define LIMINE_TERMINAL_CB_DEC 10
186#define LIMINE_TERMINAL_CB_BELL 20
187#define LIMINE_TERMINAL_CB_PRIVATE_ID 30
188#define LIMINE_TERMINAL_CB_STATUS_REPORT 40
189#define LIMINE_TERMINAL_CB_POS_REPORT 50
190#define LIMINE_TERMINAL_CB_KBD_LEDS 60
191#define LIMINE_TERMINAL_CB_MODE 70
192#define LIMINE_TERMINAL_CB_LINUX 80
193
194#define LIMINE_TERMINAL_CTX_SIZE ((uint64_t)(-1))
195#define LIMINE_TERMINAL_CTX_SAVE ((uint64_t)(-2))
196#define LIMINE_TERMINAL_CTX_RESTORE ((uint64_t)(-3))
197#define LIMINE_TERMINAL_FULL_REFRESH ((uint64_t)(-4))
198
199/* Response revision 1 */
200#define LIMINE_TERMINAL_OOB_OUTPUT_GET ((uint64_t)(-10))
201#define LIMINE_TERMINAL_OOB_OUTPUT_SET ((uint64_t)(-11))
202
203#define LIMINE_TERMINAL_OOB_OUTPUT_OCRNL (1 << 0)
204#define LIMINE_TERMINAL_OOB_OUTPUT_OFDEL (1 << 1)
205#define LIMINE_TERMINAL_OOB_OUTPUT_OFILL (1 << 2)
206#define LIMINE_TERMINAL_OOB_OUTPUT_OLCUC (1 << 3)
207#define LIMINE_TERMINAL_OOB_OUTPUT_ONLCR (1 << 4)
208#define LIMINE_TERMINAL_OOB_OUTPUT_ONLRET (1 << 5)
209#define LIMINE_TERMINAL_OOB_OUTPUT_ONOCR (1 << 6)
210#define LIMINE_TERMINAL_OOB_OUTPUT_OPOST (1 << 7)
211
212LIMINE_DEPRECATED_IGNORE_START
213
214struct LIMINE_DEPRECATED limine_terminal;
215
216typedef void (*limine_terminal_write)(struct limine_terminal *, const char *, uint64_t);
217typedef void (*limine_terminal_callback)(struct limine_terminal *, uint64_t, uint64_t, uint64_t, uint64_t);
218
219struct LIMINE_DEPRECATED limine_terminal {
220 uint64_t columns;
221 uint64_t rows;
222 LIMINE_PTR(struct limine_framebuffer *) framebuffer;
223};
224
225struct LIMINE_DEPRECATED limine_terminal_response {
226 uint64_t revision;
227 uint64_t terminal_count;
228 LIMINE_PTR(struct limine_terminal **) terminals;
229 LIMINE_PTR(limine_terminal_write) write;
230};
231
232struct LIMINE_DEPRECATED limine_terminal_request {
233 uint64_t id[4];
234 uint64_t revision;
235 LIMINE_PTR(struct limine_terminal_response *) response;
236 LIMINE_PTR(limine_terminal_callback) callback;
237};
238
239LIMINE_DEPRECATED_IGNORE_END
240
241/* Paging mode */
242
243#define LIMINE_PAGING_MODE_REQUEST { LIMINE_COMMON_MAGIC, 0x95c1a0edab0944cb, 0xa4e5cb3842f7488a }
244
245#if defined (__x86_64__) || defined (__i386__)
246#define LIMINE_PAGING_MODE_X86_64_4LVL 0
247#define LIMINE_PAGING_MODE_X86_64_5LVL 1
248#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_X86_64_5LVL
249#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_X86_64_4LVL
250#elif defined (__aarch64__)
251#define LIMINE_PAGING_MODE_AARCH64_4LVL 0
252#define LIMINE_PAGING_MODE_AARCH64_5LVL 1
253#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_AARCH64_5LVL
254#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_AARCH64_4LVL
255#elif defined (__riscv) && (__riscv_xlen == 64)
256#define LIMINE_PAGING_MODE_RISCV_SV39 0
257#define LIMINE_PAGING_MODE_RISCV_SV48 1
258#define LIMINE_PAGING_MODE_RISCV_SV57 2
259#define LIMINE_PAGING_MODE_MAX LIMINE_PAGING_MODE_RISCV_SV57
260#define LIMINE_PAGING_MODE_DEFAULT LIMINE_PAGING_MODE_RISCV_SV48
261#else
262#error Unknown architecture
263#endif
264
266 uint64_t revision;
267 uint64_t mode;
268 uint64_t flags;
269};
270
272 uint64_t id[4];
273 uint64_t revision;
274 LIMINE_PTR(struct limine_paging_mode_response *) response;
275 uint64_t mode;
276 uint64_t flags;
277};
278
279/* 5-level paging */
280
281#define LIMINE_5_LEVEL_PAGING_REQUEST { LIMINE_COMMON_MAGIC, 0x94469551da9b3192, 0xebe5e86db7382888 }
282
283LIMINE_DEPRECATED_IGNORE_START
284
285struct LIMINE_DEPRECATED limine_5_level_paging_response {
286 uint64_t revision;
287};
288
289struct LIMINE_DEPRECATED limine_5_level_paging_request {
290 uint64_t id[4];
291 uint64_t revision;
292 LIMINE_PTR(struct limine_5_level_paging_response *) response;
293};
294
295LIMINE_DEPRECATED_IGNORE_END
296
297/* SMP */
298
299#define LIMINE_SMP_REQUEST { LIMINE_COMMON_MAGIC, 0x95a67b819a1b857e, 0xa0b61b723b6a73e0 }
300
301struct limine_smp_info;
302
303typedef void (*limine_goto_address)(struct limine_smp_info *);
304
305#if defined (__x86_64__) || defined (__i386__)
306
307#define LIMINE_SMP_X2APIC (1 << 0)
308
309struct limine_smp_info {
310 uint32_t processor_id;
311 uint32_t lapic_id;
312 uint64_t reserved;
313 LIMINE_PTR(limine_goto_address) goto_address;
314 uint64_t extra_argument;
315};
316
317struct limine_smp_response {
318 uint64_t revision;
319 uint32_t flags;
320 uint32_t bsp_lapic_id;
321 uint64_t cpu_count;
322 LIMINE_PTR(struct limine_smp_info **) cpus;
323};
324
325#elif defined (__aarch64__)
326
327struct limine_smp_info {
328 uint32_t processor_id;
329 uint32_t gic_iface_no;
330 uint64_t mpidr;
331 uint64_t reserved;
332 LIMINE_PTR(limine_goto_address) goto_address;
333 uint64_t extra_argument;
334};
335
336struct limine_smp_response {
337 uint64_t revision;
338 uint64_t flags;
339 uint64_t bsp_mpidr;
340 uint64_t cpu_count;
341 LIMINE_PTR(struct limine_smp_info **) cpus;
342};
343
344#elif defined (__riscv) && (__riscv_xlen == 64)
345
346struct limine_smp_info {
347 uint64_t processor_id;
348 uint64_t hartid;
349 uint64_t reserved;
350 LIMINE_PTR(limine_goto_address) goto_address;
351 uint64_t extra_argument;
352};
353
354struct limine_smp_response {
355 uint64_t revision;
356 uint64_t flags;
357 uint64_t bsp_hartid;
358 uint64_t cpu_count;
359 LIMINE_PTR(struct limine_smp_info **) cpus;
360};
361
362#else
363#error Unknown architecture
364#endif
365
367 uint64_t id[4];
368 uint64_t revision;
369 LIMINE_PTR(struct limine_smp_response *) response;
370 uint64_t flags;
371};
372
373/* Memory map */
374
375#define LIMINE_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x67cf3d9d378a806f, 0xe304acdfc50c3c62 }
376
377#define LIMINE_MEMMAP_USABLE 0
378#define LIMINE_MEMMAP_RESERVED 1
379#define LIMINE_MEMMAP_ACPI_RECLAIMABLE 2
380#define LIMINE_MEMMAP_ACPI_NVS 3
381#define LIMINE_MEMMAP_BAD_MEMORY 4
382#define LIMINE_MEMMAP_BOOTLOADER_RECLAIMABLE 5
383#define LIMINE_MEMMAP_KERNEL_AND_MODULES 6
384#define LIMINE_MEMMAP_FRAMEBUFFER 7
385
387 uint64_t base;
388 uint64_t length;
389 uint64_t type;
390};
391
393 uint64_t revision;
394 uint64_t entry_count;
395 LIMINE_PTR(struct limine_memmap_entry **) entries;
396};
397
399 uint64_t id[4];
400 uint64_t revision;
401 LIMINE_PTR(struct limine_memmap_response *) response;
402};
403
404/* Entry point */
405
406#define LIMINE_ENTRY_POINT_REQUEST { LIMINE_COMMON_MAGIC, 0x13d86c035a1cd3e1, 0x2b0caa89d8f3026a }
407
408typedef void (*limine_entry_point)(void);
409
411 uint64_t revision;
412};
413
415 uint64_t id[4];
416 uint64_t revision;
417 LIMINE_PTR(struct limine_entry_point_response *) response;
418 LIMINE_PTR(limine_entry_point) entry;
419};
420
421/* Kernel File */
422
423#define LIMINE_KERNEL_FILE_REQUEST { LIMINE_COMMON_MAGIC, 0xad97e90e83f1ed67, 0x31eb5d1c5ff23b69 }
424
426 uint64_t revision;
427 LIMINE_PTR(struct limine_file *) kernel_file;
428};
429
431 uint64_t id[4];
432 uint64_t revision;
433 LIMINE_PTR(struct limine_kernel_file_response *) response;
434};
435
436/* Module */
437
438#define LIMINE_MODULE_REQUEST { LIMINE_COMMON_MAGIC, 0x3e7e279702be32af, 0xca1c4f3bd1280cee }
439
440#define LIMINE_INTERNAL_MODULE_REQUIRED (1 << 0)
441
443 LIMINE_PTR(const char *) path;
444 LIMINE_PTR(const char *) cmdline;
445 uint64_t flags;
446};
447
449 uint64_t revision;
450 uint64_t module_count;
451 LIMINE_PTR(struct limine_file **) modules;
452};
453
455 uint64_t id[4];
456 uint64_t revision;
457 LIMINE_PTR(struct limine_module_response *) response;
458
459 /* Request revision 1 */
460 uint64_t internal_module_count;
461 LIMINE_PTR(struct limine_internal_module **) internal_modules;
462};
463
464/* RSDP */
465
466#define LIMINE_RSDP_REQUEST { LIMINE_COMMON_MAGIC, 0xc5e77b6b397e7b43, 0x27637845accdcf3c }
467
469 uint64_t revision;
470 LIMINE_PTR(void *) address;
471};
472
474 uint64_t id[4];
475 uint64_t revision;
476 LIMINE_PTR(struct limine_rsdp_response *) response;
477};
478
479/* SMBIOS */
480
481#define LIMINE_SMBIOS_REQUEST { LIMINE_COMMON_MAGIC, 0x9e9046f11e095391, 0xaa4a520fefbde5ee }
482
484 uint64_t revision;
485 LIMINE_PTR(void *) entry_32;
486 LIMINE_PTR(void *) entry_64;
487};
488
490 uint64_t id[4];
491 uint64_t revision;
492 LIMINE_PTR(struct limine_smbios_response *) response;
493};
494
495/* EFI system table */
496
497#define LIMINE_EFI_SYSTEM_TABLE_REQUEST { LIMINE_COMMON_MAGIC, 0x5ceba5163eaaf6d6, 0x0a6981610cf65fcc }
498
500 uint64_t revision;
501 LIMINE_PTR(void *) address;
502};
503
505 uint64_t id[4];
506 uint64_t revision;
507 LIMINE_PTR(struct limine_efi_system_table_response *) response;
508};
509
510/* EFI memory map */
511
512#define LIMINE_EFI_MEMMAP_REQUEST { LIMINE_COMMON_MAGIC, 0x7df62a431d6872d5, 0xa4fcdfb3e57306c8 }
513
515 uint64_t revision;
516 LIMINE_PTR(void *) memmap;
517 uint64_t memmap_size;
518 uint64_t desc_size;
519 uint64_t desc_version;
520};
521
523 uint64_t id[4];
524 uint64_t revision;
525 LIMINE_PTR(struct limine_efi_memmap_response *) response;
526};
527
528/* Boot time */
529
530#define LIMINE_BOOT_TIME_REQUEST { LIMINE_COMMON_MAGIC, 0x502746e184c088aa, 0xfbc5ec83e6327893 }
531
533 uint64_t revision;
534 int64_t boot_time;
535};
536
538 uint64_t id[4];
539 uint64_t revision;
540 LIMINE_PTR(struct limine_boot_time_response *) response;
541};
542
543/* Kernel address */
544
545#define LIMINE_KERNEL_ADDRESS_REQUEST { LIMINE_COMMON_MAGIC, 0x71ba76863cc55f63, 0xb2644a48c516a487 }
546
548 uint64_t revision;
549 uint64_t physical_base;
550 uint64_t virtual_base;
551};
552
554 uint64_t id[4];
555 uint64_t revision;
556 LIMINE_PTR(struct limine_kernel_address_response *) response;
557};
558
559/* Device Tree Blob */
560
561#define LIMINE_DTB_REQUEST { LIMINE_COMMON_MAGIC, 0xb40ddb48fb54bac7, 0x545081493f81ffb7 }
562
564 uint64_t revision;
565 LIMINE_PTR(void *) dtb_ptr;
566};
567
569 uint64_t id[4];
570 uint64_t revision;
571 LIMINE_PTR(struct limine_dtb_response *) response;
572};
573
574#ifdef __cplusplus
575}
576#endif
577
578#endif
Definition limine.h:414
Definition limine.h:410
Definition limine.h:386