kernel: implement initcalls and a testing system

This commit is contained in:
2023-02-26 10:05:39 +00:00
parent bc1bc9fec5
commit d41ea0cd52
16 changed files with 314 additions and 40 deletions

View File

@@ -3,6 +3,13 @@
#include <stdint.h>
#define __X2(x) #x
#define __X(x) __X2(x)
#define __define_initcall(fn, id) \
static initcall_t __initcall_##fn##id __used \
__section(".initcall" __X(id) ".init") = (fn)
extern int ml_init(uintptr_t arg);
#endif

View File

@@ -7,6 +7,7 @@
#include <socks/vm.h>
#include <socks/printk.h>
#include <socks/machine/cpu.h>
#include <socks/libc/stdio.h>
#include <arch/vgacon.h>
#include <arch/acpi.h>

41
arch/x86_64/initcall.c Normal file
View File

@@ -0,0 +1,41 @@
#include <socks/init.h>
extern char __initcall0_start[];
extern char __initcall1_start[];
extern char __initcall2_start[];
extern char __initcall3_start[];
extern char __initcall4_start[];
extern char __initcall5_start[];
extern char __initcall6_start[];
extern char __initcall7_start[];
extern char __initcall8_start[];
extern char __initcall_end[];
static initcall_t *m_init_func_levels[] = {
(initcall_t *)__initcall0_start,
(initcall_t *)__initcall1_start,
(initcall_t *)__initcall2_start,
(initcall_t *)__initcall3_start,
(initcall_t *)__initcall4_start,
(initcall_t *)__initcall5_start,
(initcall_t *)__initcall6_start,
(initcall_t *)__initcall7_start,
(initcall_t *)__initcall8_start,
(initcall_t *)__initcall_end,
};
int start_initlevel(int level) {
if (m_init_func_levels[level] == m_init_func_levels[level + 1]) {
return 0;
}
for (initcall_t *fn = m_init_func_levels[level]; fn < m_init_func_levels[level + 1]; fn++) {
int res = (*fn)();
if (res != 0) {
return res;
}
}
return 0;
}

View File

@@ -31,6 +31,28 @@ SECTIONS {
*(.data)
}
.initcall ALIGN(4K) : AT(ADDR(.initcall) - KERNEL_VMA) {
__initcall0_start = .;
*(.initcall0.init)
__initcall1_start = .;
*(.initcall1.init)
__initcall2_start = .;
*(.initcall2.init)
__initcall3_start = .;
*(.initcall3.init)
__initcall4_start = .;
*(.initcall4.init)
__initcall5_start = .;
*(.initcall5.init)
__initcall6_start = .;
*(.initcall6.init)
__initcall7_start = .;
*(.initcall7.init)
__initcall8_start = .;
*(.initcall8.init)
__initcall_end = .;
}
.eh_frame ALIGN(4K) : AT(ADDR(.eh_frame) - KERNEL_VMA)
{
_ehframe = .;