Get basic /sbin/grub GUI working

This commit is contained in:
gord 1999-03-14 03:32:01 +00:00
parent b296e6bad2
commit b0016b886e
13 changed files with 373 additions and 146 deletions

View file

@ -1,5 +1,43 @@
1999-03-13 Gordon Matzigkeit <gord@trick.fig.org>
* shared_src/gunzip.c (border): Rename to bitorder, to resolve
clash with curses.
* shared_src/stage2.c (timeout): Rename to grub_timeout.
* configure.in: Check for curses libraries for use with
/sbin/grub.
* shared_src/shared.h (KEY_DELETE): Rename to KEY_DC, for
compatibility with curses.
(KEY_INSERT): Rename to KEY_IC.
(KEY_PGDN): Rename to KEY_NPAGE.
(KEY_PGUP): Rename to KEY_PPAGE.
* shared_src/asm.S (asm_getkey): Renamed to getkey.
* shared_src/char_io.c (getkey): Delete, because it's useless.
* shared_src/shared.h: Resolve name clashes with libc by renaming
overlapping functions to have grub_ prefixes, then defining
macros.
* grub/asmstub.c (start_stage2): Make some assertions about our
scratch memory area.
* shared_src/shared.h (end): Delete declaration.
(RAW_ADDR, RAW_SEG): Macros to redirect /sbin/grub memory requests
through grub_scratch_mem.
* grub/asmstub.c (get_mem_map): Implement, simulating 4MB
contiguous memory.
(get_code_end): Implement, simulating with a malloced area.
grub/asmstub.c (start_stage2): Initialize grub_scratch_mem.
* shared_src/asm.S (get_mem_map): Some BIOSes expect the high word
of %eax to be zero.
(get_code_end): Move this from common.c so that we can stub it out
in the simulator.
* debian/rules: Make sure info files end up in /usr/info, not
/info.

141
configure vendored
View file

@ -816,7 +816,6 @@ esac
# Options
#
sbingrub=
stage2debug=
# Check whether --enable-sbin-grub or --disable-sbin-grub was given.
if test "${enable_sbin_grub+set}" = set; then
enableval="$enable_sbin_grub"
@ -824,6 +823,8 @@ if test "${enable_sbin_grub+set}" = set; then
fi
stage2debug=
# Check whether --enable-debug or --disable-debug was given.
if test "${enable_debug+set}" = set; then
enableval="$enable_debug"
@ -832,14 +833,12 @@ fi
#
# Programs
#
echo $ac_n "checking build system type""... $ac_c" 1>&6
echo "configure:843: checking build system type" >&5
echo "configure:842: checking build system type" >&5
build_alias=$build
case "$build_alias" in
@ -865,7 +864,7 @@ fi
# Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args.
set dummy ${ac_tool_prefix}gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:869: checking for $ac_word" >&5
echo "configure:868: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -896,7 +895,7 @@ fi
# Extract the first word of "${ac_tool_prefix}ld", so it can be a program name with args.
set dummy ${ac_tool_prefix}ld; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:900: checking for $ac_word" >&5
echo "configure:899: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_LD'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -927,7 +926,7 @@ fi
# Extract the first word of "${ac_tool_prefix}objcopy", so it can be a program name with args.
set dummy ${ac_tool_prefix}objcopy; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:931: checking for $ac_word" >&5
echo "configure:930: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_OBJCOPY'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -960,7 +959,7 @@ fi
# Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:964: checking for $ac_word" >&5
echo "configure:963: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -989,7 +988,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:993: checking for $ac_word" >&5
echo "configure:992: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1037,7 +1036,7 @@ fi
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1041: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
echo "configure:1040: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@ -1047,11 +1046,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF
#line 1051 "configure"
#line 1050 "configure"
#include "confdefs.h"
main(){return(0);}
EOF
if { (eval echo configure:1055: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
if { (eval echo configure:1054: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then
@ -1071,12 +1070,12 @@ if test $ac_cv_prog_cc_works = no; then
{ echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1075: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "configure:1074: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1080: checking whether we are using GNU C" >&5
echo "configure:1079: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1085,7 +1084,7 @@ else
yes;
#endif
EOF
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1089: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1088: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes
else
ac_cv_prog_gcc=no
@ -1100,7 +1099,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS"
CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:1104: checking whether ${CC-cc} accepts -g" >&5
echo "configure:1103: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1129,7 +1128,7 @@ fi
echo $ac_n "checking symbol names produced by ${CC-cc}""... $ac_c" 1>&6
echo "configure:1133: checking symbol names produced by ${CC-cc}" >&5
echo "configure:1132: checking symbol names produced by ${CC-cc}" >&5
if eval "test \"`echo '$''{'grub_cv_asm_ext_c'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1142,7 +1141,7 @@ func (int *list)
}
EOF
if { ac_try='${CC-cc} -S conftest.c'; { (eval echo configure:1146: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then :
if { ac_try='${CC-cc} -S conftest.c'; { (eval echo configure:1145: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then :
else
{ echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; }
fi
@ -1170,7 +1169,7 @@ EOF
echo $ac_n "checking whether ${OBJCOPY} works for absolute addresses""... $ac_c" 1>&6
echo "configure:1174: checking whether ${OBJCOPY} works for absolute addresses" >&5
echo "configure:1173: checking whether ${OBJCOPY} works for absolute addresses" >&5
if eval "test \"`echo '$''{'grub_cv_prog_objcopy_absolute'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1182,21 +1181,21 @@ blah (void)
}
EOF
if { (eval echo configure:1186: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then :
if { (eval echo configure:1185: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then :
else
{ echo "configure: error: ${CC-cc} cannot compile C source code" 1>&2; exit 1; }
fi
grub_cv_prog_objcopy_absolute=yes
for link_addr in 2000 8000 7C00; do
if { ac_try='${LD-ld} -N -Ttext $link_addr conftest.o -o conftest.exec'; { (eval echo configure:1192: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
if { ac_try='${LD-ld} -N -Ttext $link_addr conftest.o -o conftest.exec'; { (eval echo configure:1191: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
else
{ echo "configure: error: ${LD-ld} cannot link at address $link_addr" 1>&2; exit 1; }
fi
if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1196: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1195: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
else
{ echo "configure: error: ${OBJCOPY-objcopy} cannot create binary files" 1>&2; exit 1; }
fi
if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure:1200: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure:1199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
mv -f conftest conftest.old
else
grub_cv_prog_objcopy_absolute=no
@ -1213,7 +1212,7 @@ fi
echo $ac_n "checking for .code16 addr32 assembler support""... $ac_c" 1>&6
echo "configure:1217: checking for .code16 addr32 assembler support" >&5
echo "configure:1216: checking for .code16 addr32 assembler support" >&5
if eval "test \"`echo '$''{'grub_cv_asm_addr32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
@ -1223,7 +1222,7 @@ l1: addr32
movb %al, l1
EOF
if { ac_try='${CC-cc} -c conftest.s'; { (eval echo configure:1227: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then
if { ac_try='${CC-cc} -c conftest.s'; { (eval echo configure:1226: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then
grub_cv_asm_addr32=yes
else
grub_cv_asm_addr32=no
@ -1236,6 +1235,98 @@ if test "x$grub_cv_asm_addr32" != xyes; then
{ echo "configure: error: GRUB requires GAS .code16 addr32 support; upgrade your binutils" 1>&2; exit 1; }
fi
# Check for curses libraries if we are building /sbin/grub.
if test -n "$sbingrub"; then
echo $ac_n "checking for getch in -lncurses""... $ac_c" 1>&6
echo "configure:1242: checking for getch in -lncurses" >&5
ac_lib_var=`echo ncurses'_'getch | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lncurses $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1250 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char getch();
int main() {
getch()
; return 0; }
EOF
if { (eval echo configure:1261: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"
fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
echo "$ac_t""yes" 1>&6
LIBS="$LIBS -lncurses"
cat >> confdefs.h <<\EOF
#define HAVE_LIBCURSES 1
EOF
else
echo "$ac_t""no" 1>&6
echo $ac_n "checking for getch in -lcurses""... $ac_c" 1>&6
echo "configure:1284: checking for getch in -lcurses" >&5
ac_lib_var=`echo curses'_'getch | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6
else
ac_save_LIBS="$LIBS"
LIBS="-lcurses $LIBS"
cat > conftest.$ac_ext <<EOF
#line 1292 "configure"
#include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2
builtin and then its argument prototype would still apply. */
char getch();
int main() {
getch()
; return 0; }
EOF
if { (eval echo configure:1303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes"
else
echo "configure: failed program was:" >&5
cat conftest.$ac_ext >&5
rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=no"
fi
rm -f conftest*
LIBS="$ac_save_LIBS"
fi
if eval "test \"`echo '$ac_cv_lib_'$ac_lib_var`\" = yes"; then
echo "$ac_t""yes" 1>&6
LIBS="$LIBS -lcurses"
cat >> confdefs.h <<\EOF
#define HAVE_LIBCURSES 1
EOF
else
echo "$ac_t""no" 1>&6
fi
fi
fi
# Create rules for our shared sources.
SHARED_SRC_RULES=./ssrcrules.mk
echo creating $SHARED_SRC_RULES

View file

@ -33,16 +33,15 @@ AC_SUBST(host_vendor)
# Options
#
sbingrub=
stage2debug=
AC_ARG_ENABLE(sbin-grub,
[ --enable-sbin-grub build /sbin/grub command-line utility],
[test "x$enableval" = xno || sbingrub=grub])
AC_SUBST(sbingrub)
stage2debug=
AC_ARG_ENABLE(debug,
[ --enable-debug build debugging version of stage2],
[test "x$enableval" = xno || stage2debug=stage2_debug])
AC_SUBST(sbingrub)
AC_SUBST(stage2debug)
#
@ -65,6 +64,14 @@ if test "x$grub_cv_asm_addr32" != xyes; then
AC_MSG_ERROR([GRUB requires GAS .code16 addr32 support; upgrade your binutils])
fi
# Check for curses libraries if we are building /sbin/grub.
if test -n "$sbingrub"; then
AC_CHECK_LIB(ncurses, getch, [LIBS="$LIBS -lncurses"
AC_DEFINE(HAVE_LIBCURSES)],
[AC_CHECK_LIB(curses, getch, [LIBS="$LIBS -lcurses"
AC_DEFINE(HAVE_LIBCURSES)])])
fi
# Create rules for our shared sources.
AC_SUBST_FILE(SHARED_SRC_RULES)dnl
SHARED_SRC_RULES=./ssrcrules.mk

2
debian/changelog vendored
View file

@ -5,7 +5,7 @@ grub (0.5.91) unstable; urgency=low
* GRUB data now installed in /share/grub/$(host_cpu)-$(host_vendor).
* Preliminary Texinfo documentation.
-- Gordon Matzigkeit <gord@debian.org> Sat, 13 Mar 1999 17:37:25 -0600
--
grub (0.5.90) unstable; urgency=low

View file

@ -2,6 +2,7 @@ EXTRA_PROGRAMS = grub
sbin_PROGRAMS = $(sbingrub)
CLEANFILES = $(EXTRA_PROGRAMS)
COMPILE = $(CC) -DGRUB_UTIL=1 $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
INCLUDES = -I$(top_srcdir)/shared_src
grub_SOURCES = main.c asmstub.c

View file

@ -74,6 +74,7 @@ EXTRA_PROGRAMS = grub
sbin_PROGRAMS = $(sbingrub)
CLEANFILES = $(EXTRA_PROGRAMS)
COMPILE = $(CC) -DGRUB_UTIL=1 $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
INCLUDES = -I$(top_srcdir)/shared_src
grub_SOURCES = main.c asmstub.c
@ -96,7 +97,6 @@ grub_DEPENDENCIES = boot.o common.o char_io.o cmdline.o disk_io.o \
gunzip.o fsys_ffs.o fsys_ext2fs.o fsys_fat.o stage2.o
grub_LDFLAGS =
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)
LINK = $(CC) $(CFLAGS) $(LDFLAGS) -o $@
DIST_COMMON = Makefile.am Makefile.in

View file

@ -18,37 +18,78 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#define end _end
#include "shared.h"
#undef end
/* We want to prevent any circularararity in our stubs, as well as
libc name clashes. */
#undef NULL
#undef bcopy
#undef bzero
#undef getc
#undef isspace
#undef printf
#undef putchar
#undef strncat
#undef strstr
#undef tolower
#include <stdlib.h>
#include <assert.h>
#include <stdio.h>
/* Simulated memory sizes. */
#define EXTENDED_MEMSIZE (4 * 1024 * 1024) /* 4MB */
#define CONVENTIONAL_MEMSIZE (640) /* 640kB */
char *end = _end;
unsigned long install_partition = 0x20000;
unsigned long boot_drive = 0;
char version_string[] = "0.5";
char config_file[] = "/boot/grub/menu.lst";
char *grub_scratch_mem = 0;
/* The main entry point into this mess. */
void
start_stage2 (void)
{
grub_scratch_mem = memalign (16, EXTENDED_MEMSIZE);
/* Check some invariants. */
assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR);
assert (FSYS_BUF % 16 == 0);
assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR);
#ifdef HAVE_LIBCURSES
/* Get into char-at-a-time mode. */
initscr ();
cbreak ();
noecho ();
scrollok (stdscr, TRUE);
#endif
init_bios_info ();
}
void
stop (void)
{
fprintf (stderr, "grub: aborting...\n");
exit (1);
}
/* calls for direct boot-loader chaining */
void
chain_stage1 (int segment, int offset, int part_table_addr)
{
stop ();
}
void
chain_stage2 (int segment, int offset)
{
stop ();
}
@ -56,7 +97,7 @@ chain_stage2 (int segment, int offset)
void
linux_boot (void)
{
stop ();
}
@ -64,7 +105,7 @@ linux_boot (void)
void
big_linux_boot (void)
{
stop ();
}
@ -72,7 +113,7 @@ big_linux_boot (void)
void
multi_boot (int start, int mbi)
{
stop ();
}
/* sets it to linear or wired A20 operation */
@ -83,34 +124,70 @@ gateA20 (int linear)
}
void *
get_code_end (void)
{
/* Just return a little area for simulation. */
return malloc (1024);
}
/* memory probe routines */
int
get_memsize (int type)
{
if (!type)
return 640 * 1024; /* 640kB conventional */
return CONVENTIONAL_MEMSIZE;
else
return 4 * 1024 * 1024; /* 4MB extended */
return EXTENDED_MEMSIZE;
}
/* get_eisamemsize() : return packed EISA memory map, lower 16 bits is
* memory between 1M and 16M in 1K parts, upper 16 bits is
* memory above 16M in 64K parts. If error, return -1.
*/
int
get_eisamemsize (void)
{
return (EXTENDED_MEMSIZE / 1024);
}
int
get_mmap_entry (int buf, int cont)
{
}
#define MMAR_DESC_TYPE_AVAILABLE 1 /* available to OS */
#define MMAR_DESC_TYPE_RESERVED 2 /* not available */
#define MMAR_DESC_TYPE_ACPI_RECLAIM 3 /* usable by OS after reading ACPI */
#define MMAR_DESC_TYPE_ACPI_NVS 4 /* required to save between NVS sessions */
/* Address and old continuation value for the Query System Address Map
BIOS call. */
int
get_mem_map (int addr, int cont)
/* Memory map address range descriptor. */
struct mmar_desc
{
unsigned long desc_len; /* Size of this descriptor. */
unsigned long long addr; /* Base address. */
unsigned long long length; /* Length in bytes. */
unsigned long type; /* Type of address range. */
};
/* Fetch the next entry in the memory map and return the continuation
value. DESC is a pointer to the descriptor buffer, and CONT is the
previous continuation value (0 to get the first entry in the
map). */
int
get_mem_map (struct mmar_desc *desc, int cont)
{
if (! cont)
{
/* First entry, located at 1MB. */
desc->desc_len = sizeof (*desc) - sizeof (desc->desc_len);
desc->addr = 1024 * 1024;
desc->length = EXTENDED_MEMSIZE;
desc->type = MMAR_DESC_TYPE_AVAILABLE;
}
else
{
/* No more entries, so give an error. */
desc->desc_len = 0;
}
return 0;
}
@ -146,15 +223,21 @@ gotoxy (int x, int y)
/* displays an ASCII character. IBM displays will translate some
characters to special graphical ones */
void
putchar (int c)
grub_putchar (int c)
{
addch (c);
}
/* returns packed BIOS/ASCII code */
int
asm_getkey (void)
getkey (void)
{
int c;
nodelay (stdscr, FALSE);
c = getch ();
nodelay (stdscr, TRUE);
return c;
}
@ -162,6 +245,7 @@ asm_getkey (void)
int
checkkey (void)
{
getch ();
}

View file

@ -753,6 +753,15 @@ pc_notnewline:
pop %ebp
ret
/* get_code_end() : return the address of the end of the code
* This is here so that it can be replaced by asmstub.c.
*/
ENTRY(get_code_end)
movl $EXT_C(end), %eax /* will be the end of the bss */
shrl $2, %eax /* Round up to the next word. */
incl %eax
shll $2, %eax
ret
/*
*
@ -843,7 +852,6 @@ xnoteisa:
pop %ebp
ret
/*
*
* get_mem_map(addr, cont) : address and old continuation value (zero to
@ -886,7 +894,7 @@ ENTRY(get_mem_map)
.code16
movw %si, %es
movw $0xe820, %ax
movl $0xe820, %eax
int $0x15
data32
@ -1298,14 +1306,14 @@ gottime:
/*
* asm_getkey()
* getkey()
* BIOS call "INT 16H Function 00H" to read character from keyboard
* Call with %ah = 0x0
* Return: %ah = keyboard scan code
* %al = ASCII character
*/
ENTRY(asm_getkey)
ENTRY(getkey)
push %ebp
push %ebx /* save %ebx */

View file

@ -23,14 +23,6 @@
#include "shared.h"
#ifndef STAGE1_5
int
getkey (void)
{
return asm_getkey ();
}
#endif /* STAGE1_5 */
void
print_error (void)
@ -244,7 +236,7 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
case KEY_END:
c = 5;
break;
case KEY_DELETE:
case KEY_DC:
c = 8;
default:
}

View file

@ -118,7 +118,8 @@ init_bios_info (void)
* unused by GRUB.
*/
mbi.mmap_addr = (addr = (((int) end) & ~3) + 4);
addr = get_code_end ();
mbi.mmap_addr = addr;
mbi.mmap_length = 0;
cont = 0;
@ -126,6 +127,7 @@ init_bios_info (void)
{
cont = get_mem_map (addr, cont);
/* If the returned buffer's base is zero, quit. */
if (!*((int *) addr))
break;

View file

@ -358,7 +358,7 @@ static unsigned wp;
/* Tables for deflate from PKZIP's appnote.txt. */
static unsigned border[] =
static unsigned bitorder[] =
{ /* Order of the bit length code lengths */
16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
static ush cplens[] =
@ -942,11 +942,11 @@ init_dynamic_block (void)
for (j = 0; j < nb; j++)
{
NEEDBITS (3);
ll[border[j]] = (unsigned) b & 7;
ll[bitorder[j]] = (unsigned) b & 7;
DUMPBITS (3);
}
for (; j < 19; j++)
ll[border[j]] = 0;
ll[bitorder[j]] = 0;
/* build decoding table for trees--single level, 7 bit lookup */
bl = 7;

View file

@ -22,6 +22,16 @@
* Generic defines to use anywhere
*/
/* Maybe redirect memory requests through grub_scratch_mem. */
#ifdef GRUB_UTIL
extern char *grub_scratch_mem;
# define RAW_ADDR(x) ((x) + (int) grub_scratch_mem)
# define RAW_SEG(x) (RAW_ADDR ((x) << 4) >> 4)
#else
# define RAW_ADDR(x) x
# define RAW_SEG(x) x
#endif
/*
* Integer sizes
*/
@ -29,8 +39,8 @@
#define MAXINT 0x7FFFFFFF
/* 512-byte scratch area */
#define SCRATCHADDR 0x77e00
#define SCRATCHSEG 0x77e0
#define SCRATCHADDR RAW_ADDR (0x77e00)
#define SCRATCHSEG RAW_SEG (0x77e0)
/*
* This is the location of the raw device buffer. It is 31.5K
@ -38,12 +48,8 @@
*/
#define BUFFERLEN 0x7e00
#define BUFFERADDR 0x70000
#define BUFFERSEG 0x7000
#if (BUFFERADDR + BUFFERLEN) != SCRATCHADDR
# error "scratch area isn't at the end of the device buffer"
#endif
#define BUFFERADDR RAW_ADDR (0x70000)
#define BUFFERSEG RAW_SEG (0x7000)
/*
* BIOS disk defines
@ -58,24 +64,16 @@
*/
#define FSYS_BUFLEN 0x8000
#define FSYS_BUF 0x68000
#if (FSYS_BUF % 16) != 0
# error "FSYS_BUF is not segment-aligned"
#endif
#if (FSYS_BUF + FSYS_BUFLEN) != BUFFERADDR
# error "device buffer buffer isn't at the end of the filesystem buffer"
#endif
#define FSYS_BUF RAW_ADDR (0x68000)
/*
* Linux setup parameters
*/
#define LINUX_STAGING_AREA 0x100000
#define LINUX_SETUP 0x90000
#define LINUX_STAGING_AREA RAW_ADDR (0x100000)
#define LINUX_SETUP RAW_ADDR (0x90000)
#define LINUX_SETUP_MAXLEN 0x1E00
#define LINUX_KERNEL 0x10000
#define LINUX_KERNEL RAW_ADDR (0x10000)
#define LINUX_KERNEL_MAXLEN 0x7F000
#define LINUX_SETUP_SEG 0x9020
#define LINUX_INIT_SEG 0x9000
@ -89,12 +87,12 @@
#define LINUX_SETUP_CODE_START 0x214
#define LINUX_SETUP_INITRD 0x218
#define CL_MY_LOCATION 0x92000
#define CL_MY_END_ADDR 0x920FF
#define CL_MAGIC_ADDR 0x90020
#define CL_MY_LOCATION RAW_ADDR (0x92000)
#define CL_MY_END_ADDR RAW_ADDR (0x920FF)
#define CL_MAGIC_ADDR RAW_ADDR (0x90020)
#define CL_MAGIC 0xA33F
#define CL_BASE_ADDR 0x90000
#define CL_OFFSET 0x90022
#define CL_BASE_ADDR RAW_ADDR (0x90000)
#define CL_OFFSET RAW_ADDR (0x90022)
/*
* General disk stuff
@ -103,7 +101,7 @@
#define SECTOR_SIZE 0x200
#define BIOS_FLAG_FIXED_DISK 0x80
#define BOOTSEC_LOCATION 0x7C00
#define BOOTSEC_LOCATION RAW_ADDR (0x7C00)
#define BOOTSEC_SIGNATURE 0xAA55
#define BOOTSEC_BPB_OFFSET 0x3
#define BOOTSEC_BPB_LENGTH 0x3B
@ -169,6 +167,36 @@
enable clock line */
#define KB_A20_ENABLE 0x02
/* Codes for getchar. */
#define ASCII_CHAR(x) ((x) & 0xFF)
#if !defined(GRUB_UTIL) || !defined(HAVE_LIBCURSES)
# define KEY_LEFT 0x4B00
# define KEY_RIGHT 0x4D00
# define KEY_UP 0x4800
# define KEY_DOWN 0x5000
# define KEY_IC 0x5200 /* insert char */
# define KEY_DC 0x5300 /* delete char */
# define KEY_HOME 0x4700
# define KEY_END 0x4F00
# define KEY_NPAGE 0x4900
# define KEY_PPAGE 0x5100
#else
# include <curses.h>
#endif
/* Remap some names so that we don't conflict with libc. */
#define bcopy grub_bcopy
#define bzero grub_bzero
#define isspace grub_isspace
#define open grub_open
#define printf grub_printf
#undef putchar
#define putchar grub_putchar
#define read grub_read
#define strncat grub_strncat
#define strstr grub_strstr
#define tolower grub_tolower
#ifndef ASM_FILE
@ -199,13 +227,12 @@ outb (unsigned short port, unsigned char val)
#include "mb_header.h"
#include "mb_info.h"
extern char end[]; /* will be the end of the bss */
/* this function must be called somewhere... */
void
cmain (void)
__attribute__ ((noreturn));
#undef NULL
#define NULL ((void *) 0)
@ -218,6 +245,8 @@ __attribute__ ((noreturn));
extern char version_string[];
extern char config_file[];
void stop (void) __attribute__ ((noreturn));
/* calls for direct boot-loader chaining */
void chain_stage1 (int segment, int offset, int part_table_addr)
__attribute__ ((noreturn));
@ -226,6 +255,9 @@ __attribute__ ((noreturn));
/* do some funky stuff, then boot linux */
void linux_boot (void) __attribute__ ((noreturn));
/* do some funky stuff, then boot bzImage linux */
void big_linux_boot (void) __attribute__ ((noreturn));
/* booting a multiboot executable */
void multi_boot (int start, int mbi) __attribute__ ((noreturn));
@ -258,23 +290,11 @@ __attribute__ ((noreturn));
#define DISP_UP 0x18
#define DISP_DOWN 0x19
void putchar (int c);
/* returns packed BIOS/ASCII code */
#define BIOS_CODE(x) ((x) >> 8)
#define ASCII_CHAR(x) ((x) & 0xFF)
#define KEY_LEFT 0x4B00
#define KEY_RIGHT 0x4D00
#define KEY_UP 0x4800
#define KEY_DOWN 0x5000
#define KEY_INSERT 0x5200
#define KEY_DELETE 0x5300
#define KEY_HOME 0x4700
#define KEY_END 0x4F00
#define KEY_PGUP 0x4900
#define KEY_PGDN 0x5100
int asm_getkey (void);
int getkey (void);
/* returns 0 if non-ASCII character */
#undef getc
#define getc() ASCII_CHAR(getkey())
/* like 'getkey', but doesn't wait, returns -1 if nothing available */
@ -355,32 +375,16 @@ __attribute__ ((noreturn));
MAX_ERR_NUM
};
/* returns packed BIOS/ASCII code */
#define BIOS_CODE(x) ((x) >> 8)
#define ASCII_CHAR(x) ((x) & 0xFF)
#define KEY_LEFT 0x4B00
#define KEY_RIGHT 0x4D00
#define KEY_UP 0x4800
#define KEY_DOWN 0x5000
#define KEY_INSERT 0x5200
#define KEY_DELETE 0x5300
#define KEY_HOME 0x4700
#define KEY_END 0x4F00
#define KEY_PGUP 0x4900
#define KEY_PGDN 0x5100
int getkey (void); /* actually just calls asm_getkey and invalidates the
disk buffer */
void init_page (void);
void print_error (void);
char *convert_to_ascii (char *buf, int c,...);
void printf (char *format,...);
void grub_printf (char *format,...);
int get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen);
int tolower (int c);
int isspace (int c);
int strncat (char *s1, char *s2, int n);
int grub_tolower (int c);
int grub_isspace (int c);
int grub_strncat (char *s1, char *s2, int n);
int substring (char *s1, char *s2);
char *strstr (char *s1, char *s2);
char *grub_strstr (char *s1, char *s2);
int bcopy (char *from, char *to, int len);
int bzero (char *start, int len);
int get_based_digit (int c, int base);
@ -448,8 +452,8 @@ __attribute__ ((noreturn));
int make_saved_active (void); /* sets the active partition to the that
represented by the "saved_" parameters */
int open (char *filename);
int read (int addr, int len); /* if "length" is -1, read all the
int grub_open (char *filename);
int grub_read (int addr, int len); /* if "length" is -1, read all the
remaining data in the file */
int dir (char *dirname); /* list directory, printing all completions */

View file

@ -131,7 +131,7 @@ set_line(int y, int attr)
}
int timeout;
static int grub_timeout;
void
@ -189,31 +189,31 @@ restart:
/* initilize to NULL just in case... */
cur_entry = NULL;
if (timeout >= 0 && (time1 = getrtsecs()) != time2 && time1 != 0xFF)
if (grub_timeout >= 0 && (time1 = getrtsecs()) != time2 && time1 != 0xFF)
{
if (timeout <= 0)
if (grub_timeout <= 0)
{
timeout = -1;
grub_timeout = -1;
break;
}
/* else not booting yet! */
time2 = time1;
gotoxy(3, 22);
printf("The highlighted entry will be booted automatically in %d seconds. ", timeout);
printf("The highlighted entry will be booted automatically in %d seconds. ", grub_timeout);
gotoxy(74, 4+entryno);
timeout--;
grub_timeout --;
}
if (checkkey() != -1)
{
c = getkey();
if (timeout >= 0)
if (grub_timeout >= 0)
{
gotoxy(3, 22);
printf(" ");
timeout = -1;
grub_timeout = -1;
fallback = -1;
gotoxy(74, 4+entryno);
}
@ -514,7 +514,7 @@ cmain(void)
config_len = 0; menu_len = 0; num_entries = 0; default_entry = 0;
config_entries = (char *)(mbi.mmap_addr + mbi.mmap_length);
menu_entries = (char *)(BUFFERADDR + (32 * 1024));
password = NULL; fallback = -1; timeout = -1;
password = NULL; fallback = -1; grub_timeout = -1;
/*
* Here load the configuration file.
@ -552,7 +552,7 @@ cmain(void)
else if (!state)
{
if (substring("timeout", cmdline) < 1)
safe_parse_maxint(&ptr, &timeout);
safe_parse_maxint(&ptr, &grub_timeout);
if (substring("fallback", cmdline) < 1)
safe_parse_maxint(&ptr, &fallback);
if (substring("default", cmdline) < 1)