/*
 *  GRUB  --  GRand Unified Bootloader
 *  Copyright (C) 2000 Free Software Foundation, Inc.
 *
 *  This program is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation; either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program; if not, see <http://www.gnu.org/licenses/>.
 */

/* This is stolen from libc/x86/setjmp.S in the OSKit */
/* 
 * Mach Operating System
 * Copyright (c) 1991,1990,1989 Carnegie Mellon University
 * All Rights Reserved.
 * 
 * Permission to use, copy, modify and distribute this software and its
 * documentation is hereby granted, provided that both the copyright
 * notice and this permission notice appear in all copies of the
 * software, derivative works or modified versions, and any portions
 * thereof, and that both notices appear in supporting documentation.
 * 
 * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
 * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
 * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
 * 
 * Carnegie Mellon requests users of this software to return to
 * 
 *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
 *  School of Computer Science
 *  Carnegie Mellon University
 *  Pittsburgh PA 15213-3890
 * 
 * any improvements or extensions that they make and grant Carnegie Mellon
 * the rights to redistribute these changes.
 */
/*
 * C library -- _setjmp, _longjmp
 *
 *      _longjmp(a,v)
 * will generate a "return(v)" from
 * the last call to
 *      _setjmp(a)
 * by restoring registers from the stack,
 * The previous signal state is NOT restored.
 *
 */

#define EXT_C(sym) sym
#define FUNCTION(x)     .globl EXT_C(x) ; .type EXT_C(x), @function ; EXT_C(x):

	.file	"setjmp.S"

	.text
	
FUNCTION(setjmp)
	movl	4(%esp), %ecx		/* fetch buffer */
	movl	%ebx, 0(%ecx)
	movl	%esi, 4(%ecx)
	movl	%edi, 8(%ecx)
	movl	%ebp, 12(%ecx)		/* save frame pointer of caller */
	popl	%edx
	movl	%esp, 16(%ecx)		/* save stack pointer of caller */
	movl	%edx, 20(%ecx)		/* save pc of caller */
	xorl	%eax, %eax
        jmp     *%edx

FUNCTION(longjmp)
	movl	8(%esp), %eax		/* return(v) */
	movl	4(%esp), %ecx		/* fetch buffer */
	movl	0(%ecx), %ebx
	movl	4(%ecx), %esi
	movl	8(%ecx), %edi
	movl	12(%ecx), %ebp
	movl	16(%ecx), %esp
	orl	%eax, %eax
	jnz	0f
	incl	%eax
0:	jmp	*20(%ecx)		/* done, return.... */
