Get /sbin/grub GUI working.
This commit is contained in:
parent
b0016b886e
commit
ab6e2839e5
21 changed files with 889 additions and 646 deletions
34
ChangeLog
34
ChangeLog
|
@ -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>
|
||||
|
||||
* shared_src/gunzip.c (border): Rename to bitorder, to resolve
|
||||
|
|
180
configure
vendored
180
configure
vendored
|
@ -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.
|
||||
set dummy gcc; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
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.
|
||||
set dummy cc; ac_word=$2
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1036,7 +972,7 @@ fi
|
|||
fi
|
||||
|
||||
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
|
||||
# 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
|
||||
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1050 "configure"
|
||||
#line 986 "configure"
|
||||
#include "confdefs.h"
|
||||
main(){return(0);}
|
||||
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
|
||||
# If we can't run a trivial program, we are probably using a cross compiler.
|
||||
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; }
|
||||
fi
|
||||
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
|
||||
cross_compiling=$ac_cv_prog_cc_cross
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1084,7 +1020,7 @@ else
|
|||
yes;
|
||||
#endif
|
||||
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
|
||||
else
|
||||
ac_cv_prog_gcc=no
|
||||
|
@ -1099,7 +1035,7 @@ if test $ac_cv_prog_gcc = yes; then
|
|||
ac_save_CFLAGS="$CFLAGS"
|
||||
CFLAGS=
|
||||
echo $ac_n "checking whether ${CC-cc} accepts -g""... $ac_c" 1>&6
|
||||
echo "configure: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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1127,8 +1063,76 @@ else
|
|||
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 "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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1141,7 +1145,7 @@ func (int *list)
|
|||
}
|
||||
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
|
||||
{ echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; }
|
||||
fi
|
||||
|
@ -1169,7 +1173,7 @@ EOF
|
|||
|
||||
|
||||
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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1181,21 +1185,21 @@ blah (void)
|
|||
}
|
||||
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
|
||||
{ echo "configure: error: ${CC-cc} cannot compile C source code" 1>&2; exit 1; }
|
||||
fi
|
||||
grub_cv_prog_objcopy_absolute=yes
|
||||
for link_addr in 2000 8000 7C00; do
|
||||
if { ac_try='${LD-ld} -N -Ttext $link_addr conftest.o -o conftest.exec'; { (eval echo configure: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
|
||||
{ echo "configure: error: ${LD-ld} cannot link at address $link_addr" 1>&2; exit 1; }
|
||||
fi
|
||||
if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure: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
|
||||
{ echo "configure: error: ${OBJCOPY-objcopy} cannot create binary files" 1>&2; exit 1; }
|
||||
fi
|
||||
if test ! -f conftest.old || { ac_try='cmp -s conftest.old conftest'; { (eval echo configure: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
|
||||
else
|
||||
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 "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
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
else
|
||||
|
@ -1222,7 +1226,7 @@ l1: addr32
|
|||
movb %al, l1
|
||||
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
|
||||
else
|
||||
grub_cv_asm_addr32=no
|
||||
|
@ -1238,7 +1242,7 @@ fi
|
|||
# Check for curses libraries if we are building /sbin/grub.
|
||||
if test -n "$sbingrub"; then
|
||||
echo $ac_n "checking for getch in -lncurses""... $ac_c" 1>&6
|
||||
echo "configure:1242: checking for getch in -lncurses" >&5
|
||||
echo "configure:1246: checking for getch in -lncurses" >&5
|
||||
ac_lib_var=`echo ncurses'_'getch | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -1246,7 +1250,7 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lncurses $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1250 "configure"
|
||||
#line 1254 "configure"
|
||||
#include "confdefs.h"
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
|
@ -1257,7 +1261,7 @@ int main() {
|
|||
getch()
|
||||
; return 0; }
|
||||
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*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
@ -1280,7 +1284,7 @@ EOF
|
|||
else
|
||||
echo "$ac_t""no" 1>&6
|
||||
echo $ac_n "checking for getch in -lcurses""... $ac_c" 1>&6
|
||||
echo "configure:1284: checking for getch in -lcurses" >&5
|
||||
echo "configure:1288: checking for getch in -lcurses" >&5
|
||||
ac_lib_var=`echo curses'_'getch | sed 'y%./+-%__p_%'`
|
||||
if eval "test \"`echo '$''{'ac_cv_lib_$ac_lib_var'+set}'`\" = set"; then
|
||||
echo $ac_n "(cached) $ac_c" 1>&6
|
||||
|
@ -1288,7 +1292,7 @@ else
|
|||
ac_save_LIBS="$LIBS"
|
||||
LIBS="-lcurses $LIBS"
|
||||
cat > conftest.$ac_ext <<EOF
|
||||
#line 1292 "configure"
|
||||
#line 1296 "configure"
|
||||
#include "confdefs.h"
|
||||
/* Override any gcc2 internal prototype to avoid an error. */
|
||||
/* We use char because int might match the return type of a gcc2
|
||||
|
@ -1299,7 +1303,7 @@ int main() {
|
|||
getch()
|
||||
; return 0; }
|
||||
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*
|
||||
eval "ac_cv_lib_$ac_lib_var=yes"
|
||||
else
|
||||
|
|
|
@ -49,6 +49,11 @@ AC_SUBST(stage2debug)
|
|||
#
|
||||
|
||||
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(OBJCOPY, objcopy)
|
||||
|
||||
|
|
|
@ -1,5 +1,3 @@
|
|||
Get /sbin/grub to work.
|
||||
|
||||
Change partition syntax to correspond with BSD ``slice'' syntax
|
||||
(`(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
|
||||
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
|
||||
so that old config files can be used.
|
||||
Add a real scripting language, possibly retaining backward
|
||||
compatibility so that old config files can be used.
|
||||
|
||||
Look at the network booting patches from L4.
|
||||
|
||||
|
|
175
grub/asmstub.c
175
grub/asmstub.c
|
@ -18,6 +18,9 @@
|
|||
* Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||||
*/
|
||||
|
||||
/* Simulator entry point. */
|
||||
int grub_stage2 (void);
|
||||
|
||||
#include "shared.h"
|
||||
/* We want to prevent any circularararity in our stubs, as well as
|
||||
libc name clashes. */
|
||||
|
@ -45,15 +48,37 @@ unsigned long install_partition = 0x20000;
|
|||
unsigned long boot_drive = 0;
|
||||
char version_string[] = "0.5";
|
||||
char config_file[] = "/boot/grub/menu.lst";
|
||||
|
||||
/* Emulation requirements. */
|
||||
char *grub_scratch_mem = 0;
|
||||
|
||||
#define NUM_DISKS 256
|
||||
static FILE **disks = 0;
|
||||
|
||||
/* The main entry point into this mess. */
|
||||
void
|
||||
start_stage2 (void)
|
||||
int
|
||||
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. */
|
||||
assert ((SCRATCHSEG << 4) == SCRATCHADDR);
|
||||
assert ((BUFFERSEG << 4) == BUFFERADDR);
|
||||
assert (BUFFERADDR + BUFFERLEN == SCRATCHADDR);
|
||||
assert (FSYS_BUF % 16 == 0);
|
||||
assert (FSYS_BUF + FSYS_BUFLEN == BUFFERADDR);
|
||||
|
@ -63,16 +88,65 @@ start_stage2 (void)
|
|||
initscr ();
|
||||
cbreak ();
|
||||
noecho ();
|
||||
nonl ();
|
||||
scrollok (stdscr, TRUE);
|
||||
keypad (stdscr, TRUE);
|
||||
#endif
|
||||
|
||||
init_bios_info ();
|
||||
/* 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 ();
|
||||
}
|
||||
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
|
||||
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");
|
||||
exit (1);
|
||||
}
|
||||
|
@ -124,11 +198,11 @@ gateA20 (int linear)
|
|||
}
|
||||
|
||||
|
||||
void *
|
||||
int
|
||||
get_code_end (void)
|
||||
{
|
||||
/* 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_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
|
||||
value. DESC is a pointer to the descriptor buffer, and CONT is the
|
||||
previous continuation value (0 to get the first entry in the
|
||||
map). */
|
||||
int
|
||||
get_mem_map (struct mmar_desc *desc, int cont)
|
||||
get_mmap_entry (struct mmar_desc *desc, int cont)
|
||||
{
|
||||
if (! cont)
|
||||
{
|
||||
|
@ -204,6 +269,9 @@ getrtsecs (void)
|
|||
void
|
||||
cls (void)
|
||||
{
|
||||
#ifdef HAVE_LIBCURSES
|
||||
clear ();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -211,12 +279,22 @@ cls (void)
|
|||
int
|
||||
getxy (void)
|
||||
{
|
||||
int y, x;
|
||||
#ifdef HAVE_LIBCURSES
|
||||
getyx (stdscr, y, x);
|
||||
#else
|
||||
y = x = 0;
|
||||
#endif
|
||||
return (x << 8) | (y & 0xff);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
gotoxy (int x, int y)
|
||||
{
|
||||
#ifdef HAVE_LIBCURSES
|
||||
move (y, x);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -225,7 +303,11 @@ gotoxy (int x, int y)
|
|||
void
|
||||
grub_putchar (int c)
|
||||
{
|
||||
#ifdef HAVE_LIBCURSES
|
||||
addch (c);
|
||||
#else
|
||||
putchar (c);
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -233,11 +315,15 @@ grub_putchar (int c)
|
|||
int
|
||||
getkey (void)
|
||||
{
|
||||
#ifdef HAVE_LIBCURSES
|
||||
int c;
|
||||
nodelay (stdscr, FALSE);
|
||||
c = getch ();
|
||||
nodelay (stdscr, TRUE);
|
||||
return c;
|
||||
#else
|
||||
return getchar ();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -245,7 +331,11 @@ getkey (void)
|
|||
int
|
||||
checkkey (void)
|
||||
{
|
||||
getch ();
|
||||
#ifdef HAVE_LIBCURSES
|
||||
return getch ();
|
||||
#else
|
||||
return getchar ();
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
|
@ -253,24 +343,71 @@ checkkey (void)
|
|||
void
|
||||
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
|
||||
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
|
||||
biosdisk (int subfunc, int drive, int geometry,
|
||||
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
|
||||
stop_floppy (void)
|
||||
{
|
||||
/* NOTUSED */
|
||||
}
|
||||
|
|
74
grub/main.c
74
grub/main.c
|
@ -18,12 +18,78 @@
|
|||
* 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
|
||||
main (int argc, char **argv)
|
||||
{
|
||||
/* Call the main entry point. */
|
||||
start_stage2 ();
|
||||
exit (0);
|
||||
int c;
|
||||
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);
|
||||
break;
|
||||
|
||||
default:
|
||||
usage (1);
|
||||
}
|
||||
}
|
||||
while (c != EOF);
|
||||
|
||||
/* Transfer control to the stage2 simulator. */
|
||||
exit (grub_stage2 ());
|
||||
}
|
||||
|
|
|
@ -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.
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
ENTRY(get_mem_map)
|
||||
ENTRY(get_mmap_entry)
|
||||
push %ebp
|
||||
push %ebx
|
||||
push %ecx
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/* boot.c - load and bootstrap a kernel */
|
||||
/*
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -18,8 +20,6 @@
|
|||
*/
|
||||
|
||||
|
||||
#define _BOOT_C
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
#include "freebsd.h"
|
||||
|
@ -41,9 +41,9 @@ static struct mod_list mll[99];
|
|||
int
|
||||
load_image (void)
|
||||
{
|
||||
int len, i, exec_type, align_4k = 1, type = 0;
|
||||
unsigned long flags = 0, text_len, data_len, bss_len;
|
||||
char *str, *str2;
|
||||
int len, i, exec_type = 0, align_4k = 1, type = 0;
|
||||
unsigned long flags = 0, text_len = 0, data_len = 0, bss_len = 0;
|
||||
char *str = 0, *str2 = 0;
|
||||
union
|
||||
{
|
||||
struct multiboot_header *mb;
|
||||
|
@ -59,10 +59,10 @@ load_image (void)
|
|||
buffer by default */
|
||||
pu.aout = (struct exec *) buffer;
|
||||
|
||||
if (!open (cur_cmdline))
|
||||
if (!grub_open (cur_cmdline))
|
||||
return 0;
|
||||
|
||||
if (!(len = read ((int) buffer, MULTIBOOT_SEARCH)) || len < 32)
|
||||
if (!(len = grub_read (buffer, MULTIBOOT_SEARCH)) || len < 32)
|
||||
{
|
||||
if (!errnum)
|
||||
errnum = ERR_EXEC_FORMAT;
|
||||
|
@ -101,8 +101,6 @@ load_image (void)
|
|||
|| ((pu.elf->e_phoff + (pu.elf->e_phentsize * pu.elf->e_phnum))
|
||||
>= len))
|
||||
errnum = ERR_EXEC_FORMAT;
|
||||
|
||||
exec_type = 0;
|
||||
str = "elf";
|
||||
}
|
||||
else if (flags & MULTIBOOT_AOUT_KLUDGE)
|
||||
|
@ -228,7 +226,7 @@ load_image (void)
|
|||
filepos = data_len + SECTOR_SIZE;
|
||||
|
||||
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');
|
||||
else if (!errnum)
|
||||
errnum = ERR_EXEC_FORMAT;
|
||||
|
@ -266,7 +264,7 @@ load_image (void)
|
|||
printf (", loadaddr=0x%x, text%s=0x%x", cur_addr, str, text_len);
|
||||
|
||||
/* 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;
|
||||
|
||||
|
@ -280,7 +278,8 @@ load_image (void)
|
|||
|
||||
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;
|
||||
cur_addr += data_len;
|
||||
}
|
||||
|
@ -310,12 +309,12 @@ load_image (void)
|
|||
|
||||
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;
|
||||
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;
|
||||
|
||||
|
@ -325,7 +324,7 @@ load_image (void)
|
|||
|
||||
printf (", strtab=0x%x", i);
|
||||
|
||||
symtab_err = (read (cur_addr, i) != i);
|
||||
symtab_err = (grub_read ((char *) cur_addr, i) != i);
|
||||
cur_addr += i;
|
||||
}
|
||||
else
|
||||
|
@ -383,7 +382,7 @@ load_image (void)
|
|||
|
||||
/* load the segment */
|
||||
if (memcheck (memaddr, memsiz)
|
||||
&& read (memaddr, filesiz) == filesiz)
|
||||
&& grub_read ((char *) memaddr, filesiz) == filesiz)
|
||||
{
|
||||
if (memsiz > filesiz)
|
||||
bzero ((char *) (memaddr + filesiz), memsiz - filesiz);
|
||||
|
@ -399,7 +398,7 @@ load_image (void)
|
|||
errnum = ERR_EXEC_FORMAT;
|
||||
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 */
|
||||
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;
|
||||
|
||||
printf (" [Multiboot-module @ 0x%x, 0x%x bytes]\n", cur_addr, len);
|
||||
|
@ -450,7 +449,7 @@ load_initrd (void)
|
|||
int len;
|
||||
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;
|
||||
|
||||
moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000;
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
|
||||
/* char_io.c - basic console input and output */
|
||||
/*
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -19,8 +20,6 @@
|
|||
*/
|
||||
|
||||
|
||||
#define _CHAR_IO_C
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
|
||||
|
@ -88,7 +87,7 @@ printf (char *format,...)
|
|||
|
||||
dataptr++;
|
||||
|
||||
while (c = *(format++))
|
||||
while ((c = *(format++)) != 0)
|
||||
{
|
||||
if (c != '%')
|
||||
putchar (c);
|
||||
|
@ -113,7 +112,7 @@ printf (char *format,...)
|
|||
case 's':
|
||||
ptr = (char *) (*(dataptr++));
|
||||
|
||||
while (c = *(ptr++))
|
||||
while ((c = *(ptr++)) != 0)
|
||||
putchar (c);
|
||||
break;
|
||||
}
|
||||
|
@ -133,13 +132,12 @@ init_page (void)
|
|||
}
|
||||
|
||||
|
||||
/* 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,
|
||||
and the whole screen is about 2000 characters, minus the prompt...
|
||||
so want to leave space for an error line, etc.
|
||||
maxlen should be at least 1, and we shouldn't have a NULL prompt or
|
||||
cmdline... the cmdline must be a valid string at the start */
|
||||
|
||||
/* Don't use this with a MAXLEN greater than 1600 or so! The problem
|
||||
is that GET_CMDLINE depends on the everything fitting on the screen
|
||||
at once. So, the whole screen is about 2000 characters, minus the
|
||||
PROMPT, and space for error and status lines, etc. MAXLEN must be
|
||||
at least 1, and PROMPT and CMDLINE must be valid strings (not NULL
|
||||
or zero-length). */
|
||||
int
|
||||
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 llen = 0;
|
||||
|
||||
/* nested function definition for code simplicity XXX GCC only, I think */
|
||||
void cl_print (char *str)
|
||||
/* nested function definition for code simplicity */
|
||||
static void cl_print (char *str)
|
||||
{
|
||||
while (*str != 0)
|
||||
{
|
||||
|
@ -157,15 +155,15 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
{
|
||||
xend = 0;
|
||||
putchar (' ');
|
||||
if (yend == (getxy () & 0xFF))
|
||||
if (yend == (getxy () & 0xff))
|
||||
ystart--;
|
||||
else
|
||||
yend++;
|
||||
}
|
||||
}
|
||||
}
|
||||
/* nested function definition for code simplicity XXX GCC only, I think */
|
||||
void cl_setcpos (void)
|
||||
/* nested function definition for code simplicity */
|
||||
static void cl_setcpos (void)
|
||||
{
|
||||
yend = ((lpos + plen) / 79) + ystart;
|
||||
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 */
|
||||
void cl_init ()
|
||||
static void cl_init ()
|
||||
{
|
||||
/* distinguish us from other lines and error messages! */
|
||||
putchar ('\n');
|
||||
|
||||
/* print full line and set position here */
|
||||
ystart = (getxy () & 0xFF);
|
||||
ystart = (getxy () & 0xff);
|
||||
yend = ystart;
|
||||
xend = 0;
|
||||
cl_print (prompt);
|
||||
|
@ -188,10 +186,10 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
}
|
||||
|
||||
/* nested function definition for erasing to the end of the line */
|
||||
void cl_kill_to_end ()
|
||||
static void cl_kill_to_end ()
|
||||
{
|
||||
int i;
|
||||
cmdline[lpos] = 0;
|
||||
cmdline[lpos] = 0;
|
||||
for (i = lpos; i <= llen; i++)
|
||||
{
|
||||
if (i && ((i + plen) % 79) == 0)
|
||||
|
@ -206,14 +204,13 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
plen++;
|
||||
while (cmdline[llen])
|
||||
llen++;
|
||||
/* XXX limiting maxlen to 1600 */
|
||||
if (maxlen > 1600)
|
||||
if (maxlen > MAX_CMDLINE)
|
||||
{
|
||||
maxlen = 1600;
|
||||
if (llen > 1599)
|
||||
maxlen = MAX_CMDLINE;
|
||||
if (llen >= MAX_CMDLINE)
|
||||
{
|
||||
llen = 1599;
|
||||
cmdline[1600] = 0;
|
||||
llen = MAX_CMDLINE - 1;
|
||||
cmdline[MAX_CMDLINE] = 0;
|
||||
}
|
||||
}
|
||||
lpos = llen;
|
||||
|
@ -237,6 +234,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
c = 5;
|
||||
break;
|
||||
case KEY_DC:
|
||||
c = 4;
|
||||
case KEY_BACKSPACE:
|
||||
c = 8;
|
||||
default:
|
||||
}
|
||||
|
@ -261,8 +260,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
|
||||
/* goto part after line here */
|
||||
yend = ((llen + plen) / 79) + ystart;
|
||||
gotoxy (0, yend);
|
||||
putchar ('\n');
|
||||
gotoxy (0, getxy () & 0xff);
|
||||
|
||||
if (lpos > j)
|
||||
{
|
||||
|
@ -382,8 +381,8 @@ get_cmdline (char *prompt, char *commands, char *cmdline, int maxlen)
|
|||
|
||||
/* goto part after line here */
|
||||
yend = ((llen + plen) / 79) + ystart;
|
||||
gotoxy (0, yend);
|
||||
putchar ('\n');
|
||||
gotoxy (0, getxy () & 0xff);
|
||||
|
||||
/* remove leading spaces */
|
||||
/* use c and lpos as indexes now */
|
||||
|
@ -563,10 +562,12 @@ strstr (char *s1, char *s2)
|
|||
int
|
||||
memcheck (int start, int len)
|
||||
{
|
||||
if ((start < 0x1000) || (start < 0x100000
|
||||
&& (mbi.mem_lower * 1024) < (start + len))
|
||||
|| (start >= 0x100000
|
||||
&& (mbi.mem_upper * 1024) < ((start - 0x100000) + len)))
|
||||
/* FIXME: fails when used with addresses on our stack. */
|
||||
if ((start < RAW_ADDR (0x1000)) ||
|
||||
(start < RAW_ADDR (0x100000) &&
|
||||
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;
|
||||
|
||||
return (!errnum);
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/* cmdline.c - the device-independent GRUB text command line */
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define _CMDLINE_C
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
#ifdef DEBUG
|
||||
|
@ -34,6 +34,22 @@
|
|||
#define PHYS_TO_VIRTUAL(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
|
||||
cmos_write_byte(int loc, int val)
|
||||
{
|
||||
|
@ -139,12 +155,9 @@ debug_fs_blocklist_func(int sector)
|
|||
|
||||
|
||||
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;
|
||||
#ifdef DEBUG
|
||||
int mptest = 0;
|
||||
#endif /* DEBUG */
|
||||
char *cur_heap = heap, *cur_entry = script, *old_entry;
|
||||
|
||||
/* initialization */
|
||||
|
@ -178,7 +191,7 @@ restart:
|
|||
if (password || errnum == ERR_BOOT_COMMAND)
|
||||
{
|
||||
printf("Press any key to continue...");
|
||||
getc();
|
||||
(void) getc ();
|
||||
returnit:
|
||||
return 0;
|
||||
}
|
||||
|
@ -211,7 +224,7 @@ returnit:
|
|||
print_error();
|
||||
}
|
||||
|
||||
if (run_cmdline && get_cmdline("command> ", commands, cur_heap, 2048))
|
||||
if (run_cmdline && get_cmdline(PACKAGE "> ", commands, cur_heap, 2048))
|
||||
return 1;
|
||||
|
||||
if (substring("boot", cur_heap) == 0 || (script && !*cur_heap))
|
||||
|
@ -247,9 +260,9 @@ returnit:
|
|||
|
||||
if (substring("chainloader", cur_heap) < 1)
|
||||
{
|
||||
if (open(cur_cmdline) && (read(BOOTSEC_LOCATION, SECTOR_SIZE)
|
||||
== SECTOR_SIZE)
|
||||
&& (*((unsigned short *) (BOOTSEC_LOCATION+BOOTSEC_SIG_OFFSET))
|
||||
if (grub_open (cur_cmdline) &&
|
||||
(grub_read ((char *) BOOTSEC_LOCATION, SECTOR_SIZE) == SECTOR_SIZE) &&
|
||||
(*((unsigned short *) (BOOTSEC_LOCATION+BOOTSEC_SIG_OFFSET))
|
||||
== BOOTSEC_SIGNATURE))
|
||||
type = 'c';
|
||||
else if (!errnum)
|
||||
|
@ -301,7 +314,7 @@ returnit:
|
|||
bcopy(cur_heap, heap, cmd_len + (((int)cur_cmdline) - ((int)cur_heap)));
|
||||
cur_cmdline = heap + (((int)cur_cmdline) - ((int)cur_heap));
|
||||
cur_heap = heap;
|
||||
if (type = load_image())
|
||||
if ((type = load_image()) != 0)
|
||||
cur_heap = cur_cmdline + cmd_len;
|
||||
}
|
||||
else if (substring("module", cur_heap) < 1)
|
||||
|
@ -324,7 +337,7 @@ returnit:
|
|||
}
|
||||
else if (type == 'L' || type == 'l')
|
||||
{
|
||||
load_initrd();
|
||||
load_initrd ();
|
||||
}
|
||||
else
|
||||
errnum = ERR_NEED_MB_KERNEL;
|
||||
|
@ -333,16 +346,16 @@ returnit:
|
|||
{
|
||||
if (type == 'L' || type == 'l')
|
||||
{
|
||||
load_initrd();
|
||||
load_initrd ();
|
||||
}
|
||||
else
|
||||
errnum = ERR_NEED_LX_KERNEL;
|
||||
}
|
||||
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];
|
||||
int i = BOOTSEC_LOCATION+STAGE1_FIRSTLIST-4, new_drive = 0xFF;
|
||||
int new_drive = 0xFF;
|
||||
|
||||
dest_dev = skip_to(0, stage1_file);
|
||||
if (*dest_dev == 'd')
|
||||
|
@ -350,13 +363,14 @@ returnit:
|
|||
new_drive = 0;
|
||||
dest_dev = skip_to(0, dest_dev);
|
||||
}
|
||||
file = skip_to(0, dest_dev);
|
||||
addr = skip_to(0, file);
|
||||
file = skip_to (0, dest_dev);
|
||||
addr = skip_to (0, file);
|
||||
|
||||
if (safe_parse_maxint(&addr, &installaddr) && open(stage1_file)
|
||||
&& read((int)buffer, SECTOR_SIZE) == SECTOR_SIZE
|
||||
&& set_device(dest_dev) && open_partition()
|
||||
&& devread(0, 0, SECTOR_SIZE, (int)old_sect))
|
||||
if (safe_parse_maxint (&addr, &installaddr) &&
|
||||
grub_open (stage1_file) &&
|
||||
grub_read (buffer, SECTOR_SIZE) == SECTOR_SIZE &&
|
||||
set_device (dest_dev) && open_partition () &&
|
||||
devread (0, 0, SECTOR_SIZE, old_sect))
|
||||
{
|
||||
int dest_drive = current_drive, dest_geom = buf_geom;
|
||||
int dest_sector = part_start, i;
|
||||
|
@ -383,7 +397,7 @@ returnit:
|
|||
{
|
||||
errnum = ERR_BAD_VERSION;
|
||||
}
|
||||
else if (open(file))
|
||||
else if (grub_open (file))
|
||||
{
|
||||
if (!new_drive)
|
||||
new_drive = current_drive;
|
||||
|
@ -415,7 +429,8 @@ returnit:
|
|||
installlist = BOOTSEC_LOCATION+STAGE1_FIRSTLIST+4;
|
||||
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
|
||||
|| (*((short *)(SCRATCHADDR+STAGE2_VER_MAJ_OFFS))
|
||||
|
@ -442,10 +457,10 @@ returnit:
|
|||
|
||||
write_stage2_sect++;
|
||||
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;
|
||||
|
||||
|
@ -468,14 +483,19 @@ returnit:
|
|||
no_decompression = 0;
|
||||
#endif
|
||||
}
|
||||
fallback = -1;
|
||||
return 1;
|
||||
|
||||
/* Error running the install script, so drop to command line. */
|
||||
if (script)
|
||||
{
|
||||
fallback = -1;
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#ifdef DEBUG
|
||||
else if (substring("testload", cur_heap) < 1)
|
||||
{
|
||||
type = 0;
|
||||
if (open(cur_cmdline))
|
||||
if (grub_open (cur_cmdline))
|
||||
{
|
||||
int i;
|
||||
|
||||
|
@ -488,7 +508,7 @@ returnit:
|
|||
/* read whole file first */
|
||||
printf("Whole file: ");
|
||||
|
||||
read(0x100000, -1);
|
||||
grub_read ((char *) 0x100000, -1);
|
||||
|
||||
/* now compare two sections of the file read differently */
|
||||
|
||||
|
@ -502,23 +522,23 @@ returnit:
|
|||
printf("\nPartial read 1: ");
|
||||
|
||||
filepos = 0;
|
||||
read(0x200000, 0x7);
|
||||
read(0x200007, 0x100);
|
||||
read(0x200107, 0x10);
|
||||
read(0x200117, 0x999);
|
||||
read(0x200ab0, 0x10);
|
||||
read(0x200ac0, 0x10000);
|
||||
grub_read ((char *) 0x200000, 0x7);
|
||||
grub_read ((char *) 0x200007, 0x100);
|
||||
grub_read ((char *) 0x200107, 0x10);
|
||||
grub_read ((char *) 0x200117, 0x999);
|
||||
grub_read ((char *) 0x200ab0, 0x10);
|
||||
grub_read ((char *) 0x200ac0, 0x10000);
|
||||
|
||||
/* second partial read */
|
||||
printf("\nPartial read 2: ");
|
||||
|
||||
filepos = 0;
|
||||
read(0x300000, 0x10000);
|
||||
read(0x310000, 0x10);
|
||||
read(0x310010, 0x7);
|
||||
read(0x310017, 0x10);
|
||||
read(0x310027, 0x999);
|
||||
read(0x3109c0, 0x100);
|
||||
grub_read ((char *) 0x300000, 0x10000);
|
||||
grub_read ((char *) 0x310000, 0x10);
|
||||
grub_read ((char *) 0x310010, 0x7);
|
||||
grub_read ((char *) 0x310017, 0x10);
|
||||
grub_read ((char *) 0x310027, 0x999);
|
||||
grub_read ((char *) 0x3109c0, 0x100);
|
||||
|
||||
printf("\nHeader1 = 0x%x, next = 0x%x, next = 0x%x, next = 0x%x\n",
|
||||
*((int *)0x200000), *((int *)0x200004), *((int *)0x200008),
|
||||
|
@ -564,7 +584,8 @@ returnit:
|
|||
{
|
||||
if (get_eisamemsize() != -1)
|
||||
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(" Lower memory: %uK, Upper memory (to first chipset hole): %uK\n",
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
/* common.c - miscellaneous shared variables and routines */
|
||||
/*
|
||||
* 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
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#define _COMMON_C
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
|
||||
/*
|
||||
* Shared BIOS/boot data.
|
||||
*/
|
||||
|
@ -35,7 +34,7 @@ unsigned long saved_mem_upper;
|
|||
* Error code stuff.
|
||||
*/
|
||||
|
||||
int errnum = 0;
|
||||
grub_error_t errnum = ERR_NONE;
|
||||
|
||||
#ifndef STAGE1_5
|
||||
|
||||
|
@ -93,7 +92,9 @@ static struct AddrRangeDesc fakemap[3] =
|
|||
void
|
||||
init_bios_info (void)
|
||||
{
|
||||
#ifndef STAGE1_5
|
||||
int cont, memtmp, addr;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Get information from BIOS on installed RAM.
|
||||
|
@ -125,7 +126,7 @@ init_bios_info (void)
|
|||
|
||||
do
|
||||
{
|
||||
cont = get_mem_map (addr, cont);
|
||||
cont = get_mmap_entry ((void *) addr, cont);
|
||||
|
||||
/* If the returned buffer's base is zero, quit. */
|
||||
if (!*((int *) addr))
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
/* disk_io.c - implement abstract BIOS disk input and output */
|
||||
/*
|
||||
* GRUB -- GRand Unified Bootloader
|
||||
* Copyright (C) 1996 Erich Boleyn <erich@uruk.org>
|
||||
|
@ -19,20 +20,35 @@
|
|||
*/
|
||||
|
||||
|
||||
#define _DISK_IO_C
|
||||
|
||||
#include "shared.h"
|
||||
|
||||
#include "filesys.h"
|
||||
|
||||
/* XXX for evil hack */
|
||||
#include "freebsd.h"
|
||||
|
||||
#ifndef STAGE1_5
|
||||
/* instrumentation variables */
|
||||
void (*debug_fs) (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
|
||||
are meant to be working values. */
|
||||
|
@ -43,7 +59,8 @@ unsigned long current_partition;
|
|||
* Global variables describing details of the filesystem
|
||||
*/
|
||||
|
||||
/* XXX BSD evil hack */
|
||||
/* FIXME: BSD evil hack */
|
||||
#include "freebsd.h"
|
||||
int bsd_evil_hack;
|
||||
|
||||
/* filesystem type */
|
||||
|
@ -69,9 +86,9 @@ int filemax;
|
|||
|
||||
|
||||
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)
|
||||
return 1;
|
||||
|
@ -119,8 +136,9 @@ rawread (int drive, int sector, int byte_offset, int byte_len, int addr)
|
|||
bufaddr = BUFFERADDR + byte_offset;
|
||||
}
|
||||
|
||||
if (bios_err = biosdisk (BIOSDISK_READ, drive, buf_geom,
|
||||
read_start, read_len, BUFFERSEG))
|
||||
bios_err = biosdisk (BIOSDISK_READ, drive, buf_geom,
|
||||
read_start, read_len, BUFFERSEG);
|
||||
if (bios_err)
|
||||
{
|
||||
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))
|
||||
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;
|
||||
sector += num_sect;
|
||||
slen -= num_sect;
|
||||
|
@ -175,7 +193,7 @@ 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)
|
||||
devread (int sector, int byte_offset, int byte_len, char *buf)
|
||||
{
|
||||
/*
|
||||
* Check partition boundaries
|
||||
|
@ -202,7 +220,7 @@ devread (int sector, int byte_offset, int byte_len, int addr)
|
|||
#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 requires that "sector" is relative to the beginning
|
||||
|
@ -211,11 +229,12 @@ devread (int sector, int byte_offset, int byte_len, int addr)
|
|||
* sector.
|
||||
*/
|
||||
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)
|
||||
{
|
||||
if (!(current_partition & 0xFF000000uL)
|
||||
|
@ -230,8 +249,10 @@ sane_partition (void)
|
|||
errnum = ERR_DEV_VALUES;
|
||||
return 0;
|
||||
}
|
||||
#endif /* !defined(STAGE1_5) || !defined(NO_BLOCK_FILES) */
|
||||
|
||||
|
||||
#ifndef STAGE1_5
|
||||
static void
|
||||
attempt_mount (void)
|
||||
{
|
||||
|
@ -241,6 +262,7 @@ attempt_mount (void)
|
|||
if (fsys_type == NUM_FSYS && errnum == ERR_NONE)
|
||||
errnum = ERR_FSYS_MOUNT;
|
||||
}
|
||||
#endif /* STAGE1_5 */
|
||||
|
||||
|
||||
#ifndef STAGE1_5
|
||||
|
@ -257,7 +279,7 @@ make_saved_active (void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
if (!rawread (saved_drive, 0, 0, SECTOR_SIZE, SCRATCHADDR))
|
||||
if (!rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR))
|
||||
return 0;
|
||||
|
||||
if (PC_SLICE_FLAG (SCRATCHADDR, part) != PC_SLICE_FLAG_BOOTABLE)
|
||||
|
@ -297,6 +319,7 @@ check_and_print_mount (void)
|
|||
#endif /* STAGE1_5 */
|
||||
|
||||
|
||||
#if !defined(STAGE1_5) || !defined(NO_BLOCK_FILES)
|
||||
static int
|
||||
check_BSD_parts (int flags)
|
||||
{
|
||||
|
@ -310,7 +333,7 @@ check_BSD_parts (int flags)
|
|||
}
|
||||
|
||||
if (!rawread (current_drive, part_start + BSD_LABEL_SECTOR,
|
||||
0, SECTOR_SIZE, (int) label_buf))
|
||||
0, SECTOR_SIZE, label_buf))
|
||||
return 0;
|
||||
|
||||
if (BSD_LABEL_CHECK_MAG (label_buf))
|
||||
|
@ -319,7 +342,7 @@ check_BSD_parts (int flags)
|
|||
{
|
||||
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)
|
||||
| PC_SLICE_TYPE_BSD);
|
||||
|
@ -360,6 +383,7 @@ check_BSD_parts (int flags)
|
|||
errnum = ERR_BAD_PART_TABLE;
|
||||
return 0;
|
||||
}
|
||||
#endif /* !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)
|
||||
{
|
||||
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
|
||||
* know it works.
|
||||
*/
|
||||
if (!sane_partition ()
|
||||
|| !rawread (current_drive, 0, 0, SECTOR_SIZE, (int) mbr_buf))
|
||||
|| !rawread (current_drive, 0, 0, SECTOR_SIZE, mbr_buf))
|
||||
return 0;
|
||||
|
||||
bsd_evil_hack = 0;
|
||||
|
@ -404,7 +428,7 @@ real_open_partition (int flags)
|
|||
while (slice_no < 255 && ext >= 0
|
||||
&& (part_no == 0xFF || slice_no <= part_no)
|
||||
&& 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
|
||||
|
@ -512,7 +536,7 @@ real_open_partition (int flags)
|
|||
if (current_partition == 0xFFFFFF
|
||||
|| current_partition == 0xFF00FF)
|
||||
{
|
||||
current_partition == 0xFFFFFF;
|
||||
current_partition = 0xFFFFFF;
|
||||
ext = -2;
|
||||
}
|
||||
}
|
||||
|
@ -648,7 +672,7 @@ set_device (char *device)
|
|||
|
||||
/* A Mach-style absolute partition name. */
|
||||
ch = *device;
|
||||
if (*device != 'f' && *device != 'h' ||
|
||||
if ((*device != 'f' && *device != 'h') ||
|
||||
(device += 2, (*(device - 1) != 'd')))
|
||||
errnum = ERR_DEV_FORMAT;
|
||||
else
|
||||
|
@ -768,7 +792,7 @@ set_bootdev (int hdbias)
|
|||
else if ((saved_partition >> 16) == 0xFF)
|
||||
i = 0;
|
||||
|
||||
/* XXX extremely evil hack!!! */
|
||||
/* FIXME: extremely evil hack!!! */
|
||||
j = 2;
|
||||
if (saved_drive & 0x80)
|
||||
j = bsd_evil_hack;
|
||||
|
@ -927,7 +951,7 @@ print_completions (char *filename)
|
|||
*/
|
||||
|
||||
int
|
||||
open (char *filename)
|
||||
grub_open (char *filename)
|
||||
{
|
||||
#ifndef NO_DECOMPRESSION
|
||||
compressed_file = 0;
|
||||
|
@ -946,7 +970,7 @@ open (char *filename)
|
|||
block_file = 0;
|
||||
#endif /* NO_BLOCK_FILES */
|
||||
|
||||
/* XXX to account for partial filesystem implementations! */
|
||||
/* This accounts for partial filesystem implementations. */
|
||||
fsmax = MAXINT;
|
||||
|
||||
if (*filename != '/')
|
||||
|
@ -1039,7 +1063,7 @@ open (char *filename)
|
|||
|
||||
|
||||
int
|
||||
read (int addr, int len)
|
||||
grub_read (char *buf, int len)
|
||||
{
|
||||
/* Make sure "filepos" is a sane value */
|
||||
if ((filepos < 0) | (filepos > filemax))
|
||||
|
@ -1060,7 +1084,7 @@ read (int addr, int len)
|
|||
|
||||
#ifndef NO_DECOMPRESSION
|
||||
if (compressed_file)
|
||||
return gunzip_read (addr, len);
|
||||
return gunzip_read (buf, len);
|
||||
#endif /* NO_DECOMPRESSION */
|
||||
|
||||
#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 */
|
||||
devread (BLK_BLKSTART (BLK_CUR_BLKLIST) + BLK_CUR_BLKNUM,
|
||||
off, size, addr);
|
||||
off, size, buf);
|
||||
|
||||
#ifndef STAGE1_5
|
||||
debug_fs_func = NULL;
|
||||
|
@ -1118,7 +1142,7 @@ read (int addr, int len)
|
|||
len -= size;
|
||||
filepos += size;
|
||||
ret += size;
|
||||
addr += size;
|
||||
buf += size;
|
||||
}
|
||||
|
||||
if (errnum)
|
||||
|
@ -1134,7 +1158,7 @@ read (int addr, int len)
|
|||
return 0;
|
||||
}
|
||||
|
||||
return (*(fsys_table[fsys_type].read_func)) (addr, len);
|
||||
return (*(fsys_table[fsys_type].read_func)) (buf, len);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
|
||||
/* filesys.h - abstract filesystem interface */
|
||||
/*
|
||||
* 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
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
|
@ -37,7 +38,7 @@
|
|||
#ifdef FSYS_FFS
|
||||
#define FSYS_FFS_NUM 1
|
||||
int ffs_mount (void);
|
||||
int ffs_read (int addr, int len);
|
||||
int ffs_read (char *buf, int len);
|
||||
int ffs_dir (char *dirname);
|
||||
#else
|
||||
#define FSYS_FFS_NUM 0
|
||||
|
@ -58,7 +59,7 @@ int fat_dir (char *dirname);
|
|||
#ifdef FSYS_EXT2FS
|
||||
#define FSYS_EXT2FS_NUM 1
|
||||
int ext2fs_mount (void);
|
||||
int ext2fs_read (int addr, int len);
|
||||
int ext2fs_read (char *buf, int len);
|
||||
int ext2fs_dir (char *dirname);
|
||||
#else
|
||||
#define FSYS_EXT2FS_NUM 0
|
||||
|
@ -86,44 +87,15 @@ struct fsys_entry
|
|||
{
|
||||
char *name;
|
||||
int (*mount_func) (void);
|
||||
int (*read_func) (int addr, int len);
|
||||
int (*read_func) (char *buf, int len);
|
||||
int (*dir_func) (char *dirname);
|
||||
};
|
||||
|
||||
#ifdef STAGE1_5
|
||||
# define print_possibilities 0
|
||||
#endif
|
||||
|
||||
#ifndef _DISK_IO_C
|
||||
|
||||
# ifndef STAGE1_5
|
||||
#else
|
||||
extern int print_possibilities;
|
||||
# endif
|
||||
#endif
|
||||
|
||||
extern int fsmax;
|
||||
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 */
|
||||
|
|
|
@ -238,7 +238,7 @@ struct ext2_dir_entry
|
|||
* ffz = Find First Zero in word. Undefined if no zero exists,
|
||||
* so code should check against ~0UL first..
|
||||
*/
|
||||
__inline__ unsigned long
|
||||
static __inline__ unsigned long
|
||||
ffz (unsigned long word)
|
||||
{
|
||||
__asm__ ("bsfl %1,%0"
|
||||
|
@ -257,33 +257,31 @@ ext2fs_mount (void)
|
|||
&& (current_slice != PC_SLICE_TYPE_EXT2FS)
|
||||
&& (current_slice != (PC_SLICE_TYPE_BSD | (FS_OTHER << 8))))
|
||||
|| 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)
|
||||
retval = 0;
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
/* not part of the interface
|
||||
takes a file system block number and reads it into area pointed
|
||||
to by buffer */
|
||||
int
|
||||
/* Takes a file system block number and reads it into BUFFER. */
|
||||
static int
|
||||
ext2_rdfsb (int fsblock, int buffer)
|
||||
{
|
||||
#ifdef E2DEBUG
|
||||
printf ("fsblock %d buffer %d\n", fsblock, buffer);
|
||||
#endif /* E2DEBUG */
|
||||
return devread (fsblock * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE), 0,
|
||||
EXT2_BLOCK_SIZE (SUPERBLOCK), (int) buffer);
|
||||
EXT2_BLOCK_SIZE (SUPERBLOCK), (char *) buffer);
|
||||
}
|
||||
|
||||
/* from
|
||||
ext2/inode.c:ext2_bmap()
|
||||
*/
|
||||
/* not part of interface
|
||||
maps "logical block" (the file offset div blocksize) into
|
||||
"physical blocks" (the location in the file system) via an inode */
|
||||
int
|
||||
/* Maps LOGICAL_BLOCK (the file offset divided by the blocksize) into
|
||||
a physical block (the location in the file system) via an inode. */
|
||||
static int
|
||||
ext2fs_block_map (int logical_block)
|
||||
{
|
||||
|
||||
|
@ -387,7 +385,7 @@ ext2fs_block_map (int logical_block)
|
|||
|
||||
/* preconditions: all preconds of ext2fs_block_map */
|
||||
int
|
||||
ext2fs_read (int addr, int len)
|
||||
ext2fs_read (char *buf, int len)
|
||||
{
|
||||
int logical_block;
|
||||
int offset;
|
||||
|
@ -436,13 +434,13 @@ ext2fs_read (int addr, int len)
|
|||
#endif /* STAGE1_5 */
|
||||
|
||||
devread (map * (EXT2_BLOCK_SIZE (SUPERBLOCK) / DEV_BSIZE),
|
||||
offset, size, addr);
|
||||
offset, size, buf);
|
||||
|
||||
#ifndef STAGE1_5
|
||||
debug_fs_func = NULL;
|
||||
#endif /* STAGE1_5 */
|
||||
|
||||
addr += size;
|
||||
buf += size;
|
||||
len -= size;
|
||||
filepos += size;
|
||||
ret += size;
|
||||
|
@ -592,7 +590,7 @@ ext2fs_dir (char *dirname)
|
|||
/* If we've got a symbolic link, then chase it. */
|
||||
if (S_ISLNK (INODE->i_mode))
|
||||
{
|
||||
int len, remaining;
|
||||
int len;
|
||||
if (++link_count > MAX_LINK_COUNT)
|
||||
{
|
||||
errnum = ERR_SYMLINK_LOOP;
|
||||
|
@ -624,7 +622,7 @@ ext2fs_dir (char *dirname)
|
|||
if (INODE->i_blocks)
|
||||
{
|
||||
/* Read the necessary blocks, and reset the file pointer. */
|
||||
len = read ((int) linkbuf, filemax);
|
||||
len = grub_read (linkbuf, filemax);
|
||||
filepos = 0;
|
||||
if (!len)
|
||||
return 0;
|
||||
|
|
|
@ -43,7 +43,7 @@ fat_mount (void)
|
|||
&& (current_slice != PC_SLICE_TYPE_FAT16_LT32M)
|
||||
&& (current_slice != PC_SLICE_TYPE_FAT16_GT32M)
|
||||
&& (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_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))
|
||||
|
@ -112,7 +112,7 @@ fat_create_blocklist (int first_fat_entry)
|
|||
mapblock = ((new_mapblock < 6) ? 0 :
|
||||
((new_mapblock - 6) & ~0x1FF));
|
||||
if (!devread ((mapblock >> 9) + FAT_BPB_FAT_START (BPB),
|
||||
0, SECTOR_SIZE * 4, FAT_BUF))
|
||||
0, SECTOR_SIZE * 4, (char *) FAT_BUF))
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -196,7 +196,7 @@ loop:
|
|||
|
||||
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)
|
||||
{
|
||||
|
|
|
@ -82,7 +82,7 @@ ffs_mount (void)
|
|||
if ((((current_drive & 0x80) || (current_slice != 0))
|
||||
&& current_slice != (PC_SLICE_TYPE_BSD | (FS_BSDFFS << 8)))
|
||||
|| part_length < (SBLOCK + (SBSIZE / DEV_BSIZE))
|
||||
|| !devread (SBLOCK, 0, SBSIZE, (int) SUPERBLOCK)
|
||||
|| !devread (SBLOCK, 0, SBSIZE, (char *) SUPERBLOCK)
|
||||
|| SUPERBLOCK->fs_magic != FS_MAGIC)
|
||||
retval = 0;
|
||||
|
||||
|
@ -101,7 +101,7 @@ block_map (int file_block)
|
|||
|
||||
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;
|
||||
errnum = ERR_FSYS_CORRUPT;
|
||||
|
@ -116,7 +116,7 @@ block_map (int file_block)
|
|||
|
||||
|
||||
int
|
||||
ffs_read (int addr, int len)
|
||||
ffs_read (char *buf, int len)
|
||||
{
|
||||
int logno, off, size, map, ret = 0;
|
||||
|
||||
|
@ -138,13 +138,13 @@ ffs_read (int addr, int len)
|
|||
debug_fs_func = debug_fs;
|
||||
#endif /* STAGE1_5 */
|
||||
|
||||
devread (fsbtodb (SUPERBLOCK, map), off, size, addr);
|
||||
devread (fsbtodb (SUPERBLOCK, map), off, size, buf);
|
||||
|
||||
#ifndef STAGE1_5
|
||||
debug_fs_func = NULL;
|
||||
#endif /* STAGE1_5 */
|
||||
|
||||
addr += size;
|
||||
buf += size;
|
||||
len -= size;
|
||||
filepos += size;
|
||||
ret += size;
|
||||
|
@ -170,7 +170,7 @@ loop:
|
|||
/* load current inode (defaults to the root inode) */
|
||||
|
||||
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? */
|
||||
|
||||
bcopy ((void *) &(((struct dinode *) FSYS_BUF)[ino % (SUPERBLOCK->fs_inopb)]),
|
||||
|
@ -232,7 +232,8 @@ loop:
|
|||
|
||||
if ((map = block_map (block)) < 0
|
||||
|| !devread (fsbtodb (SUPERBLOCK, map), 0,
|
||||
blksize (SUPERBLOCK, INODE, block), FSYS_BUF))
|
||||
blksize (SUPERBLOCK, INODE, block),
|
||||
(char *) FSYS_BUF))
|
||||
{
|
||||
errnum = ERR_FSYS_CORRUPT;
|
||||
*rest = ch;
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
/*
|
||||
* 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
|
||||
* 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
|
||||
prefer that if you modify it and redistribute it that you include
|
||||
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;
|
||||
}
|
||||
}
|
||||
while ((not_retval = read ((int) &ch, 1)) == 1);
|
||||
while ((not_retval = grub_read (&ch, 1)) == 1);
|
||||
|
||||
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
|
||||
* 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) != OLD_GZIP_HDR_LE)))
|
||||
{
|
||||
|
@ -291,11 +291,12 @@ gunzip_test_header (void)
|
|||
*/
|
||||
if (buf[2] != DEFLATED || (buf[3] & UNSUPP_FLAGS)
|
||||
|| ((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] & COMMENT) && bad_field (-1))
|
||||
|| ((gzip_data_offset = filepos), (filepos = filemax - 8),
|
||||
(read ((int) buf, 8) != 8)))
|
||||
(grub_read (buf, 8) != 8)))
|
||||
{
|
||||
if (!errnum)
|
||||
errnum = ERR_BAD_GZIP_HEADER;
|
||||
|
@ -481,7 +482,7 @@ get_byte (void)
|
|||
if (filepos == gzip_data_offset || bufloc == INBUFSIZ)
|
||||
{
|
||||
bufloc = 0;
|
||||
read ((int) inbuf, INBUFSIZ);
|
||||
grub_read (inbuf, INBUFSIZ);
|
||||
}
|
||||
|
||||
return inbuf[bufloc++];
|
||||
|
@ -1166,9 +1167,8 @@ initialize_tables (void)
|
|||
|
||||
|
||||
int
|
||||
gunzip_read (int addr, int len)
|
||||
gunzip_read (char *buf, int len)
|
||||
{
|
||||
int size; /* last block flag */
|
||||
int ret = 0;
|
||||
|
||||
compressed_file = 0;
|
||||
|
@ -1200,9 +1200,9 @@ gunzip_read (int addr, int len)
|
|||
if (size > len)
|
||||
size = len;
|
||||
|
||||
bcopy (srcaddr, (char *) addr, size);
|
||||
bcopy (srcaddr, buf, size);
|
||||
|
||||
addr += size;
|
||||
buf += size;
|
||||
len -= size;
|
||||
gzip_filepos += size;
|
||||
ret += size;
|
||||
|
|
|
@ -1,7 +1,8 @@
|
|||
|
||||
/* shared.h - definitions used in all GRUB-specific code */
|
||||
/*
|
||||
* 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
|
||||
* 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_IC 0x5200 /* insert char */
|
||||
# define KEY_DC 0x5300 /* delete char */
|
||||
# define KEY_BACKSPACE 0x0008
|
||||
# define KEY_HOME 0x4700
|
||||
# define KEY_END 0x4F00
|
||||
# define KEY_NPAGE 0x4900
|
||||
# define KEY_PPAGE 0x5100
|
||||
# define A_NORMAL 0x7
|
||||
# define A_REVERSE 0x70
|
||||
#else
|
||||
# include <curses.h>
|
||||
#endif
|
||||
|
||||
/* Remap some names so that we don't conflict with libc. */
|
||||
#define bcopy grub_bcopy
|
||||
#define bzero grub_bzero
|
||||
#define isspace grub_isspace
|
||||
#define open grub_open
|
||||
#define printf grub_printf
|
||||
#undef putchar
|
||||
#define putchar grub_putchar
|
||||
#define read grub_read
|
||||
#define strncat grub_strncat
|
||||
#define strstr grub_strstr
|
||||
#define tolower grub_tolower
|
||||
|
||||
|
||||
#ifndef ASM_FILE
|
||||
|
||||
|
||||
/*
|
||||
* 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 */
|
||||
/* Special graphics characters for IBM displays. */
|
||||
#define DISP_UL 218
|
||||
#define DISP_UR 191
|
||||
#define DISP_LL 192
|
||||
|
@ -289,228 +199,301 @@ __attribute__ ((noreturn));
|
|||
#define DISP_RIGHT 0x1a
|
||||
#define DISP_UP 0x18
|
||||
#define DISP_DOWN 0x19
|
||||
void putchar (int c);
|
||||
/* returns packed BIOS/ASCII code */
|
||||
int getkey (void);
|
||||
|
||||
/* returns 0 if non-ASCII character */
|
||||
#undef getc
|
||||
#define getc() ASCII_CHAR(getkey())
|
||||
|
||||
/* like 'getkey', but doesn't wait, returns -1 if nothing available */
|
||||
int checkkey (void);
|
||||
|
||||
/* sets text mode character attribute at the cursor position */
|
||||
#define ATTRIB_NORMAL 0x7
|
||||
#define ATTRIB_INVERSE 0x70
|
||||
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);
|
||||
/* Remap some libc-API-compatible function names so that we can use
|
||||
them alongside their libc counterparts. */
|
||||
#define bcopy grub_bcopy
|
||||
#define bzero grub_bzero
|
||||
#define isspace grub_isspace
|
||||
#define printf grub_printf
|
||||
#undef putchar
|
||||
#define putchar grub_putchar
|
||||
#define strncat grub_strncat
|
||||
#define strstr grub_strstr
|
||||
#define tolower grub_tolower
|
||||
|
||||
|
||||
#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;
|
||||
extern char *password;
|
||||
extern char commands[];
|
||||
#include "mb_header.h"
|
||||
#include "mb_info.h"
|
||||
|
||||
#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);
|
||||
void init_cmdline (void);
|
||||
int enter_cmdline (char *script, char *heap);
|
||||
#undef NULL
|
||||
#define NULL ((void *) 0)
|
||||
|
||||
/* Error codes (descriptions are in common.c) */
|
||||
typedef enum
|
||||
{
|
||||
ERR_NONE = 0,
|
||||
ERR_BAD_FILENAME,
|
||||
ERR_BAD_FILETYPE,
|
||||
ERR_BAD_GZIP_DATA,
|
||||
ERR_BAD_GZIP_HEADER,
|
||||
ERR_BAD_PART_TABLE,
|
||||
ERR_BAD_VERSION,
|
||||
ERR_BELOW_1MB,
|
||||
ERR_BOOT_COMMAND,
|
||||
ERR_BOOT_FAILURE,
|
||||
ERR_BOOT_FEATURES,
|
||||
ERR_DEV_FORMAT,
|
||||
ERR_DEV_VALUES,
|
||||
ERR_EXEC_FORMAT,
|
||||
ERR_FILELENGTH,
|
||||
ERR_FILE_NOT_FOUND,
|
||||
ERR_FSYS_CORRUPT,
|
||||
ERR_FSYS_MOUNT,
|
||||
ERR_GEOM,
|
||||
ERR_NEED_LX_KERNEL,
|
||||
ERR_NEED_MB_KERNEL,
|
||||
ERR_NO_DISK,
|
||||
ERR_NO_PART,
|
||||
ERR_NUMBER_PARSING,
|
||||
ERR_OUTSIDE_PART,
|
||||
ERR_READ,
|
||||
ERR_SYMLINK_LOOP,
|
||||
ERR_UNRECOGNIZED,
|
||||
ERR_WONT_FIT,
|
||||
ERR_WRITE,
|
||||
|
||||
/*
|
||||
* From "char_io.c"
|
||||
*/
|
||||
MAX_ERR_NUM
|
||||
} grub_error_t;
|
||||
|
||||
#ifndef _CHAR_IO_C
|
||||
extern unsigned long install_partition;
|
||||
extern unsigned long boot_drive;
|
||||
extern char version_string[];
|
||||
extern char config_file[];
|
||||
|
||||
int special_attribute;
|
||||
#ifndef STAGE1_5
|
||||
/* GUI interface variables. */
|
||||
extern int fallback;
|
||||
extern char *password;
|
||||
extern char commands[];
|
||||
#endif
|
||||
|
||||
#endif /* _CHAR_IO_C */
|
||||
|
||||
enum grub_error_t
|
||||
{
|
||||
ERR_NONE = 0,
|
||||
ERR_BAD_FILENAME,
|
||||
ERR_BAD_FILETYPE,
|
||||
ERR_BAD_GZIP_DATA,
|
||||
ERR_BAD_GZIP_HEADER,
|
||||
ERR_BAD_PART_TABLE,
|
||||
ERR_BAD_VERSION,
|
||||
ERR_BELOW_1MB,
|
||||
ERR_BOOT_COMMAND,
|
||||
ERR_BOOT_FAILURE,
|
||||
ERR_BOOT_FEATURES,
|
||||
ERR_DEV_FORMAT,
|
||||
ERR_DEV_VALUES,
|
||||
ERR_EXEC_FORMAT,
|
||||
ERR_FILELENGTH,
|
||||
ERR_FILE_NOT_FOUND,
|
||||
ERR_FSYS_CORRUPT,
|
||||
ERR_FSYS_MOUNT,
|
||||
ERR_GEOM,
|
||||
ERR_NEED_LX_KERNEL,
|
||||
ERR_NEED_MB_KERNEL,
|
||||
ERR_NO_DISK,
|
||||
ERR_NO_PART,
|
||||
ERR_NUMBER_PARSING,
|
||||
ERR_OUTSIDE_PART,
|
||||
ERR_READ,
|
||||
ERR_SYMLINK_LOOP,
|
||||
ERR_UNRECOGNIZED,
|
||||
ERR_WONT_FIT,
|
||||
ERR_WRITE,
|
||||
|
||||
MAX_ERR_NUM
|
||||
};
|
||||
|
||||
void init_page (void);
|
||||
void print_error (void);
|
||||
char *convert_to_ascii (char *buf, int c,...);
|
||||
void grub_printf (char *format,...);
|
||||
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);
|
||||
|
||||
|
||||
/*
|
||||
* From "gunzip.c"
|
||||
*/
|
||||
|
||||
#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 NO_DECOMPRESSION
|
||||
extern int no_decompression;
|
||||
extern int compressed_file;
|
||||
#endif
|
||||
|
||||
#ifndef STAGE1_5
|
||||
/* instrumentation variables */
|
||||
extern void (*debug_fs) (int);
|
||||
extern void (*debug_fs_func) (int);
|
||||
extern void (*debug_fs) (int);
|
||||
extern void (*debug_fs_func) (int);
|
||||
#endif /* STAGE1_5 */
|
||||
|
||||
extern unsigned long current_drive;
|
||||
extern unsigned long current_partition;
|
||||
extern unsigned long current_drive;
|
||||
extern unsigned long current_partition;
|
||||
|
||||
extern int fsys_type;
|
||||
extern int fsys_type;
|
||||
|
||||
#ifndef NO_BLOCK_FILES
|
||||
extern int block_file;
|
||||
extern int block_file;
|
||||
#endif /* NO_BLOCK_FILES */
|
||||
|
||||
extern long part_start;
|
||||
extern long part_length;
|
||||
extern long part_start;
|
||||
extern long part_length;
|
||||
|
||||
extern int current_slice;
|
||||
extern int current_slice;
|
||||
|
||||
extern int buf_drive;
|
||||
extern int buf_track;
|
||||
extern int buf_geom;
|
||||
extern int buf_drive;
|
||||
extern int buf_track;
|
||||
extern int buf_geom;
|
||||
|
||||
/* these are the current file position and maximum file position */
|
||||
extern int filepos;
|
||||
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
|
||||
extern int filepos;
|
||||
extern int filemax;
|
||||
|
||||
/*
|
||||
* Common BIOS/boot data.
|
||||
*/
|
||||
|
||||
extern struct multiboot_info mbi;
|
||||
extern unsigned long saved_drive;
|
||||
extern unsigned long saved_partition;
|
||||
extern unsigned long saved_mem_upper;
|
||||
extern struct multiboot_info mbi;
|
||||
extern unsigned long saved_drive;
|
||||
extern unsigned long saved_partition;
|
||||
extern unsigned long saved_mem_upper;
|
||||
|
||||
/*
|
||||
* Error variables.
|
||||
*/
|
||||
|
||||
extern int errnum;
|
||||
extern char *err_list[];
|
||||
extern grub_error_t errnum;
|
||||
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 */
|
||||
|
|
|
@ -227,8 +227,7 @@ get_checksum (unsigned start, int length)
|
|||
static int
|
||||
boot_cpu (imps_processor * proc)
|
||||
{
|
||||
int apicid = proc->apic_id;
|
||||
unsigned bootaddr, send_status, accept_status, cfg;
|
||||
unsigned bootaddr, accept_status;
|
||||
unsigned bios_reset_vector = PHYS_TO_VIRTUAL (BIOS_RESET_VECTOR);
|
||||
|
||||
/* %%%%% ESB */
|
||||
|
|
|
@ -29,7 +29,7 @@ cmain (void)
|
|||
* 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);
|
||||
|
||||
/*
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
|
||||
#include "../shared_src/shared.h"
|
||||
|
||||
char *
|
||||
static char *
|
||||
get_entry(char *list, int num, int nested)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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)
|
||||
{
|
||||
int i;
|
||||
|
@ -118,15 +118,15 @@ print_border(int y, int size)
|
|||
putchar(DISP_LR);
|
||||
}
|
||||
|
||||
void
|
||||
static void
|
||||
set_line(int y, int attr)
|
||||
{
|
||||
int x;
|
||||
|
||||
for (x = 2; x < 75; x++)
|
||||
{
|
||||
gotoxy(x, y);
|
||||
set_attrib(attr);
|
||||
gotoxy (x, y);
|
||||
set_attrib (attr);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -134,7 +134,7 @@ set_line(int y, int attr)
|
|||
static int grub_timeout;
|
||||
|
||||
|
||||
void
|
||||
static void
|
||||
run_menu(char *menu_entries, char *config_entries, int num_entries,
|
||||
char *heap, int entryno)
|
||||
{
|
||||
|
@ -179,7 +179,7 @@ restart:
|
|||
print_entries(3, 12, first_entry, menu_entries);
|
||||
|
||||
/* invert initial line */
|
||||
set_line(4+entryno, 0x70);
|
||||
set_line (4 + entryno, A_REVERSE);
|
||||
|
||||
/* XX using RT clock now, need to initialize value */
|
||||
while ((time1 = getrtsecs()) == 0xFF);
|
||||
|
@ -222,15 +222,15 @@ restart:
|
|||
{
|
||||
if (entryno > 0)
|
||||
{
|
||||
set_line(4+entryno, 0x7);
|
||||
entryno--;
|
||||
set_line(4+entryno, 0x70);
|
||||
set_line (4 + entryno, A_NORMAL);
|
||||
entryno --;
|
||||
set_line (4 + entryno, A_REVERSE);
|
||||
}
|
||||
else if (first_entry > 0)
|
||||
{
|
||||
first_entry--;
|
||||
first_entry --;
|
||||
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))
|
||||
|
@ -238,15 +238,15 @@ restart:
|
|||
{
|
||||
if (entryno < 11)
|
||||
{
|
||||
set_line(4+entryno, 0x7);
|
||||
entryno++;
|
||||
set_line(4+entryno, 0x70);
|
||||
set_line (4 + entryno, A_NORMAL);
|
||||
entryno ++;
|
||||
set_line (4 + entryno, A_REVERSE);
|
||||
}
|
||||
else if (num_entries > 12+first_entry)
|
||||
{
|
||||
first_entry++;
|
||||
print_entries(3, 12, first_entry, menu_entries);
|
||||
set_line(15, 0x70);
|
||||
first_entry ++;
|
||||
print_entries (3, 12, first_entry, menu_entries);
|
||||
set_line (15, A_REVERSE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -261,7 +261,7 @@ restart:
|
|||
{
|
||||
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 */
|
||||
if (c == 'o')
|
||||
{
|
||||
|
@ -323,7 +323,7 @@ restart:
|
|||
{
|
||||
char *new_file = config_file;
|
||||
while (isspace(*ptr)) ptr++;
|
||||
while (*(new_file++) = *(ptr++));
|
||||
while ((*(new_file++) = *(ptr++)) != 0);
|
||||
return;
|
||||
}
|
||||
c = ASCII_CHAR(getkey());
|
||||
|
@ -350,14 +350,14 @@ restart:
|
|||
else
|
||||
{
|
||||
/* safe area! */
|
||||
new_heap = heap+1501;
|
||||
new_heap = heap + NEW_HEAPSIZE + 1;
|
||||
cur_entry = get_entry(menu_entries,
|
||||
first_entry+entryno, 0);
|
||||
}
|
||||
|
||||
do
|
||||
{
|
||||
while (*(new_heap++) = cur_entry[i++]);
|
||||
while ((*(new_heap++) = cur_entry[i++]) != 0);
|
||||
num_entries++;
|
||||
}
|
||||
while (config_entries && cur_entry[i]);
|
||||
|
@ -373,13 +373,14 @@ restart:
|
|||
cls();
|
||||
init_cmdline();
|
||||
|
||||
new_heap = heap+1501;
|
||||
new_heap = heap + NEW_HEAPSIZE + 1;
|
||||
|
||||
saved_drive = boot_drive;
|
||||
saved_partition = install_partition;
|
||||
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;
|
||||
|
||||
|
@ -408,7 +409,7 @@ restart:
|
|||
}
|
||||
if (c == 'c')
|
||||
{
|
||||
enter_cmdline(NULL, heap);
|
||||
enter_cmdline (NULL, heap);
|
||||
goto restart;
|
||||
}
|
||||
}
|
||||
|
@ -432,7 +433,7 @@ restart:
|
|||
if (!cur_entry)
|
||||
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)
|
||||
break;
|
||||
|
@ -460,7 +461,7 @@ get_line_from_config(char *cmdline, int maxlen)
|
|||
int pos = 0, literal = 0, comment = 0;
|
||||
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! */
|
||||
if (c == '\\')
|
||||
|
@ -520,12 +521,12 @@ cmain(void)
|
|||
* 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;
|
||||
char cmdline[1502], *ptr;
|
||||
|
||||
while (get_line_from_config(cmdline, 1500))
|
||||
while (get_line_from_config (cmdline, NEW_HEAPSIZE))
|
||||
{
|
||||
ptr = skip_to(1, cmdline);
|
||||
|
||||
|
@ -547,7 +548,7 @@ cmain(void)
|
|||
state = 1;
|
||||
|
||||
/* copy title into menu area */
|
||||
while (menu_entries[menu_len++] = *(ptr++));
|
||||
while ((menu_entries[menu_len++] = *(ptr++)) != 0);
|
||||
}
|
||||
else if (!state)
|
||||
{
|
||||
|
@ -559,9 +560,8 @@ cmain(void)
|
|||
safe_parse_maxint(&ptr, &default_entry);
|
||||
if (substring("password", cmdline) < 1)
|
||||
{
|
||||
char *ptrend = ptr;
|
||||
password = config_entries;
|
||||
while (*(config_entries++) = *(ptr++));
|
||||
while ((*(config_entries++) = *(ptr++)) != 0);
|
||||
}
|
||||
|
||||
errnum = 0;
|
||||
|
@ -573,7 +573,7 @@ cmain(void)
|
|||
state++;
|
||||
|
||||
/* 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)
|
||||
while (1)
|
||||
enter_cmdline(NULL, config_entries);
|
||||
enter_cmdline (NULL, config_entries);
|
||||
|
||||
/*
|
||||
* Run menu interface (this shouldn't return!).
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue