Forráskód Böngészése

refactor(mem): use cpp

greatbridf 2 éve
szülő
commit
010eeefb18

+ 2 - 2
CMakeLists.txt

@@ -45,7 +45,7 @@ set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         src/kernel/process.c
                         src/kernel/tty.c
                         src/kernel/stdio.c
-                        src/kernel/mem.c
+                        src/kernel/mem.cpp
                         src/kernel/vfs.cpp
                         src/kernel/vga.c
                         src/kernel/hw/keyboard.cpp
@@ -63,7 +63,7 @@ set(KERNEL_MAIN_SOURCES src/kernel_main.c
                         include/kernel/interrupt.h
                         include/kernel/process.h
                         include/kernel/stdio.h
-                        include/kernel/mem.h
+                        include/kernel/mem.hpp
                         include/kernel/vfs.h
                         include/kernel/vga.h
                         include/kernel/hw/keyboard.h

+ 1 - 1
include/asm/sys.h

@@ -1,6 +1,6 @@
 #pragma once
 
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <types/types.h>
 
 #ifdef __cplusplus

+ 0 - 0
include/kernel/mem.h → include/kernel/mem.hpp


+ 1 - 1
include/types/allocator.hpp

@@ -1,5 +1,5 @@
 #pragma once
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <types/types.h>
 
 inline void* operator new(size_t, void* ptr)

+ 8 - 0
include/types/bitmap.h

@@ -2,6 +2,14 @@
 
 #include <types/stdint.h>
 
+#ifdef __cplusplus
+extern "C" {
+#endif
+
 int bm_test(char* bm, size_t n);
 void bm_set(char* bm, size_t n);
 void bm_clear(char* bm, size_t n);
+
+#ifdef __cplusplus
+}
+#endif

+ 1 - 1
include/types/list.hpp

@@ -1,6 +1,6 @@
 #pragma once
 
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <types/allocator.hpp>
 #include <types/types.h>
 

+ 4 - 0
include/types/stdint.h

@@ -1,6 +1,10 @@
 #pragma once
 
+#ifdef __cplusplus
+#define NULL (nullptr)
+#else
 #define NULL ((void*)0)
+#endif
 
 typedef __INT8_TYPE__ int8_t;
 typedef __INT16_TYPE__ int16_t;

+ 1 - 1
include/types/vector.hpp

@@ -1,6 +1,6 @@
 #pragma once
 
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <types/allocator.hpp>
 #include <types/cplusplus.hpp>
 #include <types/types.h>

+ 1 - 1
src/kernel/interrupt.c

@@ -4,7 +4,7 @@
 #include <kernel/hw/keyboard.h>
 #include <kernel/hw/timer.h>
 #include <kernel/interrupt.h>
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <kernel/stdio.h>
 #include <kernel/tty.h>
 #include <kernel/vga.h>

+ 20 - 21
src/kernel/mem.c → src/kernel/mem.cpp

@@ -2,7 +2,7 @@
 #include <asm/port_io.h>
 #include <asm/sys.h>
 #include <kernel/errno.h>
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <kernel/stdio.h>
 #include <kernel/task.h>
 #include <kernel/vga.h>
@@ -48,7 +48,7 @@ static int32_t brk(void* addr)
 // sets errno when failed to increase heap pointer
 static void* sbrk(size_t increment)
 {
-    if (brk(p_break + increment) != 0) {
+    if (brk((char*)p_break + increment) != 0) {
         errno = ENOMEM;
         return 0;
     } else {
@@ -64,13 +64,22 @@ int init_heap(void)
     if (brk(KERNEL_HEAP_START) != 0) {
         return GB_FAILED;
     }
-    struct mem_blk* p_blk = sbrk(0);
+    struct mem_blk* p_blk = (struct mem_blk*)sbrk(0);
     p_blk->size = 4;
     p_blk->flags.has_next = 0;
     p_blk->flags.is_free = 1;
     return GB_OK;
 }
 
+static inline struct mem_blk* _find_next_mem_blk(struct mem_blk* blk, size_t blk_size)
+{
+    char* p = (char*)blk;
+    p += sizeof(struct mem_blk);
+    p += blk_size;
+    p -= (4 * sizeof(uint8_t));
+    return (struct mem_blk*)p;
+}
+
 // @param start_pos position where to start finding
 // @param size the size of the block we're looking for
 // @return found block if suitable block exists, if not, the last block
@@ -88,10 +97,7 @@ find_blk(
                 errno = ENOTFOUND;
                 return start_pos;
             }
-            start_pos = ((void*)start_pos)
-                + sizeof(struct mem_blk)
-                + start_pos->size
-                - 4 * sizeof(uint8_t);
+            start_pos = _find_next_mem_blk(start_pos, start_pos->size);
         }
     }
 }
@@ -106,10 +112,7 @@ allocate_new_block(
         return 0;
     }
 
-    struct mem_blk* blk = ((void*)blk_before)
-        + sizeof(struct mem_blk)
-        + blk_before->size
-        - 4 * sizeof(uint8_t);
+    struct mem_blk* blk = _find_next_mem_blk(blk_before, blk_before->size);
 
     blk_before->flags.has_next = 1;
 
@@ -130,10 +133,7 @@ static void split_block(
         return;
     }
 
-    struct mem_blk* blk_next = ((void*)blk)
-        + sizeof(struct mem_blk)
-        + this_size
-        - 4 * sizeof(uint8_t);
+    struct mem_blk* blk_next = _find_next_mem_blk(blk, this_size);
 
     blk_next->size = blk->size
         - this_size
@@ -151,7 +151,7 @@ void* k_malloc(size_t size)
 {
     struct mem_blk* block_allocated;
 
-    block_allocated = find_blk(p_start, size);
+    block_allocated = find_blk((struct mem_blk*)p_start, size);
     if (errno == ENOTFOUND) {
         // 'block_allocated' in the argument list is the pointer
         // pointing to the last block
@@ -168,7 +168,7 @@ void* k_malloc(size_t size)
 
 void k_free(void* ptr)
 {
-    ptr -= (sizeof(struct mem_blk_flags) + sizeof(size_t));
+    ptr = (void*)((char*)ptr - (sizeof(struct mem_blk_flags) + sizeof(size_t)));
     struct mem_blk* blk = (struct mem_blk*)ptr;
     blk->flags.is_free = 1;
     // TODO: fusion free blocks nearby
@@ -190,13 +190,12 @@ phys_ptr_t l_ptr_to_p_ptr(struct mm* mm, linr_ptr_t v_ptr)
 {
     while (mm != NULL) {
         if (v_ptr < mm->start || v_ptr >= mm->start + mm->len * 4096) {
-            goto next;
+            mm = mm->next;
+            continue;
         }
         size_t offset = (size_t)(v_ptr - mm->start);
         LIST_LIKE_AT(struct page, mm->pgs, offset / PAGE_SIZE, result);
         return page_to_phys_addr(result->phys_page_id) + (offset % 4096);
-    next:
-        mm = mm->next;
     }
 
     // TODO: handle error
@@ -397,7 +396,7 @@ int k_map(
             page = page->next;
 
         // create a new page node
-        struct page* new_page = k_malloc(sizeof(struct page));
+        struct page* new_page = (struct page*)k_malloc(sizeof(struct page));
 
         new_page->attr.read = (read == 1);
         new_page->attr.write = (write == 1);

+ 2 - 2
src/kernel/tty.c

@@ -1,9 +1,9 @@
 #include <asm/port_io.h>
+#include <kernel/hw/serial.h>
+#include <kernel/mem.hpp>
 #include <kernel/stdio.h>
 #include <kernel/tty.h>
-#include <kernel/mem.h>
 #include <kernel/vga.h>
-#include <kernel/hw/serial.h>
 
 static void serial_tty_put_char(struct tty* p_tty, char c)
 {

+ 1 - 1
src/kernel/vfs.cpp

@@ -1,5 +1,5 @@
 #include <kernel/errno.h>
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <kernel/stdio.h>
 #include <kernel/tty.h>
 #include <kernel/vfs.h>

+ 1 - 1
src/kernel_main.c

@@ -8,7 +8,7 @@
 #include <kernel/hw/serial.h>
 #include <kernel/hw/timer.h>
 #include <kernel/interrupt.h>
-#include <kernel/mem.h>
+#include <kernel/mem.hpp>
 #include <kernel/stdio.h>
 #include <kernel/tty.h>
 #include <kernel/vfs.h>