:: commit 5b5f7683600f86b0c994e6cec49c9a10b0237664

mintsuki <mintsuki@protonmail.com> — 2022-09-14 12:54

parents: 08b004600a

smp: Remove hacks needed for stivale

diff --git a/common/protos/limine.c b/common/protos/limine.c
index 8745772d..73e2c415 100644
--- a/common/protos/limine.c
+++ b/common/protos/limine.c
@@ -553,7 +553,7 @@ FEAT_START
         EFI_CONFIGURATION_TABLE *cur_table = &gST->ConfigurationTable[i];
 
         if (memcmp(&cur_table->VendorGuid, &dtb_guid, sizeof(EFI_GUID)) == 0) {
-            struct limine_dtb_response *dtb_response = 
+            struct limine_dtb_response *dtb_response =
                 ext_mem_alloc(sizeof(struct limine_dtb_response));
             dtb_response->dtb_ptr = reported_addr((void *)cur_table->VendorTable);
             dtb_request->response = reported_addr(dtb_response);
@@ -878,21 +878,18 @@ FEAT_START
         break; // next feature
     }
 
-    struct limine_smp_info *smp_array;
-    struct smp_information *smp_info;
+    struct limine_smp_info *smp_info;
     size_t cpu_count;
 #if defined (__x86_64__) || defined (__i386__)
     uint32_t bsp_lapic_id;
-    smp_info = init_smp(0, (void **)&smp_array,
-                        &cpu_count, &bsp_lapic_id,
+    smp_info = init_smp(&cpu_count, &bsp_lapic_id,
                         true, want_5lv,
                         pagemap, smp_request->flags & LIMINE_SMP_X2APIC, nx_available,
                         direct_map_offset, true);
 #elif defined (__aarch64__)
     uint64_t bsp_mpidr;
 
-    smp_info = init_smp(0, (void **)&smp_array,
-                        &cpu_count, &bsp_mpidr,
+    smp_info = init_smp(&cpu_count, &bsp_mpidr,
                         pagemap, LIMINE_MAIR(fb_attr), LIMINE_TCR(tsz, pa), LIMINE_SCTLR);
 #else
 #error Unknown architecture
@@ -904,7 +901,7 @@ FEAT_START
 
     for (size_t i = 0; i < cpu_count; i++) {
         void *cpu_stack = ext_mem_alloc(stack_size) + stack_size;
-        smp_info[i].stack_addr = reported_addr(cpu_stack + stack_size);
+        smp_info[i].reserved = reported_addr(cpu_stack + stack_size);
     }
 
     struct limine_smp_response *smp_response =
@@ -921,7 +918,7 @@ FEAT_START
 
     uint64_t *smp_list = ext_mem_alloc(cpu_count * sizeof(uint64_t));
     for (size_t i = 0; i < cpu_count; i++) {
-        smp_list[i] = reported_addr(&smp_array[i]);
+        smp_list[i] = reported_addr(&smp_info[i]);
     }
 
     smp_response->cpu_count = cpu_count;
diff --git a/common/sys/smp.c b/common/sys/smp.c
index a35d9b89..5fd6780e 100644
--- a/common/sys/smp.c
+++ b/common/sys/smp.c
@@ -11,6 +11,8 @@
 #include <sys/gdt.h>
 #include <mm/vmm.h>
 #include <mm/pmm.h>
+#define LIMINE_NO_POINTERS
+#include <limine.h>
 
 struct madt {
     struct sdt header;
@@ -74,7 +76,7 @@ struct trampoline_passed_info {
 } __attribute__((packed));
 
 static bool smp_start_ap(uint32_t lapic_id, struct gdtr *gdtr,
-                         struct smp_information *info_struct,
+                         struct limine_smp_info *info_struct,
                          bool longmode, bool lv5, uint32_t pagemap,
                          bool x2apic, bool nx, uint64_t hhdm, bool wp) {
     // Prepare the trampoline
@@ -132,9 +134,7 @@ static bool smp_start_ap(uint32_t lapic_id, struct gdtr *gdtr,
     return false;
 }
 
-struct smp_information *init_smp(size_t    header_hack_size,
-                                 void    **header_ptr,
-                                 size_t   *cpu_count,
+struct limine_smp_info *init_smp(size_t   *cpu_count,
                                  uint32_t *_bsp_lapic_id,
                                  bool      longmode,
                                  bool      lv5,
@@ -213,9 +213,7 @@ struct smp_information *init_smp(size_t    header_hack_size,
         }
     }
 
-    *header_ptr = ext_mem_alloc(
-                  header_hack_size + max_cpus * sizeof(struct smp_information));
-    struct smp_information *ret = *header_ptr + header_hack_size;
+    struct limine_smp_info *ret = ext_mem_alloc(max_cpus * sizeof(struct limine_smp_info));
     *cpu_count = 0;
 
     // Try to start all APs
@@ -231,10 +229,10 @@ struct smp_information *init_smp(size_t    header_hack_size,
                 if (!((lapic->flags & 1) ^ ((lapic->flags >> 1) & 1)))
                     continue;
 
-                struct smp_information *info_struct = &ret[*cpu_count];
+                struct limine_smp_info *info_struct = &ret[*cpu_count];
 
-                info_struct->acpi_processor_uid = lapic->acpi_processor_uid;
-                info_struct->lapic_id           = lapic->lapic_id;
+                info_struct->processor_id = lapic->acpi_processor_uid;
+                info_struct->lapic_id = lapic->lapic_id;
 
                 // Do not try to restart the BSP
                 if (lapic->lapic_id == bsp_lapic_id) {
@@ -268,10 +266,10 @@ struct smp_information *init_smp(size_t    header_hack_size,
                 if (!((x2lapic->flags & 1) ^ ((x2lapic->flags >> 1) & 1)))
                     continue;
 
-                struct smp_information *info_struct = &ret[*cpu_count];
+                struct limine_smp_info *info_struct = &ret[*cpu_count];
 
-                info_struct->acpi_processor_uid = x2lapic->acpi_processor_uid;
-                info_struct->lapic_id           = x2lapic->x2apic_id;
+                info_struct->processor_id = x2lapic->acpi_processor_uid;
+                info_struct->lapic_id = x2lapic->x2apic_id;
 
                 // Do not try to restart the BSP
                 if (x2lapic->x2apic_id == bsp_x2apic_id) {
@@ -325,7 +323,7 @@ enum {
 static uint32_t psci_cpu_on = 0xC4000003;
 
 static bool try_start_ap(int boot_method, uint64_t method_ptr,
-                         struct smp_information *info_struct,
+                         struct limine_smp_info *info_struct,
                          uint64_t ttbr0, uint64_t ttbr1, uint64_t mair,
                          uint64_t tcr, uint64_t sctlr) {
     // Prepare the trampoline
@@ -350,7 +348,7 @@ static bool try_start_ap(int boot_method, uint64_t method_ptr,
     passed_info->smp_tpl_tcr         = tcr;
     passed_info->smp_tpl_sctlr       = sctlr;
 
-    // Cache coherency between the I-Cache and D-Cache is not guaranteed by the 
+    // Cache coherency between the I-Cache and D-Cache is not guaranteed by the
     // architecture and as such we must perform I-Cache invalidation.
     // Additionally, the newly-booted AP may have caches disabled which implies
     // it possibly does not see our cache contents either.
@@ -427,9 +425,7 @@ static bool try_start_ap(int boot_method, uint64_t method_ptr,
     return false;
 }
 
-static struct smp_information *try_acpi_smp(size_t    header_hack_size,
-                                            void    **header_ptr,
-                                            size_t   *cpu_count,
+static struct limine_smp_info *try_acpi_smp(size_t   *cpu_count,
                                             uint64_t *_bsp_mpidr,
                                             pagemap_t pagemap,
                                             uint64_t  mair,
@@ -459,7 +455,7 @@ static struct smp_information *try_acpi_smp(size_t    header_hack_size,
     uint64_t bsp_mpidr;
     asm volatile ("mrs %0, mpidr_el1" : "=r"(bsp_mpidr));
 
-    // This bit is Res1 in the system reg, but not included in the MPIDR from MADT 
+    // This bit is Res1 in the system reg, but not included in the MPIDR from MADT
     bsp_mpidr &= ~((uint64_t)1 << 31);
 
     *_bsp_mpidr = bsp_mpidr;
@@ -488,9 +484,7 @@ static struct smp_information *try_acpi_smp(size_t    header_hack_size,
         }
     }
 
-    *header_ptr = ext_mem_alloc(
-                  header_hack_size + max_cpus * sizeof(struct smp_information));
-    struct smp_information *ret = *header_ptr + header_hack_size;
+    struct limine_smp_info *ret = ext_mem_alloc(max_cpus * sizeof(struct limine_smp_info));
     *cpu_count = 0;
 
     // Try to start all APs
@@ -506,7 +500,7 @@ static struct smp_information *try_acpi_smp(size_t    header_hack_size,
                 if (!(gicc->flags & 1))
                     continue;
 
-                struct smp_information *info_struct = &ret[*cpu_count];
+                struct limine_smp_info *info_struct = &ret[*cpu_count];
 
                 info_struct->acpi_processor_uid = gicc->acpi_uid;
                 info_struct->gic_iface_no       = gicc->iface_no;
@@ -540,22 +534,20 @@ static struct smp_information *try_acpi_smp(size_t    header_hack_size,
     return ret;
 }
 
-struct smp_information *init_smp(size_t    header_hack_size,
-                                 void    **header_ptr,
-                                 size_t   *cpu_count,
+struct limine_smp_info *init_smp(size_t   *cpu_count,
                                  uint64_t *bsp_mpidr,
                                  pagemap_t pagemap,
                                  uint64_t  mair,
                                  uint64_t  tcr,
                                  uint64_t  sctlr) {
-    struct smp_information *info = NULL;
+    struct limine_smp_info *info = NULL;
 
-    //if (dtb_is_present() && (info = try_dtb_smp(header_hack_size, header_ptr, cpu_count,
+    //if (dtb_is_present() && (info = try_dtb_smp(cpu_count,
     //                _bsp_iface_no, pagemap, mair, tcr, sctlr)))
     //    return info;
 
     // No RSDP means no ACPI
-    if (acpi_get_rsdp() && (info = try_acpi_smp(header_hack_size, header_ptr, cpu_count,
+    if (acpi_get_rsdp() && (info = try_acpi_smp(cpu_count,
                     bsp_mpidr, pagemap, mair, tcr, sctlr)))
         return info;
 
diff --git a/common/sys/smp.h b/common/sys/smp.h
index 72bbac21..cd74518d 100644
--- a/common/sys/smp.h
+++ b/common/sys/smp.h
@@ -5,20 +5,12 @@
 #include <stddef.h>
 #include <stdbool.h>
 #include <mm/vmm.h>
+#define LIMINE_NO_POINTERS
+#include <limine.h>
 
 #if defined (__x86_64__) || defined (__i386__)
 
-struct smp_information {
-    uint32_t acpi_processor_uid;
-    uint32_t lapic_id;
-    uint64_t stack_addr;
-    uint64_t goto_address;
-    uint64_t extra_argument;
-} __attribute__((packed));
-
-struct smp_information *init_smp(size_t    header_hack_size,
-                                 void    **header_ptr,
-                                 size_t   *cpu_count,
+struct limine_smp_info *init_smp(size_t   *cpu_count,
                                  uint32_t *_bsp_lapic_id,
                                  bool      longmode,
                                  bool      lv5,
@@ -30,18 +22,7 @@ struct smp_information *init_smp(size_t    header_hack_size,
 
 #elif defined (__aarch64__)
 
-struct smp_information {
-    uint32_t acpi_processor_uid;
-    uint32_t gic_iface_no;
-    uint64_t mpidr;
-    uint64_t stack_addr;
-    uint64_t goto_address;
-    uint64_t extra_argument;
-} __attribute__((packed));
-
-struct smp_information *init_smp(size_t    header_hack_size,
-                                 void    **header_ptr,
-                                 size_t   *cpu_count,
+struct limine_smp_info *init_smp(size_t   *cpu_count,
                                  uint64_t *bsp_mpidr,
                                  pagemap_t pagemap,
                                  uint64_t  mair,
tab: 248 wrap: offon