limine: Honour LIMINE_INTERNAL_MODULE_REQUIRED flag
diff --git a/common/protos/limine.c b/common/protos/limine.c
index 2b50d955..1102d8d9 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -647,9 +647,11 @@ FEAT_START
struct limine_file *modules = ext_mem_alloc(module_count * sizeof(struct limine_file));
+ size_t final_module_count = 0;
for (size_t i = 0; i < module_count; i++) {
char *module_path;
char *module_cmdline;
+ bool module_required = true;
if (i < module_request->internal_module_count) {
uint64_t *internal_modules = (void *)get_phys_addr(module_request->internal_modules);
@@ -657,6 +659,8 @@ FEAT_START
module_path = (char *)get_phys_addr(internal_module->path);
module_cmdline = (char *)get_phys_addr(internal_module->cmdline);
+
+ module_required = internal_module->flags & LIMINE_INTERNAL_MODULE_REQUIRED;
} else {
struct conf_tuple conf_tuple =
config_get_tuple(config, i - module_request->internal_module_count,
@@ -673,21 +677,26 @@ FEAT_START
print("limine: Loading module `%#`...\n", module_path);
struct file_handle *f;
- if ((f = uri_open(module_path)) == NULL)
- panic(true, "limine: Failed to open module with path `%#`. Is the path correct?", module_path);
+ if ((f = uri_open(module_path)) == NULL) {
+ if (module_required) {
+ panic(true, "limine: Failed to open module with path `%#`. Is the path correct?", module_path);
+ }
+ print("limine: Warning: Non-required internal module `%#` not found\n", module_path);
+ continue;
+ }
- struct limine_file *l = &modules[i];
+ struct limine_file *l = &modules[final_module_count++];
*l = get_file(f, module_cmdline);
fclose(f);
}
- uint64_t *modules_list = ext_mem_alloc(module_count * sizeof(uint64_t));
- for (size_t i = 0; i < module_count; i++) {
+ uint64_t *modules_list = ext_mem_alloc(final_module_count * sizeof(uint64_t));
+ for (size_t i = 0; i < final_module_count; i++) {
modules_list[i] = reported_addr(&modules[i]);
}
- module_response->module_count = module_count;
+ module_response->module_count = final_module_count;
module_response->modules = reported_addr(modules_list);
module_request->response = reported_addr(module_response);
diff --git a/test/limine.c b/test/limine.c
index 9ac0b5f6..dbcd60b3 100644
--- a/test/limine.c
+++ b/test/limine.c
@@ -56,19 +56,25 @@ __attribute__((section(".limine_reqs")))
void *kf_req = &kf_request;
struct limine_internal_module internal_module1 = {
- .path = "boot:///boot/test.elf",
+ .path = "/boot/test.elf",
.cmdline = "First internal module"
};
+struct limine_internal_module internal_module2 = {
+ .path = "test.elf",
+ .cmdline = "Second internal module"
+};
+
struct limine_internal_module *internal_modules[] = {
- &internal_module1
+ &internal_module1,
+ &internal_module2
};
struct limine_module_request module_request = {
.id = LIMINE_MODULE_REQUEST,
.revision = 1, .response = NULL,
- .internal_module_count = 1,
+ .internal_module_count = 2,
.internal_modules = internal_modules
};
