From 175f5d3a0053665f7f318d595fd83386eb0f8213 Mon Sep 17 00:00:00 2001 From: Brett Weiland Date: Sun, 12 Sep 2021 12:53:33 -0500 Subject: SMP fixed for CPUs with defective cores modified: README.md modified: src/.gdb_history modified: src/bootloader/enter_kernel.asm modified: src/bootloader/gdt.asm modified: src/debug/gdbinit.gdb modified: src/include/int.h modified: src/include/paging.h modified: src/include/smp.h modified: src/include/smp_sync.h modified: src/indigo_os modified: src/kernel/int.c modified: src/kernel/kernel.c modified: src/kernel/klog.c modified: src/kernel/madt.c modified: src/kernel/page.c modified: src/kernel/panic.c modified: src/kernel/printf.c modified: src/kernel/smp.c modified: src/kernel/smp_trampoline.asm modified: .gitignore deleted: src/.gdb_history modified: .gitignore modified: README.md deleted: src/.gdb_history modified: src/bootloader/enter_kernel.asm modified: src/bootloader/gdt.asm modified: src/debug/gdbinit.gdb modified: src/include/int.h modified: src/include/paging.h modified: src/include/smp.h modified: src/include/smp_sync.h modified: src/indigo_os modified: src/kernel/int.c modified: src/kernel/kernel.c modified: src/kernel/klog.c modified: src/kernel/madt.c modified: src/kernel/page.c modified: src/kernel/panic.c modified: src/kernel/printf.c modified: src/kernel/smp.c modified: src/kernel/smp_trampoline.asm modified: README.md --- src/kernel/smp_trampoline.asm | 56 +++++++++++++++++++++++++++++-------------- 1 file changed, 38 insertions(+), 18 deletions(-) (limited to 'src/kernel/smp_trampoline.asm') diff --git a/src/kernel/smp_trampoline.asm b/src/kernel/smp_trampoline.asm index 78303a3..20c971e 100644 --- a/src/kernel/smp_trampoline.asm +++ b/src/kernel/smp_trampoline.asm @@ -1,10 +1,11 @@ -global smp_bootstrap_stackarray +global smp_stackarray_ptr global smp_bootstrap_bsp global smp_bootstrap_corecount global final_gdt_descriptor extern smp_kinit extern _pmem_vaddr +extern temp_debug_2 [bits 16] smp_trampoline: @@ -61,6 +62,7 @@ smp_protected: bits 32 mov ax, SMP_PROTECTED_DATA_SEGMENT +mov es, ax mov ds, ax mov ss, ax mov es, ax @@ -88,7 +90,6 @@ shr ebx, 9 mov ecx, 0xc0000080 rdmsr or eax, 1 << 8 -fuckyou: or eax, ebx wrmsr @@ -107,6 +108,7 @@ jmp SMP_LONG_CODE_SEGMENT:smp_longsetup ;________________________________________________________________________________________ bits 64 +align 8 final_gdt: .start: ;and now we set up a temporary GDT creating a 1:1 mapping @@ -136,7 +138,6 @@ db 0 .end: ; later calculates offset in defs below - final_gdt_descriptor: dw final_gdt.end - final_gdt.start - 1 .offset: @@ -149,33 +150,52 @@ smp_longsetup: mov eax, 1 cpuid shr ebx, 24 -cmp bl, BYTE [smp_bootstrap_bsp] -jl .apic_below_bsp -sub bl, 1 - -.apic_below_bsp: -mov rax, QWORD [smp_bootstrap_stackarray] -mov rsp, QWORD [rax + rbx * 8] - -mov rax, 0xffff800000000000 -;or QWORD [final_gdt_descriptor.offset], rax -;lgdt [final_gdt_descriptor] -.inc_corecounter: +mov rsi, [smp_stackarray_ptr] +.search_for_cpuinfo: +mov al, [rsi] +cmp al, bl +je smp_longsetup.cpuinfo_found +add rsi, 10 +jmp .search_for_cpuinfo +.cpuinfo_found: +mov bl, [rsi + 1] +mov rsp, QWORD [rsi + 2] ;core_stack.stack mov rax, [smp_bootstrap_corecount] lock inc BYTE [rax] - smp_enter_kernel: +test bl, bl +jz .wait_for_gdt + +; setting gdt +mov rax, 0xffff800000000000 +or QWORD [final_gdt_descriptor.offset], rax +mov QWORD [smp_lock], 0 + + +.wait_for_gdt: + +mov al, [smp_lock] +test al, al +pause +jnz .wait_for_gdt +lgdt [final_gdt_descriptor] + mov rax, smp_kinit jmp rax +cli +hlt +jmp $ + align 8 -smp_bootstrap_stackarray: dq 0 -smp_lock: dq 0 +smp_stackarray_ptr: dq 0 +smp_lock: dq 1 +screen_debug_pos: dq 0 smp_bootstrap_bsp: db 0 smp_bootstrap_corecount: db 0 -- cgit v1.2.3