1 ;------------------------------------------------------------------------------ ; 2 ; Copyright (c) 2006 - 2015, Intel Corporation. All rights reserved.<BR> 3 ; This program and the accompanying materials 4 ; are licensed and made available under the terms and conditions of the BSD License 5 ; which accompanies this distribution. The full text of the license may be found at 6 ; http://opensource.org/licenses/bsd-license.php. 7 ; 8 ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, 9 ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. 10 ; 11 ; Module Name: 12 ; 13 ; MpFuncs.asm 14 ; 15 ; Abstract: 16 ; 17 ; This is the assembly code for Multi-processor S3 support 18 ; 19 ;------------------------------------------------------------------------------- 20 21 .686p 22 .model flat,C 23 .code 24 25 EXTERN InitializeFloatingPointUnits:PROC 26 27 VacantFlag Equ 00h 28 NotVacantFlag Equ 0ffh 29 30 LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart 31 StackStart equ LockLocation + 4h 32 StackSize equ LockLocation + 8h 33 RendezvousProc equ LockLocation + 0Ch 34 GdtrProfile equ LockLocation + 10h 35 IdtrProfile equ LockLocation + 16h 36 BufferStart equ LockLocation + 1Ch 37 38 ;------------------------------------------------------------------------------------- 39 ;RendezvousFunnelProc procedure follows. All APs execute their procedure. This 40 ;procedure serializes all the AP processors through an Init sequence. It must be 41 ;noted that APs arrive here very raw...ie: real mode, no stack. 42 ;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC 43 ;IS IN MACHINE CODE. 44 ;------------------------------------------------------------------------------------- 45 ;RendezvousFunnelProc (&WakeUpBuffer,MemAddress); 46 47 RendezvousFunnelProc PROC near C PUBLIC 48 RendezvousFunnelProcStart:: 49 50 ; At this point CS = 0x(vv00) and ip= 0x0. 51 52 db 8ch, 0c8h ; mov ax, cs 53 db 8eh, 0d8h ; mov ds, ax 54 db 8eh, 0c0h ; mov es, ax 55 db 8eh, 0d0h ; mov ss, ax 56 db 33h, 0c0h ; xor ax, ax 57 db 8eh, 0e0h ; mov fs, ax 58 db 8eh, 0e8h ; mov gs, ax 59 60 flat32Start:: 61 62 db 0BEh 63 dw BufferStart ; mov si, BufferStart 64 db 66h, 8Bh, 14h ; mov edx,dword ptr [si] ; EDX is keeping the start address of wakeup buffer 65 66 db 0BEh 67 dw GdtrProfile ; mov si, GdtrProfile 68 db 66h ; db 66h 69 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si] 70 71 db 0BEh 72 dw IdtrProfile ; mov si, IdtrProfile 73 db 66h ; db 66h 74 db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si] 75 76 db 33h, 0C0h ; xor ax, ax 77 db 8Eh, 0D8h ; mov ds, ax 78 79 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0 80 db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0) 81 db 0Fh, 22h, 0C0h ; mov cr0, eax 82 83 FLAT32_JUMP:: 84 85 db 66h, 67h, 0EAh ; far jump 86 dd 0h ; 32-bit offset 87 dw 20h ; 16-bit selector 88 89 PMODE_ENTRY:: ; protected mode entry point 90 91 mov ax, 8h 92 mov ds, ax 93 mov es, ax 94 mov fs, ax 95 mov gs, ax 96 mov ss, ax ; Flat mode setup. 97 98 mov esi, edx 99 100 mov edi, esi 101 add edi, LockLocation 102 mov al, NotVacantFlag 103 TestLock:: 104 xchg byte ptr [edi], al 105 cmp al, NotVacantFlag 106 jz TestLock 107 108 ProgramStack:: 109 110 mov edi, esi 111 add edi, StackSize 112 mov eax, dword ptr [edi] 113 mov edi, esi 114 add edi, StackStart 115 add eax, dword ptr [edi] 116 mov esp, eax 117 mov dword ptr [edi], eax 118 119 Releaselock:: 120 121 mov al, VacantFlag 122 mov edi, esi 123 add edi, LockLocation 124 xchg byte ptr [edi], al 125 126 ; 127 ; Call assembly function to initialize FPU. 128 ; 129 mov ebx, InitializeFloatingPointUnits 130 call ebx 131 ; 132 ; Call C Function 133 ; 134 mov edi, esi 135 add edi, RendezvousProc 136 mov eax, dword ptr [edi] 137 138 test eax, eax 139 jz GoToSleep 140 call eax ; Call C function 141 142 GoToSleep:: 143 cli 144 hlt 145 jmp $-2 146 147 RendezvousFunnelProc ENDP 148 RendezvousFunnelProcEnd:: 149 ;------------------------------------------------------------------------------------- 150 ; AsmGetAddressMap (&AddressMap); 151 ;------------------------------------------------------------------------------------- 152 AsmGetAddressMap PROC near C PUBLIC 153 154 pushad 155 mov ebp,esp 156 157 mov ebx, dword ptr [ebp+24h] 158 mov dword ptr [ebx], RendezvousFunnelProcStart 159 mov dword ptr [ebx+4h], PMODE_ENTRY - RendezvousFunnelProcStart 160 mov dword ptr [ebx+8h], FLAT32_JUMP - RendezvousFunnelProcStart 161 mov dword ptr [ebx+0ch], RendezvousFunnelProcEnd - RendezvousFunnelProcStart 162 163 popad 164 ret 165 166 AsmGetAddressMap ENDP 167 168 END 169