From c6a5bf25c26da700823f66ab0273f3f5d826e5d1 Mon Sep 17 00:00:00 2001 From: 0x35c <> Date: Fri, 28 Nov 2025 16:35:40 +0100 Subject: [PATCH] feature: reboot on space with kpanic --- src/kpanic.c | 7 +++++-- src/memory/memory.c | 47 ++++++++++++++++++++++++--------------------- 2 files changed, 30 insertions(+), 24 deletions(-) diff --git a/src/kpanic.c b/src/kpanic.c index 31637c2..a75759f 100644 --- a/src/kpanic.c +++ b/src/kpanic.c @@ -31,6 +31,9 @@ __attribute__((noreturn)) void kpanic(const char *format, ...) /* kprintf("\n\n"); */ /* print_stack(); */ /* kprintf("\n\n"); */ - /* kprintf("PRESS SPACE TO REBOOT"); */ - __asm__ __volatile__("jmp panic"); + kprintf("PRESS SPACE TO REBOOT"); + while (terminal_getkey().c != ' ') + ; + reboot(); + // __asm__ __volatile__("jmp panic"); } diff --git a/src/memory/memory.c b/src/memory/memory.c index cd371f0..55ef6ea 100644 --- a/src/memory/memory.c +++ b/src/memory/memory.c @@ -21,7 +21,6 @@ static void lst_add_back(struct frame_zone **root, struct frame_zone *element) it->next = element; } - static void add_frame_node(multiboot_memory_map_t *mmmt) { static uint32_t index = 0; @@ -64,33 +63,40 @@ static void add_frame_node(multiboot_memory_map_t *mmmt) ((uint32_t)frame_zones_page_table - VIRT_OFFSET) | INIT_FLAGS; /** We need to determine how many frames are available - to save how many frame the blocks contain etc we need some meta data - 1 struct frame_zone and a frame_table, the size of the frame_table is 1 bit per frame - the frame_table is a uint8_t so 8 bit, so its size must be CEIL(max_frames, 8) - But we don't have max_frames. - We can determine max_frame = (block_len - sizeof(struct frame_zone)) / (PAGE_SIZE + 1 / 8) (1 / 8 because size is in byte but we only need one bit) - Because we don't use float we can't have 1 / 8 - So we will multiplicate every members of this equation by 8 to have only complet number - So... max_frame = (block_len - sizeof(struct frame_zone)) * 8 / (PAGE_SIZE * 8 + 1) + to save how many frame the blocks contain etc we need some meta + data 1 struct frame_zone and a frame_table, the size of the + frame_table is 1 bit per frame the frame_table is a uint8_t so 8 bit, + so its size must be CEIL(max_frames, 8) But we don't have max_frames. + We can determine max_frame = (block_len - sizeof(struct + frame_zone)) / (PAGE_SIZE + 1 / 8) (1 / 8 because size is in byte but + we only need one bit) Because we don't use float we can't have 1 / 8 + So we will multiplicate every members of this equation by 8 to + have only complet number So... max_frame = (block_len - sizeof(struct + frame_zone)) * 8 / (PAGE_SIZE * 8 + 1) */ - const uint32_t nb_frame = (len - sizeof(struct frame_zone)) * 8 / (PAGE_SIZE * 8 + 1); + const uint32_t nb_frame = + (len - sizeof(struct frame_zone)) * 8 / (PAGE_SIZE * 8 + 1); const uint32_t frame_table_size = CEIL(nb_frame, (sizeof(uint8_t) * 8)); - uint32_t page_needed = CEIL(frame_table_size + sizeof(struct frame_zone), PAGE_SIZE); + uint32_t page_needed = + CEIL(frame_table_size + sizeof(struct frame_zone), PAGE_SIZE); uint32_t i = 0; for (; i < page_needed; i++) - frame_zones_page_table[index + i] = (((uint32_t)start_addr + i * PAGE_SIZE) & PAGE_MASK) | INIT_FLAGS; - + frame_zones_page_table[index + i] = + (((uint32_t)start_addr + i * PAGE_SIZE) & PAGE_MASK) | + INIT_FLAGS; + struct frame_zone *current = (struct frame_zone *)PTE2VA(PDE_FRAME_ZONES, index); - current->frame_table = (uint8_t*) ((uint32_t) current + sizeof(struct frame_zone)); + current->frame_table = + (uint8_t *)((uint32_t)current + sizeof(struct frame_zone)); current->first_free_frame = 0; current->next = NULL; current->remaining_frames = nb_frame; current->total_frames = nb_frame; - current->addr = (void*)(uint32_t)start_addr + page_needed * PAGE_SIZE; + current->addr = (void *)(uint32_t)start_addr + page_needed * PAGE_SIZE; bzero(current->frame_table, frame_table_size); @@ -98,15 +104,12 @@ static void add_frame_node(multiboot_memory_map_t *mmmt) lst_add_back(&head, current); } - static void init_frame_zones(void) { - for(uint32_t i = 0; i < mmap_length; - i += sizeof(multiboot_memory_map_t)) - { - multiboot_memory_map_t* mmmt = - (multiboot_memory_map_t*) ((uint32_t)mmap_addr + i); - + for (uint32_t i = 0; i < mmap_length; + i += sizeof(multiboot_memory_map_t)) { + multiboot_memory_map_t *mmmt = + (multiboot_memory_map_t *)((uint32_t)mmap_addr + i); if (mmmt->type == MULTIBOOT_MEMORY_AVAILABLE) add_frame_node(mmmt); }