/* * C library functions setjmp and longjmp for Mini-OS taken from * newlib. Function longjmp was modified to support Xen versions of * cli and sti. Defined PRIVILEGED_MODE to obtain the original * behavior. John D. Ramsdell, The MITRE Corporation, May 2006. */ /* This is file is a merger of SETJMP.S and LONGJMP.S */ /* * Copyright (C) 1991 DJ Delorie * All rights reserved. * * Redistribution and use in source and binary forms is permitted * provided that the above copyright notice and following paragraph are * duplicated in all such forms. * * This file is distributed WITHOUT ANY WARRANTY; without even the implied * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. */ /* ** jmp_buf: ** eax ebx ecx edx esi edi ebp esp eip ** 0 4 8 12 16 20 24 28 32 */ .text .global setjmp .global longjmp setjmp: pushl %ebp movl %esp, %ebp pushl %edi movl 8(%ebp), %edi movl %eax, 0(%edi) movl %ebx, 4(%edi) movl %ecx, 8(%edi) movl %edx, 12(%edi) movl %esi, 16(%edi) movl -4(%ebp), %eax movl %eax, 20(%edi) movl 0(%ebp), %eax movl %eax, 24(%edi) movl %esp, %eax addl $12, %eax movl %eax, 28(%edi) movl 4(%ebp), %eax movl %eax, 32(%edi) popl %edi movl $0, %eax leave ret longjmp: pushl %ebp movl %esp, %ebp #if !defined PRIVILEGED_MODE call cli_as_a_subroutine #endif movl 8(%ebp), %edi /* get jmp_buf */ movl 12(%ebp), %eax /* store retval in j->eax */ movl %eax, 0(%edi) movl 24(%edi), %ebp #if defined PRIVILEGED_MODE cli #endif movl 28(%edi), %esp pushl 32(%edi) movl 0(%edi), %eax movl 4(%edi), %ebx movl 8(%edi), %ecx movl 12(%edi), %edx movl 16(%edi), %esi movl 20(%edi), %edi #if defined PRIVILEGED_MODE sti #else pushl %eax /* preserve caller-saved registers */ pushl %ecx pushl %edx call sti_as_a_subroutine popl %edx popl %ecx popl %eax #endif ret