mirror of
https://github.com/limine-bootloader/limine
synced 2025-01-20 19:42:03 +03:00
smp: Remove hacks needed for stivale
This commit is contained in:
parent
7e6aad3113
commit
0f04f6860a
@ -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;
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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,
|
||||
|
Loading…
Reference in New Issue
Block a user