summaryrefslogtreecommitdiff
path: root/src/kernel/smp_trampoline.asm
diff options
context:
space:
mode:
authorBrett Weiland <brett_weiland@bpcspace.com>2021-09-12 12:53:33 -0500
committerBrett Weiland <brett_weiland@bpcspace.com>2021-09-12 13:08:34 -0500
commit175f5d3a0053665f7f318d595fd83386eb0f8213 (patch)
tree6b69d9d30ee4b2437278d3d3965223c97cda87f7 /src/kernel/smp_trampoline.asm
parent1f71b9576db536af84155363e14fc49e92de2eef (diff)
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
Diffstat (limited to 'src/kernel/smp_trampoline.asm')
-rw-r--r--src/kernel/smp_trampoline.asm56
1 files changed, 38 insertions, 18 deletions
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