diff options
| author | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-16 18:03:58 +0200 |
|---|---|---|
| committer | Aleksa Vuckovic <aleksav013@gmail.com> | 2022-08-16 18:03:58 +0200 |
| commit | 501a706643a056863b6ea214882a2be270966f87 (patch) | |
| tree | 7f1ff025e7aa37b936ce15ebfe21783ae312d7f2 /kernel/src | |
| parent | 5c1c4eb0a4084b666342e6f8eb348eb80be6214b (diff) | |
libk/list.h; reading mmap from multiboot2
Diffstat (limited to 'kernel/src')
| -rw-r--r-- | kernel/src/boot/multiboot2.c | 64 | ||||
| -rw-r--r-- | kernel/src/libk/list.c | 37 | ||||
| -rw-r--r-- | kernel/src/main.c | 18 |
3 files changed, 91 insertions, 28 deletions
diff --git a/kernel/src/boot/multiboot2.c b/kernel/src/boot/multiboot2.c index 9c2998f..d0b0667 100644 --- a/kernel/src/boot/multiboot2.c +++ b/kernel/src/boot/multiboot2.c @@ -2,14 +2,59 @@ #include <multiboot2.h> #include <graphics.h> -#include <debug.h> #include <paging.h> +#include <libk/stdio.h> +#include <libk/string.h> +#include <libk/list.h> +#include <heap.h> + #define KERNEL_VMA 0xc0000000 /* https://www.gnu.org/software/grub/manual/multiboot2/html_node/Boot-information-format.html */ -void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) +void init_fb(mb2_tag_fb* tag_fb) +{ + main_fb.addr = tag_fb->framebuffer_addr; + main_fb.width = tag_fb->framebuffer_width; + main_fb.height = tag_fb->framebuffer_height; + main_fb.pitch = tag_fb->framebuffer_pitch; + main_fb.bpp = tag_fb->framebuffer_bpp; + + // identity map framebuffer address + map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); + map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); +} + +void init_mmap(mb2_tag_mmap* tag_mmap) +{ + list_t* mmap = NULL; + + // get data and store it into list + for (size_t i = sizeof(mb2_tag_mmap); i < tag_mmap->size; i += sizeof(mb2_tag_mmap_entry)) { + mb2_tag_mmap_entry* mmap_entry; + mmap_entry = (mb2_tag_mmap_entry*)kalloc(sizeof(mb2_tag_mmap_entry)); + memcpy(mmap_entry, (char*)tag_mmap + i, sizeof(mb2_tag_mmap_entry)); + add_to_list_head(&mmap, mmap_entry); + } + + // print data from list + for (list_t* tmp = mmap; tmp != NULL; tmp = tmp->next) { + mb2_tag_mmap_entry* mmap_entry; + mmap_entry = tmp->data; + printf("base_addr: 0x%x, length: 0x%x, type: %d\n", mmap_entry->base_addr, mmap_entry->length, mmap_entry->type); + } + + // free data + for (list_t* tmp = mmap; tmp != NULL; tmp = tmp->next) { + kfree(tmp->data); + } + + // free list + free_list(&mmap); +} + +void read_mb2(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) { if (multiboot_magic != MB2_MAGIC) { // not loaded by multiboot2 bootloader @@ -18,6 +63,7 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) // we will store framebuffer information here static mb2_tag_fb* tag_fb; + static mb2_tag_mmap* tag_mmap; // skip first 8 bytes (total_size + reserved) mb2_tag_header* tag_header = (mb2_tag_header*)((char*)multiboot_bootinfo + 8 + KERNEL_VMA); @@ -28,6 +74,9 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) case MB2_TAG_FB: tag_fb = (mb2_tag_fb*)tag_header; break; + case MB2_TAG_MMAP: + tag_mmap = (mb2_tag_mmap*)tag_header; + break; default: break; } @@ -36,13 +85,6 @@ void init_fb(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) tag_header += tag_header->size / 8 + ((tag_header->size % 8) > 0); } - main_fb.addr = tag_fb->framebuffer_addr; - main_fb.width = tag_fb->framebuffer_width; - main_fb.height = tag_fb->framebuffer_height; - main_fb.pitch = tag_fb->framebuffer_pitch; - main_fb.bpp = tag_fb->framebuffer_bpp; - - // identity map framebuffer address - map_addr(main_fb.addr, main_fb.addr, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); - map_addr(main_fb.addr + PAGE_SIZE, main_fb.addr + PAGE_SIZE, FLAG_PRESENT + FLAG_WRITABLE + FLAG_HUGE); + init_fb(tag_fb); + init_mmap(tag_mmap); } diff --git a/kernel/src/libk/list.c b/kernel/src/libk/list.c new file mode 100644 index 0000000..5f75845 --- /dev/null +++ b/kernel/src/libk/list.c @@ -0,0 +1,37 @@ +#include <libk/list.h> +#include <heap.h> + +void add_to_list_head(list_t** ptr, void* data) +{ + list_t* node = (list_t*)kalloc(sizeof(list_t)); + node->data = data; + + node->next = *ptr; + *ptr = node; +} + +void add_to_list_tail(list_t** ptr, void* data) +{ + list_t* node = (list_t*)kalloc(sizeof(list_t)); + node->data = data; + + if (*ptr == NULL) { + *ptr = node; + } else { + list_t* tmp = *ptr; + while (tmp->next != NULL) + tmp = tmp->next; + tmp->next = node; + } +} + +void free_list(list_t** ptr) +{ + if (*ptr == NULL) + return; + + for (list_t* tmp = (*ptr)->next; tmp != NULL; tmp = tmp->next) { + kfree(*ptr); + *ptr = tmp; + } +} diff --git a/kernel/src/main.c b/kernel/src/main.c index 95951bd..a3303e4 100644 --- a/kernel/src/main.c +++ b/kernel/src/main.c @@ -16,23 +16,7 @@ int kernel_main(mb2_tag_header* multiboot_bootinfo, uint32_t multiboot_magic) init_paging(); init_idt(); init_heap(); - init_fb(multiboot_bootinfo, multiboot_magic); - - size_t n = 15; - uint16_t* a = (uint16_t*)kalloc(sizeof(uint16_t) * (uint32_t)n); - for (size_t i = 0; i < n; i++) { - a[i] = (uint16_t)i + 250; - } - - uint8_t* b = (uint8_t*)kalloc(sizeof(uint16_t) * (uint32_t)n); - memcpy(b, a, sizeof(uint16_t) * n); - - for (size_t i = 0; i < 2 * n; i++) { - printf("b[%d] = %d\n", i, b[i]); - } - - __asm__ volatile ("movq $4, 0x1000000;"); - + read_mb2(multiboot_bootinfo, multiboot_magic); for(;;) { __asm__ volatile ("hlt;"); |
