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