176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  GRUB  --  GRand Unified Bootloader
376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Copyright (C) 2000 Free Software Foundation, Inc.
476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  This program is free software; you can redistribute it and/or modify
676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  it under the terms of the GNU General Public License as published by
776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  the Free Software Foundation; either version 2 of the License, or
876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  (at your option) any later version.
976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  This program is distributed in the hope that it will be useful,
1176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  but WITHOUT ANY WARRANTY; without even the implied warranty of
1276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  GNU General Public License for more details.
1476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
1576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  You should have received a copy of the GNU General Public License
1676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  along with this program; if not, see <http://www.gnu.org/licenses/>.
1776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
1876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
1976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/* This is stolen from libc/x86/setjmp.S in the OSKit */
2076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
2176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Mach Operating System
2276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Copyright (c) 1991,1990,1989 Carnegie Mellon University
2376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * All Rights Reserved.
2476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
2576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Permission to use, copy, modify and distribute this software and its
2676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * documentation is hereby granted, provided that both the copyright
2776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * notice and this permission notice appear in all copies of the
2876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * software, derivative works or modified versions, and any portions
2976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * thereof, and that both notices appear in supporting documentation.
3076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
3276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * CONDITION.  CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
3376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
3476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * Carnegie Mellon requests users of this software to return to
3676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
3776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Software Distribution Coordinator  or  Software.Distribution@CS.CMU.EDU
3876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  School of Computer Science
3976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Carnegie Mellon University
4076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *  Pittsburgh PA 15213-3890
4176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
4276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * any improvements or extensions that they make and grant Carnegie Mellon
4376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the rights to redistribute these changes.
4476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
4576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman/*
4676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * C library -- _setjmp, _longjmp
4776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
4876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      _longjmp(a,v)
4976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * will generate a "return(v)" from
5076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * the last call to
5176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *      _setjmp(a)
5276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * by restoring registers from the stack,
5376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman * The previous signal state is NOT restored.
5476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman *
5576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman */
5676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
5776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define EXT_C(sym) sym
5876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman#define FUNCTION(x)     .globl EXT_C(x) ; .type EXT_C(x), @function ; EXT_C(x):
5976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	.file	"setjmp.S"
6176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	.text
6376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
6476d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFUNCTION(setjmp)
6576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	4(%esp), %ecx		/* fetch buffer */
6676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%ebx, 0(%ecx)
6776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%esi, 4(%ecx)
6876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%edi, 8(%ecx)
6976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%ebp, 12(%ecx)		/* save frame pointer of caller */
7076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	popl	%edx
7176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%esp, 16(%ecx)		/* save stack pointer of caller */
7276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	%edx, 20(%ecx)		/* save pc of caller */
7376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	xorl	%eax, %eax
7476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman        jmp     *%edx
7576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman
7676d05dc695b06c4e987bb8078f78032441e1430cGreg HartmanFUNCTION(longjmp)
7776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	8(%esp), %eax		/* return(v) */
7876d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	4(%esp), %ecx		/* fetch buffer */
7976d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	0(%ecx), %ebx
8076d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	4(%ecx), %esi
8176d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	8(%ecx), %edi
8276d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	12(%ecx), %ebp
8376d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	movl	16(%ecx), %esp
8476d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	orl	%eax, %eax
8576d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	jnz	0f
8676d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman	incl	%eax
8776d05dc695b06c4e987bb8078f78032441e1430cGreg Hartman0:	jmp	*20(%ecx)		/* done, return.... */
88