15b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 25b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GRUB -- GRand Unified Bootloader 35b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (C) 2000 Free Software Foundation, Inc. 45b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 55b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is free software; you can redistribute it and/or modify 65b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * it under the terms of the GNU General Public License as published by 75b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the Free Software Foundation; either version 2 of the License, or 85b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * (at your option) any later version. 95b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 105b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * This program is distributed in the hope that it will be useful, 115b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of 125b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 135b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * GNU General Public License for more details. 145b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 155b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * You should have received a copy of the GNU General Public License 165b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * along with this program; if not, write to the Free Software 175b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. 185b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 195b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 205b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* This is stolen from libc/x86/setjmp.S in the OSKit */ 215b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 225b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Mach Operating System 235b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Copyright (c) 1991,1990,1989 Carnegie Mellon University 245b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * All Rights Reserved. 255b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 265b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Permission to use, copy, modify and distribute this software and its 275b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * documentation is hereby granted, provided that both the copyright 285b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * notice and this permission notice appear in all copies of the 295b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * software, derivative works or modified versions, and any portions 305b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * thereof, and that both notices appear in supporting documentation. 315b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 325b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS" 335b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR 345b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE. 355b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 365b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Carnegie Mellon requests users of this software to return to 375b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 385b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU 395b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * School of Computer Science 405b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Carnegie Mellon University 415b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * Pittsburgh PA 15213-3890 425b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 435b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * any improvements or extensions that they make and grant Carnegie Mellon 445b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the rights to redistribute these changes. 455b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 465b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project/* 475b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * C library -- _setjmp, _longjmp 485b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 495b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * _longjmp(a,v) 505b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * will generate a "return(v)" from 515b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * the last call to 525b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * _setjmp(a) 535b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * by restoring registers from the stack, 545b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * The previous signal state is NOT restored. 555b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project * 565b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project */ 575b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 585b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectENTRY(grub_setjmp) 595b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 4(%esp), %ecx /* fetch buffer */ 605b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %ebx, 0(%ecx) 615b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %esi, 4(%ecx) 625b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %edi, 8(%ecx) 635b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %ebp, 12(%ecx) /* save frame pointer of caller */ 645b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project popl %edx 655b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %esp, 16(%ecx) /* save stack pointer of caller */ 665b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl %edx, 20(%ecx) /* save pc of caller */ 675b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project xorl %eax, %eax 685b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jmp *%edx 695b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project 705b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source ProjectENTRY(grub_longjmp) 715b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 8(%esp), %eax /* return(v) */ 725b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 4(%esp), %ecx /* fetch buffer */ 735b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 0(%ecx), %ebx 745b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 4(%ecx), %esi 755b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 8(%ecx), %edi 765b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 12(%ecx), %ebp 775b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project movl 16(%ecx), %esp 785b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project orl %eax, %eax 795b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project jnz 0f 805b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project incl %eax 815b1eb061628a97aae48a9c0bcaa96eb0bfa07aa4The Android Open Source Project0: jmp *20(%ecx) /* done, return.... */ 82