diff --git a/include/hal/hal.h b/include/hal/hal.h new file mode 100644 index 00000000..51af5af0 --- /dev/null +++ b/include/hal/hal.h @@ -0,0 +1,23 @@ +#ifndef HAL_HAL +#define HAL_HAL + +#include +#include + +/// @addtogroup hal +/// @{ + +/** + * @param dtb Physical address of device tree blob + * @param physical_to_effective A pointer to a function that transalates physical addresses into effective ones + * + * @retval ERR_NONE Success + * @retval ERR_BAD_ARG @p dtb is null + * @retval ERR_NOT_VALID No valid device tree found at address @p dtb + * */ +[[gnu::nonnull(2)]] +error_t hal_init(__phys void* dtb, void* (*physical_to_effective)(__phys void*)); + +/// @} + +#endif // !HAL_HAL diff --git a/include/hal/memory_regions.h b/include/hal/memory_regions.h new file mode 100644 index 00000000..85e27076 --- /dev/null +++ b/include/hal/memory_regions.h @@ -0,0 +1,30 @@ +#ifndef HAL_MEMORY_REGIONS +#define HAL_MEMORY_REGIONS + +#include +#include + +/** + * This type is opaque to the caller. + * Fields of this struct should not be modified directly. + * */ +typedef struct { + u32 idx; + bool in_memresblock; +} hal_reserved_iterator_t; + +error_t hal_get_reserved_regions_iterator(hal_reserved_iterator_t* iterOUT); +error_t hal_get_next_reserved_region(hal_reserved_iterator_t iter, memory_area_t* areaOUT); + +/** + * This type is opaque to the caller. + * Fields of this struct should not be modified directly. + * */ +typedef struct { + u32 idx; +} hal_memory_iterator_t; + +error_t hal_get_memory_regions_iterator(hal_memory_iterator_t* iterOUT); +error_t hal_get_next_memory_region(hal_memory_iterator_t iter, memory_area_t* areaOUT); + +#endif // !HAL_MEMORY_REGIONS diff --git a/include/stdbigos/error.h b/include/stdbigos/error.h index 4241d7ba..42533c04 100644 --- a/include/stdbigos/error.h +++ b/include/stdbigos/error.h @@ -16,6 +16,7 @@ typedef enum [[nodiscard]] { ERR_OUT_OF_MEMORY, ERR_NOT_ENOUGH_MEMORY, ERR_REPEATED_INITIALIZATION, + ERR_ALLOCATION_FAILED, } error_t; #endif // !BIGOS_INCLUDE_STDBIGOS_ERROR diff --git a/src/kernel/CMakeLists.txt b/src/kernel/CMakeLists.txt index e87f158e..b48d93ff 100644 --- a/src/kernel/CMakeLists.txt +++ b/src/kernel/CMakeLists.txt @@ -1,6 +1,7 @@ SETUP_EXECUTABLE(kernel) target_compile_definitions(kernel PRIVATE $,__DEBUG__ __LOGLVL__=3, __LOGLVL__=1>) +target_compile_definitions(kernel PRIVATE __ARCH_RISCV__) # Make this an opt when we add support for other arches target_link_libraries(kernel PRIVATE Debug stdbigos) target_link_options(kernel PRIVATE -static-pie -e kinit) diff --git a/src/lib/hal/CMakeLists.txt b/src/lib/hal/CMakeLists.txt new file mode 100644 index 00000000..76e1d885 --- /dev/null +++ b/src/lib/hal/CMakeLists.txt @@ -0,0 +1,7 @@ +SETUP_LIBRARY(hal) + +target_link_libraries(hal + PUBLIC stdbigos + PRIVATE Debug + PRIVATE device_tree_access +) diff --git a/src/lib/hal/hal.c b/src/lib/hal/hal.c new file mode 100644 index 00000000..6ad31a89 --- /dev/null +++ b/src/lib/hal/hal.c @@ -0,0 +1,38 @@ +#include + +#include "dt/dt.h" + +//=========== +// Internals +//=========== + +static bool g_is_init = false; +static __phys void* g_dtb = nullptr; +static void* (*g_physical_to_effective)(__phys void*) = nullptr; + +bool ihal_is_init() { + return g_is_init; +} + +error_t ihal_get_dtb(void** dtbOUT) { + if (!g_is_init) + return ERR_NOT_INITIALIZED; + *dtbOUT = g_physical_to_effective(g_dtb); + return ERR_NONE; +} + +//======== +// Public +//======== + +error_t hal_init(__phys void* dtb, void* (*physical_to_effective)(__phys void*)) { + if (dtb == nullptr) + return ERR_BAD_ARG; + fdt_t fdt = {0}; + error_t err = dt_init(physical_to_effective(dtb), &fdt); + if (err) + return err; + g_physical_to_effective = physical_to_effective; + g_is_init = true; + return ERR_NONE; +} diff --git a/src/lib/hal/hal_internal.h b/src/lib/hal/hal_internal.h new file mode 100644 index 00000000..da463e9f --- /dev/null +++ b/src/lib/hal/hal_internal.h @@ -0,0 +1,4 @@ +#ifndef LIB_HAL_HAL_INTERNAL +#define LIB_HAL_HAL_INTERNAL + +#endif // !LIB_HAL_HAL_INTERNAL diff --git a/src/lib/hal/memory_region.c b/src/lib/hal/memory_region.c new file mode 100644 index 00000000..ad5226fd --- /dev/null +++ b/src/lib/hal/memory_region.c @@ -0,0 +1,24 @@ +#include +#include + +error_t hal_get_reserved_regions_iterator(hal_reserved_iterator_t* iterOUT) { + (void)iterOUT; + return ERR_NOT_INITIALIZED; +} + +error_t hal_get_next_reserved_region(hal_reserved_iterator_t iter, memory_area_t* areaOUT) { + (void)iter; + (void)areaOUT; + return ERR_NOT_INITIALIZED; +} + +error_t hal_get_memory_regions_iterator(hal_memory_iterator_t* iterOUT) { + (void)iterOUT; + return ERR_NOT_INITIALIZED; +} + +error_t hal_get_next_memory_region(hal_memory_iterator_t iter, memory_area_t* areaOUT) { + (void)iter; + (void)areaOUT; + return ERR_NOT_INITIALIZED; +}