Reuse loaded files

Seems that limine loads them in a OK place to just remap
This commit is contained in:
2024-03-30 11:04:29 +01:00
parent 89c398e8c7
commit 22090f2b75
5 changed files with 34 additions and 25 deletions

View File

@@ -45,7 +45,6 @@ extern "C" __attribute__((unused)) void _start(void) {
init_serial();
barrier();
limine_kern_save_response();
limine_modules_save();
barrier();
map_hhdm(get_cr3());
barrier();
@@ -68,6 +67,7 @@ extern "C" __attribute__((unused)) void _start(void) {
// FIXME:
KERN_AddressSpace->map((void *) (kernel_virt_base + i * PAGE_SIZE), (void *) (kernel_phys_base + i * PAGE_SIZE), PAGE_RW);
}
limine_modules_remap();
uint64_t real_new_cr3 = (uint64_t) HHDM_V2P(KERN_AddressSpace_PML4);
uint64_t *new_stack_top = &KERN_stack[KERN_STACK_SIZE - 1]; // Don't forget in which direction the stack grows...

View File

@@ -145,18 +145,20 @@ void ktask_main() {
(new Task(Task::TaskMode::TASKMODE_KERN, vfs_tester, "vfs_tester"))->start();
for (int i = 0; i < saved_modules_size; i++) {
auto &mod = saved_modules[i];
VFSApi::touch(StrToPath(saved_modules_names[i]));
FDT::FD fd = VFSApi::open(StrToPath(saved_modules_names[i]));
File *f = VFSApi::get(fd);
f->write(saved_modules_data[i], saved_modules_data_size[i]);
f->write(static_cast<const char *>(mod.address), mod.size);
if (strcmp(saved_modules_names[i], "/init") == 0) {
GlobalTtyManager.all_tty_putstr("Starting ");
GlobalTtyManager.all_tty_putstr(saved_modules_names[i]);
GlobalTtyManager.all_tty_putchar('\n');
cgistd::vector<char> read_data(max_saved_module_file_size);
memcpy(read_data.begin(), saved_modules_data[i], max_saved_module_file_size);
cgistd::vector<char> read_data(mod.size);
memcpy(read_data.begin(), mod.address, mod.size);
ElfParser elfParser(read_data);
Task *utask = new Task(Task::TaskMode::TASKMODE_USER, (void (*)()) elfParser.get_entrypoint(), saved_modules_names[i]);

View File

@@ -5,27 +5,31 @@
#include "limine_modules.hpp"
#include "asserts.hpp"
#include "globals.hpp"
#include "paging.hpp"
#include "string.h"
static volatile struct limine_module_request module_request = {
volatile struct limine_module_request module_request = {
.id = LIMINE_MODULE_REQUEST,
.revision = 0};
limine_file saved_modules[max_saved_modules];
char saved_modules_data[max_saved_modules][max_saved_module_file_size] __attribute__((aligned(4096)));
uint64_t saved_modules_data_size[max_saved_modules] __attribute__((aligned(4096)));
char saved_modules_names[max_saved_modules][max_saved_module_name] __attribute__((aligned(4096)));
unsigned saved_modules_size = 0;
void limine_modules_save() {
void limine_modules_remap() {
for (int i = 0; i < module_request.response->module_count; i++) {
assert(i < max_saved_modules);
assert2(i < max_saved_modules, "Too many modules");
auto &mod = (*module_request.response->modules)[i];
saved_modules_size++;
saved_modules[i] = (*module_request.response->modules)[i];
assert(saved_modules[i].size < max_saved_module_file_size);
memcpy(saved_modules_data[i], saved_modules[i].address, saved_modules[i].size);
memcpy(saved_modules_names[i], saved_modules[i].path, max_saved_module_name);
saved_modules_data_size[i] = saved_modules[i].size;
memcpy(saved_modules_names[i], mod.path, max_saved_module_name);
for (size_t i = 0; i < PAGE_ROUND_UP(mod.size) / PAGE_SIZE; i++) {
KERN_AddressSpace->map((void *) ((uintptr_t) mod.address + i * PAGE_SIZE), (void *) (BOOT_AddressSpace->virt2real(reinterpret_cast<void *>((uintptr_t) mod.address + i * PAGE_SIZE))), PAGE_RW);
}
}
}

View File

@@ -7,16 +7,15 @@
#include "limine.hpp"
void limine_modules_save();
extern volatile struct limine_module_request module_request;
static constexpr unsigned max_saved_modules = 2;
static constexpr unsigned max_saved_module_file_size = 1024 * 1024;
static constexpr unsigned max_saved_module_name = 256;
void limine_modules_remap();
extern unsigned saved_modules_size;
extern limine_file saved_modules[max_saved_modules];
extern char saved_modules_data[max_saved_modules][max_saved_module_file_size] __attribute__((aligned(4096)));
extern uint64_t saved_modules_data_size[max_saved_modules] __attribute__((aligned(4096)));
extern char saved_modules_names[max_saved_modules][max_saved_module_name] __attribute__((aligned(4096)));
#endif //OS2_LIMINE_MODULES_HPP

View File

@@ -13,15 +13,18 @@
#include <stl/vector>
#define PAGE_SIZE 4096
#define PAGE_SIZE 4096
#define KERN_V2P(a) ((((uintptr_t) (a) - (uintptr_t) kernel_virt_base) + (uintptr_t) kernel_phys_base))
#define KERN_P2V(a) ((((uintptr_t) (a) -kernel_phys_base) | kernel_virt_base))
#define PAGE_ROUND_DOWN(x) (((uintptr_t) (x)) & (~(PAGE_SIZE - 1)))
#define PAGE_ROUND_UP(x) ((((uintptr_t) (x)) + PAGE_SIZE - 1) & (~(PAGE_SIZE - 1)))
#define HHDM_BEGIN 0xfffff80000000000ULL
#define HHDM_SIZE 32ULL // In GB
#define HHDM_V2P(a) ((((uintptr_t) (a)) & ~HHDM_BEGIN))
#define HHDM_P2V(a) ((((uintptr_t) (a)) | HHDM_BEGIN))
#define KERN_V2P(a) ((((uintptr_t) (a) - (uintptr_t) kernel_virt_base) + (uintptr_t) kernel_phys_base))
#define KERN_P2V(a) ((((uintptr_t) (a) -kernel_phys_base) | kernel_virt_base))
#define HHDM_BEGIN 0xfffff80000000000ULL
#define HHDM_SIZE 32ULL // In GB
#define HHDM_V2P(a) ((((uintptr_t) (a)) & ~HHDM_BEGIN))
#define HHDM_P2V(a) ((((uintptr_t) (a)) | HHDM_BEGIN))
class FDT;
@@ -62,6 +65,7 @@ extern AddressSpace *KERN_AddressSpace;
extern uintptr_t kernel_phys_base;
extern uintptr_t kernel_virt_base;
extern size_t kernel_file_size;
void limine_kern_save_response();
#define PAGE_PS (1 << 7)