processorasms.asm

来自「EFI BIOS是Intel提出的下一代的BIOS标准。这里上传的Edk源代码是」· 汇编 代码 · 共 153 行

ASM
153
字号
;------------------------------------------------------------------------------
;
; Copyright (c) 2005, 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
;
;
;------------------------------------------------------------------------------

text  SEGMENT


;
; 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 // rcx
;   Parameter       - Parameter to pass in             // rdx
;   NewStack        - New Location of the stack        // r8
;   NewBsp          - New BSP                          // r9 - not used
;
; Returns:
;   Nothing. Goes to the Entry Point passing in the new parameters
;
SwitchStacks  PROC NEAR PUBLIC

    mov   rsp,  r8       ; rsp = NewStack
    mov   r10,  rcx      ; save EntryPoint
    mov   rcx,  rdx      ; Arg1 = Parameter
    call  r10            ; r10 = copy of EntryPoint
 ;
 ; no ret as we have a new stack and we jumped to the new location
 ;     
    ret
  
SwitchStacks    ENDP


EFI_SUCCESS                     equ     0
EFI_WARN_RETURN_FROM_LONG_JUMP  equ     5

;
; Generated by h2inc run manually
;
_EFI_JUMP_BUFFER                STRUCT 2t
_rbx            QWORD           ?
_rsp            QWORD           ?
_rbp            QWORD           ?
_rdi            QWORD           ?
_rsi            QWORD           ?
_r10            QWORD           ?
_r11            QWORD           ?
_r12            QWORD           ?
_r13            QWORD           ?
_r14            QWORD           ?
_r15            QWORD           ?
_rip            QWORD           ?
_EFI_JUMP_BUFFER                ENDS

EFI_JUMP_BUFFER         TYPEDEF         _EFI_JUMP_BUFFER


;
;Routine Description:
;
;  This routine implements the x64 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
;
; EFI_STATUS
; EFIAPI
; TransferControlLongJump (
;   IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL  *This,
;   IN EFI_JUMP_BUFFER                    *Jump
;   );
;
; rcx - *This
; rdx - JumpBuffer
;
PUBLIC  TransferControlSetJump
TransferControlSetJump  PROC  NEAR
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rbx, rbx
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rsp, rsp
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rbp, rbp
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rdi, rdi
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rsi, rsi
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r10, r10
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r11, r11
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r12, r12
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r13, r13
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r14, r14
  mov   (EFI_JUMP_BUFFER PTR [rdx])._r15, r15
  mov   rax, QWORD PTR [rsp+0]
  mov   (EFI_JUMP_BUFFER PTR [rdx])._rip, rax
  mov   rax, EFI_SUCCESS  
  ret
  
TransferControlSetJump      ENDP

;
; EFI_STATUS
; EFIAPI
; TransferControlLongJump (
;   IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL  *This,  // rcx
;   IN EFI_JUMP_BUFFER                    *Jump   // rdx
;   );
;
;
PUBLIC  TransferControlLongJump
TransferControlLongJump  PROC  NEAR
  ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
  mov   rax, EFI_WARN_RETURN_FROM_LONG_JUMP          
  mov   rbx, (EFI_JUMP_BUFFER PTR [rdx])._rbx
  mov   rsp, (EFI_JUMP_BUFFER PTR [rdx])._rsp
  mov   rbp, (EFI_JUMP_BUFFER PTR [rdx])._rbp
  mov   rdi, (EFI_JUMP_BUFFER PTR [rdx])._rdi
  mov   rsi, (EFI_JUMP_BUFFER PTR [rdx])._rsi
  mov   r10, (EFI_JUMP_BUFFER PTR [rdx])._r10
  mov   r11, (EFI_JUMP_BUFFER PTR [rdx])._r11
  mov   r12, (EFI_JUMP_BUFFER PTR [rdx])._r12
  mov   r13, (EFI_JUMP_BUFFER PTR [rdx])._r13
  mov   r14, (EFI_JUMP_BUFFER PTR [rdx])._r14
  mov   r15, (EFI_JUMP_BUFFER PTR [rdx])._r15
  add   rsp, 8                                       ;pop the eip
  jmp   QWORD PTR (EFI_JUMP_BUFFER PTR [rdx])._rip
  ; set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
  mov   rax, EFI_WARN_RETURN_FROM_LONG_JUMP
  ret
TransferControlLongJump  ENDP

text  ENDS
END

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?