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