Home | History | Annotate | Download | only in Ia32
      1 /**
      2   Implementation of _LongJump() on IA-32.
      3 
      4   Copyright (c) 2006 - 2007, Intel Corporation. All rights reserved.<BR>
      5   This program and the accompanying materials
      6   are licensed and made available under the terms and conditions of the BSD License
      7   which accompanies this distribution.  The full text of the license may be found at
      8   http://opensource.org/licenses/bsd-license.php
      9 
     10   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     11   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     12 
     13 **/
     14 
     15 #include "BaseLibInternals.h"
     16 
     17 __declspec (naked)
     18 VOID
     19 EFIAPI
     20 InternalLongJump (
     21   IN      BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer,
     22   IN      UINTN                     Value
     23   )
     24 {
     25   _asm {
     26     pop     eax                         ; skip return address
     27     pop     edx                         ; edx <- JumpBuffer
     28     pop     eax                         ; eax <- Value
     29     mov     ebx, [edx]
     30     mov     esi, [edx + 4]
     31     mov     edi, [edx + 8]
     32     mov     ebp, [edx + 12]
     33     mov     esp, [edx + 16]
     34     jmp     dword ptr [edx + 20]
     35   }
     36 }
     37 
     38