mirror of
https://github.com/Leonmmcoset/cleonos.git
synced 2026-04-21 18:44:01 +00:00
Stage 7
This commit is contained in:
@@ -115,4 +115,5 @@ clks_isr_common:
|
||||
pop r15
|
||||
|
||||
add rsp, 16
|
||||
iretq
|
||||
iretq
|
||||
.section .note.GNU-stack,"",@progbits
|
||||
|
||||
8
clks/include/clks/userland.h
Normal file
8
clks/include/clks/userland.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef CLKS_USERLAND_H
|
||||
#define CLKS_USERLAND_H
|
||||
|
||||
#include <clks/types.h>
|
||||
|
||||
clks_bool clks_userland_init(void);
|
||||
|
||||
#endif
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <clks/syscall.h>
|
||||
#include <clks/tty.h>
|
||||
#include <clks/types.h>
|
||||
#include <clks/userland.h>
|
||||
|
||||
void clks_kernel_main(void) {
|
||||
const struct limine_framebuffer *boot_fb;
|
||||
@@ -39,7 +40,7 @@ void clks_kernel_main(void) {
|
||||
clks_tty_init();
|
||||
}
|
||||
|
||||
clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS STAGE6 START");
|
||||
clks_log(CLKS_LOG_INFO, "BOOT", "CLEONOS STAGE7 START");
|
||||
|
||||
if (boot_fb == CLKS_NULL) {
|
||||
clks_log(CLKS_LOG_WARN, "VIDEO", "NO FRAMEBUFFER FROM LIMINE");
|
||||
@@ -101,6 +102,11 @@ void clks_kernel_main(void) {
|
||||
clks_cpu_halt_forever();
|
||||
}
|
||||
|
||||
if (clks_userland_init() == CLKS_FALSE) {
|
||||
clks_log(CLKS_LOG_ERROR, "USER", "USERLAND INIT FAILED");
|
||||
clks_cpu_halt_forever();
|
||||
}
|
||||
|
||||
clks_scheduler_init();
|
||||
|
||||
if (clks_scheduler_add_kernel_task("klogd", 4U) == CLKS_FALSE) {
|
||||
@@ -133,4 +139,3 @@ void clks_kernel_main(void) {
|
||||
|
||||
clks_cpu_halt_forever();
|
||||
}
|
||||
|
||||
|
||||
49
clks/kernel/userland.c
Normal file
49
clks/kernel/userland.c
Normal file
@@ -0,0 +1,49 @@
|
||||
#include <clks/elf64.h>
|
||||
#include <clks/fs.h>
|
||||
#include <clks/log.h>
|
||||
#include <clks/types.h>
|
||||
#include <clks/userland.h>
|
||||
|
||||
static clks_bool clks_userland_probe_elf(const char *path, const char *tag) {
|
||||
const void *image;
|
||||
u64 size = 0ULL;
|
||||
struct clks_elf64_info info;
|
||||
|
||||
image = clks_fs_read_all(path, &size);
|
||||
|
||||
if (image == CLKS_NULL) {
|
||||
clks_log(CLKS_LOG_ERROR, "USER", "ELF FILE MISSING");
|
||||
clks_log(CLKS_LOG_ERROR, "USER", path);
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (clks_elf64_inspect(image, size, &info) == CLKS_FALSE) {
|
||||
clks_log(CLKS_LOG_ERROR, "USER", "ELF INSPECT FAILED");
|
||||
clks_log(CLKS_LOG_ERROR, "USER", path);
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
clks_log(CLKS_LOG_INFO, "USER", tag);
|
||||
clks_log_hex(CLKS_LOG_INFO, "USER", "ELF_SIZE", size);
|
||||
clks_log_hex(CLKS_LOG_INFO, "USER", "ENTRY", info.entry);
|
||||
return CLKS_TRUE;
|
||||
}
|
||||
|
||||
clks_bool clks_userland_init(void) {
|
||||
clks_log(CLKS_LOG_INFO, "USER", "USERLAND FRAMEWORK ONLINE");
|
||||
|
||||
if (clks_userland_probe_elf("/shell/shell.elf", "SHELL ELF READY") == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (clks_userland_probe_elf("/system/elfrunner.elf", "ELFRUNNER ELF READY") == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
if (clks_userland_probe_elf("/system/memc.elf", "MEMC ELF READY") == CLKS_FALSE) {
|
||||
return CLKS_FALSE;
|
||||
}
|
||||
|
||||
return CLKS_TRUE;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user