use grub_{setjmp,longjmp} to restart stage2.
This commit is contained in:
parent
817ae7fd92
commit
4ca2160923
8 changed files with 138 additions and 25 deletions
21
ChangeLog
21
ChangeLog
|
@ -1,3 +1,24 @@
|
|||
2000-01-05 OKUJI Yoshinori <okuji@gnu.org>
|
||||
|
||||
* grub/asmstub.c: Include the header shared.h after including
|
||||
all the system headers, but not before.
|
||||
(EXTENDED_MEMSIZE): Reduced to 3MB.
|
||||
(grub_setjmp): New function.
|
||||
(grub_longjmp): Likewise.
|
||||
* grub/main.c: Include setjmp.h.
|
||||
* stage2/asm.S (grub_setjmp): New function. Stolen from the
|
||||
OSKit (which stole it from Mach).
|
||||
(grub_longjmp): Likewise.
|
||||
* stage2/shared.h [GRUB_UTIL] (grub_jmp_buf): New type.
|
||||
[!GRUB_UTIL] (grub_jmp_buf): New macro. Defined as jmp_buf.
|
||||
(grub_setjmp): Declared.
|
||||
(grub_longjmp): Likewise.
|
||||
(restart_env): Likewise.
|
||||
* stage2/builtins.c (configfile_func): Use grub_longjmp instead
|
||||
of invoking cmain again.
|
||||
* stage2/stage2.c (restart_env): New variable.
|
||||
(cmain): Call grub_setjmp first to initialize RESTART_ENV.
|
||||
|
||||
2000-01-03 OKUJI Yoshinori <okuji@gnu.org>
|
||||
|
||||
* docs/multiboot.texi (Boot information format): Added the
|
||||
|
|
23
TODO
23
TODO
|
@ -13,24 +13,24 @@ Priorities:
|
|||
higher priority.
|
||||
|
||||
|
||||
* Add configuration inclusion support by adding a command "include". !
|
||||
* Add configuration inclusion support by adding a command "include".
|
||||
|
||||
* Make symbolic links work for BSD FFS. !!
|
||||
* Make symbolic links work for BSD FFS.
|
||||
|
||||
* Add indirect block support to the BSD FFS filesystem code, so files
|
||||
larger than 16MB can be read. !
|
||||
larger than 16MB can be read.
|
||||
|
||||
* Fix-up FreeBSD, NetBSD (and OpenBSD ?) command-line boot
|
||||
parameters. !!!
|
||||
parameters.
|
||||
|
||||
* Support embedding a Stage 1.5 in the "bootloader" area of a FFS
|
||||
partition. !!!
|
||||
partition.
|
||||
|
||||
* Support embedding a Stage 1.5 in the EXT2_BOOT_LOADER_INO of an ext2fs
|
||||
partition, so that it won't be accidentally erased or modified by
|
||||
the kernel.
|
||||
|
||||
* Complete the netboot support. !
|
||||
* Complete the netboot support. !!!
|
||||
|
||||
This is the proposed interface between the netboot module and the core
|
||||
system:
|
||||
|
@ -108,19 +108,19 @@ Priorities:
|
|||
|
||||
* Add bunzip2 support.
|
||||
|
||||
* Define the module system. !
|
||||
* Define the module system.
|
||||
|
||||
* Add ISA PnP support.
|
||||
|
||||
* Fix the completion so that it works for BSD partitions as well. !!
|
||||
* Fix the completion so that it works for BSD partitions as well. !
|
||||
|
||||
* Add BSD syntax support, using results of ioprobe to map drives.
|
||||
* Add BSD syntax support, using results of ioprobe to map drives. !
|
||||
(0x1f0-0x1f7 = primary IDE, 0x170-0x176 = secondary,
|
||||
0x1e8-0x1ef = tertiary, 0x168-0x16f = quaternary).
|
||||
|
||||
* Add more filesystems support (XFS, NTFS, etc.)
|
||||
|
||||
* Add remote console support (serial, parallel and net).
|
||||
* Add remote console support (serial, parallel and net). !!
|
||||
|
||||
* Add RAID support.
|
||||
|
||||
|
@ -133,7 +133,4 @@ Priorities:
|
|||
* Add internationalization support, emulating gettext as much as is
|
||||
feasible.
|
||||
|
||||
* Fix keyboard/gateA20 bug (???? at least look at the code). The
|
||||
keyboard status bits may be checked wrong.
|
||||
|
||||
? Add command for modifying partition types.
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* asmstub.c - a version of shared_src/asm.S that works under Unix */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999, 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
|
||||
|
@ -26,11 +26,6 @@
|
|||
/* Simulator entry point. */
|
||||
int grub_stage2 (void);
|
||||
|
||||
/* We want to prevent any circularararity in our stubs, as well as
|
||||
libc name clashes. */
|
||||
#define WITHOUT_LIBC_STUBS 1
|
||||
#include "shared.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
|
@ -67,8 +62,13 @@ int grub_stage2 (void);
|
|||
# include <util.h>
|
||||
#endif /* HAVE_OPENDISK */
|
||||
|
||||
/* We want to prevent any circularararity in our stubs, as well as
|
||||
libc name clashes. */
|
||||
#define WITHOUT_LIBC_STUBS 1
|
||||
#include "shared.h"
|
||||
|
||||
/* Simulated memory sizes. */
|
||||
#define EXTENDED_MEMSIZE (4 * 1024 * 1024) /* 4MB */
|
||||
#define EXTENDED_MEMSIZE (3 * 1024 * 1024) /* 3MB */
|
||||
#define CONVENTIONAL_MEMSIZE (640) /* 640kB */
|
||||
|
||||
/* Simulated disk sizes. */
|
||||
|
@ -751,6 +751,17 @@ gotoxy (int x, int y)
|
|||
#endif
|
||||
}
|
||||
|
||||
int
|
||||
grub_setjmp (grub_jmp_buf env)
|
||||
{
|
||||
return setjmp (env);
|
||||
}
|
||||
|
||||
void
|
||||
grub_longjmp (grub_jmp_buf env, int val)
|
||||
{
|
||||
longjmp (env, val);
|
||||
}
|
||||
|
||||
/* displays an ASCII character. IBM displays will translate some
|
||||
characters to special graphical ones */
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
/* main.c - experimental GRUB stage2 that runs under Unix */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999, 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
|
||||
|
@ -27,6 +27,7 @@ int grub_stage2 (void);
|
|||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
#include <setjmp.h>
|
||||
|
||||
#define WITHOUT_LIBC_STUBS 1
|
||||
#include "shared.h"
|
||||
|
|
66
stage2/asm.S
66
stage2/asm.S
|
@ -1,7 +1,7 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
|
||||
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999, 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
|
||||
|
@ -1247,6 +1247,70 @@ probe_values:
|
|||
ret
|
||||
|
||||
|
||||
/* 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.... */
|
||||
|
||||
|
||||
/*
|
||||
* putchar(c) : Puts character on the screen, interpreting '\n' as in the
|
||||
* UNIX fashion.
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
|
||||
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999, 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
|
||||
|
@ -451,7 +451,7 @@ configfile_func (char *arg, int flags)
|
|||
#endif
|
||||
|
||||
/* Restart cmain. */
|
||||
cmain ();
|
||||
grub_longjmp (restart_env, 0);
|
||||
|
||||
/* Never reach here. */
|
||||
return 0;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
|
||||
* Copyright (C) 1999 Free Software Foundation, Inc.
|
||||
* Copyright (C) 1999, 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
|
||||
|
@ -689,6 +689,20 @@ int grub_strcmp (const char *s1, const char *s2);
|
|||
int grub_strlen (const char *str);
|
||||
char *grub_strcpy (char *dest, const char *src);
|
||||
|
||||
#ifndef GRUB_UTIL
|
||||
typedef unsigned long grub_jmp_buf[6];
|
||||
#else
|
||||
/* In the grub shell, use the libc jmp_buf instead. */
|
||||
# include <setjmp.h>
|
||||
# define grub_jmp_buf jmp_buf
|
||||
#endif
|
||||
|
||||
int grub_setjmp (grub_jmp_buf env);
|
||||
void grub_longjmp (grub_jmp_buf env, int val);
|
||||
|
||||
/* The environment for restarting Stage 2. */
|
||||
extern grub_jmp_buf restart_env;
|
||||
|
||||
/* misc */
|
||||
void init_page (void);
|
||||
void print_error (void);
|
||||
|
|
|
@ -19,6 +19,8 @@
|
|||
|
||||
#include "shared.h"
|
||||
|
||||
grub_jmp_buf restart_env;
|
||||
|
||||
static char *
|
||||
get_entry (char *list, int num, int nested)
|
||||
{
|
||||
|
@ -580,6 +582,9 @@ cmain (void)
|
|||
char *config_entries, *menu_entries;
|
||||
char *kill = (char *) KILL_BUF;
|
||||
|
||||
/* Initialize the environment for restarting Stage 2. */
|
||||
grub_setjmp (restart_env);
|
||||
|
||||
/* Initialize the kill buffer. */
|
||||
*kill = 0;
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue