Home | History | Annotate | Download | only in Ia32
      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