mirror of
https://github.com/usatiuk/ficus.git
synced 2025-10-29 00:27:52 +01:00
Reuse loaded files
Seems that limine loads them in a OK place to just remap
This commit is contained in:
@@ -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...
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user