SMP: Fix struct duplication bug

This commit is contained in:
mintsuki 2020-10-25 12:41:13 +01:00
parent b7f4412948
commit 07ac3de4e6
5 changed files with 30 additions and 18 deletions

Binary file not shown.

View File

@ -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);
}
}

View File

@ -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

View File

@ -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,

View File

@ -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;
}