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 25EXTERN InitializeFloatingPointUnits:PROC 26 27VacantFlag Equ 00h 28NotVacantFlag Equ 0ffh 29 30LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart 31StackStart equ LockLocation + 4h 32StackSize equ LockLocation + 8h 33RendezvousProc equ LockLocation + 0Ch 34GdtrProfile equ LockLocation + 10h 35IdtrProfile equ LockLocation + 16h 36BufferStart 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 47RendezvousFunnelProc PROC near C PUBLIC 48RendezvousFunnelProcStart:: 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 60flat32Start:: 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 83FLAT32_JUMP:: 84 85 db 66h, 67h, 0EAh ; far jump 86 dd 0h ; 32-bit offset 87 dw 20h ; 16-bit selector 88 89PMODE_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 103TestLock:: 104 xchg byte ptr [edi], al 105 cmp al, NotVacantFlag 106 jz TestLock 107 108ProgramStack:: 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 119Releaselock:: 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 142GoToSleep:: 143 cli 144 hlt 145 jmp $-2 146 147RendezvousFunnelProc ENDP 148RendezvousFunnelProcEnd:: 149;------------------------------------------------------------------------------------- 150; AsmGetAddressMap (&AddressMap); 151;------------------------------------------------------------------------------------- 152AsmGetAddressMap 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 166AsmGetAddressMap ENDP 167 168END 169