mirror of
https://gitlab.com/bztsrc/bootboot.git
synced 2023-02-13 20:54:32 -05:00
More SMP
This commit is contained in:
parent
26e28a2558
commit
c8580afba8
7 changed files with 101 additions and 45 deletions
BIN
dist/bootboot.bin
vendored
BIN
dist/bootboot.bin
vendored
Binary file not shown.
BIN
dist/bootboot.efi
vendored
BIN
dist/bootboot.efi
vendored
Binary file not shown.
BIN
dist/bootboot.img
vendored
BIN
dist/bootboot.img
vendored
Binary file not shown.
BIN
dist/bootboot.rom
vendored
BIN
dist/bootboot.rom
vendored
Binary file not shown.
File diff suppressed because one or more lines are too long
|
@ -1,9 +1,9 @@
|
||||||
/* generated by bin2h, do not edit */
|
/* generated by bin2h, do not edit */
|
||||||
|
|
||||||
extern unsigned char binary_boot_bin[512];
|
extern unsigned char binary_boot_bin[512];
|
||||||
extern unsigned char binary_bootboot_bin[12800];
|
extern unsigned char binary_bootboot_bin[13312];
|
||||||
extern unsigned char binary_bootboot_efi[102561];
|
extern unsigned char binary_bootboot_efi[103073];
|
||||||
extern unsigned char binary_bootboot_img[35064];
|
extern unsigned char binary_bootboot_img[34912];
|
||||||
extern unsigned char binary_bootboot_rv64[8192];
|
extern unsigned char binary_bootboot_rv64[8192];
|
||||||
extern unsigned char binary_LICENCE_broadcom[1594];
|
extern unsigned char binary_LICENCE_broadcom[1594];
|
||||||
extern unsigned char binary_bootcode_bin[52456];
|
extern unsigned char binary_bootcode_bin[52456];
|
||||||
|
|
|
@ -844,9 +844,9 @@ ap_start: xor ax, ax
|
||||||
mov eax, cr0
|
mov eax, cr0
|
||||||
or al, 1
|
or al, 1
|
||||||
mov cr0, eax
|
mov cr0, eax
|
||||||
jmp CODE_PROT:@f
|
jmp CODE_PROT:ap_prot
|
||||||
USE32
|
USE32
|
||||||
@@: mov ax, DATA_PROT
|
ap_prot: mov ax, DATA_PROT
|
||||||
mov ds, ax
|
mov ds, ax
|
||||||
mov es, ax
|
mov es, ax
|
||||||
mov fs, ax
|
mov fs, ax
|
||||||
|
@ -858,7 +858,11 @@ ap_start: xor ax, ax
|
||||||
mov eax, dword [esi]
|
mov eax, dword [esi]
|
||||||
or ah, 1h
|
or ah, 1h
|
||||||
mov dword [esi], eax
|
mov dword [esi], eax
|
||||||
lock inc byte [ap_done]
|
mov ecx, 1Bh ; enable APIC MSR
|
||||||
|
rdmsr
|
||||||
|
bt eax, 1
|
||||||
|
wrmsr
|
||||||
|
lock inc word [ap_done]
|
||||||
; spinlock until BSP finishes
|
; spinlock until BSP finishes
|
||||||
@@: pause
|
@@: pause
|
||||||
cmp byte [bsp_done], 0
|
cmp byte [bsp_done], 0
|
||||||
|
@ -2020,13 +2024,15 @@ end if
|
||||||
jne @f
|
jne @f
|
||||||
mov al, byte [ebx+4] ; madt_entry.lapicproc.flag & ENABLED
|
mov al, byte [ebx+4] ; madt_entry.lapicproc.flag & ENABLED
|
||||||
and al, 1
|
and al, 1
|
||||||
jz @f
|
jz .badmadt
|
||||||
xor ax, ax
|
xor ax, ax
|
||||||
mov al, byte [ebx+3] ; madt_entry.lapicproc.lapicid
|
mov al, byte [ebx+3] ; madt_entry.lapicproc.lapicid
|
||||||
cmp al, 0FFh
|
cmp al, 0FFh
|
||||||
je @f
|
je .badmadt
|
||||||
stosw ; ACPI table holds 1 byte id, but internally we have 2 bytes
|
stosw ; ACPI table holds 1 byte id, but internally we have 2 bytes
|
||||||
inc word [numcores]
|
inc word [numcores]
|
||||||
|
jmp @f
|
||||||
|
.badmadt: mov byte [bad_madt], 1
|
||||||
@@: xor eax, eax
|
@@: xor eax, eax
|
||||||
mov al, byte [ebx+1] ; madt_entry.size
|
mov al, byte [ebx+1] ; madt_entry.size
|
||||||
or al, al
|
or al, al
|
||||||
|
@ -2335,30 +2341,6 @@ end if
|
||||||
dec ecx
|
dec ecx
|
||||||
jnz @b
|
jnz @b
|
||||||
|
|
||||||
;generate new 64 bit gdt
|
|
||||||
mov edi, GDT_table+8
|
|
||||||
;8h core code
|
|
||||||
xor eax, eax ;supervisor mode (ring 0)
|
|
||||||
mov ax, 0FFFFh
|
|
||||||
stosd
|
|
||||||
mov eax, 00209800h
|
|
||||||
stosd
|
|
||||||
;10h core data
|
|
||||||
xor eax, eax ;flat data segment
|
|
||||||
mov ax, 0FFFFh
|
|
||||||
stosd
|
|
||||||
mov eax, 00809200h
|
|
||||||
stosd
|
|
||||||
;18h mandatory tss
|
|
||||||
xor eax, eax ;required by vt-x
|
|
||||||
mov al, 068h
|
|
||||||
stosd
|
|
||||||
mov eax, 00008900h
|
|
||||||
stosd
|
|
||||||
xor eax, eax
|
|
||||||
stosd
|
|
||||||
stosd
|
|
||||||
|
|
||||||
mov al, 0FFh ;disable PIC
|
mov al, 0FFh ;disable PIC
|
||||||
out 021h, al
|
out 021h, al
|
||||||
out 0A1h, al
|
out 0A1h, al
|
||||||
|
@ -2378,6 +2360,13 @@ end if
|
||||||
mov ecx, (ap_start-ap_trampoline+3)/4
|
mov ecx, (ap_start-ap_trampoline+3)/4
|
||||||
repnz movsd
|
repnz movsd
|
||||||
|
|
||||||
|
; disable ICMR
|
||||||
|
mov al, 070h
|
||||||
|
out 22h, al
|
||||||
|
in al, 23h
|
||||||
|
or al, 1
|
||||||
|
out 23h, al
|
||||||
|
|
||||||
; enable Local APIC
|
; enable Local APIC
|
||||||
mov esi, dword [lapic_ptr]
|
mov esi, dword [lapic_ptr]
|
||||||
add esi, 0D0h ; logical destination
|
add esi, 0D0h ; logical destination
|
||||||
|
@ -2400,12 +2389,61 @@ end if
|
||||||
bt eax, 1
|
bt eax, 1
|
||||||
wrmsr
|
wrmsr
|
||||||
|
|
||||||
|
mov al, 0fh ; CMOS warm reset code 0A
|
||||||
|
out 70h, al
|
||||||
|
mov al, 0ah
|
||||||
|
out 71h, al
|
||||||
|
mov dword [467h], 07000000h ; warm reset vector
|
||||||
|
|
||||||
; make sure we use the correct Local APIC ID for the BSP
|
; make sure we use the correct Local APIC ID for the BSP
|
||||||
sub esi, 60h
|
mov esi, dword [lapic_ptr]
|
||||||
|
add esi, 020h
|
||||||
mov eax, dword [esi]
|
mov eax, dword [esi]
|
||||||
shr eax, 24
|
shr eax, 24
|
||||||
mov word [bootboot.bspid], ax
|
mov word [bootboot.bspid], ax
|
||||||
|
|
||||||
|
; use broadcast IPI if MADT is okay (no bcast id and all CPUs enabled)
|
||||||
|
cmp byte [bad_madt], 0
|
||||||
|
jnz .onebyone
|
||||||
|
; send Broadcast INIT IPI
|
||||||
|
mov esi, dword [lapic_ptr]
|
||||||
|
add esi, 300h
|
||||||
|
mov eax, 0C4500h
|
||||||
|
mov dword [esi], eax
|
||||||
|
; wait 10 millisec
|
||||||
|
prot_sleep 50
|
||||||
|
; send Broadcast STARTUP IPI
|
||||||
|
mov eax, 0C4607h
|
||||||
|
mov dword [esi], eax
|
||||||
|
; wait 200 microsec
|
||||||
|
prot_sleep 1
|
||||||
|
; send second STARTUP IPI
|
||||||
|
mov eax, 0C4607h
|
||||||
|
mov dword [esi], eax
|
||||||
|
; wait 200 microsec
|
||||||
|
prot_sleep 1
|
||||||
|
; wait for APs with 100 millisec timeout
|
||||||
|
mov ecx, 500
|
||||||
|
rdtsc
|
||||||
|
mov dword [gpt_ptr], eax
|
||||||
|
mov dword [gpt_ptr+4], edx
|
||||||
|
mov eax, dword [ncycles]
|
||||||
|
mov edx, dword [ncycles+4]
|
||||||
|
mul ecx
|
||||||
|
add dword [gpt_ptr], eax
|
||||||
|
adc dword [gpt_ptr+4], edx
|
||||||
|
mov cx, word [numcores]
|
||||||
|
@@: pause
|
||||||
|
cmp word [ap_done], cx
|
||||||
|
je .nosmp
|
||||||
|
rdtsc
|
||||||
|
cmp dword [gpt_ptr+4], edx
|
||||||
|
jl @b
|
||||||
|
cmp dword [gpt_ptr], eax
|
||||||
|
jl @b
|
||||||
|
jmp .nosmp
|
||||||
|
.onebyone:
|
||||||
|
|
||||||
; send IPIs to specific cores one by one
|
; send IPIs to specific cores one by one
|
||||||
xor edx, edx
|
xor edx, edx
|
||||||
.initcore: cmp dx, word [numcores]
|
.initcore: cmp dx, word [numcores]
|
||||||
|
@ -2419,12 +2457,6 @@ end if
|
||||||
je .initcore
|
je .initcore
|
||||||
shl ebx, 24
|
shl ebx, 24
|
||||||
|
|
||||||
mov al, 0fh ; CMOS warm reset code 0A
|
|
||||||
out 70h, al
|
|
||||||
mov al, 0ah
|
|
||||||
out 71h, al
|
|
||||||
mov dword [467h], 07000000h ; warm reset vector
|
|
||||||
|
|
||||||
; clear APIC error
|
; clear APIC error
|
||||||
mov esi, dword [lapic_ptr]
|
mov esi, dword [lapic_ptr]
|
||||||
add esi, 280h
|
add esi, 280h
|
||||||
|
@ -2485,7 +2517,7 @@ end if
|
||||||
je .nextcore
|
je .nextcore
|
||||||
shl ebx, 24
|
shl ebx, 24
|
||||||
|
|
||||||
mov byte [ap_done], 0
|
mov word [ap_done], 0
|
||||||
|
|
||||||
; select AP
|
; select AP
|
||||||
mov esi, dword [lapic_ptr]
|
mov esi, dword [lapic_ptr]
|
||||||
|
@ -2510,7 +2542,7 @@ end if
|
||||||
prot_sleep 1
|
prot_sleep 1
|
||||||
|
|
||||||
; do we need a second SIPI?
|
; do we need a second SIPI?
|
||||||
cmp byte [ap_done], 0
|
cmp word [ap_done], 0
|
||||||
jnz .nextcore
|
jnz .nextcore
|
||||||
|
|
||||||
; select AP
|
; select AP
|
||||||
|
@ -2534,6 +2566,29 @@ end if
|
||||||
prot_sleep 1
|
prot_sleep 1
|
||||||
jmp .nextcore
|
jmp .nextcore
|
||||||
.nosmp:
|
.nosmp:
|
||||||
|
;generate new 64 bit gdt
|
||||||
|
mov edi, GDT_table+8
|
||||||
|
;8h core code
|
||||||
|
xor eax, eax ;supervisor mode (ring 0)
|
||||||
|
mov ax, 0FFFFh
|
||||||
|
stosd
|
||||||
|
mov eax, 00209800h
|
||||||
|
stosd
|
||||||
|
;10h core data
|
||||||
|
xor eax, eax ;flat data segment
|
||||||
|
mov ax, 0FFFFh
|
||||||
|
stosd
|
||||||
|
mov eax, 00809200h
|
||||||
|
stosd
|
||||||
|
;18h mandatory tss
|
||||||
|
xor eax, eax ;required by vt-x
|
||||||
|
mov al, 068h
|
||||||
|
stosd
|
||||||
|
mov eax, 00008900h
|
||||||
|
stosd
|
||||||
|
xor eax, eax
|
||||||
|
stosd
|
||||||
|
stosd
|
||||||
|
|
||||||
;Enter long mode
|
;Enter long mode
|
||||||
cli
|
cli
|
||||||
|
@ -2949,7 +3004,8 @@ hasconfig: db 0
|
||||||
iscdrom: db 0
|
iscdrom: db 0
|
||||||
nosmp: db 0
|
nosmp: db 0
|
||||||
numcores: dw 0
|
numcores: dw 0
|
||||||
ap_done: db 0
|
bad_madt:
|
||||||
|
ap_done: dw 0
|
||||||
bsp_done: db 0 ;flag to indicate APs can run
|
bsp_done: db 0 ;flag to indicate APs can run
|
||||||
fattype: db 0
|
fattype: db 0
|
||||||
bkp: dd ' '
|
bkp: dd ' '
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue