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 21EXTERN InitializeFloatingPointUnits:PROC 22 23VacantFlag Equ 00h 24NotVacantFlag Equ 0ffh 25 26LockLocation equ RendezvousFunnelProcEnd - RendezvousFunnelProcStart 27StackStartAddressLocation equ LockLocation + 08h 28StackSizeLocation equ LockLocation + 10h 29CProcedureLocation equ LockLocation + 18h 30GdtrLocation equ LockLocation + 20h 31IdtrLocation equ LockLocation + 2Ah 32BufferStartLocation equ LockLocation + 34h 33Cr3OffsetLocation equ LockLocation + 38h 34 35;------------------------------------------------------------------------------------- 36;RendezvousFunnelProc procedure follows. All APs execute their procedure. This 37;procedure serializes all the AP processors through an Init sequence. It must be 38;noted that APs arrive here very raw...ie: real mode, no stack. 39;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC 40;IS IN MACHINE CODE. 41;------------------------------------------------------------------------------------- 42;RendezvousFunnelProc (&WakeUpBuffer,MemAddress); 43 44;text SEGMENT 45.code 46 47RendezvousFunnelProc PROC 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 BufferStartLocation ; mov si, BufferStartLocation 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 Cr3OffsetLocation ; mov si, Cr3Location 68 db 66h, 8Bh, 0Ch ; mov ecx,dword ptr [si] ; ECX is keeping the value of CR3 69 70 db 0BEh 71 dw GdtrLocation ; mov si, GdtrProfile 72 db 66h ; db 66h 73 db 2Eh, 0Fh, 01h, 14h ; lgdt fword ptr cs:[si] 74 75 db 0BEh 76 dw IdtrLocation ; mov si, IdtrProfile 77 db 66h ; db 66h 78 db 2Eh, 0Fh, 01h, 1Ch ; lidt fword ptr cs:[si] 79 80 db 33h, 0C0h ; xor ax, ax 81 db 8Eh, 0D8h ; mov ds, ax 82 83 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Get control register 0 84 db 66h, 83h, 0C8h, 01h ; or eax, 000000001h ; Set PE bit (bit #0) 85 db 0Fh, 22h, 0C0h ; mov cr0, eax 86 87FLAT32_JUMP:: 88 89 db 66h, 67h, 0EAh ; far jump 90 dd 0h ; 32-bit offset 91 dw 20h ; 16-bit selector 92 93PMODE_ENTRY:: ; protected mode entry point 94 95 db 66h, 0B8h, 18h, 00h ; mov ax, 18h 96 db 66h, 8Eh, 0D8h ; mov ds, ax 97 db 66h, 8Eh, 0C0h ; mov es, ax 98 db 66h, 8Eh, 0E0h ; mov fs, ax 99 db 66h, 8Eh, 0E8h ; mov gs, ax 100 db 66h, 8Eh, 0D0h ; mov ss, ax ; Flat mode setup. 101 102 db 0Fh, 20h, 0E0h ; mov eax, cr4 103 db 0Fh, 0BAh, 0E8h, 05h ; bts eax, 5 104 db 0Fh, 22h, 0E0h ; mov cr4, eax 105 106 db 0Fh, 22h, 0D9h ; mov cr3, ecx 107 108 db 8Bh, 0F2h ; mov esi, edx ; Save wakeup buffer address 109 110 db 0B9h 111 dd 0C0000080h ; mov ecx, 0c0000080h ; EFER MSR number. 112 db 0Fh, 32h ; rdmsr ; Read EFER. 113 db 0Fh, 0BAh, 0E8h, 08h ; bts eax, 8 ; Set LME=1. 114 db 0Fh, 30h ; wrmsr ; Write EFER. 115 116 db 0Fh, 20h, 0C0h ; mov eax, cr0 ; Read CR0. 117 db 0Fh, 0BAh, 0E8h, 1Fh ; bts eax, 31 ; Set PG=1. 118 db 0Fh, 22h, 0C0h ; mov cr0, eax ; Write CR0. 119 120LONG_JUMP:: 121 122 db 67h, 0EAh ; far jump 123 dd 0h ; 32-bit offset 124 dw 38h ; 16-bit selector 125 126LongModeStart:: 127 128 mov ax, 30h 129 mov ds, ax 130 mov es, ax 131 mov ss, ax 132 133 mov edi, esi 134 add edi, LockLocation 135 mov al, NotVacantFlag 136TestLock:: 137 xchg byte ptr [edi], al 138 cmp al, NotVacantFlag 139 jz TestLock 140 141ProgramStack:: 142 143 mov edi, esi 144 add edi, StackSizeLocation 145 mov rax, qword ptr [edi] 146 mov edi, esi 147 add edi, StackStartAddressLocation 148 add rax, qword ptr [edi] 149 mov rsp, rax 150 mov qword ptr [edi], rax 151 152Releaselock:: 153 154 mov al, VacantFlag 155 mov edi, esi 156 add edi, LockLocation 157 xchg byte ptr [edi], al 158 159 ; 160 ; Call assembly function to initialize FPU. 161 ; 162 mov rax, InitializeFloatingPointUnits 163 sub rsp, 20h 164 call rax 165 add rsp, 20h 166 167 ; 168 ; Call C Function 169 ; 170 mov edi, esi 171 add edi, CProcedureLocation 172 mov rax, qword ptr [edi] 173 174 test rax, rax 175 jz GoToSleep 176 177 sub rsp, 20h 178 call rax 179 add rsp, 20h 180 181GoToSleep:: 182 cli 183 hlt 184 jmp $-2 185 186RendezvousFunnelProcEnd:: 187RendezvousFunnelProc ENDP 188 189 190;------------------------------------------------------------------------------------- 191; AsmGetAddressMap (&AddressMap); 192;------------------------------------------------------------------------------------- 193; comments here for definition of address map 194AsmGetAddressMap PROC 195 mov rax, offset RendezvousFunnelProcStart 196 mov qword ptr [rcx], rax 197 mov qword ptr [rcx+8h], PMODE_ENTRY - RendezvousFunnelProcStart 198 mov qword ptr [rcx+10h], FLAT32_JUMP - RendezvousFunnelProcStart 199 mov qword ptr [rcx+18h], RendezvousFunnelProcEnd - RendezvousFunnelProcStart 200 mov qword ptr [rcx+20h], LongModeStart - RendezvousFunnelProcStart 201 mov qword ptr [rcx+28h], LONG_JUMP - RendezvousFunnelProcStart 202 ret 203 204AsmGetAddressMap ENDP 205 206END 207