|  | /* | 
|  | *  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, write to the Free Software | 
|  | *  Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | 
|  | */ | 
|  |  | 
|  | /* 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. | 
|  | * | 
|  | */ | 
|  |  | 
|  | ENTRY(grub_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 | 
|  |  | 
|  | ENTRY(grub_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.... */ |