SMP: Fix struct duplication bug
This commit is contained in:
parent
b7f4412948
commit
07ac3de4e6
BIN
limine.bin
BIN
limine.bin
Binary file not shown.
@ -320,25 +320,21 @@ void stivale2_load(char *cmdline) {
|
||||
{
|
||||
struct stivale2_header_tag_smp *smp_hdr_tag = get_tag(&stivale2_hdr, STIVALE2_HEADER_TAG_SMP_ID);
|
||||
if (smp_hdr_tag != NULL) {
|
||||
struct stivale2_struct_tag_smp *tag;
|
||||
struct smp_information *smp_info;
|
||||
size_t cpu_count;
|
||||
uint32_t bsp_lapic_id;
|
||||
smp_info = init_smp(&cpu_count, &bsp_lapic_id,
|
||||
smp_info = init_smp(sizeof(struct stivale2_struct_tag_smp), (void **)&tag,
|
||||
&cpu_count, &bsp_lapic_id,
|
||||
bits == 64, level5pg && level5pg_requested,
|
||||
pagemap, smp_hdr_tag->flags & 1);
|
||||
|
||||
if (smp_info != NULL) {
|
||||
struct stivale2_struct_tag_smp *tag =
|
||||
conv_mem_alloc(sizeof(struct stivale2_struct_tag_smp)
|
||||
+ sizeof(struct smp_information) * cpu_count);
|
||||
tag->tag.identifier = STIVALE2_STRUCT_TAG_SMP_ID;
|
||||
tag->bsp_lapic_id = bsp_lapic_id;
|
||||
tag->cpu_count = cpu_count;
|
||||
tag->flags |= (smp_hdr_tag->flags & 1) && x2apic_check();
|
||||
|
||||
memcpy((void*)tag + sizeof(struct stivale2_struct_tag_smp),
|
||||
smp_info, sizeof(struct smp_information) * cpu_count);
|
||||
|
||||
append_tag(&stivale2_struct, (struct stivale2_tag *)tag);
|
||||
}
|
||||
}
|
||||
|
@ -95,7 +95,9 @@ static bool smp_start_ap(uint32_t lapic_id, struct gdtr *gdtr,
|
||||
return false;
|
||||
}
|
||||
|
||||
struct smp_information *init_smp(size_t *cpu_count,
|
||||
struct smp_information *init_smp(size_t header_hack_size,
|
||||
void **header_ptr,
|
||||
size_t *cpu_count,
|
||||
uint32_t *_bsp_lapic_id,
|
||||
bool longmode,
|
||||
bool lv5,
|
||||
@ -172,7 +174,9 @@ struct smp_information *init_smp(size_t *cpu_count,
|
||||
}
|
||||
}
|
||||
|
||||
struct smp_information *ret = ext_mem_alloc(max_cpus * sizeof(struct smp_information));
|
||||
*header_ptr = ext_mem_alloc(
|
||||
header_hack_size + max_cpus * sizeof(struct smp_information));
|
||||
struct smp_information *ret = *header_ptr + header_hack_size;
|
||||
*cpu_count = 0;
|
||||
|
||||
// Try to start all APs
|
||||
|
@ -14,7 +14,9 @@ struct smp_information {
|
||||
uint64_t extra_argument;
|
||||
} __attribute__((packed));
|
||||
|
||||
struct smp_information *init_smp(size_t *cpu_count,
|
||||
struct smp_information *init_smp(size_t header_hack_size,
|
||||
void **header_ptr,
|
||||
size_t *cpu_count,
|
||||
uint32_t *_bsp_lapic_id,
|
||||
bool longmode,
|
||||
bool lv5,
|
||||
|
@ -3,7 +3,8 @@
|
||||
#include <e9print.h>
|
||||
#include <stddef.h>
|
||||
|
||||
static uint8_t stack[4096] = {0};
|
||||
typedef uint8_t stack[4096];
|
||||
static stack stacks[10] = {0};
|
||||
void stivale2_main(struct stivale2_struct *info);
|
||||
|
||||
struct stivale2_header_tag_smp smp_request = {
|
||||
@ -27,11 +28,16 @@ struct stivale2_header_tag_framebuffer framebuffer_request = {
|
||||
__attribute__((section(".stivale2hdr"), used))
|
||||
struct stivale2_header header2 = {
|
||||
.entry_point = (uint64_t)stivale2_main,
|
||||
.stack = (uintptr_t)stack + sizeof(stack),
|
||||
.stack = (uintptr_t)stacks[0] + sizeof(stack),
|
||||
.flags = 0,
|
||||
.tags = (uint64_t)&framebuffer_request
|
||||
};
|
||||
|
||||
void ap_entry(struct stivale2_smp_info *s) {
|
||||
e9_printf("AP %u started", s->lapic_id);
|
||||
for (;;);
|
||||
}
|
||||
|
||||
void stivale2_main(struct stivale2_struct *info) {
|
||||
// Print stuff.
|
||||
e9_puts("Stivale2 info passed to the kernel:");
|
||||
@ -104,12 +110,16 @@ void stivale2_main(struct stivale2_struct *info) {
|
||||
e9_printf("\tBSP LAPIC ID: %d", s->bsp_lapic_id);
|
||||
e9_printf("\tCPU Count: %d", s->cpu_count);
|
||||
for (size_t i = 0; i < s->cpu_count; i++) {
|
||||
struct stivale2_smp_info in = s->smp_info[i];
|
||||
e9_printf("\t\tProcessor ID: %d", in.processor_id);
|
||||
e9_printf("\t\tLAPIC ID: %d", in.lapic_id);
|
||||
e9_printf("\t\tTarget Stack: %x", in.target_stack);
|
||||
e9_printf("\t\tGOTO Address: %x", in.goto_address);
|
||||
e9_printf("\t\tExtra Argument: %x", in.extra_argument);
|
||||
struct stivale2_smp_info *in = &s->smp_info[i];
|
||||
e9_printf("\t\tProcessor ID: %d", in->processor_id);
|
||||
e9_printf("\t\tLAPIC ID: %d", in->lapic_id);
|
||||
e9_printf("\t\tTarget Stack: %x", in->target_stack);
|
||||
e9_printf("\t\tGOTO Address: %x", in->goto_address);
|
||||
e9_printf("\t\tExtra Argument: %x", in->extra_argument);
|
||||
if (in->lapic_id != s->bsp_lapic_id) {
|
||||
in->target_stack = (uintptr_t)stacks[in->lapic_id] + sizeof(stack);
|
||||
in->goto_address = ap_entry;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user