summaryrefslogtreecommitdiff
path: root/kernel/mboot
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-04-08 11:49:51 -0400
committerFreya Murphy <freya@freyacat.org>2025-04-08 11:49:51 -0400
commit76ea83e70c5c852de9efdf857f6ee95be7d6e6c8 (patch)
tree0f00ac8591bc2978b0f4e82cf23033f4a677f306 /kernel/mboot
parentfix old checkout (diff)
downloadcomus-76ea83e70c5c852de9efdf857f6ee95be7d6e6c8.tar.gz
comus-76ea83e70c5c852de9efdf857f6ee95be7d6e6c8.tar.bz2
comus-76ea83e70c5c852de9efdf857f6ee95be7d6e6c8.zip
acpi
Diffstat (limited to 'kernel/mboot')
-rw-r--r--kernel/mboot/mboot.c13
-rw-r--r--kernel/mboot/mboot.h2
-rw-r--r--kernel/mboot/mmap.c9
-rw-r--r--kernel/mboot/rsdp.c25
4 files changed, 45 insertions, 4 deletions
diff --git a/kernel/mboot/mboot.c b/kernel/mboot/mboot.c
index 9156c3c..ce74cc1 100644
--- a/kernel/mboot/mboot.c
+++ b/kernel/mboot/mboot.c
@@ -1,7 +1,18 @@
+#include <lib.h>
+#include <comus/mboot.h>
#include "mboot.h"
-void *locate_mboot_table(volatile void *mboot, uint32_t type)
+static volatile void *mboot;
+
+void mboot_init(long magic, volatile void *ptr)
+{
+ if (magic != MBOOT_HEADER_MAGIC)
+ panic("invalid multiboot magic");
+ mboot = ptr;
+}
+
+void *locate_mboot_table(uint32_t type)
{
struct mboot_info *info = (struct mboot_info *)mboot;
const char *mboot_end = ((char *)info) + info->total_size;
diff --git a/kernel/mboot/mboot.h b/kernel/mboot/mboot.h
index db85de1..7e8c09a 100644
--- a/kernel/mboot/mboot.h
+++ b/kernel/mboot/mboot.h
@@ -100,6 +100,6 @@ struct mboot_tag_framebuffer {
uint16_t reserved;
};
-void *locate_mboot_table(volatile void *mboot, uint32_t type);
+void *locate_mboot_table(uint32_t type);
#endif /* mboot.h */
diff --git a/kernel/mboot/mmap.c b/kernel/mboot/mmap.c
index 8a5f549..1b5f08b 100644
--- a/kernel/mboot/mmap.c
+++ b/kernel/mboot/mmap.c
@@ -8,9 +8,12 @@ static const char *segment_type[] = { "Reserved", "Free",
"Hibernation", "Defective",
"Unknown" };
-void mboot_load_mmap(volatile void *mboot, struct memory_map *res)
+int mboot_get_mmap(struct memory_map *res)
{
- void *tag = locate_mboot_table(mboot, MBOOT_MEMORY_MAP);
+ void *tag = locate_mboot_table(MBOOT_MEMORY_MAP);
+ if (tag == NULL)
+ return 1;
+
struct mboot_tag_mmap *mmap = (struct mboot_tag_mmap *)tag;
int idx = 0;
@@ -33,4 +36,6 @@ void mboot_load_mmap(volatile void *mboot, struct memory_map *res)
res->entries[idx].len = seg->len;
}
res->entry_count = idx;
+
+ return 0;
}
diff --git a/kernel/mboot/rsdp.c b/kernel/mboot/rsdp.c
new file mode 100644
index 0000000..fb49187
--- /dev/null
+++ b/kernel/mboot/rsdp.c
@@ -0,0 +1,25 @@
+#include <lib.h>
+#include <comus/mboot.h>
+
+#include "mboot.h"
+
+void *mboot_get_rsdp(void)
+{
+ void *tag;
+
+ // acpi 2.0
+ tag = locate_mboot_table(MBOOT_NEW_RSDP);
+ if (tag != NULL) {
+ struct mboot_tag_new_rsdp *rsdp = (struct mboot_tag_new_rsdp *) tag;
+ return rsdp->rsdp;
+ }
+
+ // acpi 1.0
+ tag = locate_mboot_table(MBOOT_OLD_RSDP);
+ if (tag != NULL) {
+ struct mboot_tag_old_rsdp *rsdp = (struct mboot_tag_old_rsdp *) tag;
+ return rsdp->rsdp;
+ }
+
+ return NULL;
+}