24#define INIT_STEP(message, code) \
25 LAST_INIT_STEP = message; \
27 logi("kernel", message);
38 logd(
"kernel",
"Hello world!");
44 logi(
"kernel",
"Initializing subsystems");
47 "Initialized physical memory management",
52 "Initialized virtual memory management",
57 "Initialized framebuffer console backbuffer",
62 "Initialized UEFI runtime services",
67 "Initialized service registry",
72 "Initialized mutex subsystem",
78 "Initialized message queue subsystem",
83 "Initialized syscall interface",
89 "Initialized scheduling and program execution",
94 "Initialized interrupt management",
100 "Read kernel symbols",
105 "Cleaned bootup memory structures",
110 "Prepared userspace",
114 logi(
"kernel",
"Kernel initialization complete");
124 #include "../../bootlogo.c"
129 logd(
"main.c",
"loaderStruct->num_mem_desc: %lu", loaderStruct->
num_mem_desc);
141 char desc_status[81];
142 memset(desc_status, 0, 81);
144 for(
size_t i = 0; i < loaderStruct->
num_mem_desc; ++i) {
148 desc_status[i % 80] =
'-';
153 desc_status[i % 80] =
'F';
157 desc_status[i % 80] =
'X';
161 logd(
"mm",
"memory descriptor status: %s", desc_status);
162 memset(desc_status, 0, 81);
166 logd(
"mm",
"memory descriptor status: %s", desc_status);
168 logi(
"mm",
"%u pages (%B) free, %u (%B) firmware runtime memory",
169 pages_free, pages_free * 4096,
170 pages_firmware, pages_firmware* 4096
177 for(
size_t i = 0; i < loaderStruct->
num_files; ++i) {
189 (
ptr_t)loaderStruct +
194 for(
size_t i = 0; i < loaderStruct->
num_files; ++i) {
201 ptr_t data_start = 0;
206 logd(
"init" "Failed to run '%s'", desc->
name);
static const struct @2 lf_os_bootlogo
void init_efi(struct LoaderStruct *loaderStruct)
ptr_t load_elf(ptr_t start, struct vm_table *context, ptr_t *data_start, ptr_t *data_end)
void * elf_load_symbols(ptr_t elf, allocator_t *alloc)
void fbconsole_init_backbuffer(void)
void fbconsole_blt(const uint8_t *image, uint16_t width, uint16_t height, int16_t tx, int16_t ty)
int fbconsole_write(char *string,...)
void fbconsole_init(int width, int height, int stride, uint8_t *fb)
void init_symbols(struct LoaderStruct *loaderStruct)
void init_console(struct LoaderStruct *loaderStruct)
void bootstrap_globals(void)
#define INIT_STEP(message, code)
void init_init(struct LoaderStruct *loaderStruct)
void init_mm(struct LoaderStruct *loaderStruct)
#define ALLOCATOR_REGION_SCRATCHPAD
void * memset(void *dest, int c, size_t size)
int strcasecmp(const char *s1, const char *s2)
uint16_t fb_stride
Pixels per scanline (including invisible pixels)
uint64_t offset
Offset where the file contents are located after LoaderStruct.
uint64_t flags
Flags for the memory region. See MEMORY_REGION_ defines.
uint64_t num_files
Number of loaded files.
uint16_t fb_width
Width of the framebuffer in visible pixels.
#define MEMORY_REGION_USABLE
memory is free to be used
size_t num_pages
Number of pages, where page size is 4096 bytes.
#define MEMORY_REGION_FIRMWARE
memory is in use by the firmware
ptr_t fb_location
Location of framebuffer as physical address.
uint64_t num_mem_desc
Number of memory descriptors.
ptr_t start_address
Start of the region as physical address.
char name[256]
Zero terminated string with the name of the file.
uint16_t fb_height
Height of the framebuffer in pixels.
Main interface between loader and kernel.
Describes a single memory region.
#define logd(component, fmt,...)
#define logi(component, fmt,...)
void mm_bootstrap(ptr_t usable_page)
void mm_mark_physical_pages(ptr_t start, uint64_t count, mm_page_status_t status)
void init_mq(allocator_t *alloc)
void panic_message(const char *message)
int main(int argc, char *argv[])
void start_task(struct vm_table *context, ptr_t entry, ptr_t data_start, ptr_t data_end, const char *name)
void init_scheduler(void)
ptr_t slab_alloc(SlabHeader *slab)
void init_slab(ptr_t mem_start, ptr_t mem_end, size_t allocation_size)
void cleanup_boot_vm(void)
struct vm_table * vm_current_context(void)
struct vm_table * vm_context_new(void)
struct vm_table * VM_KERNEL_CONTEXT
A paging table, when this is a PML4 it may also be called context.