1;------------------------------------------------------------------------------ ; 2; Copyright (c) 2016, 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.nasm 14; 15; Abstract: 16; 17; This is the assembly code for Multi-processor S3 support 18; 19;------------------------------------------------------------------------------- 20 21SECTION .text 22 23extern ASM_PFX(InitializeFloatingPointUnits) 24 25%define VacantFlag 0x0 26%define NotVacantFlag 0xff 27 28%define LockLocation RendezvousFunnelProcEnd - RendezvousFunnelProcStart 29%define StackStart LockLocation + 0x4 30%define StackSize LockLocation + 0x8 31%define RendezvousProc LockLocation + 0xC 32%define GdtrProfile LockLocation + 0x10 33%define IdtrProfile LockLocation + 0x16 34%define BufferStart LockLocation + 0x1C 35 36;------------------------------------------------------------------------------------- 37;RendezvousFunnelProc procedure follows. All APs execute their procedure. This 38;procedure serializes all the AP processors through an Init sequence. It must be 39;noted that APs arrive here very raw...ie: real mode, no stack. 40;ALSO THIS PROCEDURE IS EXECUTED BY APs ONLY ON 16 BIT MODE. HENCE THIS PROC 41;IS IN MACHINE CODE. 42;------------------------------------------------------------------------------------- 43;RendezvousFunnelProc (&WakeUpBuffer,MemAddress); 44 45BITS 16 46global ASM_PFX(RendezvousFunnelProc) 47ASM_PFX(RendezvousFunnelProc): 48RendezvousFunnelProcStart: 49 50; At this point CS = 0x(vv00) and ip= 0x0. 51 52 mov ax, cs 53 mov ds, ax 54 mov es, ax 55 mov ss, ax 56 xor ax, ax 57 mov fs, ax 58 mov gs, ax 59 60flat32Start: 61 62 mov si, BufferStart 63 mov edx,dword [si] ; EDX is keeping the start address of wakeup buffer 64 65 mov si, GdtrProfile 66o32 lgdt [cs:si] 67 68 mov si, IdtrProfile 69o32 lidt [cs:si] 70 71 xor ax, ax 72 mov ds, ax 73 74 mov eax, cr0 ; Get control register 0 75 or eax, 0x000000001 ; Set PE bit (bit #0) 76 mov cr0, eax 77 78FLAT32_JUMP: 79 80a32 jmp dword 0x20:0x0 81 82BITS 32 83PMODE_ENTRY: ; protected mode entry point 84 85 mov ax, 0x8 86o16 mov ds, ax 87o16 mov es, ax 88o16 mov fs, ax 89o16 mov gs, ax 90o16 mov ss, ax ; Flat mode setup. 91 92 mov esi, edx 93 94 mov edi, esi 95 add edi, LockLocation 96 mov al, NotVacantFlag 97TestLock: 98 xchg byte [edi], al 99 cmp al, NotVacantFlag 100 jz TestLock 101 102ProgramStack: 103 104 mov edi, esi 105 add edi, StackSize 106 mov eax, dword [edi] 107 mov edi, esi 108 add edi, StackStart 109 add eax, dword [edi] 110 mov esp, eax 111 mov dword [edi], eax 112 113Releaselock: 114 115 mov al, VacantFlag 116 mov edi, esi 117 add edi, LockLocation 118 xchg byte [edi], al 119 120 ; 121 ; Call assembly function to initialize FPU. 122 ; 123 mov ebx, ASM_PFX(InitializeFloatingPointUnits) 124 call ebx 125 ; 126 ; Call C Function 127 ; 128 mov edi, esi 129 add edi, RendezvousProc 130 mov eax, dword [edi] 131 132 test eax, eax 133 jz GoToSleep 134 call eax ; Call C function 135 136GoToSleep: 137 cli 138 hlt 139 jmp $-2 140 141RendezvousFunnelProcEnd: 142;------------------------------------------------------------------------------------- 143; AsmGetAddressMap (&AddressMap); 144;------------------------------------------------------------------------------------- 145global ASM_PFX(AsmGetAddressMap) 146ASM_PFX(AsmGetAddressMap): 147 148 pushad 149 mov ebp,esp 150 151 mov ebx, dword [ebp+0x24] 152 mov dword [ebx], RendezvousFunnelProcStart 153 mov dword [ebx+0x4], PMODE_ENTRY - RendezvousFunnelProcStart 154 mov dword [ebx+0x8], FLAT32_JUMP - RendezvousFunnelProcStart 155 mov dword [ebx+0xc], RendezvousFunnelProcEnd - RendezvousFunnelProcStart 156 157 popad 158 ret 159 160