From 1b5adad684b1bb6540624b9b323d160f38d25b1e Mon Sep 17 00:00:00 2001 From: frogrammer9 Date: Wed, 8 Apr 2026 14:02:33 +0200 Subject: [PATCH 1/3] added kernel address space interface --- src/kernel/address_space/address_space.c | 0 src/kernel/address_space/address_space.h | 35 ++++++++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 src/kernel/address_space/address_space.c create mode 100644 src/kernel/address_space/address_space.h diff --git a/src/kernel/address_space/address_space.c b/src/kernel/address_space/address_space.c new file mode 100644 index 00000000..e69de29b diff --git a/src/kernel/address_space/address_space.h b/src/kernel/address_space/address_space.h new file mode 100644 index 00000000..d62ffa45 --- /dev/null +++ b/src/kernel/address_space/address_space.h @@ -0,0 +1,35 @@ +#ifndef KERNEL_ADDRESS_SPACE_ADDRESS_SPACE +#define KERNEL_ADDRESS_SPACE_ADDRESS_SPACE + +#include "stdbigos/error.h" +#include "stdbigos/types.h" + +typedef enum : u16 { + AS_FLAGS_READ = (1ull << 0), + AS_FLAGS_WRITE = (1ull << 1), + AS_FLAGS_EXECUTE = (1ull << 2), + AS_FLAGS_MAPPED = (1ull << 3), + AS_FLAGS_GLOBAL = (1ull << 4), + AS_FLAGS_USER = (1ull << 5), +} address_space_region_flags_t; + +typedef struct { + address_space_region_flags_t flags; + void* addr; + size_t size; +} address_space_region_t; + +typedef struct { + address_space_region_t* regions; + size_t regions_count; + bool does_manage_own_memory; + bool active; +} address_space_t; + +error_t address_space_init(); + +error_t address_space_init_from_buffer(address_space_region_t* regions, size_t count); + +error_t address_space_delegate_memory_management(void** addrOUT); + +#endif // !KERNEL_ADDRESS_SPACE_ADDRESS_SPACE From 91ff42c0d8cec45fa0d67337612d6eae8b57e15f Mon Sep 17 00:00:00 2001 From: frogrammer9 Date: Thu, 9 Apr 2026 20:34:39 +0200 Subject: [PATCH 2/3] added hal address space interface --- src/example_dtree/CMakeLists.txt | 2 +- src/kernel/CMakeLists.txt | 2 +- src/kernel/hal/arch/riscv/address_space.c | 1 + .../hal/arch/riscv/memory_region.c | 3 +- src/{lib => kernel}/hal/hal.c | 2 +- src/{lib => kernel}/hal/hal_internal.h | 0 src/kernel/hal/include/address_space.h | 45 +++++++++++++++++++ {include/hal => src/kernel/hal/include}/hal.h | 0 .../kernel/hal/include}/memory_regions.h | 0 .../physical_memory/manager.c | 2 +- src/lib/dt/CMakeLists.txt | 4 +- src/lib/hal/CMakeLists.txt | 7 --- 12 files changed, 54 insertions(+), 14 deletions(-) create mode 100644 src/kernel/hal/arch/riscv/address_space.c rename src/{lib => kernel}/hal/arch/riscv/memory_region.c (95%) rename src/{lib => kernel}/hal/hal.c (96%) rename src/{lib => kernel}/hal/hal_internal.h (100%) create mode 100644 src/kernel/hal/include/address_space.h rename {include/hal => src/kernel/hal/include}/hal.h (100%) rename {include/hal => src/kernel/hal/include}/memory_regions.h (100%) delete mode 100644 src/lib/hal/CMakeLists.txt diff --git a/src/example_dtree/CMakeLists.txt b/src/example_dtree/CMakeLists.txt index a438bbae..945e82d9 100644 --- a/src/example_dtree/CMakeLists.txt +++ b/src/example_dtree/CMakeLists.txt @@ -1,5 +1,5 @@ SETUP_EXECUTABLE(example_dtree) -target_link_libraries(example_dtree PRIVATE device_tree_access Debug startup stdbigos) +target_link_libraries(example_dtree PRIVATE dt_access Debug startup stdbigos) ADD_QEMU_TARGET(example_dtree) diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index 9c44d0e8..da60efea 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -1,7 +1,7 @@ SETUP_EXECUTABLE(kernel) target_compile_definitions(kernel PRIVATE $,__DEBUG__ __LOGLVL__=3, __LOGLVL__=1>) -target_link_libraries(kernel PRIVATE Debug stdbigos hal) +target_link_libraries(kernel PRIVATE Debug stdbigos dt_access) target_link_options(kernel PRIVATE -static-pie -e kinit) diff --git a/src/kernel/hal/arch/riscv/address_space.c b/src/kernel/hal/arch/riscv/address_space.c new file mode 100644 index 00000000..fba54c16 --- /dev/null +++ b/src/kernel/hal/arch/riscv/address_space.c @@ -0,0 +1 @@ +#include "hal/include/address_space.h" diff --git a/src/lib/hal/arch/riscv/memory_region.c b/src/kernel/hal/arch/riscv/memory_region.c similarity index 95% rename from src/lib/hal/arch/riscv/memory_region.c rename to src/kernel/hal/arch/riscv/memory_region.c index 6b8d22c5..27143301 100644 --- a/src/lib/hal/arch/riscv/memory_region.c +++ b/src/kernel/hal/arch/riscv/memory_region.c @@ -1,6 +1,7 @@ -#include #include +#include "hal/include/memory_regions.h" + typedef struct { u32 idx; bool is_in_resmem; diff --git a/src/lib/hal/hal.c b/src/kernel/hal/hal.c similarity index 96% rename from src/lib/hal/hal.c rename to src/kernel/hal/hal.c index ad80d3bb..d0e346bc 100644 --- a/src/lib/hal/hal.c +++ b/src/kernel/hal/hal.c @@ -1,4 +1,4 @@ -#include +#include "hal/include/hal.h" #include "dt/dt.h" diff --git a/src/lib/hal/hal_internal.h b/src/kernel/hal/hal_internal.h similarity index 100% rename from src/lib/hal/hal_internal.h rename to src/kernel/hal/hal_internal.h diff --git a/src/kernel/hal/include/address_space.h b/src/kernel/hal/include/address_space.h new file mode 100644 index 00000000..46ea8e9b --- /dev/null +++ b/src/kernel/hal/include/address_space.h @@ -0,0 +1,45 @@ +#ifndef HAL_ADDRESS_SPACE +#define HAL_ADDRESS_SPACE + +#include "stdbigos/error.h" +#include "stdbigos/memory_types.h" +#include "stdbigos/types.h" + +typedef struct { + alignas(64) u8 data[32]; +} hal_address_space_t; + +typedef enum : u16 { + HAL_ASR_FLAGS_READ = (1ull << 0), + HAL_ASR_FLAGS_WRITE = (1ull << 1), + HAL_ASR_FLAGS_EXECUTE = (1ull << 2), +} hal_address_region_flag_t; + +typedef enum : u16 { + HAL_AS_GLOBAL = (1ull << 0), + HAL_AS_USER = (1ull << 1), +} hal_address_space_flag_t; + +error_t hal_enable_virtual_address_spaces(hal_address_space_t* initial_as); + +error_t hal_address_space_init(hal_address_space_t* as, hal_address_space_flag_t flags); + +/** + * @brief Gets an array of available frame sizes + * + * Returns an array of available frame sizes in ascending order + * + * @param countOUT Pointer to a variable where the size of the array will be written to + * @returns Pointer to the first element of the array + * */ +[[nodiscard]] [[gnu::nonnull]] +const u32* hal_get_available_frame_sizes(u32* countOUT); + +error_t hal_address_space_set_active(hal_address_space_t* as); + +error_t hal_address_space_map(hal_address_space_t as, uintptr_t vaddr, physical_memory_region_t pmem, + hal_address_region_flag_t flags); + +error_t hal_address_space_unmap(hal_address_space_t as, uintptr_t vaddr, physical_memory_region_t* pmemOUT); + +#endif // !HAL_ADDRESS_SPACE diff --git a/include/hal/hal.h b/src/kernel/hal/include/hal.h similarity index 100% rename from include/hal/hal.h rename to src/kernel/hal/include/hal.h diff --git a/include/hal/memory_regions.h b/src/kernel/hal/include/memory_regions.h similarity index 100% rename from include/hal/memory_regions.h rename to src/kernel/hal/include/memory_regions.h diff --git a/src/kernel/memory_management/physical_memory/manager.c b/src/kernel/memory_management/physical_memory/manager.c index 5e92af40..f02ecbd1 100644 --- a/src/kernel/memory_management/physical_memory/manager.c +++ b/src/kernel/memory_management/physical_memory/manager.c @@ -5,7 +5,7 @@ #include #include "allocator.h" -#include "hal/memory_regions.h" +#include "hal/include/memory_regions.h" #include "stdbigos/address.h" #include "stdbigos/error.h" diff --git a/src/lib/dt/CMakeLists.txt b/src/lib/dt/CMakeLists.txt index f78c5788..af171cd5 100644 --- a/src/lib/dt/CMakeLists.txt +++ b/src/lib/dt/CMakeLists.txt @@ -1,6 +1,6 @@ -SETUP_LIBRARY(device_tree_access) +SETUP_LIBRARY(dt_access) -target_link_libraries(device_tree_access +target_link_libraries(dt_access PUBLIC stdbigos PRIVATE Debug ) diff --git a/src/lib/hal/CMakeLists.txt b/src/lib/hal/CMakeLists.txt deleted file mode 100644 index 76e1d885..00000000 --- a/src/lib/hal/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -SETUP_LIBRARY(hal) - -target_link_libraries(hal - PUBLIC stdbigos - PRIVATE Debug - PRIVATE device_tree_access -) From 3ef3cbd29b50f4af76287b6a07031c86d5adffc6 Mon Sep 17 00:00:00 2001 From: frogrammer9 Date: Wed, 22 Apr 2026 02:07:14 +0200 Subject: [PATCH 3/3] fixed a stupid gh actions issue --- src/lib/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/CMakeLists.txt b/src/lib/CMakeLists.txt index 2e47f342..bf4ff0be 100644 --- a/src/lib/CMakeLists.txt +++ b/src/lib/CMakeLists.txt @@ -1,6 +1,6 @@ file(GLOB CHILDREN RELATIVE ${CMAKE_CURRENT_SOURCE_DIR} *) foreach(CHILD ${CHILDREN}) - if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${CHILD}) + if(IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/${CHILD} AND EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/${CHILD}/CMakeLists.txt) add_subdirectory(${CHILD}) endif() endforeach()