git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@3 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			224 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			224 lines
		
	
	
		
			5.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ;
 | |
| ; Copyright (c) 2004, Intel Corporation                                                         
 | |
| ; All rights reserved. This program and the accompanying materials                          
 | |
| ; are licensed and made available under the terms and conditions of the BSD License         
 | |
| ; which accompanies this distribution.  The full text of the license may be found at        
 | |
| ; http://opensource.org/licenses/bsd-license.php                                            
 | |
| ;                                                                                           
 | |
| ; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,                     
 | |
| ; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.             
 | |
| ; 
 | |
| ; Module Name:
 | |
| ; 
 | |
| ;    ProcessorAsms.Asm
 | |
| ;
 | |
| ; Abstract:
 | |
| ;       This is separated from processor.c to allow this functions to be built with /O1
 | |
| ;
 | |
| ; Notes:
 | |
| ; - Masm uses "This", "ebx", etc as a directive.
 | |
| ; - H2INC is still not embedded in our build process so I translated the struc manually.
 | |
| ; - Unreferenced variables/arguments (This, NewBsp, NewStack) were causing compile errors and 
 | |
| ;       did not know of "pragma" mechanism in MASM and I did not want to reduce the warning level. 
 | |
| ;       Instead, I did a dummy referenced.
 | |
| ;
 | |
| 
 | |
|   .686P
 | |
|   .MMX
 | |
|   .MODEL SMALL
 | |
|   .CODE
 | |
| 
 | |
| EFI_SUCCESS                     equ     0
 | |
| EFI_WARN_RETURN_FROM_LONG_JUMP  equ     5
 | |
| 
 | |
| ;
 | |
| ; Generated by h2inc run manually
 | |
| ;
 | |
| _EFI_JUMP_BUFFER                STRUCT 2t
 | |
| _ebx            DWORD           ?
 | |
| _esi            DWORD           ?
 | |
| _edi            DWORD           ?
 | |
| _ebp            DWORD           ?
 | |
| _esp            DWORD           ?
 | |
| _eip            DWORD           ?
 | |
| _EFI_JUMP_BUFFER                ENDS
 | |
| 
 | |
| EFI_JUMP_BUFFER         TYPEDEF         _EFI_JUMP_BUFFER
 | |
| 
 | |
| TransferControlSetJump      PROTO  C \
 | |
|         _This:PTR EFI_PEI_TRANSFER_CONTROL_PROTOCOL, \
 | |
|         Jump:PTR EFI_JUMP_BUFFER
 | |
| 
 | |
| TransferControlLongJump     PROTO  C \
 | |
|         _This:PTR EFI_PEI_TRANSFER_CONTROL_PROTOCOL, \
 | |
|         Jump:PTR EFI_JUMP_BUFFER
 | |
| 
 | |
| SwitchStacks    PROTO  C \
 | |
|    EntryPoint:PTR DWORD, \
 | |
|    Parameter:DWORD, \
 | |
|    NewStack:PTR DWORD, \
 | |
|    NewBsp:PTR DWORD
 | |
|    
 | |
| SwitchIplStacks PROTO  C \
 | |
|    EntryPoint:PTR DWORD, \
 | |
|    Parameter1:DWORD, \
 | |
|    Parameter2:DWORD, \
 | |
|    NewStack:PTR DWORD, \
 | |
|    NewBsp:PTR DWORD
 | |
| 
 | |
| ;
 | |
| ;Routine Description:
 | |
| ;
 | |
| ;  This routine implements the IA32 variant of the SetJump call.  Its
 | |
| ;  responsibility is to store system state information for a possible
 | |
| ;  subsequent LongJump.
 | |
| ;
 | |
| ;Arguments:
 | |
| ;
 | |
| ;  Pointer to CPU context save buffer.
 | |
| ;
 | |
| ;Returns:
 | |
| ;
 | |
| ;  EFI_SUCCESS
 | |
| ;
 | |
| TransferControlSetJump      PROC  C \
 | |
|   _This:PTR EFI_PEI_TRANSFER_CONTROL_PROTOCOL, \
 | |
|   Jump:PTR EFI_JUMP_BUFFER
 | |
|     
 | |
|   mov   eax, _This 
 | |
|   mov   ecx, Jump
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._ebx, ebx
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._esi, esi
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._edi, edi
 | |
|   mov   eax, [ebp]
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._ebp, eax
 | |
|   lea   eax, [ebp+4]
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._esp, eax
 | |
|   mov   eax, [ebp+4]
 | |
|   mov   (EFI_JUMP_BUFFER PTR [ecx])._eip, eax
 | |
|   mov   eax, EFI_SUCCESS
 | |
|   
 | |
|   ret
 | |
|   
 | |
| TransferControlSetJump      ENDP
 | |
| 
 | |
| ;
 | |
| ; Routine Description:
 | |
| ; 
 | |
| ;  This routine implements the IA32 variant of the LongJump call.  Its
 | |
| ;  responsibility is restore the system state to the Context Buffer and
 | |
| ;  pass control back.
 | |
| ;
 | |
| ; Arguments:
 | |
| ; 
 | |
| ;  Pointer to CPU context save buffer.
 | |
| ;
 | |
| ; Returns:
 | |
| ;
 | |
| ;  EFI_WARN_RETURN_FROM_LONG_JUMP
 | |
| ;
 | |
| 
 | |
| TransferControlLongJump     PROC  C \
 | |
|         _This:PTR EFI_PEI_TRANSFER_CONTROL_PROTOCOL, \
 | |
|         Jump:PTR EFI_JUMP_BUFFER
 | |
| 
 | |
|   push  ebx
 | |
|   push  esi
 | |
|   push  edi
 | |
| 
 | |
|   mov   eax, _This
 | |
|     ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
 | |
|   mov   eax, EFI_WARN_RETURN_FROM_LONG_JUMP          
 | |
|   mov   ecx, Jump
 | |
|   mov   ebx, (EFI_JUMP_BUFFER PTR [ecx])._ebx
 | |
|   mov   esi, (EFI_JUMP_BUFFER PTR [ecx])._esi
 | |
|   mov   edi, (EFI_JUMP_BUFFER PTR [ecx])._edi
 | |
|   mov   ebp, (EFI_JUMP_BUFFER PTR [ecx])._ebp
 | |
|   mov   esp, (EFI_JUMP_BUFFER PTR [ecx])._esp
 | |
|   add   esp, 4                                       ;pop the eip
 | |
|   jmp   DWORD PTR (EFI_JUMP_BUFFER PTR [ecx])._eip
 | |
|   mov   eax, EFI_WARN_RETURN_FROM_LONG_JUMP
 | |
|   
 | |
|   pop   edi
 | |
|   pop   esi
 | |
|   pop   ebx
 | |
|   ret
 | |
|   
 | |
| TransferControlLongJump     ENDP
 | |
| 
 | |
| ;
 | |
| ; Routine Description:
 | |
| ;       This allows the caller to switch the stack and goes to the new entry point
 | |
| ;
 | |
| ; Arguments:
 | |
| ;       EntryPoint      - Pointer to the location to enter
 | |
| ;       Parameter       - Parameter to pass in
 | |
| ;       NewStack        - New Location of the stack
 | |
| ;       NewBsp          - New BSP
 | |
| ;
 | |
| ; Returns:
 | |
| ;
 | |
| ;       Nothing. Goes to the Entry Point passing in the new parameters
 | |
| ;
 | |
| SwitchStacks    PROC  C \
 | |
|   EntryPoint:PTR DWORD, \
 | |
|   Parameter:DWORD, \
 | |
|   NewStack:PTR DWORD, \
 | |
|   NewBsp:PTR DWORD
 | |
|   
 | |
|   push  ebx
 | |
|   mov   eax, NewBsp
 | |
|   mov   ebx, Parameter
 | |
|   mov   ecx, EntryPoint
 | |
|   mov   eax, NewStack
 | |
|   mov   esp, eax
 | |
|   push  ebx
 | |
|   push  0
 | |
|   jmp   ecx
 | |
|   
 | |
|   pop   ebx
 | |
|   ret
 | |
|   
 | |
| SwitchStacks    ENDP
 | |
| 
 | |
| ;
 | |
| ; Routine Description:
 | |
| ;       This allows the caller to switch the stack and goes to the new entry point
 | |
| ;
 | |
| ; Arguments:
 | |
| ;       EntryPoint              - Pointer to the location to enter
 | |
| ;       Parameter1/Parameter2   - Parameter to pass in
 | |
| ;       NewStack                - New Location of the stack
 | |
| ;       NewBsp                  - New BSP
 | |
| ;
 | |
| ; Returns:
 | |
| ;
 | |
| ;       Nothing. Goes to the Entry Point passing in the new parameters
 | |
| ;
 | |
| SwitchIplStacks PROC  C \
 | |
|   EntryPoint:PTR DWORD, \
 | |
|   Parameter1:DWORD, \
 | |
|   Parameter2:DWORD, \
 | |
|   NewStack:PTR DWORD, \
 | |
|   NewBsp:PTR DWORD
 | |
|   
 | |
|   push  ebx
 | |
|   mov   eax, NewBsp         
 | |
|   mov   ebx, Parameter1
 | |
|   mov   edx, Parameter2
 | |
|   mov   ecx, EntryPoint
 | |
|   mov   eax, NewStack
 | |
|   mov   esp, eax
 | |
| 
 | |
|   push  edx
 | |
|   push  ebx
 | |
|   call  ecx
 | |
|   
 | |
|   pop   ebx
 | |
|   ret
 | |
|   
 | |
| SwitchIplStacks ENDP
 | |
| 
 | |
|   END
 | |
| 
 |