Home | History | Annotate | Download | only in X64
      1 #------------------------------------------------------------------------------
      2 #
      3 # Copyright (c) 2008 - 2010, Intel Corporation. All rights reserved.<BR>
      4 # This program and the accompanying materials
      5 # are licensed and made available under the terms and conditions of the BSD License
      6 # which accompanies this distribution.  The full text of the license may be found at
      7 # http://opensource.org/licenses/bsd-license.php
      8 #
      9 # THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     10 # WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     11 #
     12 # Module Name:
     13 #   ProcessorAsms.S
     14 #
     15 # Abstract:
     16 #   This is separated from processor.c to allow this functions to be built with /O1
     17 #
     18 #
     19 #------------------------------------------------------------------------------
     20 #include <EfiBind.h>
     21 
     22     .text
     23 
     24 .globl ASM_PFX(SwitchStacks)
     25 .globl ASM_PFX(TransferControlSetJump)
     26 .globl ASM_PFX(TransferControlLongJump)
     27 
     28 #
     29 # Routine Description:
     30 #   This allows the caller to switch the stack and goes to the new entry point
     31 #
     32 # Arguments:
     33 #   EntryPoint      - Pointer to the location to enter // rcx
     34 #   Parameter       - Parameter to pass in             // rdx
     35 #   NewStack        - New Location of the stack        // r8
     36 #   NewBsp          - New BSP                          // r9 - not used
     37 #
     38 # Returns:
     39 #   Nothing. Goes to the Entry Point passing in the new parameters
     40 #
     41 ASM_PFX(SwitchStacks):
     42 
     43     # Adjust stack for
     44     #   1) leave 4 registers space
     45     #   2) let it 16 bytes aligned after call
     46     sub    $0x20,%r8
     47     and    -0x10,%r8w   # do not assume 16 bytes aligned
     48 
     49   	mov    %r8,%rsp
     50   	mov    %rcx,%r10
     51   	mov    %rdx,%rcx
     52   	callq  *%r10
     53 
     54  #
     55  # no ret as we have a new stack and we jumped to the new location
     56  #
     57     ret
     58 
     59 #SwitchStacks ENDP
     60 
     61 
     62 .set                            EFI_SUCCESS, 0
     63 .set                            EFI_WARN_RETURN_FROM_LONG_JUMP, 5
     64 
     65 #
     66 #Routine Description:
     67 #
     68 #  This routine implements the x64 variant of the SetJump call.  Its
     69 #  responsibility is to store system state information for a possible
     70 #  subsequent LongJump.
     71 #
     72 #Arguments:
     73 #
     74 #  Pointer to CPU context save buffer.
     75 #
     76 #Returns:
     77 #
     78 #  EFI_SUCCESS
     79 #
     80 # EFI_STATUS
     81 # EFIAPI
     82 # TransferControlLongJump (
     83 #   IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL  *This,
     84 #   IN EFI_JUMP_BUFFER                    *Jump
     85 #   );
     86 #
     87 # rcx - *This
     88 # rdx - JumpBuffer
     89 #
     90 ASM_PFX(TransferControlSetJump):
     91       mov    %rbx,(%rdx)
     92       mov    %rsp,0x8(%rdx)
     93       mov    %rbp,0x10(%rdx)
     94       mov    %rdi,0x18(%rdx)
     95       mov    %rsi,0x20(%rdx)
     96       mov    %r10,0x28(%rdx)
     97       mov    %r11,0x30(%rdx)
     98       mov    %r12,0x38(%rdx)
     99       mov    %r13,0x40(%rdx)
    100       mov    %r14,0x48(%rdx)
    101       mov    %r15,0x50(%rdx)
    102       #; save non-volatile fp registers
    103       stmxcsr 0x60(%rdx)
    104       lea     0x68(%rdx), %rax
    105       movdqu  %xmm6, (%rax)
    106       movdqu  %xmm7, 0x10(%rax)
    107       movdqu  %xmm8, 0x20(%rax)
    108       movdqu  %xmm9, 0x30(%rax)
    109       movdqu  %xmm10, 0x40(%rax)
    110       movdqu  %xmm11, 0x50(%rax)
    111       movdqu  %xmm12, 0x60(%rax)
    112       movdqu  %xmm13, 0x70(%rax)
    113       movdqu  %xmm14, 0x80(%rax)
    114       movdqu  %xmm15, 0x90(%rax)
    115       mov    (%rsp),%rax
    116       mov    %rax,0x58(%rdx)
    117       mov    $0x0,%rax
    118       retq
    119 
    120 
    121 #
    122 # EFI_STATUS
    123 # EFIAPI
    124 # TransferControlLongJump (
    125 #   IN EFI_PEI_TRANSFER_CONTROL_PROTOCOL  *This,  // rcx
    126 #   IN EFI_JUMP_BUFFER                    *Jump   // rdx
    127 #   );
    128 #
    129 #
    130 ASM_PFX(TransferControlLongJump):
    131       # set return from SetJump to EFI_WARN_RETURN_FROM_LONG_JUMP
    132       #; load non-volatile fp registers
    133       ldmxcsr 0x60(%rdx)
    134       lea     0x68(%rdx), %rax
    135       movdqu  (%rax), %xmm6
    136       movdqu  0x10(%rax), %xmm7
    137       movdqu  0x20(%rax), %xmm8
    138       movdqu  0x30(%rax), %xmm9
    139       movdqu  0x40(%rax), %xmm10
    140       movdqu  0x50(%rax), %xmm11
    141       movdqu  0x60(%rax), %xmm12
    142       movdqu  0x70(%rax), %xmm13
    143       movdqu  0x80(%rax), %xmm14
    144       movdqu  0x90(%rax), %xmm15
    145       mov    $0x5,%rax
    146       mov    (%rdx),%rbx
    147       mov    0x8(%rdx),%rsp
    148       mov    0x10(%rdx),%rbp
    149       mov    0x18(%rdx),%rdi
    150       mov    0x20(%rdx),%rsi
    151       mov    0x28(%rdx),%r10
    152       mov    0x30(%rdx),%r11
    153       mov    0x38(%rdx),%r12
    154       mov    0x40(%rdx),%r13
    155       mov    0x48(%rdx),%r14
    156       mov    0x50(%rdx),%r15
    157       add    $0x8,%rsp
    158       jmpq   *0x58(%rdx)
    159       mov    $0x5,%rax
    160       retq
    161 
    162