feat: added support for constructors/desctructors
This commit is contained in:
@@ -67,12 +67,22 @@ if (NOT IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/${CMAKE_SYSTEM_PRO
|
|||||||
message(FATAL_ERROR "Unknown architecture ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/${CMAKE_SYSTEM_PROCESSOR}")
|
message(FATAL_ERROR "Unknown architecture ${CMAKE_CURRENT_SOURCE_DIR}/src/platform/${CMAKE_SYSTEM_PROCESSOR}")
|
||||||
endif ()
|
endif ()
|
||||||
|
|
||||||
file(GLOB PLATFORM_SPECIFIC_SOURCES src/platform/x86_64/*.c)
|
file(GLOB PLATFORM_SPECIFIC_SOURCES src/platform/${CMAKE_SYSTEM_PROCESSOR}/*.c)
|
||||||
|
file(GLOB PLATFORM_SPECIFIC_ASM_SOURCES src/platform/${CMAKE_SYSTEM_PROCESSOR}/*.asm)
|
||||||
|
|
||||||
|
file(GLOB CRTI src/platform/generic/crt/crti.c)
|
||||||
|
file(GLOB CRTN src/platform/generic/crt/crtn.c)
|
||||||
|
|
||||||
# Define aggregate sources
|
# Define aggregate sources
|
||||||
set(KERNEL_SOURCE_FILES ${KERNEL_SOURCES} ${LIMINE_KERNEL_SOURCES} ${PLATFORM_GENERIC_SOURCES} ${PLATFORM_SPECIFIC_SOURCES})
|
set(KERNEL_SOURCE_FILES
|
||||||
|
${KERNEL_SOURCES}
|
||||||
|
${LIMINE_KERNEL_SOURCES}
|
||||||
|
${PLATFORM_GENERIC_SOURCES}
|
||||||
|
${PLATFORM_SPECIFIC_SOURCES}
|
||||||
|
${PLATFORM_SPECIFIC_ASM_SOURCES}
|
||||||
|
)
|
||||||
|
|
||||||
# Define executable
|
# Define executable
|
||||||
add_executable(yak.elf ${KERNEL_SOURCE_FILES})
|
add_executable(yak.elf ${CRTI} ${KERNEL_SOURCE_FILES} ${CRTN})
|
||||||
target_link_libraries(yak.elf PRIVATE ${BUILTINS_LIB})
|
target_link_libraries(yak.elf PRIVATE ${BUILTINS_LIB})
|
||||||
target_include_directories(yak.elf PRIVATE include ../limine/include ${printf_library_SOURCE_DIR}/src)# ${printf_library_SOURCE_DIR}/src)
|
target_include_directories(yak.elf PRIVATE include ../limine/include ${printf_library_SOURCE_DIR}/src)# ${printf_library_SOURCE_DIR}/src)
|
||||||
@@ -5,6 +5,18 @@
|
|||||||
#ifndef YAK_PLATFORM_H
|
#ifndef YAK_PLATFORM_H
|
||||||
#define YAK_PLATFORM_H
|
#define YAK_PLATFORM_H
|
||||||
|
|
||||||
|
#if __x86_64__ || __x86_64
|
||||||
|
#define HAS_INIT
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAS_INIT
|
||||||
|
void _init();
|
||||||
|
void _fini();
|
||||||
|
#else
|
||||||
|
#define _init
|
||||||
|
#define _fini
|
||||||
|
#endif
|
||||||
|
|
||||||
void platform_init();
|
void platform_init();
|
||||||
|
|
||||||
void __attribute__((noreturn)) halt_forever();
|
void __attribute__((noreturn)) halt_forever();
|
||||||
|
|||||||
@@ -23,6 +23,8 @@ SECTIONS
|
|||||||
. = 0xffffffff80000000;
|
. = 0xffffffff80000000;
|
||||||
|
|
||||||
.text : {
|
.text : {
|
||||||
|
*(.init)
|
||||||
|
*(.fini)
|
||||||
*(.text .text.*)
|
*(.text .text.*)
|
||||||
} :text
|
} :text
|
||||||
|
|
||||||
@@ -33,6 +35,20 @@ SECTIONS
|
|||||||
*(.rodata .rodata.*)
|
*(.rodata .rodata.*)
|
||||||
} :rodata
|
} :rodata
|
||||||
|
|
||||||
|
/* Include the list of initialization functions sorted. */
|
||||||
|
.init_array :
|
||||||
|
{
|
||||||
|
KEEP (*(.init_array.*))
|
||||||
|
KEEP (*(.init_array))
|
||||||
|
} :rodata
|
||||||
|
|
||||||
|
/* Include the list of termination functions sorted. */
|
||||||
|
.fini_array :
|
||||||
|
{
|
||||||
|
KEEP (*(SORT(.fini_array.*)))
|
||||||
|
KEEP (*(.fini_array))
|
||||||
|
} :rodata
|
||||||
|
|
||||||
/* Move to the next memory page for .data */
|
/* Move to the next memory page for .data */
|
||||||
. += CONSTANT(MAXPAGESIZE);
|
. += CONSTANT(MAXPAGESIZE);
|
||||||
|
|
||||||
|
|||||||
21
yak-kernel/src/platform/generic/crt/crti.c
Normal file
21
yak-kernel/src/platform/generic/crt/crti.c
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// Created by rick on 9-5-23.
|
||||||
|
//
|
||||||
|
// Based upon https://wiki.osdev.org/Calling_Global_Constructors
|
||||||
|
typedef void (*func_ptr)(void);
|
||||||
|
|
||||||
|
extern func_ptr _init_array_start[0], _init_array_end[0];
|
||||||
|
extern func_ptr _fini_array_start[0], _fini_array_end[0];
|
||||||
|
|
||||||
|
void _init(void) {
|
||||||
|
for (func_ptr *func = _init_array_start; func != _init_array_end; func++)
|
||||||
|
(*func)();
|
||||||
|
}
|
||||||
|
|
||||||
|
void _fini(void) {
|
||||||
|
for (func_ptr *func = _fini_array_start; func != _fini_array_end; func++)
|
||||||
|
(*func)();
|
||||||
|
}
|
||||||
|
|
||||||
|
func_ptr _init_array_start[0] __attribute__ ((used, section(".init_array"), aligned(sizeof(func_ptr)))) = {};
|
||||||
|
func_ptr _fini_array_start[0] __attribute__ ((used, section(".fini_array"), aligned(sizeof(func_ptr)))) = {};
|
||||||
7
yak-kernel/src/platform/generic/crt/crtn.c
Normal file
7
yak-kernel/src/platform/generic/crt/crtn.c
Normal file
@@ -0,0 +1,7 @@
|
|||||||
|
//
|
||||||
|
// Created by rick on 9-5-23.
|
||||||
|
//
|
||||||
|
typedef void (*func_ptr)(void);
|
||||||
|
|
||||||
|
func_ptr _init_array_end[0] __attribute__ ((used, section(".init_array"), aligned(sizeof(func_ptr)))) = {};
|
||||||
|
func_ptr _fini_array_end[0] __attribute__ ((used, section(".fini_array"), aligned(sizeof(func_ptr)))) = {};
|
||||||
@@ -3,6 +3,7 @@
|
|||||||
#include "yak/platform/generic/platform.h"
|
#include "yak/platform/generic/platform.h"
|
||||||
|
|
||||||
void kmain() {
|
void kmain() {
|
||||||
|
_init();
|
||||||
// kmain is called from one of the bootloader implementations
|
// kmain is called from one of the bootloader implementations
|
||||||
|
|
||||||
// perform platform specific initialisation
|
// perform platform specific initialisation
|
||||||
@@ -10,4 +11,5 @@ void kmain() {
|
|||||||
|
|
||||||
// this should (eventually) be unreachable
|
// this should (eventually) be unreachable
|
||||||
panic("End of kmain");
|
panic("End of kmain");
|
||||||
|
_fini();
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user