parent
491f9d0d4a
commit
cc34857482
@ -0,0 +1,94 @@
|
||||
; xv6 x86_64 entryother.S
|
||||
|
||||
; Each non-boot CPU ("AP") is started up in response to a STARTUP
|
||||
; IPI from the boot CPU. Section B.4.2 of the Multi-Processor
|
||||
; Specification says that the AP will start in real mode with CS:IP
|
||||
; set to XY00:0000, where XY is an 8-bit value sent with the
|
||||
; STARTUP. Thus this code must start at a 4096-byte boundary.
|
||||
;
|
||||
; Because this code sets DS to zero, it must sit
|
||||
; at an address in the low 2^16 bytes.
|
||||
;
|
||||
; Startothers (in main.c) sends the STARTUPs one at a time.
|
||||
; It copies this code (start) at 0x7000. It puts the address of
|
||||
; a newly allocated per-core stack in start-4,the address of the
|
||||
; place to jump to (mpenter) in start-8, and the physical address
|
||||
; of entrypgdir in start-12.
|
||||
;
|
||||
; This code is identical to bootasm.S except:
|
||||
; - it does not need to enable A20
|
||||
; - it uses the address at start-4, start-8, and start-12
|
||||
|
||||
%define CR0_PE 1
|
||||
%define STA_X 0x8 ; Executable segment
|
||||
%define STA_E 0x4 ; Expand down (non-executable segments)
|
||||
%define STA_C 0x4 ; Conforming code segment (executable only)
|
||||
%define STA_W 0x2 ; Writeable (non-executable segments)
|
||||
%define STA_R 0x2 ; Readable (executable segments)
|
||||
%define STA_A 0x1 ; Accessed
|
||||
|
||||
global otherstart
|
||||
|
||||
section .text
|
||||
bits 16
|
||||
otherstart:
|
||||
cli
|
||||
|
||||
xor ax, ax
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
|
||||
lgdt [gdt.desc]
|
||||
mov eax, cr0
|
||||
or eax, CR0_PE
|
||||
mov cr0, eax
|
||||
|
||||
;PAGEBREAK!
|
||||
jmp gdt.kcode: start32
|
||||
|
||||
bits 32
|
||||
start32:
|
||||
mov ax, gdt.kdata
|
||||
mov ds, ax
|
||||
mov es, ax
|
||||
mov ss, ax
|
||||
mov ax, 0
|
||||
mov fs, ax
|
||||
mov gs, ax
|
||||
|
||||
; defer paging until we switch to 64bit mode
|
||||
; set ebx=1 so shared boot code knows we're booting a secondary core
|
||||
mov ebx, 1
|
||||
|
||||
; Switch to the stack allocated by startothers()
|
||||
mov esp, [otherstart-4]
|
||||
; Call mpenter()
|
||||
call [otherstart-8]
|
||||
|
||||
mov ax, 0x8a00
|
||||
mov dx, ax
|
||||
out dx, ax
|
||||
mov ax, 0x8ae0
|
||||
out dx, ax
|
||||
spin:
|
||||
jmp spin
|
||||
|
||||
section .bss
|
||||
resb 4096
|
||||
|
||||
section .rodata
|
||||
align 4
|
||||
gdt:
|
||||
; NULL
|
||||
dw 0, 0
|
||||
db 0, 0, 0, 0
|
||||
.kcode: equ $ - gdt
|
||||
dw 0xffff, 0
|
||||
db 0, (0x90 | STA_X | STA_R), 0xcf, 0
|
||||
.kdata: equ $ - gdt
|
||||
dw 0xffff, 0
|
||||
db 0, (0x90 | STA_W), 0xcf, 0
|
||||
.desc:
|
||||
dw ($ - gdt - 1)
|
||||
dq gdt
|
Loading…
Reference in new issue