2017-11-04 15:08:59 +00:00
|
|
|
#include "paging.h"
|
2017-11-04 02:32:23 +00:00
|
|
|
|
2017-11-09 16:00:36 +00:00
|
|
|
#include "info.h"
|
2017-11-08 12:22:46 +00:00
|
|
|
|
2020-11-26 18:50:25 +00:00
|
|
|
#include "panic.h"
|
|
|
|
#include "protected.h"
|
|
|
|
|
|
|
|
#include "tasks.h"
|
|
|
|
|
2022-06-23 10:51:42 +00:00
|
|
|
#include <kernaux/drivers/console.h>
|
2020-11-28 00:19:36 +00:00
|
|
|
#include <kernaux/multiboot2.h>
|
2020-12-01 00:01:47 +00:00
|
|
|
#include <kernaux/pfa.h>
|
2020-11-28 00:19:36 +00:00
|
|
|
|
2021-12-18 21:59:16 +00:00
|
|
|
#include <stdint.h>
|
|
|
|
|
2017-11-08 12:22:46 +00:00
|
|
|
// Defined in linker script
|
2021-12-18 21:59:16 +00:00
|
|
|
extern uint8_t _kernel_offset;
|
|
|
|
extern uint8_t _kernel_size;
|
|
|
|
extern uint8_t _kernel_phys_base;
|
|
|
|
extern uint8_t _kernel_virt_base;
|
|
|
|
extern uint8_t _kernel_stack_start;
|
|
|
|
extern uint8_t _kernel_stack_size;
|
2017-11-04 10:38:28 +00:00
|
|
|
|
2021-12-12 14:00:17 +00:00
|
|
|
static struct Kernel_Info kinfo;
|
2020-12-01 00:01:47 +00:00
|
|
|
static struct KernAux_PFA pfa;
|
2021-12-18 05:19:44 +00:00
|
|
|
static struct Paging paging;
|
2020-12-01 00:01:47 +00:00
|
|
|
|
2020-11-29 16:33:09 +00:00
|
|
|
void main(
|
2022-01-15 10:51:16 +00:00
|
|
|
const unsigned long multiboot2_info_magic,
|
2022-01-13 04:27:01 +00:00
|
|
|
const struct KernAux_Multiboot2_Info *const multiboot2_info
|
2020-11-29 16:33:09 +00:00
|
|
|
) {
|
2021-12-14 23:53:05 +00:00
|
|
|
kernaux_assert_cb = kernaux_assert_fn;
|
|
|
|
|
2022-01-15 10:51:16 +00:00
|
|
|
if (multiboot2_info_magic != KERNAUX_MULTIBOOT2_INFO_MAGIC) {
|
|
|
|
panic("Multiboot 2 info magic number is invalid.");
|
2017-11-08 12:22:46 +00:00
|
|
|
}
|
2017-11-04 11:45:48 +00:00
|
|
|
|
2022-06-23 10:51:42 +00:00
|
|
|
KernAux_Multiboot2_Info_print(multiboot2_info,
|
|
|
|
kernaux_drivers_console_printf);
|
2020-11-28 01:38:32 +00:00
|
|
|
|
2022-01-13 04:27:01 +00:00
|
|
|
if (!KernAux_Multiboot2_Info_is_valid(multiboot2_info)) {
|
2020-11-28 03:24:03 +00:00
|
|
|
panic("Multiboot 2 info is invalid.");
|
|
|
|
}
|
|
|
|
|
2021-12-17 23:26:56 +00:00
|
|
|
kernel_info_init_start(
|
2021-12-17 22:45:22 +00:00
|
|
|
&kinfo,
|
|
|
|
(size_t)&_kernel_offset,
|
|
|
|
(size_t)&_kernel_size,
|
|
|
|
(size_t)&_kernel_phys_base,
|
|
|
|
(size_t)&_kernel_virt_base,
|
2021-12-18 21:59:16 +00:00
|
|
|
(size_t)&_kernel_stack_start,
|
|
|
|
(size_t)&_kernel_stack_size
|
2021-12-17 22:45:22 +00:00
|
|
|
);
|
2021-12-19 00:03:11 +00:00
|
|
|
kernel_info_init_from_multiboot2(&kinfo, multiboot2_info);
|
2021-12-18 02:42:03 +00:00
|
|
|
kernel_info_init_finish(&kinfo);
|
2021-12-17 23:05:01 +00:00
|
|
|
kernel_info_print(&kinfo);
|
2021-12-18 02:48:27 +00:00
|
|
|
assert(kernel_info_is_valid(&kinfo), "Invalid kernel information.");
|
2021-12-17 23:05:01 +00:00
|
|
|
|
2021-12-19 00:03:11 +00:00
|
|
|
KernAux_PFA_initialize(&pfa);
|
2021-12-19 01:34:40 +00:00
|
|
|
kernel_info_setup_pfa(&kinfo, &pfa);
|
2021-12-19 00:03:11 +00:00
|
|
|
|
2021-12-18 20:33:18 +00:00
|
|
|
// TODO: maybe rename to init?
|
2021-12-18 05:19:44 +00:00
|
|
|
paging_clear(&paging);
|
2021-12-18 20:33:18 +00:00
|
|
|
|
2021-12-19 02:13:51 +00:00
|
|
|
paging_identity(&paging);
|
|
|
|
paging_mapkernel(&paging, &kinfo);
|
2017-11-08 12:22:46 +00:00
|
|
|
|
2021-12-18 20:05:42 +00:00
|
|
|
paging_load(&paging);
|
|
|
|
paging_enable();
|
2017-11-08 12:22:46 +00:00
|
|
|
|
2020-11-26 18:50:25 +00:00
|
|
|
protected_initialize(&kinfo);
|
|
|
|
|
2022-06-23 21:27:50 +00:00
|
|
|
kernaux_drivers_console_print("[INFO] main: Finished.\n");
|
2017-11-04 02:32:23 +00:00
|
|
|
}
|