summaryrefslogtreecommitdiff
path: root/kernel/src/apic
diff options
context:
space:
mode:
authorAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 09:16:03 +0100
committerAleksa Vuckovic <aleksa@vuckovic.cc>2023-02-25 09:16:03 +0100
commitb2f41efabf95f85dd6d24e460cf15f8c9ac17978 (patch)
treecaebfbd213ac18cfd3f30362d439331a1d6aac92 /kernel/src/apic
parent4f8ec6ecc42dd3ef73b51070bb4c76ea34d28d44 (diff)
madt.c: refactoring
Diffstat (limited to 'kernel/src/apic')
-rw-r--r--kernel/src/apic/madt.c151
1 files changed, 87 insertions, 64 deletions
diff --git a/kernel/src/apic/madt.c b/kernel/src/apic/madt.c
index 24f739c..2ddf90f 100644
--- a/kernel/src/apic/madt.c
+++ b/kernel/src/apic/madt.c
@@ -4,6 +4,65 @@
#include <libk/string.h>
#include <libk/stdio.h>
+void madt_parse_cpu(uint64_t *addr)
+{
+ struct MADT_cpu_local_apic *cpu = (struct MADT_cpu_local_apic *)kalloc(
+ sizeof(struct MADT_cpu_local_apic));
+ memcpy(cpu, addr, sizeof(struct MADT_cpu_local_apic));
+
+ if (cpu->flags & 0x1) {
+ cpu_apic_ids[numcores] = cpu->apic_id;
+ numcores++;
+ }
+
+ /* printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags); */
+ kfree(cpu);
+}
+
+void madt_parse_ioapic(uint64_t *addr)
+{
+ struct MADT_io_apic *io =
+ (struct MADT_io_apic *)kalloc(sizeof(struct MADT_io_apic));
+ memcpy(io, addr, sizeof(struct MADT_io_apic));
+
+ ioapic_addr = io->io_apic_addr;
+
+ /* printf("found io: apic_id: 0x%x, addr: 0x%x, int_base: 0x%x\n", io->apic_id, io->io_apic_addr, io->int_base); */
+ kfree(io);
+}
+
+void madt_parse_int(uint64_t *addr)
+{
+ struct MADT_io_apic_int *io_apic_int =
+ (struct MADT_io_apic_int *)kalloc(
+ sizeof(struct MADT_io_apic_int));
+ memcpy(io_apic_int, addr, sizeof(struct MADT_io_apic_int));
+
+ /* printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags); */
+ kfree(io_apic_int);
+}
+
+void madt_parse_lapic_nmi(uint64_t *addr)
+{
+ struct MADT_lapic_nmi *lapic_nmi =
+ (struct MADT_lapic_nmi *)kalloc(sizeof(struct MADT_lapic_nmi));
+ memcpy(lapic_nmi, addr, sizeof(struct MADT_lapic_nmi));
+
+ /* printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint); */
+ kfree(lapic_nmi);
+}
+
+void madt_parse_lapic_addr_ovr(uint64_t *addr)
+{
+ struct MADT_lapic_addr *lapic_addr_ovr =
+ (struct MADT_lapic_addr *)kalloc(
+ sizeof(struct MADT_lapic_addr));
+ memcpy(lapic_addr_ovr, addr, sizeof(struct MADT_lapic_addr));
+
+ /* printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr); */
+ kfree(lapic_addr_ovr);
+}
+
void parse_madt()
{
uint64_t *madt_addr = find_sys_table_addr("APIC");
@@ -28,81 +87,45 @@ void parse_madt()
uint8_t len = m->len;
kfree(m);
- if (type == 0) {
+ switch (type) {
+ case 0:
/* Processor Local APIC */
- struct MADT_cpu_local_apic *cpu =
- (struct MADT_cpu_local_apic *)kalloc(
- sizeof(struct MADT_cpu_local_apic));
- memcpy(cpu,
- (uint64_t *)((uint64_t)madt_addr +
- (uint64_t)curr_size),
- sizeof(struct MADT_cpu_local_apic));
-
- if (cpu->flags & 0x1) {
- cpu_apic_ids[numcores] = cpu->apic_id;
- numcores++;
- }
-
- /* printf("found cpu: acpi_id: 0x%x, apic_id: 0x%x, flags: 0x%x\n", cpu->acpi_id, cpu->apic_id, cpu->flags); */
- kfree(cpu);
- } else if (type == 1) {
+ madt_parse_cpu((uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size));
+ break;
+ case 1:
/* I/O APIC */
- struct MADT_io_apic *io = (struct MADT_io_apic *)kalloc(
- sizeof(struct MADT_io_apic));
- memcpy(io,
- (uint64_t *)((uint64_t)madt_addr +
- (uint64_t)curr_size),
- sizeof(struct MADT_io_apic));
-
- ioapic_addr = io->io_apic_addr;
-
- /* printf("found io: apic_id: 0x%x, addr: 0x%x, int_base: 0x%x\n", io->apic_id, io->io_apic_addr, io->int_base); */
- kfree(io);
- } else if (type == 2) {
+ madt_parse_ioapic((uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size));
+ break;
+ case 2:
/* IO/APIC Interrupt Source Override */
- struct MADT_io_apic_int *io_apic_int =
- (struct MADT_io_apic_int *)kalloc(
- sizeof(struct MADT_io_apic_int));
- memcpy(io_apic_int,
- (uint64_t *)((uint64_t)madt_addr +
- (uint64_t)curr_size),
- sizeof(struct MADT_io_apic_int));
-
- /* printf("found io_apic_int: bus: 0x%x, irq_source: 0x%x, global_sys_int: 0x%x, flags: 0x%x\n", io_apic_int->bus_source, io_apic_int->irq_source, io_apic_int->global_sys_int, io_apic_int->flags); */
- kfree(io_apic_int);
- } else if (type == 3) {
+ madt_parse_int((uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size));
+ break;
+ case 3:
/* IO/APIC Non-maskable interrupt source */
printf("MADT entry of type %d\n", type);
- } else if (type == 4) {
+ break;
+ case 4:
/* Local APIC Non-maskable interrupts */
- struct MADT_lapic_nmi *lapic_nmi =
- (struct MADT_lapic_nmi *)kalloc(
- sizeof(struct MADT_lapic_nmi));
- memcpy(lapic_nmi,
- (uint64_t *)((uint64_t)madt_addr +
- (uint64_t)curr_size),
- sizeof(struct MADT_lapic_nmi));
-
- /* printf("found lapic_nmi: acpi_cpu_id: 0x%x, flags: 0x%x, lint: 0x%x\n", lapic_nmi->acpi_cpu_id, lapic_nmi->flags, lapic_nmi->lint); */
- kfree(lapic_nmi);
- } else if (type == 5) {
+ madt_parse_lapic_nmi((uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size));
+ break;
+ case 5:
/* Local APIC Address Override */
- struct MADT_lapic_addr *lapic_addr_ovr =
- (struct MADT_lapic_addr *)kalloc(
- sizeof(struct MADT_lapic_addr));
- memcpy(lapic_addr_ovr,
- (uint64_t *)((uint64_t)madt_addr +
- (uint64_t)curr_size),
- sizeof(struct MADT_lapic_addr));
-
- /* printf("found lapic: addr: 0x%x\n", lapic_addr_ovr->phys_addr); */
- kfree(lapic_addr_ovr);
- } else if (type == 9) {
+ madt_parse_lapic_addr_ovr(
+ (uint64_t *)((uint64_t)madt_addr +
+ (uint64_t)curr_size));
+ break;
+ case 9:
/* Processor Local x2APIC */
printf("MADT entry of type %d\n", type);
- } else {
+ break;
+ default:
/* ERROR */
printf("ERROR: MADT entry of type %d\n", type);
+ break;
}
curr_size += len;
}