From 07ac3de4e6ea332f9ab45c1eb0d1bd07759e33ec Mon Sep 17 00:00:00 2001 From: mintsuki Date: Sun, 25 Oct 2020 12:41:13 +0100 Subject: [PATCH] SMP: Fix struct duplication bug --- limine.bin | Bin 32768 -> 32768 bytes stage2/protos/stivale2.c | 10 +++------- stage2/sys/smp.c | 8 ++++++-- stage2/sys/smp.h | 4 +++- test/stivale2.c | 26 ++++++++++++++++++-------- 5 files changed, 30 insertions(+), 18 deletions(-) diff --git a/limine.bin b/limine.bin index 316186ad85e63f6205e127cc58294de564f91259..35f3c69a11dd8c31d837027c0ad34117a9d1e71a 100644 GIT binary patch delta 22495 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 delta 22494 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�k( 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 diff --git a/stage2/protos/stivale2.c b/stage2/protos/stivale2.c index 508cf611..6aedbd05 100644 --- a/stage2/protos/stivale2.c +++ b/stage2/protos/stivale2.c @@ -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); } } diff --git a/stage2/sys/smp.c b/stage2/sys/smp.c index 9e9dc539..90c48c98 100644 --- a/stage2/sys/smp.c +++ b/stage2/sys/smp.c @@ -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 diff --git a/stage2/sys/smp.h b/stage2/sys/smp.h index ec4741c7..0e36df14 100644 --- a/stage2/sys/smp.h +++ b/stage2/sys/smp.h @@ -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, diff --git a/test/stivale2.c b/test/stivale2.c index 789d320f..c2b83b97 100644 --- a/test/stivale2.c +++ b/test/stivale2.c @@ -3,7 +3,8 @@ #include #include -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; }