From 8b37fe66818a77b4f5721cc606f8261453f1065b Mon Sep 17 00:00:00 2001 From: mintsuki Date: Fri, 18 Sep 2020 19:02:47 +0200 Subject: [PATCH] Finish implementing SMP --- STIVALE2.md | 2 +- limine.bin | Bin 32768 -> 32768 bytes stage2/lib/blib.h | 1 - stage2/lib/sleep.asm | 77 ---------------------------------- stage2/lib/smp.c | 12 ++++-- stage2/lib/smp.h | 1 + stage2/lib/smp_trampoline.asm | 58 ++++++++++++++++++++++--- stage2/limine.h | 2 +- 8 files changed, 64 insertions(+), 89 deletions(-) diff --git a/STIVALE2.md b/STIVALE2.md index 552a52ce..fef82551 100644 --- a/STIVALE2.md +++ b/STIVALE2.md @@ -392,7 +392,7 @@ struct stivale2_smp_info { // This MUST point to a valid stack of at least // 256 bytes in size, and 16-byte aligned. uint64_t goto_address; // This address is polled by the started APs - // until the kernel on the BSP performs an + // until the kernel on another CPU performs an // atomic write to this field. // When that happens, bootloader code will // load up ESP/RSP with the stack value as diff --git a/limine.bin b/limine.bin index 2c3fdc74f331f567278889f072335404446dc886..2848241b81c2c72b126977d698fe69897f1ced39 100644 GIT binary patch delta 18854 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 delta 18855 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 #include #include +#include #include #include #include @@ -32,6 +33,11 @@ struct gdtr { uint32_t ptr; } __attribute__((packed)); +static void delay(uint32_t cycles) { + for (uint32_t i = 0; i < cycles; i++) + port_in_b(0x80); +} + void smp_trampoline(void); extern struct gdtr smp_tpl_gdt; struct smp_information *smp_tpl_info_struct; @@ -52,17 +58,17 @@ static bool smp_start_ap(uint8_t lapic_id, struct gdtr *gdtr, // Send the INIT IPI lapic_write(LAPIC_REG_ICR1, lapic_id << 24); lapic_write(LAPIC_REG_ICR0, 0x500); - pit_sleep(1); + delay(5000); // Send the Startup IPI lapic_write(LAPIC_REG_ICR1, lapic_id << 24); lapic_write(LAPIC_REG_ICR0, ((size_t)smp_trampoline / 4096) | 0x600); - for (int i = 0; i < 20; i++) { - pit_sleep(1); + for (int i = 0; i < 100; i++) { if (locked_read(&smp_tpl_booted_flag) == 1) { return true; } + delay(10000); } return false; diff --git a/stage2/lib/smp.h b/stage2/lib/smp.h index d0dcd143..0c96b2a3 100644 --- a/stage2/lib/smp.h +++ b/stage2/lib/smp.h @@ -9,6 +9,7 @@ struct smp_information { uint32_t processor_id; uint32_t lapic_id; + uint64_t stack_addr; uint64_t goto_address; } __attribute__((packed)); diff --git a/stage2/lib/smp_trampoline.asm b/stage2/lib/smp_trampoline.asm index 8fd0abef..fc467fd2 100644 --- a/stage2/lib/smp_trampoline.asm +++ b/stage2/lib/smp_trampoline.asm @@ -77,16 +77,62 @@ section .text bits 32 parking32: - mov ecx, dword [smp_tpl_info_struct] + mov edi, dword [smp_tpl_info_struct] mov eax, 1 lock xchg dword [smp_tpl_booted_flag], eax - mov eax, 0xcafebabe - jmp $ + + xor eax, eax + .loop: + lock xadd dword [edi + 16], eax + test eax, eax + jnz .out + pause + jmp .loop + + .out: + mov esp, dword [edi + 8] + push 0 + push eax + push edi + xor eax, eax + xor ebx, ebx + xor ecx, ecx + xor edx, edx + xor esi, esi + xor edi, edi + xor ebp, ebp + ret bits 64 parking64: - mov ecx, dword [smp_tpl_info_struct] + mov edi, dword [smp_tpl_info_struct] mov eax, 1 lock xchg dword [smp_tpl_booted_flag], eax - mov eax, 0xdeadbeef - jmp $ + + xor eax, eax + .loop: + lock xadd qword [rdi + 16], rax + test rax, rax + jnz .out + pause + jmp .loop + + .out: + mov rsp, qword [rdi + 8] + push 0 + push rax + xor rax, rax + xor rbx, rbx + xor rcx, rcx + xor rdx, rdx + xor rsi, rsi + xor rbp, rbp + xor r8, r8 + xor r9, r9 + xor r10, r10 + xor r11, r11 + xor r12, r12 + xor r13, r13 + xor r14, r14 + xor r15, r15 + ret diff --git a/stage2/limine.h b/stage2/limine.h index 6f9e2c11..ce1136b9 100644 --- a/stage2/limine.h +++ b/stage2/limine.h @@ -1,6 +1,6 @@ #ifndef __LIMINE_H__ #define __LIMINE_H__ -#define LIMINE_VERSION "0.4" +#define LIMINE_VERSION "0.5" #endif