Get /sbin/grub GUI working.

This commit is contained in:
gord committed 1999-03-15 02:08:13 +00:00
1 parent b0016b886e
commit ab6e2839e5
21 files changed
+846 -603

No files matched your search

+34
View File
@@ -1,3 +1,37 @@
1999-03-14 Gordon Matzigkeit <gord@trick.fig.org>
* shared_src/stage2.c (run_menu): Use A_REVERSE and A_NORMAL
constants instead of magic numbers.
* shared_src/shared.h (A_REVERSE): Renamed from ATTR_INVERSE for
compatibility with curses.
(A_NORMAL): Renamed from ATTR_NORMAL.
* shared_src/cmdline.c (enter_cmdline): Change prompt to "grub> ".
(enter_cmdline): Only abort the boot if we are in a script.
* shared_src/stage2.c (run_menu): Change prompts to "grub edit> ".
* shared_src/char_io.c (memcheck): Use RAW_ADDR to compute memory
locations.
(get_cmdline): Change the `goto next line' code to account for
newlines deleting to end of line under curses.
* Innumerable cleanups to fix warnings. There are still too many
typecasts in the wrong places (int variables used to hold
pointers, then casted to a pointer type), but things look better.
* configure.in (CPPFLAGS): Bump up GCC warnings to -Wall
-Wmissing-prototypes -Wunused.
* shared_src/shared.h: Delete stupid declarations, and totally
rearrange for clarity.
(inb, outb): Move to cmdline.c, since it's only used there.
(print_possibilities, fsmax, fsys_table): Move definitions to
disk_io.c.
* grub/asmstub.c: Fill in more stubs.
1999-03-13 Gordon Matzigkeit <gord@trick.fig.org> 1999-03-13 Gordon Matzigkeit <gord@trick.fig.org>
* shared_src/gunzip.c (border): Rename to bitorder, to resolve * shared_src/gunzip.c (border): Rename to bitorder, to resolve
Vendored
+92 -88
View File
@@ -892,74 +892,10 @@ 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: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
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_LD="${ac_tool_prefix}ld"
break
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
fi
fi
LD="$ac_cv_prog_LD"
if test -n "$LD"; then
echo "$ac_t""$LD" 1>&6
else
echo "$ac_t""no" 1>&6
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: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
if test -n "$OBJCOPY"; then
ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_OBJCOPY="${ac_tool_prefix}objcopy"
break
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_prog_OBJCOPY" && ac_cv_prog_OBJCOPY="objcopy"
fi
fi
OBJCOPY="$ac_cv_prog_OBJCOPY"
if test -n "$OBJCOPY"; then
echo "$ac_t""$OBJCOPY" 1>&6
else
echo "$ac_t""no" 1>&6
fi
# Defined in acinclude.m4.
# Extract the first word of "gcc", so it can be a program name with args. # Extract the first word of "gcc", so it can be a program name with args.
set dummy gcc; ac_word=$2 set dummy gcc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:963: checking for $ac_word" >&5 echo "configure:899: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -988,7 +924,7 @@ if test -z "$CC"; then
# Extract the first word of "cc", so it can be a program name with args. # Extract the first word of "cc", so it can be a program name with args.
set dummy cc; ac_word=$2 set dummy cc; ac_word=$2
echo $ac_n "checking for $ac_word""... $ac_c" 1>&6 echo $ac_n "checking for $ac_word""... $ac_c" 1>&6
echo "configure:992: checking for $ac_word" >&5 echo "configure:928: checking for $ac_word" >&5
if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_CC'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1036,7 +972,7 @@ fi
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works""... $ac_c" 1>&6
echo "configure:1040: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5 echo "configure:976: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) works" >&5
ac_ext=c ac_ext=c
# CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options.
@@ -1046,11 +982,11 @@ ac_link='${CC-cc} -o conftest $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1050 "configure" #line 986 "configure"
#include "confdefs.h" #include "confdefs.h"
main(){return(0);} main(){return(0);}
EOF EOF
if { (eval echo configure:1054: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:990: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
ac_cv_prog_cc_works=yes ac_cv_prog_cc_works=yes
# If we can't run a trivial program, we are probably using a cross compiler. # If we can't run a trivial program, we are probably using a cross compiler.
if (./conftest; exit) 2>/dev/null; then if (./conftest; exit) 2>/dev/null; then
@@ -1070,12 +1006,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; } { echo "configure: error: installation or configuration problem: C compiler cannot create executables." 1>&2; exit 1; }
fi fi
echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6 echo $ac_n "checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler""... $ac_c" 1>&6
echo "configure:1074: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5 echo "configure:1010: checking whether the C compiler ($CC $CFLAGS $LDFLAGS) is a cross-compiler" >&5
echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6 echo "$ac_t""$ac_cv_prog_cc_cross" 1>&6
cross_compiling=$ac_cv_prog_cc_cross cross_compiling=$ac_cv_prog_cc_cross
echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6 echo $ac_n "checking whether we are using GNU C""... $ac_c" 1>&6
echo "configure:1079: checking whether we are using GNU C" >&5 echo "configure:1015: checking whether we are using GNU C" >&5
if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_gcc'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1084,7 +1020,7 @@ else
yes; yes;
#endif #endif
EOF EOF
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 if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1024: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } | egrep yes >/dev/null 2>&1; then
ac_cv_prog_gcc=yes ac_cv_prog_gcc=yes
else else
ac_cv_prog_gcc=no ac_cv_prog_gcc=no
@@ -1099,7 +1035,7 @@ if test $ac_cv_prog_gcc = yes; then
ac_save_CFLAGS="$CFLAGS" ac_save_CFLAGS="$CFLAGS"
CFLAGS= CFLAGS=
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6 echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
echo "configure:1103: checking whether ${CC-cc} accepts -g" >&5 echo "configure:1039: checking whether ${CC-cc} accepts -g" >&5
if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_prog_cc_g'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1127,8 +1063,76 @@ else
fi fi
# Enforce coding standards.
CPPFLAGS="$CPPFLAGS -Wall -Wmissing-prototypes -Wunused"
# 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:1073: 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
if test -n "$LD"; then
ac_cv_prog_LD="$LD" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_LD="${ac_tool_prefix}ld"
break
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_prog_LD" && ac_cv_prog_LD="ld"
fi
fi
LD="$ac_cv_prog_LD"
if test -n "$LD"; then
echo "$ac_t""$LD" 1>&6
else
echo "$ac_t""no" 1>&6
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:1104: 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
if test -n "$OBJCOPY"; then
ac_cv_prog_OBJCOPY="$OBJCOPY" # Let the user override the test.
else
IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}:"
for ac_dir in $PATH; do
test -z "$ac_dir" && ac_dir=.
if test -f $ac_dir/$ac_word; then
ac_cv_prog_OBJCOPY="${ac_tool_prefix}objcopy"
break
fi
done
IFS="$ac_save_ifs"
test -z "$ac_cv_prog_OBJCOPY" && ac_cv_prog_OBJCOPY="objcopy"
fi
fi
OBJCOPY="$ac_cv_prog_OBJCOPY"
if test -n "$OBJCOPY"; then
echo "$ac_t""$OBJCOPY" 1>&6
else
echo "$ac_t""no" 1>&6
fi
# Defined in acinclude.m4.
echo $ac_n "checking symbol names produced by ${CC-cc}""... $ac_c" 1>&6 echo $ac_n "checking symbol names produced by ${CC-cc}""... $ac_c" 1>&6
echo "configure:1132: checking symbol names produced by ${CC-cc}" >&5 echo "configure:1136: checking symbol names produced by ${CC-cc}" >&5
if eval "test \"`echo '$''{'grub_cv_asm_ext_c'+set}'`\" = set"; then if eval "test \"`echo '$''{'grub_cv_asm_ext_c'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1141,7 +1145,7 @@ func (int *list)
} }
EOF EOF
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 : if { ac_try='${CC-cc} -S conftest.c'; { (eval echo configure:1149: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then :
else else
{ echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; } { echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; }
fi fi
@@ -1169,7 +1173,7 @@ EOF
echo $ac_n "checking whether ${OBJCOPY} works for absolute addresses""... $ac_c" 1>&6 echo $ac_n "checking whether ${OBJCOPY} works for absolute addresses""... $ac_c" 1>&6
echo "configure:1173: checking whether ${OBJCOPY} works for absolute addresses" >&5 echo "configure:1177: checking whether ${OBJCOPY} works for absolute addresses" >&5
if eval "test \"`echo '$''{'grub_cv_prog_objcopy_absolute'+set}'`\" = set"; then if eval "test \"`echo '$''{'grub_cv_prog_objcopy_absolute'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1181,21 +1185,21 @@ blah (void)
} }
EOF EOF
if { (eval echo configure:1185: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then : if { (eval echo configure:1189: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then :
else else
{ echo "configure: error: ${CC-cc} cannot compile C source code" 1>&2; exit 1; } { echo "configure: error: ${CC-cc} cannot compile C source code" 1>&2; exit 1; }
fi fi
grub_cv_prog_objcopy_absolute=yes grub_cv_prog_objcopy_absolute=yes
for link_addr in 2000 8000 7C00; do 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:1191: \"$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:1195: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
else else
{ echo "configure: error: ${LD-ld} cannot link at address $link_addr" 1>&2; exit 1; } { echo "configure: error: ${LD-ld} cannot link at address $link_addr" 1>&2; exit 1; }
fi fi
if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1195: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1199: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then :
else else
{ echo "configure: error: ${OBJCOPY-objcopy} cannot create binary files" 1>&2; exit 1; } { echo "configure: error: ${OBJCOPY-objcopy} cannot create binary files" 1>&2; exit 1; }
fi fi
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 if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure:1203: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then
mv -f conftest conftest.old mv -f conftest conftest.old
else else
grub_cv_prog_objcopy_absolute=no grub_cv_prog_objcopy_absolute=no
@@ -1212,7 +1216,7 @@ fi
echo $ac_n "checking for .code16 addr32 assembler support""... $ac_c" 1>&6 echo $ac_n "checking for .code16 addr32 assembler support""... $ac_c" 1>&6
echo "configure:1216: checking for .code16 addr32 assembler support" >&5 echo "configure:1220: checking for .code16 addr32 assembler support" >&5
if eval "test \"`echo '$''{'grub_cv_asm_addr32'+set}'`\" = set"; then if eval "test \"`echo '$''{'grub_cv_asm_addr32'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
else else
@@ -1222,7 +1226,7 @@ l1: addr32
movb %al, l1 movb %al, l1
EOF EOF
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 if { ac_try='${CC-cc} -c conftest.s'; { (eval echo configure:1230: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then
grub_cv_asm_addr32=yes grub_cv_asm_addr32=yes
else else
grub_cv_asm_addr32=no grub_cv_asm_addr32=no
@@ -1238,7 +1242,7 @@ fi
# Check for curses libraries if we are building /sbin/grub. # Check for curses libraries if we are building /sbin/grub.
if test -n "$sbingrub"; then if test -n "$sbingrub"; then
echo $ac_n "checking for getch in -lncurses""... $ac_c" 1>&6 echo $ac_n "checking for getch in -lncurses""... $ac_c" 1>&6
echo "configure:1242: checking for getch in -lncurses" >&5 echo "configure:1246: checking for getch in -lncurses" >&5
ac_lib_var=`echo ncurses'_'getch | sed 'y%./+-%__p_%'` ac_lib_var=`echo ncurses'_'getch | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@@ -1246,7 +1250,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lncurses $LIBS" LIBS="-lncurses $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1250 "configure" #line 1254 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1257,7 +1261,7 @@ int main() {
getch() getch()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1261: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1265: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
@@ -1280,7 +1284,7 @@ EOF
else else
echo "$ac_t""no" 1>&6 echo "$ac_t""no" 1>&6
echo $ac_n "checking for getch in -lcurses""... $ac_c" 1>&6 echo $ac_n "checking for getch in -lcurses""... $ac_c" 1>&6
echo "configure:1284: checking for getch in -lcurses" >&5 echo "configure:1288: checking for getch in -lcurses" >&5
ac_lib_var=`echo curses'_'getch | sed 'y%./+-%__p_%'` ac_lib_var=`echo curses'_'getch | sed 'y%./+-%__p_%'`
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
echo $ac_n "(cached) $ac_c" 1>&6 echo $ac_n "(cached) $ac_c" 1>&6
@@ -1288,7 +1292,7 @@ else
ac_save_LIBS="$LIBS" ac_save_LIBS="$LIBS"
LIBS="-lcurses $LIBS" LIBS="-lcurses $LIBS"
cat > conftest.$ac_ext <<EOF cat > conftest.$ac_ext <<EOF
#line 1292 "configure" #line 1296 "configure"
#include "confdefs.h" #include "confdefs.h"
/* Override any gcc2 internal prototype to avoid an error. */ /* Override any gcc2 internal prototype to avoid an error. */
/* We use char because int might match the return type of a gcc2 /* We use char because int might match the return type of a gcc2
@@ -1299,7 +1303,7 @@ int main() {
getch() getch()
; return 0; } ; return 0; }
EOF EOF
if { (eval echo configure:1303: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then if { (eval echo configure:1307: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest; then
rm -rf conftest* rm -rf conftest*
eval "ac_cv_lib_$ac_lib_var=yes" eval "ac_cv_lib_$ac_lib_var=yes"
else else
+5
View File
@@ -49,6 +49,11 @@ AC_SUBST(stage2debug)
# #
AC_CHECK_TOOL(CC, gcc) AC_CHECK_TOOL(CC, gcc)
AC_PROG_CC
# Enforce coding standards.
CPPFLAGS="$CPPFLAGS -Wall -Wmissing-prototypes -Wunused"
AC_CHECK_TOOL(LD, ld) AC_CHECK_TOOL(LD, ld)
AC_CHECK_TOOL(OBJCOPY, objcopy) AC_CHECK_TOOL(OBJCOPY, objcopy)
+3 -5
View File
@@ -1,5 +1,3 @@
Get /sbin/grub to work.
Change partition syntax to correspond with BSD ``slice'' syntax Change partition syntax to correspond with BSD ``slice'' syntax
(`(hd0,1a)' -> `/dev/hd0s2a'). (`(hd0,1a)' -> `/dev/hd0s2a').
@@ -9,10 +7,10 @@ type''. We need this for clean Hurd install floppies.
Find out the size restrictions for FAT and ext2fs stage1.5 boot Find out the size restrictions for FAT and ext2fs stage1.5 boot
blocks. Enforce all arbitrary limits using the Makefiles. blocks. Enforce all arbitrary limits using the Makefiles.
Finish LBA and int13 extensions support. Finish int13 extensions support.
Add a real scripting language, possibly retain backward compatibility Add a real scripting language, possibly retaining backward
so that old config files can be used. compatibility so that old config files can be used.
Look at the network booting patches from L4. Look at the network booting patches from L4.
+155 -18
View File
@@ -18,6 +18,9 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
/* Simulator entry point. */
int grub_stage2 (void);
#include "shared.h" #include "shared.h"
/* We want to prevent any circularararity in our stubs, as well as /* We want to prevent any circularararity in our stubs, as well as
libc name clashes. */ libc name clashes. */
@@ -45,15 +48,37 @@ unsigned long install_partition = 0x20000;
unsigned long boot_drive = 0; unsigned long boot_drive = 0;
char version_string[] = "0.5"; char version_string[] = "0.5";
char config_file[] = "/boot/grub/menu.lst"; char config_file[] = "/boot/grub/menu.lst";
/* Emulation requirements. */
char *grub_scratch_mem = 0; char *grub_scratch_mem = 0;
#define NUM_DISKS 256
static FILE **disks = 0;
/* The main entry point into this mess. */ /* The main entry point into this mess. */
void int
start_stage2 (void) grub_stage2 (void)
{ {
grub_scratch_mem = memalign (16, EXTENDED_MEMSIZE); /* These need to be static, because they survive our stack transitions. */
static int status = 0;
static char *realstack;
int i;
char *scratch, *simstack;
assert (grub_scratch_mem == 0);
scratch = malloc (0x100000 + EXTENDED_MEMSIZE + 15);
assert (scratch);
grub_scratch_mem = (char *) ((((int) scratch) >> 4) << 4);
/* FIXME: simulate the memory holes using mprot, if available. */
assert (disks == 0);
disks = malloc (NUM_DISKS * sizeof (*disks));
assert (disks);
/* Check some invariants. */ /* Check some invariants. */
assert ((SCRATCHSEG << 4) == SCRATCHADDR);
assert ((BUFFERSEG << 4) == BUFFERADDR);
assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR); assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR);
assert (FSYS_BUF % 16 == 0); assert (FSYS_BUF % 16 == 0);
assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR); assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR);
@@ -63,16 +88,65 @@ start_stage2 (void)
initscr (); initscr ();
cbreak (); cbreak ();
noecho (); noecho ();
nonl ();
scrollok (stdscr, TRUE); scrollok (stdscr, TRUE);
keypad (stdscr, TRUE);
#endif #endif
/* Make sure our stack lives in the simulated memory area. */
simstack = (char *) RAW_ADDR (PROTSTACKINIT);
#ifdef SIMULATE_STACK
__asm __volatile ("movl %%esp, %0;" : "=d" (realstack));
__asm __volatile ("movl %0, %%esp" :: "d" (simstack));
#endif
{
/* FIXME: Do a setjmp here for the stop command. */
if (1)
{
/* Actually enter the generic stage2 code. */
status = 0;
init_bios_info (); init_bios_info ();
}
else
{
/* Somebody aborted. */
status = 1;
}
}
#ifdef SIMULATE_STACK
/* Replace our stack before we use any local variables. */
__asm __volatile ("movl %0, %%esp" :: "d" (realstack));
#endif
#ifdef HAVE_LIBCURSES
endwin ();
#endif
/* Close off the file pointers we used. */
for (i = 0; i < NUM_DISKS; i ++)
if (disks[i])
fclose (disks[i]);
/* Release memory. */
free (disks);
disks = 0;
free (scratch);
grub_scratch_mem = 0;
/* Ahh... at last we're ready to return to caller. */
return status;
} }
void void
stop (void) stop (void)
{ {
#ifdef HAVE_LIBCURSES
endwin ();
#endif
/* FIXME: If we don't exit, then we need to free our data areas. */
fprintf (stderr, "grub: aborting...\n"); fprintf (stderr, "grub: aborting...\n");
exit (1); exit (1);
} }
@@ -124,11 +198,11 @@ gateA20 (int linear)
} }
void * int
get_code_end (void) get_code_end (void)
{ {
/* Just return a little area for simulation. */ /* Just return a little area for simulation. */
return malloc (1024); return BOOTSEC_LOCATION + (60 * 1024);
} }
@@ -159,21 +233,12 @@ get_eisamemsize (void)
#define MMAR_DESC_TYPE_ACPI_RECLAIM 3 /* usable by OS after reading ACPI */ #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 */ #define MMAR_DESC_TYPE_ACPI_NVS 4 /* required to save between NVS sessions */
/* 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 /* 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 value. DESC is a pointer to the descriptor buffer, and CONT is the
previous continuation value (0 to get the first entry in the previous continuation value (0 to get the first entry in the
map). */ map). */
int int
get_mem_map (struct mmar_desc *desc, int cont) get_mmap_entry (struct mmar_desc *desc, int cont)
{ {
if (! cont) if (! cont)
{ {
@@ -204,6 +269,9 @@ getrtsecs (void)
void void
cls (void) cls (void)
{ {
#ifdef HAVE_LIBCURSES
clear ();
#endif
} }
@@ -211,12 +279,22 @@ cls (void)
int int
getxy (void) getxy (void)
{ {
int y, x;
#ifdef HAVE_LIBCURSES
getyx (stdscr, y, x);
#else
y = x = 0;
#endif
return (x << 8) | (y & 0xff);
} }
void void
gotoxy (int x, int y) gotoxy (int x, int y)
{ {
#ifdef HAVE_LIBCURSES
move (y, x);
#endif
} }
@@ -225,7 +303,11 @@ gotoxy (int x, int y)
void void
grub_putchar (int c) grub_putchar (int c)
{ {
#ifdef HAVE_LIBCURSES
addch (c); addch (c);
#else
putchar (c);
#endif
} }
@@ -233,11 +315,15 @@ grub_putchar (int c)
int int
getkey (void) getkey (void)
{ {
#ifdef HAVE_LIBCURSES
int c; int c;
nodelay (stdscr, FALSE); nodelay (stdscr, FALSE);
c = getch (); c = getch ();
nodelay (stdscr, TRUE); nodelay (stdscr, TRUE);
return c; return c;
#else
return getchar ();
#endif
} }
@@ -245,7 +331,11 @@ getkey (void)
int int
checkkey (void) checkkey (void)
{ {
getch (); #ifdef HAVE_LIBCURSES
return getch ();
#else
return getchar ();
#endif
} }
@@ -253,24 +343,71 @@ checkkey (void)
void void
set_attrib (int attr) set_attrib (int attr)
{ {
#ifdef HAVE_LIBCURSES
chgat (1, attr, 0, NULL);
#endif
} }
/* low-level disk I/O */ /* Low-level disk I/O. Our stubbed version just returns a file
descriptor, not the actual geometry. */
int int
get_diskinfo (int drive) get_diskinfo (int drive)
{ {
} /* The unpartitioned device name: /dev/XdX */
char devname[9];
/* See if we have a cached device. */
if (disks[drive])
return (int) disks[drive];
/* Try opening the drive device. */
strcpy (devname, "/dev/");
if (drive & 0x80)
devname[5] = 'h';
else
devname[5] = 'f';
devname[6] = 'd';
/* Check to make sure we don't exceed /dev/hdz. */
devname[7] = (drive & 0x7f) + 'a';
if (devname[7] > 'z')
return 0;
devname[8] = '\0';
/* Open read/write, or read-only if that failed. */
disks[drive] = fopen (devname, "r+");
if (! disks[drive])
disks[drive] = fopen (devname, "r");
return (int) disks[drive];
}
int int
biosdisk (int subfunc, int drive, int geometry, biosdisk (int subfunc, int drive, int geometry,
int sector, int nsec, int segment) int sector, int nsec, int segment)
{ {
char *buf;
FILE *fp;
/* Get the file pointer from the geometry, and make sure it matches. */
fp = (FILE *) geometry;
if (! fp || fp != disks[drive])
return BIOSDISK_ERROR_GEOMETRY;
/* Seek to the specified location. */
if (fseek (fp, sector * SECTOR_SIZE, SEEK_SET))
return -1;
buf = (char *) (segment << 4);
if (fread (buf, nsec * SECTOR_SIZE, 1, fp) != 1)
return -1;
return 0;
} }
void void
stop_floppy (void) stop_floppy (void)
{ {
/* NOTUSED */
} }
+69 -3
View File
@@ -18,12 +18,78 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
extern void start_stage2 (void); /* Simulator entry point. */
int grub_stage2 (void);
#include <stdio.h>
#include <getopt.h>
char *program_name = 0;
#define OPT_HELP -2
#define OPT_VERSION -3
#define OPTSTRING ""
static struct option longopts[] =
{
{"help", no_argument, 0, OPT_HELP},
{"version", no_argument, 0, OPT_VERSION},
{0},
};
static void
usage (int status)
{
if (status)
fprintf (stderr, "Try ``%s --help'' for more information.\n",
program_name);
else
printf ("\
Usage: %s [OPTION]...\n\
\n\
Enter the GRand Unified Bootloader command shell.\n\
\n\
--help display this message and exit\n\
--version print version information and exit\n\
",
program_name);
exit (status);
}
int int
main (int argc, char **argv) main (int argc, char **argv)
{ {
/* Call the main entry point. */ int c;
start_stage2 (); program_name = argv[0];
/* Parse command-line options. */
do
{
c = getopt_long (argc, argv, OPTSTRING, longopts, 0);
switch (c)
{
case EOF:
/* Fall through the bottom of the loop. */
break;
case OPT_HELP:
usage (0);
break;
case OPT_VERSION:
printf ("GNU GRUB " VERSION "\n");
exit (0); exit (0);
break;
default:
usage (1);
}
}
while (c != EOF);
/* Transfer control to the stage2 simulator. */
exit (grub_stage2 ());
} }
+2 -2
View File
@@ -854,7 +854,7 @@ xnoteisa:
/* /*
* *
* get_mem_map(addr, cont) : address and old continuation value (zero to * get_mmap_entry(addr, cont) : address and old continuation value (zero to
* start), for the Query System Address Map BIOS call. * start), for the Query System Address Map BIOS call.
* *
* Sets the first 4-byte int value of "addr" to the size returned by * Sets the first 4-byte int value of "addr" to the size returned by
@@ -865,7 +865,7 @@ xnoteisa:
* NOTE: Currently hard-coded for a maximum buffer length of 1024. * NOTE: Currently hard-coded for a maximum buffer length of 1024.
*/ */
ENTRY(get_mem_map) ENTRY(get_mmap_entry)
push %ebp push %ebp
push %ebx push %ebx
push %ecx push %ecx
+18 -19
View File
@@ -1,6 +1,8 @@
/* boot.c - load and bootstrap a kernel */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -18,8 +20,6 @@
*/ */
#define _BOOT_C
#include "shared.h" #include "shared.h"
#include "freebsd.h" #include "freebsd.h"
@@ -41,9 +41,9 @@ static struct mod_list mll[99];
int int
load_image (void) load_image (void)
{ {
int len, i, exec_type, align_4k = 1, type = 0; int len, i, exec_type = 0, align_4k = 1, type = 0;
unsigned long flags = 0, text_len, data_len, bss_len; unsigned long flags = 0, text_len = 0, data_len = 0, bss_len = 0;
char *str, *str2; char *str = 0, *str2 = 0;
union union
{ {
struct multiboot_header *mb; struct multiboot_header *mb;
@@ -59,10 +59,10 @@ load_image (void)
buffer by default */ buffer by default */
pu.aout = (struct exec *) buffer; pu.aout = (struct exec *) buffer;
if (!open (cur_cmdline)) if (!grub_open (cur_cmdline))
return 0; return 0;
if (!(len = read ((int) buffer, MULTIBOOT_SEARCH)) || len < 32) if (!(len = grub_read (buffer, MULTIBOOT_SEARCH)) || len < 32)
{ {
if (!errnum) if (!errnum)
errnum = ERR_EXEC_FORMAT; errnum = ERR_EXEC_FORMAT;
@@ -101,8 +101,6 @@ load_image (void)
|| ((pu.elf->e_phoff + (pu.elf->e_phentsize * pu.elf->e_phnum)) || ((pu.elf->e_phoff + (pu.elf->e_phentsize * pu.elf->e_phnum))
>= len)) >= len))
errnum = ERR_EXEC_FORMAT; errnum = ERR_EXEC_FORMAT;
exec_type = 0;
str = "elf"; str = "elf";
} }
else if (flags & MULTIBOOT_AOUT_KLUDGE) else if (flags & MULTIBOOT_AOUT_KLUDGE)
@@ -228,7 +226,7 @@ load_image (void)
filepos = data_len + SECTOR_SIZE; filepos = data_len + SECTOR_SIZE;
cur_addr = LINUX_STAGING_AREA + text_len; cur_addr = LINUX_STAGING_AREA + text_len;
if (read (LINUX_STAGING_AREA, text_len) >= (text_len - 16)) if (grub_read ((char *) LINUX_STAGING_AREA, text_len) >= (text_len - 16))
return (big_linux ? 'L' : 'l'); return (big_linux ? 'L' : 'l');
else if (!errnum) else if (!errnum)
errnum = ERR_EXEC_FORMAT; errnum = ERR_EXEC_FORMAT;
@@ -266,7 +264,7 @@ load_image (void)
printf (", loadaddr=0x%x, text%s=0x%x", cur_addr, str, text_len); printf (", loadaddr=0x%x, text%s=0x%x", cur_addr, str, text_len);
/* read text, then read data */ /* read text, then read data */
if (read (cur_addr, text_len) == text_len) if (grub_read ((char *) cur_addr, text_len) == text_len)
{ {
cur_addr += text_len; cur_addr += text_len;
@@ -280,7 +278,8 @@ load_image (void)
printf (", data=0x%x", data_len); printf (", data=0x%x", data_len);
if (read (cur_addr, data_len) != data_len && !errnum) if (grub_read ((char *) cur_addr, data_len) != data_len &&
!errnum)
errnum = ERR_EXEC_FORMAT; errnum = ERR_EXEC_FORMAT;
cur_addr += data_len; cur_addr += data_len;
} }
@@ -310,12 +309,12 @@ load_image (void)
printf (", symtab=0x%x", pu.aout->a_syms); printf (", symtab=0x%x", pu.aout->a_syms);
if (read (cur_addr, pu.aout->a_syms) == pu.aout->a_syms) if (grub_read ((char *) cur_addr, pu.aout->a_syms) == pu.aout->a_syms)
{ {
cur_addr += pu.aout->a_syms; cur_addr += pu.aout->a_syms;
mbi.syms.a.tabsize = pu.aout->a_syms; mbi.syms.a.tabsize = pu.aout->a_syms;
if (read ((int) (&i), sizeof (int)) == sizeof (int)) if (grub_read ((char *) &i, sizeof (int)) == sizeof (int))
{ {
*(((int *) cur_addr)++) = i; *(((int *) cur_addr)++) = i;
@@ -325,7 +324,7 @@ load_image (void)
printf (", strtab=0x%x", i); printf (", strtab=0x%x", i);
symtab_err = (read (cur_addr, i) != i); symtab_err = (grub_read ((char *) cur_addr, i) != i);
cur_addr += i; cur_addr += i;
} }
else else
@@ -383,7 +382,7 @@ load_image (void)
/* load the segment */ /* load the segment */
if (memcheck (memaddr, memsiz) if (memcheck (memaddr, memsiz)
&& read (memaddr, filesiz) == filesiz) && grub_read ((char *) memaddr, filesiz) == filesiz)
{ {
if (memsiz > filesiz) if (memsiz > filesiz)
bzero ((char *) (memaddr + filesiz), memsiz - filesiz); bzero ((char *) (memaddr + filesiz), memsiz - filesiz);
@@ -399,7 +398,7 @@ load_image (void)
errnum = ERR_EXEC_FORMAT; errnum = ERR_EXEC_FORMAT;
else else
{ {
/* XXX load ELF symbols */ /* FIXME: load ELF symbols */
} }
} }
} }
@@ -423,7 +422,7 @@ load_module (void)
/* if we are supposed to load on 4K boundaries */ /* if we are supposed to load on 4K boundaries */
cur_addr = (cur_addr + 0xFFF) & 0xFFFFF000; cur_addr = (cur_addr + 0xFFF) & 0xFFFFF000;
if (!open (cur_cmdline) || !(len = read (cur_addr, -1))) if (!grub_open (cur_cmdline) || !(len = grub_read ((char *) cur_addr, -1)))
return 0; return 0;
printf (" [Multiboot-module @ 0x%x, 0x%x bytes]\n", cur_addr, len); printf (" [Multiboot-module @ 0x%x, 0x%x bytes]\n", cur_addr, len);
@@ -450,7 +449,7 @@ load_initrd (void)
int len; int len;
long *ramdisk, moveto; long *ramdisk, moveto;
if (!open (cur_cmdline) || !(len = read (cur_addr, -1))) if (!grub_open (cur_cmdline) || !(len = grub_read ((char *) cur_addr, -1)))
return 0; return 0;
moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000; moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000;
+33 -32
View File
@@ -1,7 +1,8 @@
/* char_io.c - basic console input and output */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -19,8 +20,6 @@
*/ */
#define _CHAR_IO_C
#include "shared.h" #include "shared.h"
@@ -88,7 +87,7 @@ printf (char *format,...)
dataptr++; dataptr++;
while (c = *(format++)) while ((c = *(format++)) != 0)
{ {
if (c != '%') if (c != '%')
putchar (c); putchar (c);
@@ -113,7 +112,7 @@ printf (char *format,...)
case 's': case 's':
ptr = (char *) (*(dataptr++)); ptr = (char *) (*(dataptr++));
while (c = *(ptr++)) while ((c = *(ptr++)) != 0)
putchar (c); putchar (c);
break; break;
} }
@@ -133,13 +132,12 @@ init_page (void)
} }
/* don't use this with a maxlen greater than 1600 or so! the problem /* Don't use this with a MAXLEN greater than 1600 or so! The problem
is that it depends on the whole thing fitting on the screen at once, is that GET_CMDLINE depends on the everything fitting on the screen
and the whole screen is about 2000 characters, minus the prompt... at once. So, the whole screen is about 2000 characters, minus the
so want to leave space for an error line, etc. PROMPT, and space for error and status lines, etc. MAXLEN must be
maxlen should be at least 1, and we shouldn't have a NULL prompt or at least 1, and PROMPT and CMDLINE must be valid strings (not NULL
cmdline... the cmdline must be a valid string at the start */ or zero-length). */
int int
get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen) get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
{ {
@@ -147,8 +145,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
int plen = 0; int plen = 0;
int llen = 0; int llen = 0;
/* nested function definition for code simplicity XXX GCC only, I think */ /* nested function definition for code simplicity */
void cl_print (char *str) static void cl_print (char *str)
{ {
while (*str != 0) while (*str != 0)
{ {
@@ -157,15 +155,15 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
{ {
xend = 0; xend = 0;
putchar (' '); putchar (' ');
if (yend == (getxy () & 0xFF)) if (yend == (getxy () & 0xff))
ystart--; ystart--;
else else
yend++; yend++;
} }
} }
} }
/* nested function definition for code simplicity XXX GCC only, I think */ /* nested function definition for code simplicity */
void cl_setcpos (void) static void cl_setcpos (void)
{ {
yend = ((lpos + plen) / 79) + ystart; yend = ((lpos + plen) / 79) + ystart;
xend = ((lpos + plen) % 79); xend = ((lpos + plen) % 79);
@@ -173,13 +171,13 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
} }
/* nested function definition for initial command-line printing */ /* nested function definition for initial command-line printing */
void cl_init () static void cl_init ()
{ {
/* distinguish us from other lines and error messages! */ /* distinguish us from other lines and error messages! */
putchar ('\n'); putchar ('\n');
/* print full line and set position here */ /* print full line and set position here */
ystart = (getxy () & 0xFF); ystart = (getxy () & 0xff);
yend = ystart; yend = ystart;
xend = 0; xend = 0;
cl_print (prompt); cl_print (prompt);
@@ -188,7 +186,7 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
} }
/* nested function definition for erasing to the end of the line */ /* nested function definition for erasing to the end of the line */
void cl_kill_to_end () static void cl_kill_to_end ()
{ {
int i; int i;
cmdline[lpos] = 0; cmdline[lpos] = 0;
@@ -206,14 +204,13 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
plen++; plen++;
while (cmdline[llen]) while (cmdline[llen])
llen++; llen++;
/* XXX limiting maxlen to 1600 */ if (maxlen > MAX_CMDLINE)
if (maxlen > 1600)
{ {
maxlen = 1600; maxlen = MAX_CMDLINE;
if (llen > 1599) if (llen >= MAX_CMDLINE)
{ {
llen = 1599; llen = MAX_CMDLINE - 1;
cmdline[1600] = 0; cmdline[MAX_CMDLINE] = 0;
} }
} }
lpos = llen; lpos = llen;
@@ -237,6 +234,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
c = 5; c = 5;
break; break;
case KEY_DC: case KEY_DC:
c = 4;
case KEY_BACKSPACE:
c = 8; c = 8;
default: default:
} }
@@ -261,8 +260,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
/* goto part after line here */ /* goto part after line here */
yend = ((llen + plen) / 79) + ystart; yend = ((llen + plen) / 79) + ystart;
gotoxy (0, yend);
putchar ('\n'); putchar ('\n');
gotoxy (0, getxy () & 0xff);
if (lpos > j) if (lpos > j)
{ {
@@ -382,8 +381,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
/* goto part after line here */ /* goto part after line here */
yend = ((llen + plen) / 79) + ystart; yend = ((llen + plen) / 79) + ystart;
gotoxy (0, yend);
putchar ('\n'); putchar ('\n');
gotoxy (0, getxy () & 0xff);
/* remove leading spaces */ /* remove leading spaces */
/* use c and lpos as indexes now */ /* use c and lpos as indexes now */
@@ -563,10 +562,12 @@ strstr (char *s1, char *s2)
int int
memcheck (int start, int len) memcheck (int start, int len)
{ {
if ((start < 0x1000) || (start < 0x100000 /* FIXME: fails when used with addresses on our stack. */
&& (mbi.mem_lower * 1024) < (start + len)) if ((start < RAW_ADDR (0x1000)) ||
|| (start >= 0x100000 (start < RAW_ADDR (0x100000) &&
&& (mbi.mem_upper * 1024) < ((start - 0x100000) + len))) RAW_ADDR (mbi.mem_lower * 1024) < (start + len)) ||
(start >= RAW_ADDR (0x100000) &&
RAW_ADDR (mbi.mem_upper * 1024) < ((start - 0x100000) + len)))
errnum = ERR_WONT_FIT; errnum = ERR_WONT_FIT;
return (!errnum); return (!errnum);
+62 -41
View File
@@ -1,6 +1,8 @@
/* cmdline.c - the device-independent GRUB text command line */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -17,8 +19,6 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define _CMDLINE_C
#include "shared.h" #include "shared.h"
#ifdef DEBUG #ifdef DEBUG
@@ -34,6 +34,22 @@
#define PHYS_TO_VIRTUAL(x) (x) #define PHYS_TO_VIRTUAL(x) (x)
#define VIRTUAL_TO_PHYS(x) (x) #define VIRTUAL_TO_PHYS(x) (x)
static inline unsigned char
inb (unsigned short port)
{
unsigned char data;
__asm __volatile ("inb %1,%0":"=a" (data):"d" (port));
return data;
}
static inline void
outb (unsigned short port, unsigned char val)
{
__asm __volatile ("outb %0,%1"::"a" (val), "d" (port));
}
__inline__ static void __inline__ static void
cmos_write_byte(int loc, int val) cmos_write_byte(int loc, int val)
{ {
@@ -139,12 +155,9 @@ debug_fs_blocklist_func(int sector)
int int
enter_cmdline(char *script, char *heap) enter_cmdline (char *script, char *heap)
{ {
int bootdev, cmd_len, type = 0, run_cmdline = 1, have_run_cmdline = 0; int bootdev, cmd_len, type = 0, run_cmdline = 1, have_run_cmdline = 0;
#ifdef DEBUG
int mptest = 0;
#endif /* DEBUG */
char *cur_heap = heap, *cur_entry = script, *old_entry; char *cur_heap = heap, *cur_entry = script, *old_entry;
/* initialization */ /* initialization */
@@ -178,7 +191,7 @@ restart:
if (password || errnum == ERR_BOOT_COMMAND) if (password || errnum == ERR_BOOT_COMMAND)
{ {
printf("Press any key to continue..."); printf("Press any key to continue...");
getc(); (void) getc ();
returnit: returnit:
return 0; return 0;
} }
@@ -211,7 +224,7 @@ returnit:
print_error(); print_error();
} }
if (run_cmdline && get_cmdline("command> ", commands, cur_heap, 2048)) if (run_cmdline && get_cmdline(PACKAGE "> ", commands, cur_heap, 2048))
return 1; return 1;
if (substring("boot", cur_heap) == 0 || (script && !*cur_heap)) if (substring("boot", cur_heap) == 0 || (script && !*cur_heap))
@@ -247,9 +260,9 @@ returnit:
if (substring("chainloader", cur_heap) < 1) if (substring("chainloader", cur_heap) < 1)
{ {
if (open(cur_cmdline) && (read(BOOTSEC_LOCATION, SECTOR_SIZE) if (grub_open (cur_cmdline) &&
== SECTOR_SIZE) (grub_read ((char *) BOOTSEC_LOCATION, SECTOR_SIZE) == SECTOR_SIZE) &&
&& (*((unsigned short *) (BOOTSEC_LOCATION+BOOTSEC_SIG_OFFSET)) (*((unsigned short *) (BOOTSEC_LOCATION+BOOTSEC_SIG_OFFSET))
== BOOTSEC_SIGNATURE)) == BOOTSEC_SIGNATURE))
type = 'c'; type = 'c';
else if (!errnum) else if (!errnum)
@@ -301,7 +314,7 @@ returnit:
bcopy(cur_heap, heap, cmd_len + (((int)cur_cmdline) - ((int)cur_heap))); bcopy(cur_heap, heap, cmd_len + (((int)cur_cmdline) - ((int)cur_heap)));
cur_cmdline = heap + (((int)cur_cmdline) - ((int)cur_heap)); cur_cmdline = heap + (((int)cur_cmdline) - ((int)cur_heap));
cur_heap = heap; cur_heap = heap;
if (type = load_image()) if ((type = load_image()) != 0)
cur_heap = cur_cmdline + cmd_len; cur_heap = cur_cmdline + cmd_len;
} }
else if (substring("module", cur_heap) < 1) else if (substring("module", cur_heap) < 1)
@@ -324,7 +337,7 @@ returnit:
} }
else if (type == 'L' || type == 'l') else if (type == 'L' || type == 'l')
{ {
load_initrd(); load_initrd ();
} }
else else
errnum = ERR_NEED_MB_KERNEL; errnum = ERR_NEED_MB_KERNEL;
@@ -333,16 +346,16 @@ returnit:
{ {
if (type == 'L' || type == 'l') if (type == 'L' || type == 'l')
{ {
load_initrd(); load_initrd ();
} }
else else
errnum = ERR_NEED_LX_KERNEL; errnum = ERR_NEED_LX_KERNEL;
} }
else if (substring("install", cur_heap) < 1) else if (substring("install", cur_heap) < 1)
{ {
char *stage1_file = cur_cmdline, *dest_dev, *file, *addr, *config_file; char *stage1_file = cur_cmdline, *dest_dev, *file, *addr;
char buffer[SECTOR_SIZE], old_sect[SECTOR_SIZE]; char buffer[SECTOR_SIZE], old_sect[SECTOR_SIZE];
int i = BOOTSEC_LOCATION+STAGE1_FIRSTLIST-4, new_drive = 0xFF; int new_drive = 0xFF;
dest_dev = skip_to(0, stage1_file); dest_dev = skip_to(0, stage1_file);
if (*dest_dev == 'd') if (*dest_dev == 'd')
@@ -350,13 +363,14 @@ returnit:
new_drive = 0; new_drive = 0;
dest_dev = skip_to(0, dest_dev); dest_dev = skip_to(0, dest_dev);
} }
file = skip_to(0, dest_dev); file = skip_to (0, dest_dev);
addr = skip_to(0, file); addr = skip_to (0, file);
if (safe_parse_maxint(&addr, &installaddr) && open(stage1_file) if (safe_parse_maxint (&addr, &installaddr) &&
&& read((int)buffer, SECTOR_SIZE) == SECTOR_SIZE grub_open (stage1_file) &&
&& set_device(dest_dev) && open_partition() grub_read (buffer, SECTOR_SIZE) == SECTOR_SIZE &&
&& devread(0, 0, SECTOR_SIZE, (int)old_sect)) set_device (dest_dev) && open_partition () &&
devread (0, 0, SECTOR_SIZE, old_sect))
{ {
int dest_drive = current_drive, dest_geom = buf_geom; int dest_drive = current_drive, dest_geom = buf_geom;
int dest_sector = part_start, i; int dest_sector = part_start, i;
@@ -383,7 +397,7 @@ returnit:
{ {
errnum = ERR_BAD_VERSION; errnum = ERR_BAD_VERSION;
} }
else if (open(file)) else if (grub_open (file))
{ {
if (!new_drive) if (!new_drive)
new_drive = current_drive; new_drive = current_drive;
@@ -415,7 +429,8 @@ returnit:
installlist = BOOTSEC_LOCATION+STAGE1_FIRSTLIST+4; installlist = BOOTSEC_LOCATION+STAGE1_FIRSTLIST+4;
debug_fs = debug_fs_blocklist_func; debug_fs = debug_fs_blocklist_func;
if (!errnum && read(SCRATCHADDR, SECTOR_SIZE) == SECTOR_SIZE) if (!errnum &&
grub_read ((char *) SCRATCHADDR, SECTOR_SIZE) == SECTOR_SIZE)
{ {
if (*((long *)SCRATCHADDR) != 0x8070ea if (*((long *)SCRATCHADDR) != 0x8070ea
|| (*((short *)(SCRATCHADDR+STAGE2_VER_MAJ_OFFS)) || (*((short *)(SCRATCHADDR+STAGE2_VER_MAJ_OFFS))
@@ -442,10 +457,10 @@ returnit:
write_stage2_sect++; write_stage2_sect++;
while (*(str++)); /* find string */ while (*(str++)); /* find string */
while (*(str++) = *(ptr++)); /* do copy */ while ((*(str++) = *(ptr++)) != 0); /* do copy */
} }
read(0x100000, -1); grub_read ((char *) 0x100000, -1);
buf_track = -1; buf_track = -1;
@@ -468,14 +483,19 @@ returnit:
no_decompression = 0; no_decompression = 0;
#endif #endif
} }
/* Error running the install script, so drop to command line. */
if (script)
{
fallback = -1; fallback = -1;
return 1; return 1;
} }
}
#ifdef DEBUG #ifdef DEBUG
else if (substring("testload", cur_heap) < 1) else if (substring("testload", cur_heap) < 1)
{ {
type = 0; type = 0;
if (open(cur_cmdline)) if (grub_open (cur_cmdline))
{ {
int i; int i;
@@ -488,7 +508,7 @@ returnit:
/* read whole file first */ /* read whole file first */
printf("Whole file: "); printf("Whole file: ");
read(0x100000, -1); grub_read ((char *) 0x100000, -1);
/* now compare two sections of the file read differently */ /* now compare two sections of the file read differently */
@@ -502,23 +522,23 @@ returnit:
printf("\nPartial read 1: "); printf("\nPartial read 1: ");
filepos = 0; filepos = 0;
read(0x200000, 0x7); grub_read ((char *) 0x200000, 0x7);
read(0x200007, 0x100); grub_read ((char *) 0x200007, 0x100);
read(0x200107, 0x10); grub_read ((char *) 0x200107, 0x10);
read(0x200117, 0x999); grub_read ((char *) 0x200117, 0x999);
read(0x200ab0, 0x10); grub_read ((char *) 0x200ab0, 0x10);
read(0x200ac0, 0x10000); grub_read ((char *) 0x200ac0, 0x10000);
/* second partial read */ /* second partial read */
printf("\nPartial read 2: "); printf("\nPartial read 2: ");
filepos = 0; filepos = 0;
read(0x300000, 0x10000); grub_read ((char *) 0x300000, 0x10000);
read(0x310000, 0x10); grub_read ((char *) 0x310000, 0x10);
read(0x310010, 0x7); grub_read ((char *) 0x310010, 0x7);
read(0x310017, 0x10); grub_read ((char *) 0x310017, 0x10);
read(0x310027, 0x999); grub_read ((char *) 0x310027, 0x999);
read(0x3109c0, 0x100); grub_read ((char *) 0x3109c0, 0x100);
printf("\nHeader1 = 0x%x, next = 0x%x, next = 0x%x, next = 0x%x\n", printf("\nHeader1 = 0x%x, next = 0x%x, next = 0x%x, next = 0x%x\n",
*((int *)0x200000), *((int *)0x200004), *((int *)0x200008), *((int *)0x200000), *((int *)0x200004), *((int *)0x200008),
@@ -564,7 +584,8 @@ returnit:
{ {
if (get_eisamemsize() != -1) if (get_eisamemsize() != -1)
printf(" EISA Memory BIOS Interface is present\n"); printf(" EISA Memory BIOS Interface is present\n");
if (get_mem_map(SCRATCHADDR, 0) != 0 || *((int *) SCRATCHADDR) != 0) if (get_mmap_entry ((void *) SCRATCHADDR, 0) != 0 ||
*((int *) SCRATCHADDR) != 0)
printf(" Address Map BIOS Interface is present\n"); printf(" Address Map BIOS Interface is present\n");
printf(" Lower memory: %uK, Upper memory (to first chipset hole): %uK\n", printf(" Lower memory: %uK, Upper memory (to first chipset hole): %uK\n",
+6 -5
View File
@@ -1,6 +1,8 @@
/* common.c - miscellaneous shared variables and routines */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -17,11 +19,8 @@
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/ */
#define _COMMON_C
#include "shared.h" #include "shared.h"
/* /*
* Shared BIOS/boot data. * Shared BIOS/boot data.
*/ */
@@ -35,7 +34,7 @@ unsigned long saved_mem_upper;
* Error code stuff. * Error code stuff.
*/ */
int errnum = 0; grub_error_t errnum = ERR_NONE;
#ifndef STAGE1_5 #ifndef STAGE1_5
@@ -93,7 +92,9 @@ static struct AddrRangeDesc fakemap[3] =
void void
init_bios_info (void) init_bios_info (void)
{ {
#ifndef STAGE1_5
int cont, memtmp, addr; int cont, memtmp, addr;
#endif
/* /*
* Get information from BIOS on installed RAM. * Get information from BIOS on installed RAM.
@@ -125,7 +126,7 @@ init_bios_info (void)
do do
{ {
cont = get_mem_map (addr, cont); cont = get_mmap_entry ((void *) addr, cont);
/* If the returned buffer's base is zero, quit. */ /* If the returned buffer's base is zero, quit. */
if (!*((int *) addr)) if (!*((int *) addr))
+57 -33
View File
@@ -1,3 +1,4 @@
/* disk_io.c - implement abstract BIOS disk input and output */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
@@ -19,20 +20,35 @@
*/ */
#define _DISK_IO_C
#include "shared.h" #include "shared.h"
#include "filesys.h" #include "filesys.h"
/* XXX for evil hack */
#include "freebsd.h"
#ifndef STAGE1_5 #ifndef STAGE1_5
/* instrumentation variables */ /* instrumentation variables */
void (*debug_fs) (int) = NULL; void (*debug_fs) (int) = NULL;
void (*debug_fs_func) (int) = NULL; void (*debug_fs_func) (int) = NULL;
#endif /* STAGE1_5 */
int print_possibilities;
#endif
int fsmax;
struct fsys_entry fsys_table[NUM_FSYS + 1] =
{
# ifdef FSYS_FAT
{"fat", fat_mount, 0, fat_dir},
# endif
# ifdef FSYS_EXT2FS
{"ext2fs", ext2fs_mount, ext2fs_read, ext2fs_dir},
# endif
/* XX FFS should come last as it's superblock is commonly crossing tracks
on floppies from track 1 to 2, while others only use 1. */
# ifdef FSYS_FFS
{"ffs", ffs_mount, ffs_read, ffs_dir},
# endif
{0, 0, 0, 0}
};
/* These have the same format as "boot_drive" and "install_partition", but /* These have the same format as "boot_drive" and "install_partition", but
are meant to be working values. */ are meant to be working values. */
@@ -43,7 +59,8 @@ unsigned long current_partition;
* Global variables describing details of the filesystem * Global variables describing details of the filesystem
*/ */
/* XXX BSD evil hack */ /* FIXME: BSD evil hack */
#include "freebsd.h"
int bsd_evil_hack; int bsd_evil_hack;
/* filesystem type */ /* filesystem type */
@@ -69,9 +86,9 @@ int filemax;
int int
rawread (int drive, int sector, int byte_offset, int byte_len, int addr) rawread (int drive, int sector, int byte_offset, int byte_len, char *buf)
{ {
int slen = (byte_offset + byte_len + 511) / SECTOR_SIZE; int slen = (byte_offset + byte_len + SECTOR_SIZE - 1) / SECTOR_SIZE;
if (byte_len <= 0) if (byte_len <= 0)
return 1; return 1;
@@ -119,8 +136,9 @@ rawread (int drive, int sector, int byte_offset, int byte_len, int addr)
bufaddr = BUFFERADDR + byte_offset; bufaddr = BUFFERADDR + byte_offset;
} }
if (bios_err = biosdisk (BIOSDISK_READ, drive, buf_geom, bios_err = biosdisk (BIOSDISK_READ, drive, buf_geom,
read_start, read_len, BUFFERSEG)) read_start, read_len, BUFFERSEG);
if (bios_err)
{ {
buf_track = -1; buf_track = -1;
@@ -161,9 +179,9 @@ rawread (int drive, int sector, int byte_offset, int byte_len, int addr)
if (size > ((num_sect * SECTOR_SIZE) - byte_offset)) if (size > ((num_sect * SECTOR_SIZE) - byte_offset))
size = (num_sect * SECTOR_SIZE) - byte_offset; size = (num_sect * SECTOR_SIZE) - byte_offset;
bcopy ((char *) bufaddr, (char *) addr, size); bcopy ((char *) bufaddr, buf, size);
addr += size; buf += size;
byte_len -= size; byte_len -= size;
sector += num_sect; sector += num_sect;
slen -= num_sect; slen -= num_sect;
@@ -175,7 +193,7 @@ rawread (int drive, int sector, int byte_offset, int byte_len, int addr)
int int
devread (int sector, int byte_offset, int byte_len, int addr) devread (int sector, int byte_offset, int byte_len, char *buf)
{ {
/* /*
* Check partition boundaries * Check partition boundaries
@@ -202,7 +220,7 @@ devread (int sector, int byte_offset, int byte_len, int addr)
#endif /* !STAGE1_5 && DEBUG */ #endif /* !STAGE1_5 && DEBUG */
/* /*
* Call "rawread", which is very similar, but: * Call RAWREAD, which is very similar, but:
* *
* -- It takes an extra parameter, the drive number. * -- It takes an extra parameter, the drive number.
* -- It requires that "sector" is relative to the beginning * -- It requires that "sector" is relative to the beginning
@@ -211,11 +229,12 @@ devread (int sector, int byte_offset, int byte_len, int addr)
* sector. * sector.
*/ */
return rawread (current_drive, part_start + sector, byte_offset, return rawread (current_drive, part_start + sector, byte_offset,
byte_len, addr); byte_len, buf);
} }
int #if !defined(STAGE1_5) || !defined(NO_BLOCK_FILES)
static int
sane_partition (void) sane_partition (void)
{ {
if (!(current_partition & 0xFF000000uL) if (!(current_partition & 0xFF000000uL)
@@ -230,8 +249,10 @@ sane_partition (void)
errnum = ERR_DEV_VALUES; errnum = ERR_DEV_VALUES;
return 0; return 0;
} }
#endif /* !defined(STAGE1_5) || !defined(NO_BLOCK_FILES) */
#ifndef STAGE1_5
static void static void
attempt_mount (void) attempt_mount (void)
{ {
@@ -241,6 +262,7 @@ attempt_mount (void)
if (fsys_type == NUM_FSYS && errnum == ERR_NONE) if (fsys_type == NUM_FSYS && errnum == ERR_NONE)
errnum = ERR_FSYS_MOUNT; errnum = ERR_FSYS_MOUNT;
} }
#endif /* STAGE1_5 */
#ifndef STAGE1_5 #ifndef STAGE1_5
@@ -257,7 +279,7 @@ make_saved_active (void)
return 0; return 0;
} }
if (!rawread (saved_drive, 0, 0, SECTOR_SIZE, SCRATCHADDR)) if (!rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR))
return 0; return 0;
if (PC_SLICE_FLAG (SCRATCHADDR, part) != PC_SLICE_FLAG_BOOTABLE) if (PC_SLICE_FLAG (SCRATCHADDR, part) != PC_SLICE_FLAG_BOOTABLE)
@@ -297,6 +319,7 @@ check_and_print_mount (void)
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
#if !defined(STAGE1_5) || !defined(NO_BLOCK_FILES)
static int static int
check_BSD_parts (int flags) check_BSD_parts (int flags)
{ {
@@ -310,7 +333,7 @@ check_BSD_parts (int flags)
} }
if (!rawread (current_drive, part_start + BSD_LABEL_SECTOR, if (!rawread (current_drive, part_start + BSD_LABEL_SECTOR,
0, SECTOR_SIZE, (int) label_buf)) 0, SECTOR_SIZE, label_buf))
return 0; return 0;
if (BSD_LABEL_CHECK_MAG (label_buf)) if (BSD_LABEL_CHECK_MAG (label_buf))
@@ -319,7 +342,7 @@ check_BSD_parts (int flags)
{ {
if (BSD_PART_TYPE (label_buf, part_no)) if (BSD_PART_TYPE (label_buf, part_no))
{ {
/* XXX should do BAD144 sector remapping setup here */ /* FIXME: should do BAD144 sector remapping setup here */
current_slice = ((BSD_PART_TYPE (label_buf, part_no) << 8) current_slice = ((BSD_PART_TYPE (label_buf, part_no) << 8)
| PC_SLICE_TYPE_BSD); | PC_SLICE_TYPE_BSD);
@@ -360,6 +383,7 @@ check_BSD_parts (int flags)
errnum = ERR_BAD_PART_TABLE; errnum = ERR_BAD_PART_TABLE;
return 0; return 0;
} }
#endif /* !defined(STAGE1_5) || !defined(NO_BLOCK_FILES) */
#if !defined(STAGE1_5) || !defined(NO_BLOCK_FILES) #if !defined(STAGE1_5) || !defined(NO_BLOCK_FILES)
@@ -369,14 +393,14 @@ static int
real_open_partition (int flags) real_open_partition (int flags)
{ {
char mbr_buf[SECTOR_SIZE]; char mbr_buf[SECTOR_SIZE];
int i, part_no, slice_no, ext = 0, part_offset = 0; int i, part_no, slice_no, ext = 0;
/* /*
* The "rawread" is probably unnecessary here, but it is good to * The "rawread" is probably unnecessary here, but it is good to
* know it works. * know it works.
*/ */
if (!sane_partition () if (!sane_partition ()
|| !rawread (current_drive, 0, 0, SECTOR_SIZE, (int) mbr_buf)) || !rawread (current_drive, 0, 0, SECTOR_SIZE, mbr_buf))
return 0; return 0;
bsd_evil_hack = 0; bsd_evil_hack = 0;
@@ -404,7 +428,7 @@ real_open_partition (int flags)
while (slice_no < 255 && ext >= 0 while (slice_no < 255 && ext >= 0
&& (part_no == 0xFF || slice_no <= part_no) && (part_no == 0xFF || slice_no <= part_no)
&& rawread (current_drive, part_offset, && rawread (current_drive, part_offset,
0, SECTOR_SIZE, (int) mbr_buf)) 0, SECTOR_SIZE, mbr_buf))
{ {
/* /*
* If the table isn't valid, we can't continue * If the table isn't valid, we can't continue
@@ -512,7 +536,7 @@ real_open_partition (int flags)
if (current_partition == 0xFFFFFF if (current_partition == 0xFFFFFF
|| current_partition == 0xFF00FF) || current_partition == 0xFF00FF)
{ {
current_partition == 0xFFFFFF; current_partition = 0xFFFFFF;
ext = -2; ext = -2;
} }
} }
@@ -648,7 +672,7 @@ set_device (char *device)
/* A Mach-style absolute partition name. */ /* A Mach-style absolute partition name. */
ch = *device; ch = *device;
if (*device != 'f' && *device != 'h' || if ((*device != 'f' && *device != 'h') ||
(device += 2, (*(device - 1) != 'd'))) (device += 2, (*(device - 1) != 'd')))
errnum = ERR_DEV_FORMAT; errnum = ERR_DEV_FORMAT;
else else
@@ -768,7 +792,7 @@ set_bootdev (int hdbias)
else if ((saved_partition >> 16) == 0xFF) else if ((saved_partition >> 16) == 0xFF)
i = 0; i = 0;
/* XXX extremely evil hack!!! */ /* FIXME: extremely evil hack!!! */
j = 2; j = 2;
if (saved_drive & 0x80) if (saved_drive & 0x80)
j = bsd_evil_hack; j = bsd_evil_hack;
@@ -927,7 +951,7 @@ print_completions (char *filename)
*/ */
int int
open (char *filename) grub_open (char *filename)
{ {
#ifndef NO_DECOMPRESSION #ifndef NO_DECOMPRESSION
compressed_file = 0; compressed_file = 0;
@@ -946,7 +970,7 @@ open (char *filename)
block_file = 0; block_file = 0;
#endif /* NO_BLOCK_FILES */ #endif /* NO_BLOCK_FILES */
/* XXX to account for partial filesystem implementations! */ /* This accounts for partial filesystem implementations. */
fsmax = MAXINT; fsmax = MAXINT;
if (*filename != '/') if (*filename != '/')
@@ -1039,7 +1063,7 @@ open (char *filename)
int int
read (int addr, int len) grub_read (char *buf, int len)
{ {
/* Make sure "filepos" is a sane value */ /* Make sure "filepos" is a sane value */
if ((filepos < 0) | (filepos > filemax)) if ((filepos < 0) | (filepos > filemax))
@@ -1060,7 +1084,7 @@ read (int addr, int len)
#ifndef NO_DECOMPRESSION #ifndef NO_DECOMPRESSION
if (compressed_file) if (compressed_file)
return gunzip_read (addr, len); return gunzip_read (buf, len);
#endif /* NO_DECOMPRESSION */ #endif /* NO_DECOMPRESSION */
#ifndef NO_BLOCK_FILES #ifndef NO_BLOCK_FILES
@@ -1109,7 +1133,7 @@ read (int addr, int len)
/* read current block and put it in the right place in memory */ /* read current block and put it in the right place in memory */
devread (BLK_BLKSTART (BLK_CUR_BLKLIST) + BLK_CUR_BLKNUM, devread (BLK_BLKSTART (BLK_CUR_BLKLIST) + BLK_CUR_BLKNUM,
off, size, addr); off, size, buf);
#ifndef STAGE1_5 #ifndef STAGE1_5
debug_fs_func = NULL; debug_fs_func = NULL;
@@ -1118,7 +1142,7 @@ read (int addr, int len)
len -= size; len -= size;
filepos += size; filepos += size;
ret += size; ret += size;
addr += size; buf += size;
} }
if (errnum) if (errnum)
@@ -1134,7 +1158,7 @@ read (int addr, int len)
return 0; return 0;
} }
return (*(fsys_table[fsys_type].read_func)) (addr, len); return (*(fsys_table[fsys_type].read_func)) (buf, len);
} }
+7 -35
View File
@@ -1,7 +1,8 @@
/* filesys.h - abstract filesystem interface */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -37,7 +38,7 @@
#ifdef FSYS_FFS #ifdef FSYS_FFS
#define FSYS_FFS_NUM 1 #define FSYS_FFS_NUM 1
int ffs_mount (void); int ffs_mount (void);
int ffs_read (int addr, int len); int ffs_read (char *buf, int len);
int ffs_dir (char *dirname); int ffs_dir (char *dirname);
#else #else
#define FSYS_FFS_NUM 0 #define FSYS_FFS_NUM 0
@@ -58,7 +59,7 @@ int fat_dir (char *dirname);
#ifdef FSYS_EXT2FS #ifdef FSYS_EXT2FS
#define FSYS_EXT2FS_NUM 1 #define FSYS_EXT2FS_NUM 1
int ext2fs_mount (void); int ext2fs_mount (void);
int ext2fs_read (int addr, int len); int ext2fs_read (char *buf, int len);
int ext2fs_dir (char *dirname); int ext2fs_dir (char *dirname);
#else #else
#define FSYS_EXT2FS_NUM 0 #define FSYS_EXT2FS_NUM 0
@@ -86,44 +87,15 @@ struct fsys_entry
{ {
char *name; char *name;
int (*mount_func) (void); int (*mount_func) (void);
int (*read_func) (int addr, int len); int (*read_func) (char *buf, int len);
int (*dir_func) (char *dirname); int (*dir_func) (char *dirname);
}; };
#ifdef STAGE1_5 #ifdef STAGE1_5
# define print_possibilities 0 # define print_possibilities 0
#endif #else
#ifndef _DISK_IO_C
# ifndef STAGE1_5
extern int print_possibilities; extern int print_possibilities;
# endif #endif
extern int fsmax; extern int fsmax;
extern struct fsys_entry fsys_table[NUM_FSYS + 1]; extern struct fsys_entry fsys_table[NUM_FSYS + 1];
#else /* _DISK_IO_C */
# ifndef STAGE1_5
int print_possibilities;
# endif
int fsmax;
struct fsys_entry fsys_table[NUM_FSYS + 1] =
{
# ifdef FSYS_FAT
{"fat", fat_mount, 0, fat_dir},
# endif
# ifdef FSYS_EXT2FS
{"ext2fs", ext2fs_mount, ext2fs_read, ext2fs_dir},
# endif
/* XX FFS should come last as it's superblock is commonly crossing tracks
on floppies from track 1 to 2, while others only use 1. */
# ifdef FSYS_FFS
{"ffs", ffs_mount, ffs_read, ffs_dir},
# endif
{0, 0, 0, 0}
};
#endif /* _DISK_IO_C */
+14 -16
View File
@@ -238,7 +238,7 @@ struct ext2_dir_entry
* ffz = Find First Zero in word. Undefined if no zero exists, * ffz = Find First Zero in word. Undefined if no zero exists,
* so code should check against ~0UL first.. * so code should check against ~0UL first..
*/ */
__inline__ unsigned long static __inline__ unsigned long
ffz (unsigned long word) ffz (unsigned long word)
{ {
__asm__ ("bsfl %1,%0" __asm__ ("bsfl %1,%0"
@@ -257,33 +257,31 @@ ext2fs_mount (void)
&& (current_slice != PC_SLICE_TYPE_EXT2FS) && (current_slice != PC_SLICE_TYPE_EXT2FS)
&& (current_slice != (PC_SLICE_TYPE_BSD | (FS_OTHER << 8)))) && (current_slice != (PC_SLICE_TYPE_BSD | (FS_OTHER << 8))))
|| part_length < (SBLOCK + (sizeof (struct ext2_super_block) / DEV_BSIZE)) || part_length < (SBLOCK + (sizeof (struct ext2_super_block) / DEV_BSIZE))
|| !devread (SBLOCK, 0, sizeof (struct ext2_super_block), (int) SUPERBLOCK) || !devread (SBLOCK, 0, sizeof (struct ext2_super_block),
(char *) SUPERBLOCK)
|| SUPERBLOCK->s_magic != EXT2_SUPER_MAGIC) || SUPERBLOCK->s_magic != EXT2_SUPER_MAGIC)
retval = 0; retval = 0;
return retval; return retval;
} }
/* not part of the interface /* Takes a file system block number and reads it into BUFFER. */
takes a file system block number and reads it into area pointed static int
to by buffer */
int
ext2_rdfsb (int fsblock, int buffer) ext2_rdfsb (int fsblock, int buffer)
{ {
#ifdef E2DEBUG #ifdef E2DEBUG
printf ("fsblock %d buffer %d\n", fsblock, buffer); printf ("fsblock %d buffer %d\n", fsblock, buffer);
#endif /* E2DEBUG */ #endif /* E2DEBUG */
return devread (fsblock * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE), 0, return devread (fsblock * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE), 0,
EXT2_BLOCK_SIZE (SUPERBLOCK), (int) buffer); EXT2_BLOCK_SIZE (SUPERBLOCK), (char *) buffer);
} }
/* from /* from
ext2/inode.c:ext2_bmap() ext2/inode.c:ext2_bmap()
*/ */
/* not part of interface /* Maps LOGICAL_BLOCK (the file offset divided by the blocksize) into
maps "logical block" (the file offset div blocksize) into a physical block (the location in the file system) via an inode. */
"physical blocks" (the location in the file system) via an inode */ static int
int
ext2fs_block_map (int logical_block) ext2fs_block_map (int logical_block)
{ {
@@ -387,7 +385,7 @@ ext2fs_block_map (int logical_block)
/* preconditions: all preconds of ext2fs_block_map */ /* preconditions: all preconds of ext2fs_block_map */
int int
ext2fs_read (int addr, int len) ext2fs_read (char *buf, int len)
{ {
int logical_block; int logical_block;
int offset; int offset;
@@ -436,13 +434,13 @@ ext2fs_read (int addr, int len)
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
devread (map * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE), devread (map * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE),
offset, size, addr); offset, size, buf);
#ifndef STAGE1_5 #ifndef STAGE1_5
debug_fs_func = NULL; debug_fs_func = NULL;
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
addr += size; buf += size;
len -= size; len -= size;
filepos += size; filepos += size;
ret += size; ret += size;
@@ -592,7 +590,7 @@ ext2fs_dir (char *dirname)
/* If we've got a symbolic link, then chase it. */ /* If we've got a symbolic link, then chase it. */
if (S_ISLNK (INODE->i_mode)) if (S_ISLNK (INODE->i_mode))
{ {
int len, remaining; int len;
if (++link_count > MAX_LINK_COUNT) if (++link_count > MAX_LINK_COUNT)
{ {
errnum = ERR_SYMLINK_LOOP; errnum = ERR_SYMLINK_LOOP;
@@ -624,7 +622,7 @@ ext2fs_dir (char *dirname)
if (INODE->i_blocks) if (INODE->i_blocks)
{ {
/* Read the necessary blocks, and reset the file pointer. */ /* Read the necessary blocks, and reset the file pointer. */
len = read ((int) linkbuf, filemax); len = grub_read (linkbuf, filemax);
filepos = 0; filepos = 0;
if (!len) if (!len)
return 0; return 0;
+3 -3
View File
@@ -43,7 +43,7 @@ fat_mount (void)
&& (current_slice != PC_SLICE_TYPE_FAT16_LT32M) && (current_slice != PC_SLICE_TYPE_FAT16_LT32M)
&& (current_slice != PC_SLICE_TYPE_FAT16_GT32M) && (current_slice != PC_SLICE_TYPE_FAT16_GT32M)
&& (current_slice != (PC_SLICE_TYPE_BSD | (FS_MSDOS << 8)))) && (current_slice != (PC_SLICE_TYPE_BSD | (FS_MSDOS << 8))))
|| !devread (0, 0, SECTOR_SIZE, BPB) || !devread (0, 0, SECTOR_SIZE, (char *) BPB)
|| FAT_BPB_BYTES_PER_SECTOR (BPB) != SECTOR_SIZE || FAT_BPB_BYTES_PER_SECTOR (BPB) != SECTOR_SIZE
|| FAT_BPB_SECT_PER_CLUST (BPB) < 1 || FAT_BPB_SECT_PER_CLUST (BPB) > 64 || FAT_BPB_SECT_PER_CLUST (BPB) < 1 || FAT_BPB_SECT_PER_CLUST (BPB) > 64
|| (FAT_BPB_SECT_PER_CLUST (BPB) & (FAT_BPB_SECT_PER_CLUST (BPB) - 1)) || (FAT_BPB_SECT_PER_CLUST (BPB) & (FAT_BPB_SECT_PER_CLUST (BPB) - 1))
@@ -112,7 +112,7 @@ fat_create_blocklist (int first_fat_entry)
mapblock = ((new_mapblock < 6) ? 0 : mapblock = ((new_mapblock < 6) ? 0 :
((new_mapblock - 6) & ~0x1FF)); ((new_mapblock - 6) & ~0x1FF));
if (!devread ((mapblock >> 9) + FAT_BPB_FAT_START (BPB), if (!devread ((mapblock >> 9) + FAT_BPB_FAT_START (BPB),
0, SECTOR_SIZE * 4, FAT_BUF)) 0, SECTOR_SIZE * 4, (char *) FAT_BUF))
return 0; return 0;
} }
@@ -196,7 +196,7 @@ loop:
do do
{ {
if (read ((int) dir_buf, FAT_DIRENTRY_LENGTH) != FAT_DIRENTRY_LENGTH) if (grub_read (dir_buf, FAT_DIRENTRY_LENGTH) != FAT_DIRENTRY_LENGTH)
{ {
if (!errnum) if (!errnum)
{ {
+8 -7
View File
@@ -82,7 +82,7 @@ ffs_mount (void)
if ((((current_drive & 0x80) || (current_slice != 0)) if ((((current_drive & 0x80) || (current_slice != 0))
&& current_slice != (PC_SLICE_TYPE_BSD | (FS_BSDFFS << 8))) && current_slice != (PC_SLICE_TYPE_BSD | (FS_BSDFFS << 8)))
|| part_length < (SBLOCK + (SBSIZE / DEV_BSIZE)) || part_length < (SBLOCK + (SBSIZE / DEV_BSIZE))
|| !devread (SBLOCK, 0, SBSIZE, (int) SUPERBLOCK) || !devread (SBLOCK, 0, SBSIZE, (char *) SUPERBLOCK)
|| SUPERBLOCK->fs_magic != FS_MAGIC) || SUPERBLOCK->fs_magic != FS_MAGIC)
retval = 0; retval = 0;
@@ -101,7 +101,7 @@ block_map (int file_block)
if ((bnum = fsbtodb (SUPERBLOCK, INODE->i_ib[0])) != mapblock) if ((bnum = fsbtodb (SUPERBLOCK, INODE->i_ib[0])) != mapblock)
{ {
if (!devread (bnum, 0, SUPERBLOCK->fs_bsize, MAPBUF)) if (!devread (bnum, 0, SUPERBLOCK->fs_bsize, (char *)MAPBUF))
{ {
mapblock = -1; mapblock = -1;
errnum = ERR_FSYS_CORRUPT; errnum = ERR_FSYS_CORRUPT;
@@ -116,7 +116,7 @@ block_map (int file_block)
int int
ffs_read (int addr, int len) ffs_read (char *buf, int len)
{ {
int logno, off, size, map, ret = 0; int logno, off, size, map, ret = 0;
@@ -138,13 +138,13 @@ ffs_read (int addr, int len)
debug_fs_func = debug_fs; debug_fs_func = debug_fs;
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
devread (fsbtodb (SUPERBLOCK, map), off, size, addr); devread (fsbtodb (SUPERBLOCK, map), off, size, buf);
#ifndef STAGE1_5 #ifndef STAGE1_5
debug_fs_func = NULL; debug_fs_func = NULL;
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
addr += size; buf += size;
len -= size; len -= size;
filepos += size; filepos += size;
ret += size; ret += size;
@@ -170,7 +170,7 @@ loop:
/* load current inode (defaults to the root inode) */ /* load current inode (defaults to the root inode) */
if (!devread (fsbtodb (SUPERBLOCK, itod (SUPERBLOCK, ino)), if (!devread (fsbtodb (SUPERBLOCK, itod (SUPERBLOCK, ino)),
0, SUPERBLOCK->fs_bsize, FSYS_BUF)) 0, SUPERBLOCK->fs_bsize, (char *) FSYS_BUF))
return 0; /* XXX what return value? */ return 0; /* XXX what return value? */
bcopy ((void *) &(((struct dinode *) FSYS_BUF)[ino % (SUPERBLOCK->fs_inopb)]), bcopy ((void *) &(((struct dinode *) FSYS_BUF)[ino % (SUPERBLOCK->fs_inopb)]),
@@ -232,7 +232,8 @@ loop:
if ((map = block_map (block)) < 0 if ((map = block_map (block)) < 0
|| !devread (fsbtodb (SUPERBLOCK, map), 0, || !devread (fsbtodb (SUPERBLOCK, map), 0,
blksize (SUPERBLOCK, INODE, block), FSYS_BUF)) blksize (SUPERBLOCK, INODE, block),
(char *) FSYS_BUF))
{ {
errnum = ERR_FSYS_CORRUPT; errnum = ERR_FSYS_CORRUPT;
*rest = ch; *rest = ch;
+10 -10
View File
@@ -1,6 +1,7 @@
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -32,7 +33,6 @@
/* You can do whatever you like with this source file, though I would /* You can do whatever you like with this source file, though I would
prefer that if you modify it and redistribute it that you include prefer that if you modify it and redistribute it that you include
comments to that effect with your name and the date. Thank you. comments to that effect with your name and the date. Thank you.
[The history has been moved to the file ChangeLog.]
*/ */
/* /*
@@ -216,7 +216,7 @@ bad_field (int len)
break; break;
} }
} }
while ((not_retval = read ((int) &ch, 1)) == 1); while ((not_retval = grub_read (&ch, 1)) == 1);
return (!not_retval); return (!not_retval);
} }
@@ -276,7 +276,7 @@ gunzip_test_header (void)
* (other than a real error with the disk) then we don't think it * (other than a real error with the disk) then we don't think it
* is a compressed file, and simply mark it as such. * is a compressed file, and simply mark it as such.
*/ */
if (no_decompression || read ((int) buf, 10) != 10 if (no_decompression || grub_read (buf, 10) != 10
|| ((*((unsigned short *) buf) != GZIP_HDR_LE) || ((*((unsigned short *) buf) != GZIP_HDR_LE)
& (*((unsigned short *) buf) != OLD_GZIP_HDR_LE))) & (*((unsigned short *) buf) != OLD_GZIP_HDR_LE)))
{ {
@@ -291,11 +291,12 @@ gunzip_test_header (void)
*/ */
if (buf[2] != DEFLATED || (buf[3] & UNSUPP_FLAGS) if (buf[2] != DEFLATED || (buf[3] & UNSUPP_FLAGS)
|| ((buf[3] & EXTRA_FIELD) || ((buf[3] & EXTRA_FIELD)
&& (read ((int) buf, 2) != 2 || bad_field (*((unsigned short *) buf)))) && (grub_read (buf, 2) != 2 ||
bad_field (*((unsigned short *) buf))))
|| ((buf[3] & ORIG_NAME) && bad_field (-1)) || ((buf[3] & ORIG_NAME) && bad_field (-1))
|| ((buf[3] & COMMENT) && bad_field (-1)) || ((buf[3] & COMMENT) && bad_field (-1))
|| ((gzip_data_offset = filepos), (filepos = filemax - 8), || ((gzip_data_offset = filepos), (filepos = filemax - 8),
(read ((int) buf, 8) != 8))) (grub_read (buf, 8) != 8)))
{ {
if (!errnum) if (!errnum)
errnum = ERR_BAD_GZIP_HEADER; errnum = ERR_BAD_GZIP_HEADER;
@@ -481,7 +482,7 @@ get_byte (void)
if (filepos == gzip_data_offset || bufloc == INBUFSIZ) if (filepos == gzip_data_offset || bufloc == INBUFSIZ)
{ {
bufloc = 0; bufloc = 0;
read ((int) inbuf, INBUFSIZ); grub_read (inbuf, INBUFSIZ);
} }
return inbuf[bufloc++]; return inbuf[bufloc++];
@@ -1166,9 +1167,8 @@ initialize_tables (void)
int int
gunzip_read (int addr, int len) gunzip_read (char *buf, int len)
{ {
int size; /* last block flag */
int ret = 0; int ret = 0;
compressed_file = 0; compressed_file = 0;
@@ -1200,9 +1200,9 @@ gunzip_read (int addr, int len)
if (size > len) if (size > len)
size = len; size = len;
bcopy (srcaddr, (char *) addr, size); bcopy (srcaddr, buf, size);
addr += size; buf += size;
len -= size; len -= size;
gzip_filepos += size; gzip_filepos += size;
ret += size; ret += size;
+231 -248
View File
@@ -1,7 +1,8 @@
/* shared.h - definitions used in all GRUB-specific code */
/* /*
* GRUB -- GRand Unified Bootloader * GRUB -- GRand Unified Bootloader
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org> * Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
* Copyright (C) 1999 Free Software Foundation, Inc.
* *
* This program is free software; you can redistribute it and/or modify * 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 * it under the terms of the GNU General Public License as published by
@@ -176,109 +177,18 @@ extern char *grub_scratch_mem;
# define KEY_DOWN 0x5000 # define KEY_DOWN 0x5000
# define KEY_IC 0x5200 /* insert char */ # define KEY_IC 0x5200 /* insert char */
# define KEY_DC 0x5300 /* delete char */ # define KEY_DC 0x5300 /* delete char */
# define KEY_BACKSPACE 0x0008
# define KEY_HOME 0x4700 # define KEY_HOME 0x4700
# define KEY_END 0x4F00 # define KEY_END 0x4F00
# define KEY_NPAGE 0x4900 # define KEY_NPAGE 0x4900
# define KEY_PPAGE 0x5100 # define KEY_PPAGE 0x5100
# define A_NORMAL 0x7
# define A_REVERSE 0x70
#else #else
# include <curses.h> # include <curses.h>
#endif #endif
/* Remap some names so that we don't conflict with libc. */ /* Special graphics characters for IBM displays. */
#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
/*
* Below this should be ONLY defines and other constructs for C code.
*/
static inline unsigned char
inb (unsigned short port)
{
unsigned char data;
__asm __volatile ("inb %1,%0":"=a" (data):"d" (port));
return data;
}
static inline void
outb (unsigned short port, unsigned char val)
{
__asm __volatile ("outb %0,%1"::"a" (val), "d" (port));
}
/* multiboot stuff */
#include "mb_header.h"
#include "mb_info.h"
/* this function must be called somewhere... */
void
cmain (void)
__attribute__ ((noreturn));
#undef NULL
#define NULL ((void *) 0)
/*
* From "asm.S"
*/
extern unsigned long install_partition;
extern unsigned long boot_drive;
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));
void chain_stage2 (int segment, int offset) __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));
/* sets it to linear or wired A20 operation */
void gateA20 (int linear);
/* memory probe routines */
int get_memsize (int type);
int get_eisamemsize (void);
int get_mmap_entry (int buf, int cont);
/* low-level timing info */
int getrtsecs (void);
/* low-level character I/O */
void cls (void);
int getxy (void); /* returns packed values, LSB+1 is x, LSB is y */
void gotoxy (int x, int y);
/* displays an ASCII character. IBM displays will translate some
characters to special graphical ones */
#define DISP_UL 218 #define DISP_UL 218
#define DISP_UR 191 #define DISP_UR 191
#define DISP_LL 192 #define DISP_LL 192
@@ -289,58 +199,45 @@ __attribute__ ((noreturn));
#define DISP_RIGHT 0x1a #define DISP_RIGHT 0x1a
#define DISP_UP 0x18 #define DISP_UP 0x18
#define DISP_DOWN 0x19 #define DISP_DOWN 0x19
void putchar (int c);
/* returns packed BIOS/ASCII code */
int getkey (void);
/* returns 0 if non-ASCII character */ /* Remap some libc-API-compatible function names so that we can use
#undef getc them alongside their libc counterparts. */
#define getc() ASCII_CHAR(getkey()) #define bcopy grub_bcopy
#define bzero grub_bzero
/* like 'getkey', but doesn't wait, returns -1 if nothing available */ #define isspace grub_isspace
int checkkey (void); #define printf grub_printf
#undef putchar
/* sets text mode character attribute at the cursor position */ #define putchar grub_putchar
#define ATTRIB_NORMAL 0x7 #define strncat grub_strncat
#define ATTRIB_INVERSE 0x70 #define strstr grub_strstr
void set_attrib (int attr); #define tolower grub_tolower
/* low-level disk I/O */
int get_diskinfo (int drive);
int biosdisk (int read, int drive, int geometry,
int sector, int nsec, int segment);
void stop_floppy (void);
#ifndef ASM_FILE
/* /*
* From "cmdline.c" * Below this should be ONLY defines and other constructs for C code.
*/ */
#ifndef _CMDLINE_C /* multiboot stuff */
extern int fallback; #include "mb_header.h"
extern char *password; #include "mb_info.h"
extern char commands[];
#endif /* _CMDLINE_C */ /* Memory map address range descriptor used by GET_MMAP_ENTRY. */
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. */
};
char *skip_to (int after_equal, char *cmdline); #undef NULL
void init_cmdline (void); #define NULL ((void *) 0)
int enter_cmdline (char *script, char *heap);
/* Error codes (descriptions are in common.c) */
/* typedef enum
* From "char_io.c" {
*/
#ifndef _CHAR_IO_C
int special_attribute;
#endif /* _CHAR_IO_C */
enum grub_error_t
{
ERR_NONE = 0, ERR_NONE = 0,
ERR_BAD_FILENAME, ERR_BAD_FILENAME,
ERR_BAD_FILETYPE, ERR_BAD_FILETYPE,
@@ -373,144 +270,230 @@ __attribute__ ((noreturn));
ERR_WRITE, ERR_WRITE,
MAX_ERR_NUM MAX_ERR_NUM
}; } grub_error_t;
void init_page (void); extern unsigned long install_partition;
void print_error (void); extern unsigned long boot_drive;
char *convert_to_ascii (char *buf, int c,...); extern char version_string[];
void grub_printf (char *format,...); extern char config_file[];
int get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen);
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 *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);
int safe_parse_maxint (char **str_ptr, int *myint_ptr);
int memcheck (int start, int len);
#ifndef STAGE1_5
/* GUI interface variables. */
extern int fallback;
extern char *password;
extern char commands[];
#endif
/* #ifndef NO_DECOMPRESSION
* From "gunzip.c" extern int no_decompression;
*/ extern int compressed_file;
#endif
#ifndef _GUNZIP_C
extern int no_decompression;
extern int compressed_file;
#endif /* _GUNZIP_C */
int gunzip_test_header (void);
int gunzip_read (int addr, int len);
/*
* From "disk_io.c"
*/
#ifndef _DISK_IO_C
#ifndef STAGE1_5 #ifndef STAGE1_5
/* instrumentation variables */ /* instrumentation variables */
extern void (*debug_fs) (int); extern void (*debug_fs) (int);
extern void (*debug_fs_func) (int); extern void (*debug_fs_func) (int);
#endif /* STAGE1_5 */ #endif /* STAGE1_5 */
extern unsigned long current_drive; extern unsigned long current_drive;
extern unsigned long current_partition; extern unsigned long current_partition;
extern int fsys_type; extern int fsys_type;
#ifndef NO_BLOCK_FILES #ifndef NO_BLOCK_FILES
extern int block_file; extern int block_file;
#endif /* NO_BLOCK_FILES */ #endif /* NO_BLOCK_FILES */
extern long part_start; extern long part_start;
extern long part_length; extern long part_length;
extern int current_slice; extern int current_slice;
extern int buf_drive; extern int buf_drive;
extern int buf_track; extern int buf_track;
extern int buf_geom; extern int buf_geom;
/* these are the current file position and maximum file position */ /* these are the current file position and maximum file position */
extern int filepos; extern int filepos;
extern int filemax; extern int filemax;
#endif /* _DISK_IO_C */
int rawread (int drive, int sector, int byte_offset, int byte_len, int addr);
int devread (int sector, int byte_offset, int byte_len, int addr);
char *set_device (char *device); /* this gets a device from the string and
places it into the global parameters */
int open_device (void);
int make_saved_active (void); /* sets the active partition to the that
represented by the "saved_" parameters */
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 */
int set_bootdev (int hdbias);
void print_fsys_type (void); /* this prints stats on the currently
mounted filesystem */
void print_completions (char *filename); /* this prints device and filename
completions */
void copy_current_part_entry (int addr); /* copies the current partition data
to the desired address */
/*
* From "boot.c"
*/
/* for the entry address */
typedef void
(*entry_func) (int, int, int, int, int, int) __attribute__ ((noreturn));
#ifndef _BOOT_C
extern char *cur_cmdline;
extern entry_func entry_addr;
#endif /* _BOOT_C */
void bsd_boot (int type, int bootdev) __attribute__ ((noreturn));
int load_image (void);
int load_module (void);
/*
* From "common.c"
*/
#ifndef _COMMON_C
/* /*
* Common BIOS/boot data. * Common BIOS/boot data.
*/ */
extern struct multiboot_info mbi; extern struct multiboot_info mbi;
extern unsigned long saved_drive; extern unsigned long saved_drive;
extern unsigned long saved_partition; extern unsigned long saved_partition;
extern unsigned long saved_mem_upper; extern unsigned long saved_mem_upper;
/* /*
* Error variables. * Error variables.
*/ */
extern int errnum; extern grub_error_t errnum;
extern char *err_list[]; extern char *err_list[];
#endif /* _COMMON_C */ /* Simplify declaration of entry_addr. */
typedef void (*entry_func) (int, int, int, int, int, int)
__attribute__ ((noreturn));
void init_bios_info (void) __attribute__ ((noreturn)); /* Maximum command line size. Before you blindly increase this value,
see the comment in char_io.c (get_cmdline). */
#define MAX_CMDLINE 1600
#define NEW_HEAPSIZE 1500
extern char *cur_cmdline;
extern entry_func entry_addr;
/* Enter the stage1.5/stage2 C code after the stack is set up. */
void cmain (void) __attribute__ ((noreturn));
/* Halt the processor (called after an unrecoverable error). */
void stop (void) __attribute__ ((noreturn));
/* calls for direct boot-loader chaining */
void chain_stage1 (int segment, int offset, int part_table_addr)
__attribute__ ((noreturn));
void chain_stage2 (int segment, int offset) __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));
/* If LINEAR is nonzero, then set the Intel processor to linear mode.
Otherwise, bit 20 of all memory accesses is always forced to zero,
causing a wraparound effect for bugwards compatibility with the
8086 CPU. */
void gateA20 (int linear);
/* memory probe routines */
int get_memsize (int type);
int get_eisamemsize (void);
/* 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_mmap_entry (struct mmar_desc *desc, int cont);
/* Return the data area immediately following our code. */
int get_code_end (void);
/* low-level timing info */
int getrtsecs (void);
/* Clear the screen. */
void cls (void);
/* Get the current cursor position (where 0,0 is the top left hand
corner of the screen). Returns packed values, (RET >> 8) is x,
(RET & 0xff) is y. */
int getxy (void);
/* Set the cursor position. */
void gotoxy (int x, int y);
/* Displays an ASCII character. IBM displays will translate some
characters to special graphical ones (see the DISP_* constants). */
void putchar (int c);
/* Wait for a keypress, and return its packed BIOS/ASCII key code.
Use ASCII_CHAR(ret) to extract the ASCII code. */
int getkey (void);
/* returns 0 if non-ASCII character */
#undef getc
#define getc() ASCII_CHAR (getkey ())
/* Like GETKEY, but doesn't block, and returns -1 if no keystroke is
available. */
int checkkey (void);
/* Sets text mode character attribute at the cursor position. See A_*
constants defined above. */
void set_attrib (int attr);
/* Low-level disk I/O */
int get_diskinfo (int drive);
int biosdisk (int read, int drive, int geometry,
int sector, int nsec, int segment);
void stop_floppy (void);
/* Command-line interface functions. */
#ifndef STAGE1_5
char *skip_to (int after_equal, char *cmdline);
void init_cmdline (void);
int enter_cmdline (char *script, char *heap);
#endif
/* C library replacement functions with identical semantics. */
void grub_printf (char *format,...);
int grub_tolower (int c);
int grub_isspace (int c);
int grub_strncat (char *s1, char *s2, int n);
int grub_bcopy (char *from, char *to, int len);
int grub_bzero (char *start, int len);
char *grub_strstr (char *s1, char *s2);
/* misc */
void init_page (void);
void print_error (void);
char *convert_to_ascii (char *buf, int c,...);
int get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen);
int substring (char *s1, char *s2);
int get_based_digit (int c, int base);
int safe_parse_maxint (char **str_ptr, int *myint_ptr);
int memcheck (int start, int len);
#ifndef NO_DECOMPRESSION
/* Compression support. */
int gunzip_test_header (void);
int gunzip_read (char *buf, int len);
#endif /* NO_DECOMPRESSION */
int rawread (int drive, int sector, int byte_offset, int byte_len, char *buf);
int devread (int sector, int byte_offset, int byte_len, char *buf);
/* Parse a device string and initialize the global parameters. */
char *set_device (char *device);
int open_device (void);
int open_partition (void);
/* Sets device to the one represented by the SAVED_* parameters. */
int make_saved_active (void);
/* Open a file or directory on the active device, using GRUB's
internal filesystem support. */
int grub_open (char *filename);
/* Read LEN bytes into BUF from the file that was opened with
GRUB_OPEN. If LEN is -1, read all the remaining data in the file */
int grub_read (char *buf, int len);
/* List the contents of the directory that was opened with GRUB_OPEN,
printing all completions. */
int dir (char *dirname);
int set_bootdev (int hdbias);
/* Display statistics on the current active device. */
void print_fsys_type (void);
/* Display device and filename completions. */
void print_completions (char *filename);
/* Copies the current partition data to the desired address. */
void copy_current_part_entry (char *buf);
void bsd_boot (int type, int bootdev) __attribute__ ((noreturn));
int load_image (void);
int load_module (void);
int load_initrd (void);
void init_bios_info (void) __attribute__ ((noreturn));
#endif /* ASM_FILE */ #endif /* ASM_FILE */
+1 -2
View File
@@ -227,8 +227,7 @@ get_checksum (unsigned start, int length)
static int static int
boot_cpu (imps_processor * proc) boot_cpu (imps_processor * proc)
{ {
int apicid = proc->apic_id; unsigned bootaddr, accept_status;
unsigned bootaddr, send_status, accept_status, cfg;
unsigned bios_reset_vector = PHYS_TO_VIRTUAL (BIOS_RESET_VECTOR); unsigned bios_reset_vector = PHYS_TO_VIRTUAL (BIOS_RESET_VECTOR);
/* %%%%% ESB */ /* %%%%% ESB */
+1 -1
View File
@@ -29,7 +29,7 @@ cmain (void)
* Here load the true second-stage boot-loader. * Here load the true second-stage boot-loader.
*/ */
if (open (config_file) && read (0x8000, -1)) if (grub_open (config_file) && grub_read ((char *) 0x8000, -1))
chain_stage2 (0, 0x8000); chain_stage2 (0, 0x8000);
/* /*
+35 -35
View File
@@ -19,7 +19,7 @@
#include "../shared_src/shared.h" #include "../shared_src/shared.h"
char * static char *
get_entry(char *list, int num, int nested) get_entry(char *list, int num, int nested)
{ {
int i; int i;
@@ -37,7 +37,7 @@ get_entry(char *list, int num, int nested)
} }
void static void
print_entries(int y, int size, int first, char *menu_entries) print_entries(int y, int size, int first, char *menu_entries)
{ {
int i; int i;
@@ -84,7 +84,7 @@ print_entries(int y, int size, int first, char *menu_entries)
} }
void static void
print_border(int y, int size) print_border(int y, int size)
{ {
int i; int i;
@@ -118,15 +118,15 @@ print_border(int y, int size)
putchar(DISP_LR); putchar(DISP_LR);
} }
void static void
set_line(int y, int attr) set_line(int y, int attr)
{ {
int x; int x;
for (x = 2; x < 75; x++) for (x = 2; x < 75; x++)
{ {
gotoxy(x, y); gotoxy (x, y);
set_attrib(attr); set_attrib (attr);
} }
} }
@@ -134,7 +134,7 @@ set_line(int y, int attr)
static int grub_timeout; static int grub_timeout;
void static void
run_menu(char *menu_entries, char *config_entries, int num_entries, run_menu(char *menu_entries, char *config_entries, int num_entries,
char *heap, int entryno) char *heap, int entryno)
{ {
@@ -179,7 +179,7 @@ restart:
print_entries(3, 12, first_entry, menu_entries); print_entries(3, 12, first_entry, menu_entries);
/* invert initial line */ /* invert initial line */
set_line(4+entryno, 0x70); set_line (4 + entryno, A_REVERSE);
/* XX using RT clock now, need to initialize value */ /* XX using RT clock now, need to initialize value */
while ((time1 = getrtsecs()) == 0xFF); while ((time1 = getrtsecs()) == 0xFF);
@@ -222,15 +222,15 @@ restart:
{ {
if (entryno > 0) if (entryno > 0)
{ {
set_line(4+entryno, 0x7); set_line (4 + entryno, A_NORMAL);
entryno--; entryno --;
set_line(4+entryno, 0x70); set_line (4 + entryno, A_REVERSE);
} }
else if (first_entry > 0) else if (first_entry > 0)
{ {
first_entry--; first_entry --;
print_entries(3, 12, first_entry, menu_entries); print_entries(3, 12, first_entry, menu_entries);
set_line(4, 0x70); set_line (4, A_REVERSE);
} }
} }
if (((c == KEY_DOWN) || (ASCII_CHAR(c) == 14)) if (((c == KEY_DOWN) || (ASCII_CHAR(c) == 14))
@@ -238,15 +238,15 @@ restart:
{ {
if (entryno < 11) if (entryno < 11)
{ {
set_line(4+entryno, 0x7); set_line (4 + entryno, A_NORMAL);
entryno++; entryno ++;
set_line(4+entryno, 0x70); set_line (4 + entryno, A_REVERSE);
} }
else if (num_entries > 12+first_entry) else if (num_entries > 12+first_entry)
{ {
first_entry++; first_entry ++;
print_entries(3, 12, first_entry, menu_entries); print_entries (3, 12, first_entry, menu_entries);
set_line(15, 0x70); set_line (15, A_REVERSE);
} }
} }
@@ -261,7 +261,7 @@ restart:
{ {
if ((c == 'd') || (c == 'o') || (c == 'O')) if ((c == 'd') || (c == 'o') || (c == 'O'))
{ {
set_line(4+entryno, 0x7); set_line (4 + entryno, A_NORMAL);
/* insert after is almost exactly like insert before */ /* insert after is almost exactly like insert before */
if (c == 'o') if (c == 'o')
{ {
@@ -323,7 +323,7 @@ restart:
{ {
char *new_file = config_file; char *new_file = config_file;
while (isspace(*ptr)) ptr++; while (isspace(*ptr)) ptr++;
while (*(new_file++) = *(ptr++)); while ((*(new_file++) = *(ptr++)) != 0);
return; return;
} }
c = ASCII_CHAR(getkey()); c = ASCII_CHAR(getkey());
@@ -350,14 +350,14 @@ restart:
else else
{ {
/* safe area! */ /* safe area! */
new_heap = heap+1501; new_heap = heap + NEW_HEAPSIZE + 1;
cur_entry = get_entry(menu_entries, cur_entry = get_entry(menu_entries,
first_entry+entryno, 0); first_entry+entryno, 0);
} }
do do
{ {
while (*(new_heap++) = cur_entry[i++]); while ((*(new_heap++) = cur_entry[i++]) != 0);
num_entries++; num_entries++;
} }
while (config_entries && cur_entry[i]); while (config_entries && cur_entry[i]);
@@ -373,13 +373,14 @@ restart:
cls(); cls();
init_cmdline(); init_cmdline();
new_heap = heap+1501; new_heap = heap + NEW_HEAPSIZE + 1;
saved_drive = boot_drive; saved_drive = boot_drive;
saved_partition = install_partition; saved_partition = install_partition;
current_drive = 0xFF; current_drive = 0xFF;
if (!get_cmdline("editing> ", commands, new_heap, 1501)) if (!get_cmdline(PACKAGE " edit> ", commands, new_heap,
NEW_HEAPSIZE + 1))
{ {
int j = 0; int j = 0;
@@ -408,7 +409,7 @@ restart:
} }
if (c == 'c') if (c == 'c')
{ {
enter_cmdline(NULL, heap); enter_cmdline (NULL, heap);
goto restart; goto restart;
} }
} }
@@ -432,7 +433,7 @@ restart:
if (!cur_entry) if (!cur_entry)
cur_entry = get_entry(config_entries, first_entry+entryno, 1); cur_entry = get_entry(config_entries, first_entry+entryno, 1);
if (!(c = enter_cmdline(cur_entry, heap))) if (!(c = enter_cmdline (cur_entry, heap)))
{ {
if (fallback < 0) if (fallback < 0)
break; break;
@@ -460,7 +461,7 @@ get_line_from_config(char *cmdline, int maxlen)
int pos = 0, literal = 0, comment = 0; int pos = 0, literal = 0, comment = 0;
char c; /* since we're loading it a byte at a time! */ char c; /* since we're loading it a byte at a time! */
while (read((int)&c, 1)) while (grub_read (&c, 1))
{ {
/* translate characters first! */ /* translate characters first! */
if (c == '\\') if (c == '\\')
@@ -520,12 +521,12 @@ cmain(void)
* Here load the configuration file. * Here load the configuration file.
*/ */
if (open(config_file)) if (grub_open (config_file))
{ {
int state = 0, prev_config_len = 0, prev_menu_len = 0; int state = 0, prev_config_len = 0, prev_menu_len = 0;
char cmdline[1502], *ptr; char cmdline[1502], *ptr;
while (get_line_from_config(cmdline, 1500)) while (get_line_from_config (cmdline, NEW_HEAPSIZE))
{ {
ptr = skip_to(1, cmdline); ptr = skip_to(1, cmdline);
@@ -547,7 +548,7 @@ cmain(void)
state = 1; state = 1;
/* copy title into menu area */ /* copy title into menu area */
while (menu_entries[menu_len++] = *(ptr++)); while ((menu_entries[menu_len++] = *(ptr++)) != 0);
} }
else if (!state) else if (!state)
{ {
@@ -559,9 +560,8 @@ cmain(void)
safe_parse_maxint(&ptr, &default_entry); safe_parse_maxint(&ptr, &default_entry);
if (substring("password", cmdline) < 1) if (substring("password", cmdline) < 1)
{ {
char *ptrend = ptr;
password = config_entries; password = config_entries;
while (*(config_entries++) = *(ptr++)); while ((*(config_entries++) = *(ptr++)) != 0);
} }
errnum = 0; errnum = 0;
@@ -573,7 +573,7 @@ cmain(void)
state++; state++;
/* copy config file data to config area */ /* copy config file data to config area */
while (config_entries[config_len++] = cmdline[i++]); while ((config_entries[config_len++] = cmdline[i++]) != 0);
} }
} }
@@ -601,7 +601,7 @@ cmain(void)
if (!num_entries) if (!num_entries)
while (1) while (1)
enter_cmdline(NULL, config_entries); enter_cmdline (NULL, config_entries);
/* /*
* Run menu interface (this shouldn't return!). * Run menu interface (this shouldn't return!).