diff --git a/ChangeLog b/ChangeLog index 53ba3f425..1f6606e98 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,58 @@ +2000-04-03 OKUJI Yoshinori + + * stage2/stage2.c (run_menu) [GRUB_UTIL]: Removed a nested + "#ifdef GRUB_UTIL" ... "#endif". + * stage2/builtins.c (unhide_func): Don't modify SAVED_DRIVE or + SAVED_PARTITION. + (hide_func): Likewise. + * stage2/disk_io.c (set_partition_hidden_flag): Use + CURRENT_DRIVE and CURRENT_PARTITION instead of SAVED_DRIVE and + SAVED_PARTITION. Check if bit 7 in CURRENT_DRIVE is non-zero + instead of if CURRENT_DRIVE is non-zero. + + * grub/asmstub.c (init_device_map): Change the message + "Probe devices..." to "Probing devices...". Suggested by Neal H + Walfield. + + * stage2/pc_slice.h (PC_SLICE_TYPE_HIDDEN_FLAG): Move the + definition before the PC partition type definitions. + (IS_PC_SLICE_TYPE_FAT): Clear the hidden flag in TYPE before + checking if TYPE is either of the FAT partition types. Reported + by Thomas Schweikle . + +2000-04-02 OKUJI Yoshinori + + * stage2/builtins.c (setup_func): Don't read a stage 1.5 to get + the size. Use FILEMAX instead. + If embed_func fails (i.e. ERRNUM is non-zero), goto fail. + +2000-04-02 OKUJI Yoshinori + + Suggested by Neal H Walfield : + * stage2/common.c (init_bios_info): Removed a nested + "#ifndef STAGE1_5" ... "#endif". + * util/grub-install.in: Quote most of the references to + shell variables by double quotation marks. + (usage): Added a description about the argument. + * stage2/builtins.c (setup_func): Change each of the messages + when running embed_func and install_func. "Run" -> "Running". + If install_func succeeds, print a message ("Done."). + + From Frank Mehnert : + * stage2/char_io.c (convert_to_ascii) [!STAGE1_5]: Accept 'X' + and 'b' as well. If C is 'X' or 'b', then set MULT to 16. + (grub_printf): Set a new variable MASK to 0xFFFFFFFF by default. + Mask *DATAPTR with MASK when calling convert_to_ascii. + (grub_printf) [!STAGE1_5]: Added 'b' and 'X'. If C is 'b', set + MASK to 0xFF and fall through to the case 'u'. 'X' is the same + as 'x'. + + From Josip Rodin : + * grub.texi: Several awkward English sentences are fixed. + * tutorial.texi: Likewise. + * user-ref.texi: Likewise. + * appendices.texi: Likewise. + 2000-03-27 OKUJI Yoshinori * stage1/depcomp: New file. Automake forces to install it. This diff --git a/THANKS b/THANKS index d92d7194b..c37f8da1f 100644 --- a/THANKS +++ b/THANKS @@ -14,6 +14,7 @@ Dan J. Walters Edmund GRIMLEY EVANS Edward Killips Eric Hanchrow +Frank Mehnert Goran Koruga Heiko Schroeder Hisazumi Kenji @@ -25,6 +26,7 @@ Kunihiro Ishiguro Mark Lundeberg Michael Hohmuth Miles Bader +Neal H Walfield OKUJI Yoshinori Pavel Roskin Per Lundberg @@ -32,4 +34,5 @@ Peter Astrand Ramon van Handel Stephen Early Takehiro Suzuki +Thomas Schweikle VaX#n8 diff --git a/configure b/configure index 049bc0f97..3b92d918b 100644 --- a/configure +++ b/configure @@ -897,7 +897,7 @@ fi PACKAGE=grub -VERSION=0.5.94 +VERSION=0.5.95 if test "`CDPATH=: && cd $srcdir && pwd`" != "`pwd`" && test -f $srcdir/config.status; then @@ -930,31 +930,8 @@ if test -z "$install_sh"; then install_sh="`echo $install_sh | sed -e 's/\${SHELL}//'`" fi -ac_aux_dir= -for ac_dir in . $srcdir/.; do - if test -f $ac_dir/install-sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install-sh -c" - break - elif test -f $ac_dir/install.sh; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/install.sh -c" - break - elif test -f $ac_dir/shtool; then - ac_aux_dir=$ac_dir - ac_install_sh="$ac_aux_dir/shtool install -c" - break - fi -done -if test -z "$ac_aux_dir"; then - { echo "configure: error: cannot find install-sh or install.sh in . $srcdir/." 1>&2; exit 1; } -fi -ac_config_guess="$SHELL $ac_aux_dir/config.guess" -ac_config_sub="$SHELL $ac_aux_dir/config.sub" -ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. - echo $ECHO_N "checking host system type... $ECHO_C" 1>&6 -echo "configure:958: checking host system type" 1>&5 +echo "configure:935: checking host system type" 1>&5 if test "x$ac_cv_host" = "x" || (test "x$host" != "xNONE" && test "x$host" != "x$ac_cv_host_alias"); then # Make sure we can run config.sub. @@ -999,7 +976,7 @@ esac # echo $ECHO_N "checking whether to enable maintainer-specific portions of Makefiles... $ECHO_C" 1>&6 -echo "configure:1003: checking whether to enable maintainer-specific portions of Makefiles" 1>&5 +echo "configure:980: checking whether to enable maintainer-specific portions of Makefiles" 1>&5 # Check whether --enable-maintainer-mode or --disable-maintainer-mode was given. if test "${enable_maintainer_mode+set}" = set; then enableval="$enable_maintainer_mode" @@ -1022,7 +999,7 @@ if test "x$enable_maintainer_mode" = xyes; then # Extract the first word of "perl", so it can be a program name with args. set dummy perl; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1026: checking for $ac_word" 1>&5 +echo "configure:1003: checking for $ac_word" 1>&5 if test "${ac_cv_path_PERL+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1066,7 +1043,7 @@ fi # echo $ECHO_N "checking build system type... $ECHO_C" 1>&6 -echo "configure:1070: checking build system type" 1>&5 +echo "configure:1047: checking build system type" 1>&5 if test "x$ac_cv_build" = "x" || (test "x$build" != "xNONE" && test "x$build" != "x$ac_cv_build_alias"); then # Make sure we can run config.sub. @@ -1109,7 +1086,7 @@ fi # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1113: checking for $ac_word" 1>&5 +echo "configure:1090: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1147,7 +1124,7 @@ esac # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1151: checking for $ac_word" 1>&5 +echo "configure:1128: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1180,7 +1157,7 @@ fi # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1184: checking for $ac_word" 1>&5 +echo "configure:1161: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1234,7 +1211,7 @@ do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1238: checking for $ac_word" 1>&5 +echo "configure:1215: checking for $ac_word" 1>&5 if test "${ac_cv_prog_CC+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1272,7 +1249,7 @@ done test -z "$CC" && { echo "configure: error: no acceptable cc found in \$PATH" 1>&2; exit 1; } echo $ECHO_N "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works... $ECHO_C" 1>&6 -echo "configure:1276: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works" 1>&5 +echo "configure:1253: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) works" 1>&5 ac_ext=c # CFLAGS is not in ac_cpp because -g, -O, etc. are not valid cpp options. @@ -1283,12 +1260,12 @@ cross_compiling=$ac_cv_prog_cc_cross cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1269: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; 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 @@ -1314,12 +1291,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 77; } fi echo $ECHO_N "checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler... $ECHO_C" 1>&6 -echo "configure:1318: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler" 1>&5 +echo "configure:1295: checking whether the C compiler ($CC $CFLAGS $CPPFLAGS $LDFLAGS) is a cross-compiler" 1>&5 echo "$ECHO_T""$ac_cv_prog_cc_cross" 1>&6 cross_compiling=$ac_cv_prog_cc_cross echo $ECHO_N "checking whether we are using GNU C... $ECHO_C" 1>&6 -echo "configure:1323: checking whether we are using GNU C" 1>&5 +echo "configure:1300: checking whether we are using GNU C" 1>&5 if test "${ac_cv_prog_gcc+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1328,7 +1305,7 @@ else yes; #endif EOF -if { ac_try='${CC-cc} -E conftest.c'; { (eval echo configure:1332: \"$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:1309: \"$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 @@ -1346,7 +1323,7 @@ ac_test_CFLAGS="${CFLAGS+set}" ac_save_CFLAGS="$CFLAGS" CFLAGS= echo $ECHO_N "checking whether ${CC-cc} accepts -g... $ECHO_C" 1>&6 -echo "configure:1350: checking whether ${CC-cc} accepts -g" 1>&5 +echo "configure:1327: checking whether ${CC-cc} accepts -g" 1>&5 if test "${ac_cv_prog_cc_g+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1377,7 +1354,7 @@ else fi echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" 1>&6 -echo "configure:1381: checking how to run the C preprocessor" 1>&5 +echo "configure:1358: checking how to run the C preprocessor" 1>&5 # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= @@ -1393,13 +1370,13 @@ else # not just through cpp. cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1403: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1380: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1411,13 +1388,13 @@ else CPP="${CC-cc} -E -traditional-cpp" cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1421: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1398: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1429,13 +1406,13 @@ else CPP="${CC-cc} -nologo -E" cat >conftest.$ac_ext < Syntax Error EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:1439: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:1416: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then : @@ -1462,7 +1439,7 @@ echo "$ECHO_T""$CPP" 1>&6 depcc="$CC" depcpp="$CPP" echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" 1>&6 -echo "configure:1466: checking dependency style of $depcc" 1>&5 +echo "configure:1443: checking dependency style of $depcc" 1>&5 if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1516,7 +1493,7 @@ if test "x$with_binutils" != x; then # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. set dummy ${ac_tool_prefix}ranlib; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1520: checking for $ac_word" 1>&5 +echo "configure:1497: checking for $ac_word" 1>&5 if test "${ac_cv_path_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1551,7 +1528,7 @@ if test -z "$ac_cv_prog_RANLIB"; then # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1555: checking for $ac_word" 1>&5 +echo "configure:1532: checking for $ac_word" 1>&5 if test "${ac_cv_path_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1590,7 +1567,7 @@ else # Extract the first word of "ranlib", so it can be a program name with args. set dummy ranlib; ac_word=$2 echo $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1594: checking for $ac_word" 1>&5 +echo "configure:1571: checking for $ac_word" 1>&5 if test "${ac_cv_prog_RANLIB+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1633,7 +1610,7 @@ if test "x$ac_cv_prog_gcc" = xyes; then STAGE1_CFLAGS="-O2" GRUB_CFLAGS="-O2" echo $ECHO_N "checking whether optimization for size works... $ECHO_C" 1>&6 -echo "configure:1637: checking whether optimization for size works" 1>&5 +echo "configure:1614: checking whether optimization for size works" 1>&5 if test "${size_flag+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1641,7 +1618,7 @@ else saved_CFLAGS=$CFLAGS CFLAGS="-Os -g" cat >conftest.$ac_ext <&5; (eval $ac_compile) 2>&5; }; then +if { (eval echo configure:1633: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; }; then rm -rf conftest* size_flag=yes else @@ -1682,7 +1659,7 @@ if test "x$with_binutils" != x; then # 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 $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1686: checking for $ac_word" 1>&5 +echo "configure:1663: checking for $ac_word" 1>&5 if test "${ac_cv_path_OBJCOPY+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1717,7 +1694,7 @@ else # 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 $ECHO_N "checking for $ac_word... $ECHO_C" 1>&6 -echo "configure:1721: checking for $ac_word" 1>&5 +echo "configure:1698: checking for $ac_word" 1>&5 if test "${ac_cv_prog_OBJCOPY+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1752,7 +1729,7 @@ fi # Defined in acinclude.m4. echo $ECHO_N "checking if C symbols get an underscore after compilation... $ECHO_C" 1>&6 -echo "configure:1756: checking if C symbols get an underscore after compilation" 1>&5 +echo "configure:1733: checking if C symbols get an underscore after compilation" 1>&5 if test "${grub_cv_asm_uscore+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1765,7 +1742,7 @@ func (int *list) } EOF -if { ac_try='${CC-cc} ${CFLAGS} -S conftest.c'; { (eval echo configure:1769: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then +if { ac_try='${CC-cc} ${CFLAGS} -S conftest.c'; { (eval echo configure:1746: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.s; then true else { echo "configure: error: ${CC-cc} failed to produce assembly code" 1>&2; exit 1; } @@ -1790,7 +1767,7 @@ fi echo "$ECHO_T""$grub_cv_asm_uscore" 1>&6 echo $ECHO_N "checking whether ${OBJCOPY} works for absolute addresses... $ECHO_C" 1>&6 -echo "configure:1794: checking whether ${OBJCOPY} works for absolute addresses" 1>&5 +echo "configure:1771: checking whether ${OBJCOPY} works for absolute addresses" 1>&5 if test "${grub_cv_prog_objcopy_absolute+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1802,21 +1779,21 @@ cmain (void) } EOF -if { (eval echo configure:1806: \"$ac_compile\") 1>&5; (eval $ac_compile) 2>&5; } && test -s conftest.o; then : +if { (eval echo configure:1783: \"$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='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec'; { (eval echo configure:1812: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : + if { ac_try='${CC-cc} ${CFLAGS} -nostdlib -Wl,-N -Wl,-Ttext -Wl,$link_addr conftest.o -o conftest.exec'; { (eval echo configure:1789: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : else { echo "configure: error: ${CC-cc} cannot link at address $link_addr" 1>&2; exit 1; } fi - if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1816: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then : + if { ac_try='${OBJCOPY-objcopy} -O binary conftest.exec conftest'; { (eval echo configure:1793: \"$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:1820: \"$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:1797: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; }; then mv -f conftest conftest.old else grub_cv_prog_objcopy_absolute=no @@ -1832,7 +1809,7 @@ if test "x$grub_cv_prog_objcopy_absolute" != xyes; then fi echo $ECHO_N "checking whether addr32 must be in the same line as the instruction... $ECHO_C" 1>&6 -echo "configure:1836: checking whether addr32 must be in the same line as the instruction" 1>&5 +echo "configure:1813: checking whether addr32 must be in the same line as the instruction" 1>&5 if test "${grub_cv_asm_prefix_requirement+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1841,7 +1818,7 @@ else l1: addr32 movb %al, l1 EOF -if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1845: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then +if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1822: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then grub_cv_asm_prefix_requirement=yes else grub_cv_asm_prefix_requirement=no @@ -1869,7 +1846,7 @@ EOF echo "$ECHO_T""$grub_cv_asm_prefix_requirement" 1>&6 echo $ECHO_N "checking for .code16 addr32 assembler support... $ECHO_C" 1>&6 -echo "configure:1873: checking for .code16 addr32 assembler support" 1>&5 +echo "configure:1850: checking for .code16 addr32 assembler support" 1>&5 if test "${grub_cv_asm_addr32+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else @@ -1884,7 +1861,7 @@ else sed -e s/@ADDR32@/addr32\;/ < conftest.s.in > conftest.s fi -if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1888: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; }; } && test -s conftest.o; then +if { ac_try='${CC-cc} ${CFLAGS} -c conftest.s'; { (eval echo configure:1865: \"$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 @@ -1899,12 +1876,12 @@ if test "x$grub_cv_asm_addr32" != xyes; then fi echo $ECHO_N "checking if start is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:1903: checking if start is defined by the compiler" 1>&5 +echo "configure:1880: checking if start is defined by the compiler" 1>&5 if test "${grub_cv_check_start_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1896: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_start_symbol=yes else @@ -1938,12 +1915,12 @@ fi echo "$ECHO_T""$grub_cv_check_start_symbol" 1>&6 echo $ECHO_N "checking if _start is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:1942: checking if _start is defined by the compiler" 1>&5 +echo "configure:1919: checking if _start is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_start_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1935: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_start_symbol=yes else @@ -1982,12 +1959,12 @@ if test "x$grub_cv_check_start_symbol" != "xyes" \ fi echo $ECHO_N "checking if __bss_start is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:1986: checking if __bss_start is defined by the compiler" 1>&5 +echo "configure:1963: checking if __bss_start is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_uscore_bss_start_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:1979: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_uscore_bss_start_symbol=yes else @@ -2021,12 +1998,12 @@ fi echo "$ECHO_T""$grub_cv_check_uscore_uscore_bss_start_symbol" 1>&6 echo $ECHO_N "checking if _edata is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:2025: checking if _edata is defined by the compiler" 1>&5 +echo "configure:2002: checking if _edata is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_edata_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2018: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_edata_symbol=yes else @@ -2060,12 +2037,12 @@ fi echo "$ECHO_T""$grub_cv_check_uscore_edata_symbol" 1>&6 echo $ECHO_N "checking if edata is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:2064: checking if edata is defined by the compiler" 1>&5 +echo "configure:2041: checking if edata is defined by the compiler" 1>&5 if test "${grub_cv_check_edata_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2057: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_edata_symbol=yes else @@ -2105,12 +2082,12 @@ if test "x$grub_cv_check_uscore_uscore_bss_start_symbol" != "xyes" \ fi echo $ECHO_N "checking if end is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:2109: checking if end is defined by the compiler" 1>&5 +echo "configure:2086: checking if end is defined by the compiler" 1>&5 if test "${grub_cv_check_end_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2102: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_end_symbol=yes else @@ -2144,12 +2121,12 @@ fi echo "$ECHO_T""$grub_cv_check_end_symbol" 1>&6 echo $ECHO_N "checking if _end is defined by the compiler... $ECHO_C" 1>&6 -echo "configure:2148: checking if _end is defined by the compiler" 1>&5 +echo "configure:2125: checking if _end is defined by the compiler" 1>&5 if test "${grub_cv_check_uscore_end_symbol+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2141: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* grub_cv_check_uscore_end_symbol=yes else @@ -2197,14 +2174,14 @@ fi # Get the filename or the whole disk and open it. # Known to work on NetBSD. echo $ECHO_N "checking for opendisk in -lutil... $ECHO_C" 1>&6 -echo "configure:2201: checking for opendisk in -lutil" 1>&5 +echo "configure:2178: checking for opendisk in -lutil" 1>&5 if test "${ac_cv_lib_util_opendisk+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lutil $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2200: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_util_opendisk=yes else @@ -2244,14 +2221,14 @@ fi # Unless the user specify --without-curses, check for curses. if test "x$with_curses" != "xno"; then echo $ECHO_N "checking for wgetch in -lncurses... $ECHO_C" 1>&6 -echo "configure:2248: checking for wgetch in -lncurses" 1>&5 +echo "configure:2225: checking for wgetch in -lncurses" 1>&5 if test "${ac_cv_lib_ncurses_wgetch+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lncurses $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2247: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_ncurses_wgetch=yes else @@ -2288,14 +2265,14 @@ EOF else echo $ECHO_N "checking for wgetch in -lcurses... $ECHO_C" 1>&6 -echo "configure:2292: checking for wgetch in -lcurses" 1>&5 +echo "configure:2269: checking for wgetch in -lcurses" 1>&5 if test "${ac_cv_lib_curses_wgetch+set}" = set; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else ac_save_LIBS="$LIBS" LIBS="-lcurses $LIBS" cat >conftest.$ac_ext <&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then +if { (eval echo configure:2291: \"$ac_link\") 1>&5; (eval $ac_link) 2>&5; } && test -s conftest${ac_exeext}; then rm -rf conftest* ac_cv_lib_curses_wgetch=yes else @@ -2341,19 +2318,19 @@ for ac_header in string.h strings.h ncurses/curses.h ncurses.h curses.h do ac_ac_Header=`echo "ac_cv_header_$ac_header" | $ac_tr_sh` echo $ECHO_N "checking for $ac_header... $ECHO_C" 1>&6 -echo "configure:2345: checking for $ac_header" 1>&5 +echo "configure:2322: checking for $ac_header" 1>&5 if eval "test \"\${$ac_ac_Header+set}\" = set"; then echo $ECHO_N "(cached) $ECHO_C" 1>&6 else cat >conftest.$ac_ext < EOF ac_try="$ac_cpp conftest.$ac_ext >/dev/null 2>conftest.out" -{ (eval echo configure:2357: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } +{ (eval echo configure:2334: \"$ac_try\") 1>&5; (eval $ac_try) 2>&5; } ac_err=`grep -v '^ *+' conftest.out | grep -v "^conftest.${ac_ext}\$"` if test -z "$ac_err"; then rm -rf conftest* diff --git a/docs/appendices.texi b/docs/appendices.texi index 68d640746..e9d16db21 100644 --- a/docs/appendices.texi +++ b/docs/appendices.texi @@ -25,9 +25,8 @@ configurable in BIOS setting utility. Read the manual for your BIOS for more information. Furthermore, some operating systems (i.e. DOS) cannot access any large -disk, so the problem is not solved by any kind of boot loader. As long -as I know, at least GNU/Hurd and GNU/Linux can boot from such a large -disk. +disk, so the problem is not solved by any kind of boot loader. GNU/Hurd +and GNU/Linux can surely boot from such a large disk. @item Can I put Stage2 into a partition which is over 1024 cylinders? @@ -132,9 +131,9 @@ developers haven't seen it by their own eyes. This is why it is desirable that you investigate the cause seriously if you have the skill. -@item Why doesn't Linux (FreeBSD, NetBSD, etc.) become Multiboot-compliant? +@item Why don't Linux, FreeBSD, NetBSD, etc. become Multiboot-compliant? -Please ask the maintainers. If all free kernels were +Please ask the relevant maintainers. If all free kernels were Multiboot-compliant (@pxref{Top, Multiboot Specification, Motivation, multiboot, The Multiboot Specification}), the world would be an utopia@dots{} diff --git a/docs/grub-install.8 b/docs/grub-install.8 index af5aad71d..90180875e 100644 --- a/docs/grub-install.8 +++ b/docs/grub-install.8 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.020. -.TH GRUB-INSTALL "8" "February 2000" "grub-install (GNU GRUB 0.5.94)" FSF +.TH GRUB-INSTALL "8" "April 2000" "grub-install (GNU GRUB 0.5.95)" FSF .SH NAME grub-install \- install GRUB on your drive .SH SYNOPSIS @@ -21,6 +21,8 @@ instead of the root directory. \fB\-\-grub\-shell\fR=\fIFILE\fR use FILE as the grub shell. .PP +INSTALL_DEVICE can be a GRUB device name or a system device filename. +.PP Reports bugs to . .SH "SEE ALSO" The full documentation for diff --git a/docs/grub.8 b/docs/grub.8 index b3cda5421..a97ac6096 100644 --- a/docs/grub.8 +++ b/docs/grub.8 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.020. -.TH GRUB "8" "February 2000" "GNU GRUB 0.5.94" FSF +.TH GRUB "8" "April 2000" "GNU GRUB 0.5.95" FSF .SH NAME GRUB \- the grub shell .SH SYNOPSIS diff --git a/docs/grub.texi b/docs/grub.texi index 9b198bfaa..4d4516414 100644 --- a/docs/grub.texi +++ b/docs/grub.texi @@ -14,6 +14,10 @@ @syncodeindex pg cp @syncodeindex tp cp +@footnotestyle separate +@paragraphindent 3 +@finalout + @dircategory Kernel @direntry * GRUB: (grub). The GRand Unified Bootloader @@ -51,12 +55,12 @@ into another language, under the above conditions for modified versions. @titlepage @sp 10 @title The GRUB Manual +@subtitle The GRand Unified Bootloader, version @value{VERSION}, @value{UPDATED}. @author Gordon Matzigkeit @author OKUJI Yoshinori @c The following two commands start the copyright page. @page @vskip 0pt plus 1filll -@vskip 0pt plus 1filll Copyright @copyright{} 1996 Erich Boleyn Copyright @copyright{} 1999, 2000 Free Software Foundation, Inc. @@ -81,26 +85,28 @@ by Free Software Foundation. @node Top @top GRUB -This file documents GNU GRUB, the Grand Unified Bootloader. This -edition documents version @value{VERSION}. +This is the documentation of GNU GRUB, the GRand Unified Bootloader, +a flexible and powerful boot loader program for @sc{pc}s. + +This edition documents version @value{VERSION}. @end ifnottex @menu Part I: The Tutorial Manual -* Overview:: Starting to use GRUB -* Filename:: How to write filenames -* Installation:: How to install GRUB on your drive -* Boot:: How to boot your operating systems +* Overview:: What exactly GRUB is and how to use it +* Naming convention:: Names of your drives in GRUB +* Installation:: Installing GRUB on your drive +* Booting:: How to boot different operating systems * Network:: Downloading OS images from a network -* Configuration:: Writing your configuration file +* Configuration:: Writing your own configuration file Part II: The User Reference Manual * Introduction:: Capturing the spirit of GRUB * Filesystem:: Filesystem syntax and semantics * Interface:: The menu and the command-line -* Command:: The list of available builtin commands +* Commands:: The list of available builtin commands * Troubleshooting:: Error messages produced by GRUB * Invoking the grub shell:: How to use the grub shell * Invoking grub-install:: How to use the GRUB installer diff --git a/docs/mbchk.1 b/docs/mbchk.1 index 9123f6b56..a0ab48ce1 100644 --- a/docs/mbchk.1 +++ b/docs/mbchk.1 @@ -1,5 +1,5 @@ .\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.020. -.TH MBCHK "1" "February 2000" "mbchk (GNU GRUB 0.5.94)" FSF +.TH MBCHK "1" "April 2000" "mbchk (GNU GRUB 0.5.95)" FSF .SH NAME mbchk \- check the format of a Multiboot kernel .SH SYNOPSIS diff --git a/docs/stamp-vti b/docs/stamp-vti index 29ec62b87..08082e3b5 100644 --- a/docs/stamp-vti +++ b/docs/stamp-vti @@ -1,3 +1,3 @@ -@set UPDATED 30 December 1999 -@set EDITION 0.5.94 -@set VERSION 0.5.94 +@set UPDATED 2 April 2000 +@set EDITION 0.5.95 +@set VERSION 0.5.95 diff --git a/docs/tutorial.texi b/docs/tutorial.texi index 1a099869a..3eaae3fa7 100644 --- a/docs/tutorial.texi +++ b/docs/tutorial.texi @@ -5,28 +5,32 @@ Briefly, a @dfn{boot loader} is the first software program that runs when a computer starts. It is responsible for loading and transferring control to the operating system @dfn{kernel} software (such as the Linux or GNU Hurd kernel). The kernel, in turn, initializes the rest of the -operating system (usually GNU). +operating system (e.g. a GNU system). -GRUB can load a wide variety of free operating systems as well as +GRUB can load a wide variety of free operating systems, as well as chain-loading@footnote{@dfn{chain-load} is the mechanism for loading -unsupported operating systems by loading another boot loader.} -proprietary operating systems. The important feature in GRUB -is flexibility; GRUB can understand filesystems and kernel executable -formats, so you can load an arbitrary operating system as you like -without recording the position of your kernel on the disk. +unsupported operating systems by loading another boot loader. It is +typically used for loading DOS or Windows} proprietary operating +systems. -Therefore, you have to specify the drive/partition where your kernel -resides and the filename at hand. If you don't want to type the -drive and the filename every time, the menu interface (@pxref{Menu}) -will help you. GRUB loads a configuration file (@pxref{Configuration}) -if found and provides the menu so that you can select which OS is booted -at ease. Of course, you can enter the command-line interface -(@pxref{Command line}) whenever you like. +The important feature in GRUB is flexibility; GRUB understands +filesystems and kernel executable formats, so you can load an arbitrary +operating system the way you like, without recording the physical +position of your kernel on the disk. -In the following chapters, we teach you how to specify a -drive/partition and a filename (@pxref{Filename}), how to install GRUB -on your drive (@pxref{Installation}), and how to boot your OSes -(@pxref{Boot}), step by step. +Therefore, you have to specify the drive (and the partition) where your +kernel resides and the filename at hand. If you don't want to type in +the drive and the filename every time, you can set it up in a simple +configuration file (@pxref{Configuration}). GRUB will locate and load +it, and provide a nice menu interface (@pxref{Menu interface}) through +which you can easily select which OS it boots. Of course, you can enter +the command-line interface (@pxref{Command line}) whenever you like, or +you can edit specific menu entries prior to using them. + +In the following chapters, you will learn how to specify a drive or a +partition, and a file name (@pxref{Naming convention}) to GRUB, how to +install GRUB on your drive (@pxref{Installation}), and how to boot your +OSes (@pxref{Booting}), step by step. @c @node Fundamentals @@ -36,32 +40,37 @@ on your drive (@pxref{Installation}), and how to boot your OSes @c copyright problem will be solved. -@node Filename -@chapter Filename +@node Naming convention +@chapter Naming convention -Now is the time when you should learn the device syntax used in GRUB, so -that you can specify a drive/partition. See this example: +The device syntax used in GRUB is a wee bit different from what you may +have seen before in your operating system(s), and you need to know it so +that you can specify a drive/partition. + +Look at the following examples and explanations: @example (fd0) @end example -This means the first floppy disk drive. GRUB requires that the device -name is enclosed with @samp{(} and @samp{)}. The number @samp{0} is the -drive number, which is counted from @emph{zero}. In this case, GRUB uses -the whole floppy disk. +First of all, GRUB requires that the device name is enclosed with +@samp{(} and @samp{)}. The @samp{fd} part means that it is a floppy +disk. The number @samp{0} is the drive number, which is counted from +@emph{zero}. This expression means that GRUB will use the whole floppy +disk. @example (hd0,1) @end example -This means the second partition of the first hard disk drive. The first -integer @samp{0} indicates the drive number, that is, the first hard -disk, while the second integer @samp{1} indicates the partition number -(or the @sc{pc} slice number in the BSD terminology). Note that the -partition numbers are counted from @emph{zero} but not from one. In this -case, GRUB uses the partition of the disk instead of the whole -disk. +Here, @samp{hd} means it is a hard disk drive. The first integer +@samp{0} indicates the drive number, that is, the first hard disk, while +the second integer, @samp{1}, indicates the partition number (or the +@sc{pc} slice number in the BSD terminology). Once again, please note +that the partition numbers are counted from @emph{zero}, not from +one. This expression means the second partition of the first hard disk +drive. In this case, GRUB uses one partition of the disk, instead of the +whole disk. @example (hd0,4) @@ -69,62 +78,70 @@ disk. This specifies the first @dfn{extended partition} of the first hard disk drive. Note that the partition numbers for extended partitions are -counted from @samp{4}, whether your disks has four primary partitions or -less. +counted from @samp{4}, regardless of the actual number of primary +partitions on your hard disk. @example (hd1,a) @end example This means the BSD @samp{a} partition of the second hard disk. If you -need to specify which @sc{pc} slice number should be used, use a device -like @samp{(hd1,0,a)}. If the @sc{pc} slice number is omitted, GRUB -searches for the first @sc{pc} slice which has a BSD @samp{a} partition. +need to specify which @sc{pc} slice number should be used, use something +like this: @samp{(hd1,0,a)}. If the @sc{pc} slice number is omitted, +GRUB searches for the first @sc{pc} slice which has a BSD @samp{a} +partition. -Note that GRUB does @emph{not} distinguish IDE from SCSI; just count the -drive numbers from zero. Normally, any IDE drive number is less than any -SCSI drive number, but this is not true if you exchange the boot -sequence between IDE and SCSI in your BIOS. But do not worry. In the -GRUB command-line (@pxref{Command line}), you can always use the -@key{TAB} completion which displays the list of drives, the list of the -partitions of a drive, or the list of the filenames on a partition, -depending on where you push the @key{TAB} key in the command-line. So it -should be possible to determine which drive and which partition are what -you seek for. +Of course, to actually access the disks or partitions with GRUB, you +need to use the device specification in a command, like @samp{root +(fd0)} or @samp{unhide (hd0,2)}. To help you find out which number is a +partition you want, the GRUB command-line (@pxref{Command line}) options +have argument completion. That means that, for example, you only need to +type @samp{root (}, followed by a @key{TAB}, and GRUB will display the +list of drives, partitions, or filenames, so it should be quite easy to +determine the name of your target partition, even with minimal knowledge +of the syntax. -Now the question is how to specify a file. Again, see this example: +Note that GRUB does @emph{not} distinguish IDE from SCSI - it simply +counts the drive numbers from zero, regardless of their type. Normally, +any IDE drive number is less than any SCSI drive number, although that +is not true if you change the boot sequence by swapping IDE and SCSI +drives in your BIOS. + +Now the question is, how to specify a file? Again, see this example: @example (hd0,0)/vmlinuz @end example -This specifies the file whose name is @samp{vmlinuz} on the first -partition of the first hard disk drive. Isn't that easy? All you should -do is type the absolute filename. If you are tired of typing the -whole filename, press the @key{TAB} key. @kbd{@key{TAB}} -completes the filename if it is unique. Otherwise, it displays the list -of the candidates. +This specifies the file named @samp{vmlinuz}, found on the first +partition of the first hard disk drive. Note that the argument +completion works with file names, too. -OK, the next chapter introduces how to install GRUB on your drive. +That was easy, admit it. Do read the next chapter, to find out how to +actually install GRUB on your drive. @node Installation @chapter Installation -At first, install GRUB by @code{make install} (@pxref{Obtaining and -Building GRUB}) or by the GRUB package for your OS. If this is done, -let's install GRUB on your drive. There are two ways to install GRUB: -using the grub shell (@pxref{Invoking the grub shell}) on a UNIX-like OS -and using the native Stage 2. The two ways are almost the same, but the -main difference is that the grub shell might probe a wrong BIOS drive on -a UNIX-like OS. If you install GRUB on a UNIX-like OS, make sure that -you have a boot floppy disk so that you can rescue your computer when it -crashes. +First, you need to have GRUB itself properly installed on your system, +(@pxref{Obtaining and Building GRUB}) either from the source tarball, or +as a package for your OS. -Anyhow, copy your GRUB images (@file{stage1}, @file{stage2}, and -@file{*stage1_5}) to the directory @file{/boot/grub} before staring to -install GRUB. Normally, the images are installed under the directory -@file{/usr/share/grub/i386-pc}. +To use GRUB, you need to install it on your drive. There are two ways of +doing that - either using the grub shell (@pxref{Invoking the grub +shell}) on a UNIX-like OS, or by using the native Stage 2. These are +quite similar, however, the shell might probe a wrong BIOS drive, so +better be careful. + +Also, if you install GRUB on a UNIX-like OS, please make sure that you +have an emergency boot disk ready, so that you can rescue your computer +if, by any chance, your hard drive becomes unusable (unbootable). + +GRUB comes with boot images, which are normally installed in the +@file{/usr/share/grub/i386-pc} directory. You need to copy the files +@file{stage1}, @file{stage2}, and @file{*stage1_5} to the directory +@file{/boot/grub}. @menu * Installing GRUB on a floppy:: @@ -135,12 +152,17 @@ install GRUB. Normally, the images are installed under the directory @node Installing GRUB on a floppy @section Installing GRUB on a floppy +To create a GRUB boot floppy, you need to take the @file{stage1} and +@file{stage2} files from @file{/boot/grub} directory, and write them to +the first and the second block of the floppy disk. + @quotation @strong{Caution:} This procedure will destroy any data currently stored on the floppy. @end quotation -It is easy to create a GRUB boot floppy. Just follow this below: +On a UNIX like operating system, that is done with the following +commands: @example @group @@ -158,42 +180,43 @@ The device filename may be different. Consult the manual for your OS. @quotation @strong{Caution:} Installing GRUB's stage1 in this manner will erase the -normal boot-sector used by an OS. GRUB can boot GNU Mach, Linux, -FreeBSD, NetBSD, and OpenBSD directly, so this may be -desired. Generally, it is a good idea to back up the first sector of the -partition on which you are installing GRUB's stage1. This isn't as -important if you are installing GRUB on the first sector of a hard disk, -since it's easy to reinitialize it (by running @code{FDISK /MBR} from -DOS). +normal boot-sector used by an OS. @end quotation -OK, now reboot your computer with a GRUB boot floppy inserted if you -decide to install GRUB in the native environment. That's definitely -desirable. However, if you don't want to reboot your computer, run the -program @file{/sbin/grub} (@pxref{Invoking the grub shell}). +GRUB can currently boot GNU Mach, Linux, FreeBSD, NetBSD, and OpenBSD +directly, so using it on a boot sector should be okay. But generally, it +would be a good idea to back up the first sector of the partition on +which you are installing GRUB's stage1. This isn't as important if you +are installing GRUB on the first sector of a hard disk, since it's easy +to reinitialize it (e.g. by running @samp{FDISK /MBR} from DOS). -In both, GRUB will show the command-line interface (@pxref{Command +If you decide to install GRUB in the native environment, which is +definitely desirable, you'll either need to create the GRUB boot disk, +and reboot your computer with it, or run the grub shell (@pxref{Invoking +the grub shell}) as the super-user (@samp{root}). + +Once started, GRUB will show the command-line interface (@pxref{Command line}). First, set the GRUB's @dfn{root device}@footnote{Note that -GRUB's root device is not your OS's root partition; if you need to -specify a root partition for your OS, add the argument into the command -@command{kernel}.} to the partition which has your GRUB images, like -this: +GRUB's root device does not neccessarily have to be your OS's root +partition; if you need to specify a root partition for your OS, add the +argument into the command @command{kernel}.} to the partition which has +your GRUB images, like this: @example grub> root (hd0,0) @end example -If you are not sure where the images exist, use the command -@command{find}: +If you are not sure which partition actually holds these files, use the +@command{find} command, like this: @example grub> find /boot/grub/stage1 @end example This will search for the filename @file{/boot/grub/stage1} and show the -devices which contain the image. +devices which contain the file. -If you set the root device correctly, run the command +Once you've set the root device correctly, run the command @command{setup}: @example @@ -213,12 +236,13 @@ If you install GRUB into a partition or a drive except for the first one, you must chain-load GRUB from another boot loader. Refer the manual for the boot loader to know how to chain-load GRUB. -That's all. Now you can boot GRUB without a GRUB floppy, so let's see -how to boot your operating systems from GRUB in the next chapter. +That's all there is to it: now you can boot GRUB without a GRUB +floppy. See the next chapter to find out how to boot your operating +systems from GRUB. -@node Boot -@chapter Boot +@node Booting +@chapter Booting For Multiboot-compliant kernels, GRUB can load them in a consistent way, but, for some free operating systems, you need to use some OS-specific @@ -269,8 +293,8 @@ the command @command{root}. Load the kernel image by the command @command{kernel}. @item -Load the modules by the command @command{module} or -@command{modulenounzip} as you need. +If you need modules, load them with the command @command{module} or +@command{modulenounzip}. @item Run the command @command{boot}. @@ -342,14 +366,16 @@ Here, we describe some caveats on several operating systems. @subsection GNU/Hurd Since GNU/Hurd is Multiboot-compliant, it is easy to boot it; there is -nothing special. But do not forget that you specify a root partition to -the kernel. +nothing special about it. But do not forget that you have to specify a +root partition to the kernel. -First, set GRUB's root device to the same drive as -GNU/Hurd's. Probably @code{find /boot/gnumach} or such will help -you. +@enumerate +@item +Set GRUB's root device to the same drive as GNU/Hurd's. Probably the +command @code{find /boot/gnumach} or similar can help you. -Second, load the kernel and the module, like this: +@item +Load the kernel and the module, like this: @example @group @@ -358,35 +384,40 @@ grub> module /boot/serverboot @end group @end example -And, finally, run the command @command{boot}. +@item +Run the command @command{boot}. +@end enumerate @node GNU/Linux @subsection GNU/Linux -It is relatively easy to boot GNU/Linux from GRUB, because booting -GNU/Linux somewhat resembles booting a Multiboot-compliant OS. +It is relatively easy to boot GNU/Linux from GRUB, because it somewhat +resembles booting a Multiboot-compliant OS. -First, set GRUB's root device to the same drive as -GNU/Linux's. Probably @code{find /vmlinuz} or such will help -you. +@enumerate +@item +Set GRUB's root device to the same drive as GNU/Linux's. Probably the +command @code{find /vmlinuz} or similar can help you. -Second, load the kernel: +@item +Load the kernel: @example grub> kernel /vmlinuz root=/dev/hda1 @end example If you need to specify some kernel parameters, just append them to the -command. An example is to set @option{vga} to @samp{ext}: +command. For example, to set @option{vga} to @samp{ext}, do this: @example grub> kernel /vmlinuz root=/dev/hda1 vga=ext @end example -See the documentation in the Linux source tree, for the complete +See the documentation in the Linux source tree for the complete information on the available options. +@item If you use initrd, execute the command @command{initrd} after @command{kernel}: @@ -394,16 +425,17 @@ If you use initrd, execute the command @command{initrd} after grub> initrd /initrd @end example -And, finally, run the command @command{boot}. +@item +Finally, run the command @command{boot}. +@end enumerate @node FreeBSD @subsection FreeBSD GRUB can directly load both kernel formats, ELF and a.out, but this is -deprecated, since FreeBSD's bootstrap interface is sometimes changed -heavily and so GRUB can't guarantee to pass kernel parameters -correctly. +deprecated, since FreeBSD's bootstrap interface sometimes changes +heavily, so GRUB can't guarantee to pass kernel parameters correctly. Thus, we'd recommend loading the very flexible loader @file{/boot/loader} instead. See this example: @@ -420,42 +452,43 @@ grub> boot @node NetBSD @subsection NetBSD -GRUB can load NetBSD a.out directly, by the following steps: +GRUB can load NetBSD a.out directly, follow these steps: @enumerate @item -Set GRUB's root device by @command{root}. +Set GRUB's root device with @command{root}. @item -Load the kernel by @command{kernel}. +Load the kernel with @command{kernel}. @item Run @command{boot}. @end enumerate For now, however, GRUB doesn't allow you to pass kernel parameters, so -it may be better to chain-load it instead. @xref{Chain-loading}, for -more information. +it may be better to chain-load it instead, for more information please +see @xref{Chain-loading}. @node OpenBSD @subsection OpenBSD -The boot instructions are exactly the same as NetBSD (@pxref{NetBSD}). +The booting instructions are exactly the same as for NetBSD +(@pxref{NetBSD}). @node DOS/Windows @subsection DOS/Windows -GRUB doesn't support DOS or Windows directly, so you must chain-load -them (@pxref{Chain-loading}). However, their boot loaders have some -critical deficiencies, so the general methods may not be enough. +GRUB doesn't support booting DOS or Windows directly, so you must +chain-load them (@pxref{Chain-loading}). However, their boot loaders +have some critical deficiencies, so the general methods may not be +enough. -If you have installed DOS (or Windows) on a non-first hard disk, the -disk swapping technique is necessary, because it cannot boot any disks -but the first one. The solution used in GRUB is the command -@command{map} (@pxref{Command}). For example, if the installed disk is -the second hard disk, swap it for the first hard disk: +If you have installed DOS (or Windows) on a non-first hard disk, you +have to use the disk swapping technique, because that OS cannot boot +from any disks but the first one. The solution used in GRUB is the +command @command{map} (@pxref{Commands}), like this: @example @group @@ -464,23 +497,24 @@ grub> map (hd1) (hd0) @end group @end example -This performs the @dfn{virtual} exchange between the two disks. +This performs a @dfn{virtual} swap between your first and second hard +drive. @strong{Caution:} This is effective only if DOS (or Windows) uses BIOS to access the swapped disks. If it uses a special driver for them, -probably this doesn't work. +it probably won't work. Another problem arises if you install more than one sets of DOS/Windows -into one disk, because they could be confused if there are more than one -primary partitions for DOS/Windows. Certainly you should avoid this way, -but there is a solution if you do want to do so. Use the partition +onto one disk, because they could be confused if there are more than one +primary partitions for DOS/Windows. Certainly you should avoid doing +this, but there is a solution if you do want to do so. Use the partition hiding/unhiding technique. If GRUB @dfn{hide}s a DOS (or Windows) partition, then it ignores the partition. If GRUB @dfn{unhide}s a DOS (or Windows) partition, it -detects the partition. Thus, if you have installed DOS (or Windows) into +detects the partition. Thus, if you have installed DOS (or Windows) on the first partition and the second partition of the first hard disk, -follow these below when booting the first: +to boot the first copy, do the following: @example @group @@ -497,8 +531,8 @@ grub> boot @node SCO UnixWare @subsection SCO UnixWare -The boot loader in SCO UnixWare is known by the fact that its signature -is wrong. So you will need to specify the option @option{--force} to +It is known that the signature in the boot loader for SCO UnixWare is +wrong, so you will have to specify the option @option{--force} to @command{chainloader}, like this: @example @@ -514,19 +548,18 @@ grub> boot @node Network @chapter Downloading OS images from a network -Although GRUB is a disk-based boot loader, it provides you some network +Although GRUB is a disk-based boot loader, it does provide some network support. To using the network support, you need to enable at least one -network driver in the build process. See the file -@file{netboot/README.netboot} in the source distribution, for more -information. +network driver in the build process. For more information please see +@file{netboot/README.netboot} in the source distribution. -First, you have to set up servers in your network. The servers GRUB -requires are a server which assigns an IP address and a file server. The -former is one of a BOOTP server, a DHCP server and a RARP server. RARP -is deprecated, since it cannot serve much information. For the latter, -only TFTP is supported at the moment. It is not necessary to run both -the servers on one computer. How to configure the servers is beyond the -scope of this document, so please refer to their own manuals. +First, you have to set up servers in your network. GRUB requires a +server that will assign an IP address, and a file server. The former is +either BOOTP, DHCP or a RARP server (RARP is deprecated, since it cannot +serve much information). For the latter, only TFTP is supported at the +moment. It is not necessary to run both the servers on one computer. How +to configure the servers is beyond the scope of this document, so please +refer to the manuals specific to those protocols/servers. Second, run @command{bootp}, @command{dhcp} and @command{rarp} for BOOTP, DHCP and RARP, respectively. Each command will show an assigned @@ -534,9 +567,9 @@ IP address, a netmask, an IP address for your TFTP server and a gateway. If any of the addresses is wrong or it causes an error, probably the configuration of your servers isn't set up properly. -Lastly, download your OS images from your network. The network can be -accessed by the network drive @samp{(nd)}. Everything else is similar to -the normal instructions (@pxref{Boot}). +Finally, download your OS images from your network. The network can be +accessed using the network drive @samp{(nd)}. Everything else is very +similar to the normal instructions (@pxref{Booting}). Here is an example: @@ -559,51 +592,174 @@ grub> boot @node Configuration @chapter Configuration -Probably it is bothersome to type the commands to boot your OS. So -GRUB provides the menu interface (@pxref{Menu}) so that you can just -select an item from the menu. +You probably noticed that you need to type several commands to boot your +OS. There's a solution to that - GRUB provides a menu interface +(@pxref{Menu interface}) from which you can select an item (using arrow +keys) which will do everything to boot an OS. -To enable the menu, write a configuration file and save it in -@file{/boot/grub/menu.lst}. Here is a sample configuration file: +To enable the menu, you need a configuration file, +@file{/boot/grub/menu.lst}. We'll analyze an example file. + +The file first contains some general settings, the menu interface +related options. You can put these commands (@pxref{Menu-specific +commands}) before any of the items (starting with @command{title}). @example -@include menu.lst +@group +# +# Sample boot menu configuration file +# +@end group @end example -As you see, each entry begins with the special command @command{title} and -the action is described after it. Note that you may not write the -command @command{boot} at each of the entries, since GRUB automatically -executes the command @command{boot} if it loads an OS successfully. +As you may have guessed, these lines are comments. Lines starting with a +hash character (@samp{#}), and blank lines, are ignored by GRUB. -The argument for the command @command{title} is used to display the -message about the entry. Since @command{title} displays the argument as -it is, you can write any words as you like. +@example +@group +# By default, boot the first entry. +default 0 +@end group +@end example -You can write the menu interface specific commands (@pxref{Menu-specific -commands}) before any @command{title}. There are several commands you -can use in there, but we describe a few of them. The complete -descriptions can be found in @ref{Command}. +The first entry (here, counting starts with number zero, not one!) will +be the default choice. -The command @command{default} specifies which entry will be selected -when you do not select an entry explicitly. The argument is the entry -number. GRUB counts the entries from zero, so the number of the first -entry is @samp{0}, the number of the second entry is @samp{1}, @dots{} +@example +# Boot automatically after 30 secs. +timeout 30 +@end example -The default entry will be executed when you do not select any entry -during certain seconds, which is defined by the command -@command{timeout}. So in the example above, the timeout is 30 seconds. +As the comment says, GRUB will boot automatically in 30 seconds, unless +interrupted with a keypress. -The command @command{fallback} is used only if the default entry -fails. If GRUB executes the default entry and it fails, then it executes -the @dfn{fallback} entry. The argument is the same meaning as the one -for @command{default}. This command is rarely used. +@example +@group +# Fallback to the second entry. +fallback 1 +@end group +@end example -In the last entry, @command{color} is used. This command is somewhat -special because it can be used both in the command-line and in the -menu (@pxref{General commands}). GRUB has such several commands. The -command @command{color} changes the menu colors. It is best to run the -command actually to understand what happens. +If, for any reason, the default entry doesn't work, fall back to the +second one (this is rarely used, for obvious reasons). -We hope that you now understand how to use GRUB. To understand more -about GRUB, see the User Reference Manual (@pxref{Introduction}). Have -fun! +Note that the complete descriptions of these commands, which are menu +interface specific, can be found in @pxref{Menu-specific +commands}. Other descriptions can be found in @ref{Commands}. + +Now, on to the actual OS definitions. You will see that each entry +begins with a special command, @command{title}, and the action is +described after it. Note that there is no command @command{boot} at the +end of each item. That is because GRUB automatically executes +@command{boot} if it loads other commands successfully. + +The argument for the command @command{title} is used to display a short +title/description of the entry in the menu. Since @command{title} +displays the argument as is, you can write basically anything in there. + +@example +@group +# For booting the GNU Hurd +title GNU/Hurd +root (hd0,0) +kernel /boot/gnumach.gz root=hd0s1 +module /boot/serverboot.gz +@end group +@end example + +This boots GNU/Hurd from the first hard disk. + +@example +@group +# For booting Linux +title GNU/Linux +kernel (hd1,0)/vmlinuz root=/dev/hdb1 +@end group +@end example + +This boots GNU/Linux, but from the second hard disk. + +@example +@group +# For booting Mach (getting kernel from floppy) +title Utah Mach4 multiboot +root (hd0,2) +pause Insert the diskette now!! +kernel (fd0)/boot/kernel root=hd0s3 +module (fd0)/boot/bootstrap +@end group +@end example + +This boots Mach with a kernel on a floppy, but the root filesystem at +hd0s3. It also contains a @command{pause} line, which will cause GRUB to +display a prompt and delay, before actually executing the rest of the +commands and booting. + +@example +@group +# For booting FreeBSD +title FreeBSD +root (hd0,2,a) +kernel /boot/loader +@end group +@end example + +This item will boot FreeBSD kernel loaded from the @samp{a} partition of +the third @sc{pc} slice of the first hard disk. + +@example +@group +# For booting OS/2 +title OS/2 +root (hd0,1) +makeactive +# chainload OS/2 bootloader from the first sector +chainloader +1 +# This is similar to "chainload", but loads a specific file +#chainloader /boot/chain.os2 +@end group +@end example + +This will boot OS/2, using a chain-loader. + +@example +@group +# For booting Windows NT or Windows95 +title Windows NT / Windows 95 boot menu +root (hd0,0) +makeactive +chainloader +1 +# For loading DOS if Windows NT is installed +# chainload /bootsect.dos +@end group +@end example + +The same as the above, just for Windows. + +@example +@group +# For installing GRUB into the hard disk +title Install GRUB into the hard disk +root (hd0,0) +setup (hd0) +@end group +@end example + +This will just (re)install GRUB on the hard disk. + +@example +# Change the colors. +title Change the colors +color light-green/brown blink-red/blue +@end example + +In the last entry, the command @command{color} is used, to change the +menu colors (try it!). This command is somewhat special, because it can +be used both in the command-line and in the menu (@pxref{General +commands}). GRUB has several such commands, see the user reference. + +We hope that you now understand how to use the basic features of +GRUB. To learn more about GRUB, see the User Reference Manual +(@pxref{Introduction}). + +Have fun! diff --git a/docs/user-ref.texi b/docs/user-ref.texi index 3cbf65ad9..bb3a6628a 100644 --- a/docs/user-ref.texi +++ b/docs/user-ref.texi @@ -83,7 +83,7 @@ GRUB fully supports the Multiboot feature of loading multiple modules. @item Configuration File Supports a human-readable text configuration file with preset boot -commands. The list of commands (@pxref{Command}) are a superset of +commands. The list of commands (@pxref{Commands}) are a superset of those supported on the command line. An example command file is provided in @ref{Configuration}. @@ -98,7 +98,7 @@ is available to edit any preset commands, or write a new boot command set from scratch. If no command file is present, GRUB drops to the command line. -The list of commands (@pxref{Command}) are a subset of those supported +The list of commands (@pxref{Commands}) are a subset of those supported for command files. Editing commands closely resemble the Bash command line (@pxref{Command Line Editing, Bash, Command Line Editing, features, Bash Features}), with @key{TAB}-completion of commands, devices, @@ -205,7 +205,7 @@ accessed by BIOS. Because of BIOS limitations, GRUB cannot distinguish between IDE, ESDI, SCSI, or others. You must know yourself which BIOS device is equivalent to which OS device. Normally, that will be clear if you see the files in a device or use the command @command{find} -(@pxref{Command}). +(@pxref{Commands}). @menu * Device syntax:: How to specify devices @@ -311,7 +311,7 @@ the command line interface. @menu * Command line:: The flexible command line interface. -* Menu:: The simple menu interface. +* Menu interface:: The simple menu interface. * Menu entry editor:: Editing a menu entry. @end menu @@ -323,7 +323,7 @@ The command line interface provides a prompt and after it an editable text area much like a command line in Unix or DOS. Each command is immediately executed after it is entered @footnote{However, this behavior will be changed in the future version, in a user-invisible -way.}. The commands (@pxref{Command}) are a subset of those available in +way.}. The commands (@pxref{Commands}) are a subset of those available in the configuration file, used with exactly the same syntax. Cursor movement and editing of the text on the line can be done via a @@ -384,7 +384,7 @@ filesystem. This is because TFTP doesn't support filename listing for the security. -@node Menu +@node Menu interface @section The simple menu interface The menu interface is quite easy to use. Its commands are both @@ -427,7 +427,7 @@ To delete a line, hit the key @key{d}. Although GRUB does not support returning to the main menu. -@node Command +@node Commands @chapter The list of available commands In this chapter, we list the available commands, both in the @@ -1270,7 +1270,7 @@ You can use the command @command{grub} for installing GRUB under your operating systems and for a testbed when you add a new feature into GRUB or when fix a bug. @command{grub} is almost the same as the Stage 2, and, in fact, it shares the source code with the Stage 2 and you can use -the same commands (@pxref{Command}) in @command{grub}. It is emulated by +the same commands (@pxref{Commands}) in @command{grub}. It is emulated by replacing BIOS calls with UNIX system calls and libc functions. The command @command{grub} accepts the following options: diff --git a/docs/version.texi b/docs/version.texi index 29ec62b87..08082e3b5 100644 --- a/docs/version.texi +++ b/docs/version.texi @@ -1,3 +1,3 @@ -@set UPDATED 30 December 1999 -@set EDITION 0.5.94 -@set VERSION 0.5.94 +@set UPDATED 2 April 2000 +@set EDITION 0.5.95 +@set VERSION 0.5.95 diff --git a/grub/asmstub.c b/grub/asmstub.c index 1a3383b43..e5b8fda99 100644 --- a/grub/asmstub.c +++ b/grub/asmstub.c @@ -331,7 +331,8 @@ init_device_map (void) /* Print something as the user does not think GRUB has been crashed. */ fprintf (stderr, - "Probe devices to guess BIOS drives. This may take a long time.\n"); + "Probing devices to guess BIOS drives. " + "This may take a long time.\n"); if (device_map_file) /* Try to open the device map file to write the probed data. */ diff --git a/stage2/builtins.c b/stage2/builtins.c index 19a3ba37c..9d2ed9fc6 100644 --- a/stage2/builtins.c +++ b/stage2/builtins.c @@ -1294,23 +1294,12 @@ static struct builtin builtin_help = static int hide_func (char *arg, int flags) { - unsigned long tmp_drive = saved_drive; - unsigned long tmp_partition = saved_partition; - if (! set_device (arg)) return 1; - saved_partition = current_partition; - saved_drive = current_drive; if (! set_partition_hidden_flag (1)) - { - saved_drive = tmp_drive; - saved_partition = tmp_partition; - return 1; - } + return 1; - saved_drive = tmp_drive; - saved_partition = tmp_partition; return 0; } @@ -2533,6 +2522,7 @@ setup_func (char *arg, int flags) char cmd_arg[256]; char device[16]; char *buffer = (char *) RAW_ADDR (0x100000); + static void sprint_device (int drive, int partition) { grub_sprintf (device, "(%cd%d", @@ -2633,6 +2623,8 @@ setup_func (char *arg, int flags) /* OK, check if the Stage 1.5 exists. */ if (grub_open (stage1_5_map[i].name)) { + int blocksize = (filemax + SECTOR_SIZE - 1) / SECTOR_SIZE; + grub_close (); grub_strcpy (config_file, stage2); grub_strcpy (stage2, stage1_5_map[i].name); @@ -2645,26 +2637,22 @@ setup_func (char *arg, int flags) grub_sprintf (cmd_arg, "%s %s", stage2, device); /* Notify what will be run. */ - grub_printf (" Run \"embed %s\"\n", cmd_arg); + grub_printf (" Running \"embed %s\"\n", cmd_arg); embed_func (cmd_arg, flags); if (! errnum) { - int len; - - /* Need to know the size of the Stage 1.5. */ - grub_seek (0); - len = grub_read (buffer, -1); /* Construct the blocklist representation. */ - grub_sprintf (stage2, "%s1+%d", - device, - (len + SECTOR_SIZE - 1) / SECTOR_SIZE); + grub_sprintf (stage2, "%s1+%d", device, blocksize); + /* Need to prepend the device name to the configuration filename. */ sprint_device (image_drive, image_partition); grub_sprintf (buffer, "%s%s", device, config_file); grub_strcpy (config_file, buffer); } + else + goto fail; } else if (grub_strcmp (fsys, "ffs") == 0) { @@ -2705,7 +2693,7 @@ setup_func (char *arg, int flags) #endif /* ! NO_BUGGY_BIOS_IN_THE_WORLD */ /* Notify what will be run. */ - grub_printf (" Run \"install %s\"\n", cmd_arg); + grub_printf (" Running \"install %s\"\n", cmd_arg); /* Make sure that SAVED_DRIVE and SAVED_PARTITION are identical with IMAGE_DRIVE and IMAGE_PARTITION, respectively. */ @@ -2713,7 +2701,8 @@ setup_func (char *arg, int flags) saved_partition = image_partition; /* Run the command. */ - install_func (cmd_arg, flags); + if (! install_func (cmd_arg, flags)) + grub_printf ("Done.\n"); fail: saved_drive = tmp_drive; @@ -2872,23 +2861,12 @@ static struct builtin builtin_title = static int unhide_func (char *arg, int flags) { - unsigned long tmp_drive = saved_drive; - unsigned long tmp_partition = saved_partition; - if (! set_device (arg)) return 1; - saved_partition = current_partition; - saved_drive = current_drive; if (! set_partition_hidden_flag (0)) - { - saved_drive = tmp_drive; - saved_partition = tmp_partition; - return 1; - } - - saved_drive = tmp_drive; - saved_partition = tmp_partition; + return 1; + return 0; } diff --git a/stage2/char_io.c b/stage2/char_io.c index ba4995ec2..aa86cd573 100644 --- a/stage2/char_io.c +++ b/stage2/char_io.c @@ -2,7 +2,7 @@ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 1996 Erich Boleyn - * Copyright (C) 1999 Free Software Foundation, Inc. + * Copyright (C) 1999, 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -40,7 +40,7 @@ convert_to_ascii (char *buf, int c,...) char *ptr = buf; #ifndef STAGE1_5 - if (c == 'x') + if (c == 'x' || c == 'X' || c == 'b') mult = 16; if ((num & 0x80000000uL) && c == 'd') @@ -80,7 +80,8 @@ grub_printf (const char *format,...) { int *dataptr = (int *) &format; char c, *ptr, str[16]; - + unsigned long mask = 0xFFFFFFFF; + dataptr++; while ((c = *(format++)) != 0) @@ -91,11 +92,16 @@ grub_printf (const char *format,...) switch (c = *(format++)) { #ifndef STAGE1_5 + case 'b': + mask = 0xFF; + /* Fall down intentionally! */ case 'd': case 'x': + case 'X': #endif case 'u': - *convert_to_ascii (str, c, *((unsigned long *) dataptr++)) = 0; + *convert_to_ascii (str, c, *((unsigned long *) dataptr++) & mask) + = 0; ptr = str; diff --git a/stage2/common.c b/stage2/common.c index 7502626fb..5bb39f59e 100644 --- a/stage2/common.c +++ b/stage2/common.c @@ -2,7 +2,7 @@ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 1996 Erich Boleyn - * Copyright (C) 1999 Free Software Foundation, Inc. + * Copyright (C) 1999, 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -197,9 +197,7 @@ init_bios_info (void) mbi.mem_upper = memtmp; } -#ifndef STAGE1_5 saved_mem_upper = mbi.mem_upper; -#endif /* * Initialize other Multiboot Info flags. diff --git a/stage2/disk_io.c b/stage2/disk_io.c index f4d1868c5..ed6914ed2 100644 --- a/stage2/disk_io.c +++ b/stage2/disk_io.c @@ -358,12 +358,13 @@ make_saved_active (void) return 1; } +/* Hide/Unhide CURRENT_PARTITION. */ int set_partition_hidden_flag (int hidden) { - if (saved_drive) + if (current_drive & 0x80) { - int part = saved_partition >> 16; + int part = current_partition >> 16; if (part > 3) { @@ -371,7 +372,7 @@ set_partition_hidden_flag (int hidden) return 0; } - if (! rawread (saved_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) + if (! rawread (current_drive, 0, 0, SECTOR_SIZE, (char *) SCRATCHADDR)) return 0; if (hidden) @@ -380,7 +381,7 @@ set_partition_hidden_flag (int hidden) PC_SLICE_TYPE (SCRATCHADDR, part) &= ~PC_SLICE_TYPE_HIDDEN_FLAG; buf_track = -1; - if (biosdisk (BIOSDISK_WRITE, saved_drive, &buf_geom, + if (biosdisk (BIOSDISK_WRITE, current_drive, &buf_geom, 0, 1, SCRATCHSEG)) { errnum = ERR_WRITE; diff --git a/stage2/pc_slice.h b/stage2/pc_slice.h index 7378515bb..c96614d15 100644 --- a/stage2/pc_slice.h +++ b/stage2/pc_slice.h @@ -1,7 +1,7 @@ /* * GRUB -- GRand Unified Bootloader * Copyright (C) 1996 Erich Boleyn - * Copyright (C) 1999 Free Software Foundation, Inc. + * Copyright (C) 1999, 2000 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -97,6 +97,9 @@ * Known PC partition types are defined here. */ +/* This is not a flag actually, but used as if it were a flag. */ +#define PC_SLICE_TYPE_HIDDEN_FLAG 0x10 + #define PC_SLICE_TYPE_NONE 0 #define PC_SLICE_TYPE_FAT12 1 #define PC_SLICE_TYPE_FAT16_LT32M 4 @@ -110,13 +113,16 @@ #define PC_SLICE_TYPE_EXT2FS 0x83 /* For convinience. */ +/* Check if TYPE is a FAT partition type. Clear the hidden flag before + the check, to allow the user to mount a hidden partition in GRUB. */ #define IS_PC_SLICE_TYPE_FAT(type) \ - (((type) == PC_SLICE_TYPE_FAT12) \ - || ((type) == PC_SLICE_TYPE_FAT16_LT32M) \ - || ((type) == PC_SLICE_TYPE_FAT16_GT32M) \ - || ((type) == PC_SLICE_TYPE_FAT16_LBA) \ - || ((type) == PC_SLICE_TYPE_FAT32) \ - || ((type) == PC_SLICE_TYPE_FAT32_LBA)) + ({ int _type = (type) & ~PC_SLICE_TYPE_HIDDEN_FLAG; \ + _type == PC_SLICE_TYPE_FAT12 \ + || _type == PC_SLICE_TYPE_FAT16_LT32M \ + || _type == PC_SLICE_TYPE_FAT16_GT32M \ + || _type == PC_SLICE_TYPE_FAT16_LBA \ + || _type == PC_SLICE_TYPE_FAT32 \ + || _type == PC_SLICE_TYPE_FAT32_LBA; }) #define IS_PC_SLICE_TYPE_EXTENDED(type) \ (((type) == PC_SLICE_TYPE_EXTENDED) \ @@ -136,9 +142,6 @@ #define IS_PC_SLICE_TYPE_BSD(type) IS_PC_SLICE_TYPE_BSD_WITH_FS(type,0) -/* This is not a flag actually, but used as if it were a flag. */ -#define PC_SLICE_TYPE_HIDDEN_FLAG 0x10 - /* * *BSD-style disklabel & partition definitions. * diff --git a/stage2/stage2.c b/stage2/stage2.c index 2ab16af9e..13763b8de 100644 --- a/stage2/stage2.c +++ b/stage2/stage2.c @@ -479,9 +479,7 @@ restart: if (c == 'q') { /* The same as ``quit''. */ -#ifdef GRUB_UTIL stop (); -#endif } #endif } diff --git a/util/grub-install.in b/util/grub-install.in index 4ec285075..5d5ae4cad 100644 --- a/util/grub-install.in +++ b/util/grub-install.in @@ -1,7 +1,7 @@ #! /bin/sh # Install GRUB on your drive. -# Copyright (C) 1999 Free Software Foundation, Inc. +# Copyright (C) 1999, 2000 Free Software Foundation, Inc. # # This file is free software; you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by @@ -49,6 +49,8 @@ Install GRUB on your drive. instead of the root directory. --grub-shell=FILE use FILE as the grub shell. +INSTALL_DEVICE can be a GRUB device name or a system device filename. + Reports bugs to . EOF } @@ -58,26 +60,26 @@ EOF # This part is OS-specific. convert () { # First, check if the device file exists. - if test ! -e $1; then + if test ! -e "$1"; then echo "$1: Not found." 1>&2 exit 1 fi # Break the device name into the disk part and the partition part. - case $host_os in + case "$host_os" in linux*) - tmp_disk=`echo $1 | sed 's%[0-9]*$%%'` - tmp_part=`echo $1 | sed "s%$tmp_disk%%"` ;; + tmp_disk=`echo "$1" | sed 's%[0-9]*$%%'` + tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;; gnu*) - tmp_disk=`echo $1 | sed 's%s[0-9]*[a-g]?%%'` - tmp_part=`echo $1 | sed "s%$tmp_disk%%"` ;; + tmp_disk=`echo "$1" | sed 's%s[0-9]*[a-g]?%%'` + tmp_part=`echo "$1" | sed "s%$tmp_disk%%"` ;; *) echo "grub-install does not support your OS yet." 1>&2 exit 1 ;; esac # Get the drive name. - tmp_drive=`grep -v '^#' $device_map | grep $tmp_disk \ + tmp_drive=`grep -v '^#' $device_map | grep "$tmp_disk" \ | sed 's%.*\(([hf]d[0-9][a-g0-9,]*)\).*%\1%'` # If not found, print an error message and exit. @@ -89,23 +91,24 @@ convert () { if test "x$tmp_part" != x; then # If a partition is specified, we need to translate it into the # GRUB's syntax. - case $host_os in + case "$host_os" in linux*) - echo $tmp_drive | sed "s%)$%,`expr $tmp_part - 1`)%" ;; + echo "$tmp_drive" | sed "s%)$%,`expr $tmp_part - 1`)%" ;; gnu*) - tmp_pc_slice=`echo $tmp_part | sed "s%s\([0-9]*\)[a-g]?%\1%"` - tmp_bsd_partition=`echo $tmp | sed "s%s[0-9]*\([a-g]?\)%\1%"` - tmp_drive=`echo $tmp_drive \ - | sed "s%)%,\`expr $tmp_pc_slice - 1\`)%"` + tmp_pc_slice=`echo "$tmp_part" | sed "s%s\([0-9]*\)[a-g]?%\1%"` + tmp_bsd_partition=`echo "$tmp_part" \ + | sed "s%s[0-9]*\([a-g]?\)%\1%"` + tmp_drive=`echo "$tmp_drive" \ + | sed "s%)%,\`expr "$tmp_pc_slice" - 1\`)%"` if test "x$tmp_bsd_partition" != x; then - tmp_drive=`echo $tmp_drive \ + tmp_drive=`echo "$tmp_drive" \ | sed "s%)%,\`sed y%abcdefg%0123456%\`)%"` fi - echo $tmp_drive ;; + echo "$tmp_drive" ;; esac else # If no partition is specified, just print the drive name. - echo $tmp_drive + echo "$tmp_drive" fi } @@ -119,9 +122,9 @@ for option; do echo "grub-install (GNU GRUB ${VERSION})" exit 0 ;; --root-directory=*) - rootdir=`echo $option | sed 's/--root-directory=//'` ;; + rootdir=`echo "$option" | sed 's/--root-directory=//'` ;; --grub-shell=*) - grub_shell=`echo $option | sed 's/--grub-shell=//'` ;; + grub_shell=`echo "$option" | sed 's/--grub-shell=//'` ;; # This is an undocumented feature... --debug) debug=yes ;; @@ -145,17 +148,17 @@ grubdir=${bootdir}/grub device_map=${grubdir}/device.map # Check if GRUB is installed -if test ! -f $grub_shell; then +if test ! -f "$grub_shell"; then echo "${grub_shell}: Not found." 1>&2 exit 1 fi -if test ! -f $pkgdatadir/stage1; then +if test ! -f "$pkgdatadir/stage1"; then echo "${pkgdatadir}/stage1: Not found." 1>&2 exit 1 fi -if test ! -f $pkgdatadir/stage2; then +if test ! -f "$pkgdatadir/stage2"; then echo "${pkgdatadir}/stage2: Not found." 1>&2 exit 1 fi @@ -164,11 +167,11 @@ fi # Stage 1.5 does not exist. # Create the GRUB directory if it is not present. -test -d $bootdir || mkdir $bootdir -test -d $grubdir || mkdir $grubdir +test -d "$bootdir" || mkdir "$bootdir" +test -d "$grubdir" || mkdir "$grubdir" # Create the device map file if it is not present. -if test ! -f $device_map; then +if test ! -f "$device_map"; then # Create a safe temporary file. test -x /bin/tempfile && log_file=`tempfile --prefix=grub` @@ -190,7 +193,7 @@ if test "x$install_device" = x; then else case "$install_device" in /dev/*) - install_drive=`convert $install_device` + install_drive=`convert "$install_device"` # I don't know why, but some shells wouldn't die if exit is # called in a function. if test "x$install_drive" = x; then @@ -208,15 +211,16 @@ fi # For now, this uses the program `df' to get the device name, but is # this really portable? root_device=`df ${rootdir} | grep /dev/ | sed 's%.*\(/dev/[a-z0-9]*\).*%\1%'` -root_drive=`convert $root_device` +root_drive=`convert "$root_device"` if test "x$root_drive" = x; then exit 1 fi # Check if the root directory exists in the same device as the grub # directory. -grubdir_device=`df ${grubdir} | grep /dev/ | sed 's%.*\(/dev/[a-z0-9]*\).*%\1%'` -if test $grubdir_device != $root_device; then +grubdir_device=`df ${grubdir} | grep /dev/ \ + | sed 's%.*\(/dev/[a-z0-9]*\).*%\1%'` +if test "x$grubdir_device" != "x$root_device"; then # For now, cannot deal with this situation. cat <2 You must set the root directory by the option --root-directory, because