1#------------------------------------------------------------------------------
2#
3# Copyright (c) 2006 - 2008, 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#
14#   SetJump.S
15#
16# Abstract:
17#
18#   Implementation of SetJump() on IA-32.
19#
20#------------------------------------------------------------------------------
21
22ASM_GLOBAL ASM_PFX(SetJump), ASM_PFX(InternalAssertJumpBuffer)
23
24#------------------------------------------------------------------------------
25# UINTN
26# EFIAPI
27# SetJump (
28#   OUT     BASE_LIBRARY_JUMP_BUFFER  *JumpBuffer
29#   );
30#------------------------------------------------------------------------------
31ASM_PFX(SetJump):
32    pushl   0x4(%esp)
33    call    ASM_PFX(InternalAssertJumpBuffer)               # To validate JumpBuffer
34    pop     %ecx
35    pop     %ecx                                            # ecx <- return address
36    movl    (%esp), %edx
37    movl    %ebx, (%edx)
38    movl    %esi, 4(%edx)
39    movl    %edi, 8(%edx)
40    movl    %ebp, 12(%edx)
41    movl    %esp, 16(%edx)
42    movl    %ecx, 20(%edx)                                  # eip value to restore in LongJump
43    xorl    %eax, %eax
44    jmp     *%ecx
45