diff options
author | 2002-01-29 15:58:41 +0000 | |
---|---|---|
committer | 2002-01-29 15:58:41 +0000 | |
commit | e9413b609bc43850e9482ccc315466667d0db46b (patch) | |
tree | 2d8f555df524f53afde05a104d41de7d218da4fb /sys-apps/grub | |
parent | add some docs (diff) | |
download | gentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.tar.gz gentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.tar.bz2 gentoo-2-e9413b609bc43850e9482ccc315466667d0db46b.zip |
grub version update to 0.91
Diffstat (limited to 'sys-apps/grub')
21 files changed, 2797 insertions, 128 deletions
diff --git a/sys-apps/grub/files/digest-grub-0.5.96.1-r4 b/sys-apps/grub/files/digest-grub-0.5.96.1-r4 deleted file mode 100644 index 0739167187b1..000000000000 --- a/sys-apps/grub/files/digest-grub-0.5.96.1-r4 +++ /dev/null @@ -1 +0,0 @@ -MD5 3c078fa58deaf7ea3bdf3135b3b4e975 grub-0.5.96.1.tar.gz 708608 diff --git a/sys-apps/grub/files/digest-grub-0.90-r3 b/sys-apps/grub/files/digest-grub-0.90-r3 deleted file mode 100644 index fed5b37e14e6..000000000000 --- a/sys-apps/grub/files/digest-grub-0.90-r3 +++ /dev/null @@ -1 +0,0 @@ -MD5 e435d871e5d06b3106342d880380605e grub-0.90.tar.gz 745472 diff --git a/sys-apps/grub/files/digest-grub-0.91 b/sys-apps/grub/files/digest-grub-0.91 new file mode 100644 index 000000000000..7c088acabb37 --- /dev/null +++ b/sys-apps/grub/files/digest-grub-0.91 @@ -0,0 +1 @@ +MD5 83f60ed38224c2f4921d72ed56f4fa90 grub-0.91.tar.gz 868352 diff --git a/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff b/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff deleted file mode 100644 index d6ab35101f80..000000000000 --- a/sys-apps/grub/files/grub-0.5.96.1-r3-gentoo.diff +++ /dev/null @@ -1,15 +0,0 @@ -diff -ur grub-0.5.96.1.orig/util/grub-install.in grub-0.5.96.1/util/grub-install.in ---- grub-0.5.96.1.orig/util/grub-install.in Mon Oct 16 14:42:36 2000 -+++ grub-0.5.96.1/util/grub-install.in Wed Aug 1 13:41:03 2001 -@@ -76,9 +76,9 @@ - # Break the device name into the disk part and the partition part. - case "$host_os" in - linux*) -- tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' -+ tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \ - -e 's%/part[0-9]*$%/disc%'` -- tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' -+ tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \ - -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%'` - ;; - gnu*) diff --git a/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff b/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff deleted file mode 100644 index d6ab35101f80..000000000000 --- a/sys-apps/grub/files/grub-0.5.96.1-r4-gentoo.diff +++ /dev/null @@ -1,15 +0,0 @@ -diff -ur grub-0.5.96.1.orig/util/grub-install.in grub-0.5.96.1/util/grub-install.in ---- grub-0.5.96.1.orig/util/grub-install.in Mon Oct 16 14:42:36 2000 -+++ grub-0.5.96.1/util/grub-install.in Wed Aug 1 13:41:03 2001 -@@ -76,9 +76,9 @@ - # Break the device name into the disk part and the partition part. - case "$host_os" in - linux*) -- tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' -+ tmp_disk=`echo "$1" | sed -e 's%\([sh]d[a-z]\)[0-9]*$%\1%' \ - -e 's%/part[0-9]*$%/disc%'` -- tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' -+ tmp_part=`echo "$1" | sed -e 's%.*/[sh]d[a-z]\([0-9]*\)$%\1%' \ - -e 's%.*/\(disc\|part\([0-9]*\)\)$%\2%'` - ;; - gnu*) diff --git a/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch new file mode 100644 index 000000000000..dd3a60d12835 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-dont-give-mem-to-kernel.patch @@ -0,0 +1,30 @@ +--- grub-0.5.96.1/stage2/boot.c.pix Mon Oct 16 16:42:08 2000 ++++ grub-0.5.96.1/stage2/boot.c Fri Feb 23 16:40:29 2001 +@@ -322,7 +322,18 @@ + + while (((int) dest) < CL_MY_END_ADDR && *src) + *(dest++) = *(src++); +- ++ ++/* don't add ``mem='' for 2.4 kernels : ++ ++Newer machines have several regions of reserved memory outside and ++inside these regions. grub's actions are suicide on newer laptops, ++and machines like servers with lots of memory. Laptops have special ++sections of memory above 1MB which must be reserved... Ditto for ++ACPI tables. Using mem=XXX completely eliminates any information ++that the BIOS has provided to the OS. ++ ++*/ ++#if 0 + /* Add a mem option automatically only if the user doesn't + specify it explicitly. */ + if (! grub_strstr (arg, "mem=") +@@ -337,6 +348,7 @@ + dest = convert_to_ascii (dest, 'u', (extended_memory + 0x400)); + *(dest++) = 'K'; + } ++#endif + + *dest = 0; + } diff --git a/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch new file mode 100644 index 000000000000..15176e7c19da --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.5.96.1-special-raid-devices.patch @@ -0,0 +1,17 @@ +--- grub-0.5.96.1/lib/device.c.pix Mon Oct 16 16:41:54 2000 ++++ grub-0.5.96.1/lib/device.c Tue Apr 3 12:01:41 2001 +@@ -616,7 +616,13 @@ + if (strcmp (dev + strlen(dev) - 5, "/disc") == 0) + strcat (dev + strlen(dev) - 5, "/part"); + } +- sprintf (dev + strlen(dev), "%d", ((partition >> 16) & 0xFF) + 1); ++ ++ sprintf (dev + strlen(dev), "%s%d", ++ /* Compaq smart and others */ ++ (strncmp(dev, "/dev/ida/", 9) == 0 || ++ strncmp(dev, "/dev/cciss/", 11) == 0 || ++ strncmp(dev, "/dev/rd/", 8) == 0) ? "p" : "", ++ ((partition >> 16) & 0xFF) + 1); + + /* Open the partition. */ + fd = open (dev, O_RDWR); diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch new file mode 100644 index 000000000000..4c53344a3cbe --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-addsyncs.patch @@ -0,0 +1,57 @@ + +I just found another semi-critical bug, whose fix should really get +into 0.91. + +It turns out that "grub-install" doesn't have any "sync" calls to make +sure any filesystem caches are coherent with the raw devices they are +on top of... so if your filesystem waits to write out any data from the +copy command in the script to put the "stage1" and "stage2" in their +final location, you're hosed. + +I found this because it just bit me on one of my systems running stock +RedHat 7.2 with a large "stage2". + +The only script that is patched here is "grub-install". The others +don't appear to need it as they either unmount things first or don't +refer to devices. + +Hmm. Maybe the right fix is to make the "sync" system call when +starting the GRUB shell with a device map that refers to any real disks +or something like that. + +------------------------(start patch)----------------------- +--- grub.orig/util/grub-install.in Mon Oct 22 16:46:07 2001 ++++ grub/util/grub-install.in Sat Oct 27 13:06:33 2001 +@@ -244,6 +244,10 @@ + # Create a safe temporary file. + test -x /bin/tempfile && log_file=`tempfile --prefix=grub` + ++ # Before all invocations of the grub shell, call sync to make sure ++ # the raw device is in sync with any bufferring in filesystems. ++ sync ++ + $grub_shell --batch --device-map=$device_map <<EOF >$log_file + quit + EOF +@@ -318,6 +322,10 @@ + # Create a safe temporary file. + test -x /bin/tempfile && log_file=`tempfile --prefix=grub` + ++# Before all invocations of the grub shell, call sync to make sure ++# the raw device is in sync with any bufferring in filesystems. ++sync ++ + # Now perform the installation. + $grub_shell --batch --device-map=$device_map <<EOF >$log_file + root $root_drive +------------------------(end patch)----------------------- + +-- + Erich Stefan Boleyn <erich@uruk.org> http://www.uruk.org/ +"Reality is truly stranger than fiction; Probably why fiction is so popular" + +_______________________________________________ +Bug-grub mailing list +Bug-grub@gnu.org +http://mail.gnu.org/mailman/listinfo/bug-grub + diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-append.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-append.patch new file mode 100644 index 000000000000..99cd0285faef --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-append.patch @@ -0,0 +1,111 @@ +--- grub-0.90/stage2/stage2.c.append Thu Dec 20 08:20:48 2001 ++++ grub-0.90/stage2/stage2.c Thu Dec 20 17:01:20 2001 +@@ -500,7 +500,8 @@ + if (config_entries) + printf ("\ + Press enter to boot the selected OS, \'e\' to edit the\n\ +- commands before booting, or \'c\' for a command-line."); ++ commands before booting, \'a\' to modify the kernel arguments\n\ ++ before booting, or \'c\' for a command-line."); + else + printf ("\ + Press \'b\' to boot, \'e\' to edit the selected command in the\n\ +@@ -787,6 +788,98 @@ + enter_cmdline (heap, 0); + goto restart; + } ++ if (config_entries && c == 'a') ++ { ++ int new_num_entries = 0, i = 0, j; ++ int needs_padding, amount; ++ char *new_heap; ++ char * entries; ++ char * entry_copy; ++ char * append_line; ++ char * start; ++ ++ entry_copy = new_heap = heap; ++ cur_entry = get_entry (config_entries, first_entry + entryno, ++ 1); ++ ++ do ++ { ++ while ((*(new_heap++) = cur_entry[i++]) != 0); ++ new_num_entries++; ++ } ++ while (config_entries && cur_entry[i]); ++ ++ /* this only needs to be done if config_entries is non-NULL, ++ but it doesn't hurt to do it always */ ++ *(new_heap++) = 0; ++ ++ new_heap = heap + NEW_HEAPSIZE + 1; ++ ++ entries = entry_copy; ++ while (*entries) ++ { ++ if ((strstr(entries, "kernel") == entries) && ++ isspace(entries[6])) ++ break; ++ ++ while (*entries) entries++; ++ entries++; ++ } ++ ++ if (!*entries) ++ goto restart; ++ ++ start = entries + 6; ++ ++ /* skip the white space */ ++ while (*start && isspace(*start)) start++; ++ /* skip the kernel name */ ++ while (*start && !isspace(*start)) start++; ++ ++ /* skip the white space */ ++ needs_padding = (!*start || !isspace(*start)); ++ while (*start && isspace(*start)) start++; ++ ++ append_line = new_heap; ++ grub_strcpy(append_line, start); ++ ++ cls(); ++ print_cmdline_message (0); ++ ++ if (get_cmdline(PACKAGE " append> ", ++ append_line, NEW_HEAPSIZE + 1, ++ 0, 1)) ++ goto restart; ++ ++ /* have new args; append_line points to the ++ new args and start points to the old ++ args */ ++ ++ i = grub_strlen(start); ++ j = grub_strlen(append_line); ++ ++ if (i > (j + needs_padding)) ++ amount = i; ++ else ++ amount = j + needs_padding; ++ ++ /* align rest of commands properly */ ++ memmove (start + j + needs_padding, start + i, ++ ((int) append_line) - ((int) start) - (amount)); ++ ++ if (needs_padding) ++ *start = ' '; ++ ++ /* copy command to correct area */ ++ memmove (start + needs_padding, append_line, j); ++ ++ /* set up this entry to boot */ ++ config_entries = NULL; ++ cur_entry = entry_copy; ++ heap = new_heap; ++ ++ break; ++ } + #ifdef GRUB_UTIL + if (c == 'q') + { diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch new file mode 100644 index 000000000000..c714196a4402 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-install.in.patch @@ -0,0 +1,34 @@ +--- grub-0.90/util/grub-install.in~ Wed Feb 28 06:19:39 2001 ++++ grub-0.90/util/grub-install.in Thu Jul 19 16:01:12 2001 +@@ -224,6 +224,15 @@ + test -d "$bootdir" || mkdir "$bootdir" || exit 1 + test -d "$grubdir" || mkdir "$grubdir" || exit 1 + ++# Copy the GRUB images to the GRUB directory. ++for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do ++ rm -f $file || exit 1 ++done ++for file in \ ++ ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do ++ cp -f $file ${grubdir} || exit 1 ++done ++ + # If --recheck is specified, remove the device map, if present. + if test $recheck = yes; then + rm -f $device_map +@@ -297,15 +306,6 @@ + EOF + exit 1 + fi +- +-# Copy the GRUB images to the GRUB directory. +-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do +- rm -f $file || exit 1 +-done +-for file in \ +- ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do +- cp -f $file ${grubdir} || exit 1 +-done + + # Create a safe temporary file. + test -x /bin/tempfile && log_file=`tempfile --prefix=grub` diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch new file mode 100644 index 000000000000..1083ab507e71 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-installcopyonly.patch @@ -0,0 +1,85 @@ +--- grub-0.90/util/grub-install.in~ Thu Jul 19 18:42:58 2001 ++++ grub-0.90/util/grub-install.in Thu Jul 19 18:43:12 2001 +@@ -38,6 +38,7 @@ + force_lba= + recheck=no + debug=no ++justcopy=no + + # Usage: usage + # Print the usage. +@@ -149,6 +150,17 @@ + fi + } + ++copy_images() { ++ # Copy the GRUB images to the GRUB directory. ++ for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do ++ rm -f $file || exit 1 ++ done ++ for file in \ ++ ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do ++ cp -f $file ${grubdir} || exit 1 ++ done ++} ++ + # Check the arguments. + for option in "$@"; do + case "$option" in +@@ -166,6 +178,8 @@ + force_lba="--force-lba" ;; + --recheck) + recheck=yes ;; ++ --just-copy) ++ justcopy=yes ;; + # This is an undocumented feature... + --debug) + debug=yes ;; +@@ -179,12 +193,6 @@ + esac + done + +-if test "x$install_device" = x; then +- echo "install_device not specified." 1>&2 +- usage +- exit 1 +-fi +- + # If the debugging feature is enabled, print commands. + if test $debug = yes; then + set -x +@@ -195,6 +203,18 @@ + grubdir=${bootdir}/grub + device_map=${grubdir}/device.map + ++# if they just want the images copied, copy the images and then exit ++if test $justcopy = yes; then ++ copy_images ++ exit 0 ++fi ++ ++if test "x$install_device" = x; then ++ echo "install_device not specified." 1>&2 ++ usage ++ exit 1 ++fi ++ + # Check if GRUB is installed + if test -f "$grub_shell"; then + : +@@ -224,14 +244,7 @@ + test -d "$bootdir" || mkdir "$bootdir" || exit 1 + test -d "$grubdir" || mkdir "$grubdir" || exit 1 + +-# Copy the GRUB images to the GRUB directory. +-for file in ${grubdir}/stage1 ${grubdir}/stage2 ${grubdir}/*stage1_5; do +- rm -f $file || exit 1 +-done +-for file in \ +- ${pkgdatadir}/stage1 ${pkgdatadir}/stage2 ${pkgdatadir}/*stage1_5; do +- cp -f $file ${grubdir} || exit 1 +-done ++copy_images + + # If --recheck is specified, remove the device map, if present. + if test $recheck = yes; then diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch new file mode 100644 index 000000000000..47810a9ca9b9 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-passwordprompt.patch @@ -0,0 +1,146 @@ +diff -ur grub-0.90/stage2/stage2.c grub/stage2/stage2.c +--- grub-0.90/stage2/stage2.c Thu Jul 19 01:58:59 2001 ++++ grub/stage2/stage2.c Thu Jul 19 01:59:11 2001 +@@ -316,6 +316,7 @@ + char *cur_entry = 0; + int disp_up = DISP_UP; + int disp_down = DISP_DOWN; ++ int ask_pass = 0; + + /* + * Main loop for menu UI. +@@ -423,8 +424,72 @@ + grub_printf ("\n\ + Use the %c and %c keys to select which entry is highlighted.\n", + disp_up, disp_down); +- +- if (! auth && password) ++ ++ if (! auth && password && ask_pass) ++ { ++ /* Do password check here! */ ++ char entered[32]; ++ char *pptr = password; ++ ++ /* we've asked, so don't ask again */ ++ ask_pass = 0; ++ ++ if (terminal & TERMINAL_DUMB) ++ grub_printf ("\n\nThe selected entry is %d ", entryno); ++ else ++ { ++ print_entries (view_y0 + 3, 12, first_entry, menu_entries); ++ /* highlight initial line */ ++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno, ++ menu_entries); ++ } ++ ++ /* Wipe out the previously entered password */ ++ memset (entered, 0, sizeof (entered)); ++ gotoxy (view_x0 + 1, view_y0 + 16); ++ get_cmdline (" Password: ", entered, 31, '*', 0); ++ ++ while (! isspace (*pptr) && *pptr) ++ pptr++; ++ ++ /* Make sure that PASSWORD is NUL-terminated. */ ++ *pptr++ = 0; ++ ++ if (! check_password (entered, password, password_type)) ++ { ++ char *new_file = config_file; ++ ++ while (isspace (*pptr)) ++ pptr++; ++ ++ /* If *PPTR is NUL, then allow the user to use ++ privileged instructions, otherwise, load ++ another configuration file. */ ++ if (*pptr != 0) ++ { ++ while ((*(new_file++) = *(pptr++)) != 0) ++ ; ++ ++ /* Make sure that the user will not have ++ authority in the next configuration. */ ++ auth = 0; ++ return; ++ } ++ else ++ { ++ /* Now the user is superhuman. */ ++ auth = 1; ++ goto restart; ++ } ++ } ++ else ++ { ++ printf (" Failed!\n Press any key to continue..."); ++ getkey (); ++ goto restart; ++ } ++ } ++ else if (! auth && password) + { + printf ("\ + Press enter to boot the selected OS or \'p\' to enter a\n\ +@@ -637,57 +702,8 @@ + { + if (c == 'p') + { +- /* Do password check here! */ +- char entered[32]; +- char *pptr = password; +- +- if (terminal & TERMINAL_DUMB) +- grub_printf ("\r "); +- else +- gotoxy (view_x0 + 1, view_y1 + 21); +- +- /* Wipe out the previously entered password */ +- memset (entered, 0, sizeof (entered)); +- get_cmdline (" Password: ", entered, 31, '*', 0); +- +- while (! isspace (*pptr) && *pptr) +- pptr++; +- +- /* Make sure that PASSWORD is NUL-terminated. */ +- *pptr++ = 0; +- +- if (! check_password (entered, password, password_type)) +- { +- char *new_file = config_file; +- while (isspace (*pptr)) +- pptr++; +- +- /* If *PPTR is NUL, then allow the user to use +- privileged instructions, otherwise, load +- another configuration file. */ +- if (*pptr != 0) +- { +- while ((*(new_file++) = *(pptr++)) != 0) +- ; +- +- /* Make sure that the user will not have +- authority in the next configuration. */ +- auth = 0; +- return; +- } +- else +- { +- /* Now the user is superhuman. */ +- auth = 1; +- goto restart; +- } +- } +- else +- { +- printf ("Failed!\n Press any key to continue..."); +- getkey (); +- goto restart; +- } ++ ask_pass = 1; ++ goto restart; + } + } + else diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch new file mode 100644 index 000000000000..0d55efe181f5 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-symlinkmenulst.patch @@ -0,0 +1,16 @@ +Only in grub: ChangeLog~ +diff -ur grub-0.90/util/grub-install.in grub/util/grub-install.in +--- grub-0.90/util/grub-install.in Wed Sep 5 15:50:06 2001 ++++ grub/util/grub-install.in Wed Sep 5 15:50:24 2001 +@@ -320,6 +320,10 @@ + exit 1 + fi + ++if ! test -e /boot/grub/grub.conf ; then ++ test -e /boot/grub/menu.lst && ln -s ./menu.lst /boot/grub/grub.conf ++fi ++ + # Create a safe temporary file. + test -x /bin/mktemp && log_file=`/bin/mktemp /tmp/grub-install.log.XXXXXX` + +Only in grub/util: grub-install.in.orig diff --git a/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch b/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch new file mode 100644 index 000000000000..e1678344ba12 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.90-vga16-keypressclear.patch @@ -0,0 +1,36 @@ +diff -ur grub/stage2/stage2.c grub-0.90/stage2/stage2.c +--- grub/stage2/stage2.c Thu Jul 19 01:43:41 2001 ++++ grub-0.90/stage2/stage2.c Thu Jul 19 01:50:23 2001 +@@ -503,19 +503,6 @@ + + c = translate_keycode (getkey ()); + +- if (grub_timeout >= 0) +- { +- if (terminal & TERMINAL_DUMB) +- grub_putchar ('\r'); +- else +- gotoxy (view_x0 + 3, 22); +- printf (" "); +- grub_timeout = -1; +- fallback_entry = -1; +- if (! (terminal & TERMINAL_DUMB)) +- gotoxy (view_x1 - 6, view_x0 + 4 + entryno); +- } +- + /* We told them above (at least in SUPPORT_SERIAL) to use + '^' or 'v' so accept these keys. */ + if (c == 16 || c == '^') +@@ -792,6 +779,12 @@ + } + #endif + } ++ if (grub_timeout >= 0) ++ { ++ grub_timeout = -1; ++ fallback_entry = -1; ++ goto restart; ++ } + } + } + diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch new file mode 100644 index 000000000000..e28d58c901da --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.91-initrdusemem.patch @@ -0,0 +1,107 @@ +--- grub-0.91/stage2/shared.h Fri Jan 25 21:33:39 2002 ++++ grub/stage2/shared.h Fri Jan 25 20:08:10 2002 +@@ -979,6 +979,9 @@ + int grub_strlen (const char *str); + char *grub_strcpy (char *dest, const char *src); + ++/* simple version of string to unsigned long; doesn't handle bases */ ++unsigned long simple_strtoul(char *str_ptr, char **endp); ++ + #ifndef GRUB_UTIL + typedef unsigned long grub_jmp_buf[6]; + #else +--- grub-0.91/stage2/char_io.c Fri Jan 25 21:33:39 2002 ++++ grub/stage2/char_io.c Fri Jan 25 21:33:24 2002 +@@ -964,6 +964,34 @@ + return 1; + } + ++/* convert a string to an unsigned long. basically taken straight from ++ * the Linux kernel (lib/vsprintf.c) but made even simpler due to lack of ++ * base handling ++ * str_ptr is the start of the string, ++ * endp will point to the end of the parsed string when we're done ++ */ ++unsigned long ++simple_strtoul(char *str_ptr, char **endp) ++{ ++ unsigned long result = 0; ++ ++ while (1) ++ { ++ unsigned int digit; ++ ++ digit = *str_ptr - '0'; ++ /* since digit is unsigned, it will wrap */ ++ if (digit > 9) ++ break; ++ result = result * 10 + digit; ++ str_ptr++; ++ } ++ ++ if (endp) ++ *endp = (char *)str_ptr; ++ return result; ++} ++ + int + grub_tolower (int c) + { +--- grub-0.91/stage2/boot.c Mon Nov 12 01:57:29 2001 ++++ grub/stage2/boot.c Fri Jan 25 21:27:44 2002 +@@ -28,6 +28,7 @@ + static int cur_addr; + entry_func entry_addr; + static struct mod_list mll[99]; ++static unsigned long kernel_mem_end = 0; + + + /* +@@ -308,6 +309,36 @@ + 0, + (64 - setup_sects - 1) << 9); + ++ /* we need to parse mem= from the command-line so that we can load ++ the initrd in the right place. bleah */ ++ { ++ char *mem; ++ ++ mem = grub_strstr (arg, "mem="); ++ if (mem) ++ { ++ /* we handle this identically to the kernel; see memparse ++ in lib/cmdline.c of the kernel source for the ++ original location of this code */ ++ kernel_mem_end = simple_strtoul(mem+4, &mem); ++ ++ switch(*mem) ++ { ++ case 'G': ++ case 'g': ++ kernel_mem_end <<= 10; ++ case 'M': ++ case 'm': ++ kernel_mem_end <<= 10; ++ case 'K': ++ case 'k': ++ kernel_mem_end <<= 10; ++ default: ++ break; ++ } ++ } ++ } ++ + /* Copy command-line plus memory hack to staging area. + NOTE: Linux has a bug that it doesn't handle multiple spaces + between two options and a space after a "mem=" option isn't +@@ -720,7 +751,9 @@ + goto fail; + } + +- moveto = ((mbi.mem_upper + 0x400) * 0x400 - len) & 0xfffff000; ++ if (!kernel_mem_end) ++ kernel_mem_end = (mbi.mem_upper + 0x400) * 0x400; ++ moveto = (kernel_mem_end - len) & 0xfffff000; + if (moveto + len >= LINUX_INITRD_MAX_ADDRESS) + moveto = (LINUX_INITRD_MAX_ADDRESS - len) & 0xfffff000; + diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch new file mode 100644 index 000000000000..cc7807350493 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.91-splashimagehelp.patch @@ -0,0 +1,28 @@ +diff -ur grub-0.91/docs/grub.texi grub/docs/grub.texi +--- grub-0.91/docs/grub.texi Mon Jan 21 22:57:46 2002 ++++ grub/docs/grub.texi Mon Jan 21 22:57:51 2002 +@@ -1891,6 +1891,7 @@ + * rarp:: Initialize a network device via RARP + * serial:: Set up a serial device + * setkey:: Configure the key map ++* splashimage:: Use a splash image + * terminal:: Choose a terminal + * tftpserver:: Specify a TFTP server + * unhide:: Unhide a partition +@@ -2260,6 +2261,16 @@ + @end deffn + + ++@node splashimage ++@subsection splashimage ++ ++@deffn Command splashimage file ++Select an image to use as the background image. This should be ++specified using normal GRUB device naming syntax. The format of the ++file is a gzipped xpm which is 640x480 with a 14 color palette. ++@end deffn ++ ++ + @node terminal + @subsection terminal + diff --git a/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch b/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch new file mode 100644 index 000000000000..e908f921a908 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/grub-0.91-vga16.patch @@ -0,0 +1,2057 @@ +diff -urN grub-0.91/ChangeLog grub/ChangeLog +--- grub-0.91/ChangeLog Sat Jan 19 15:26:02 2002 ++++ grub/ChangeLog Mon Jan 21 22:44:25 2002 +@@ -1877,6 +1877,18 @@ + [!STAGE1_5] (CMDLINE_WIDTH): New macro. + [!STAGE1_5] (CMDLINE_MARGIN): Likewise. + * stage2/shared.h (TERMINAL_DUMB): Likewise. ++ ++2000-08-29 Paulo César Pereira de Andrade <pcpa@conectiva.com.br> ++ ++ * configure.in: Added --disable-vga16 option, in case user does not ++ want the new VGA graphics interface. ++ * stage2/asm.S: Added some new functions, for graphics operations, ++ and renamed several functions to allow wrapping them. ++ * stage2/stage2.c: Main changes for VGA16 support. ++ * stage2/char_io.c: Modified calls of grub_putchar to putchar ++ * stage2/disk_io.c: Same as for char_io.c ++ * stage2/cmdline.c: Also, the same as for char_io.c ++ * stage2/shared.h: Definitions for externs and wrapping functions. + + 2000-08-28 OKUJI Yoshinori <okuji@gnu.org> + +diff -urN grub-0.91/configure.in grub/configure.in +--- grub-0.91/configure.in Tue Jan 15 05:27:59 2002 ++++ grub/configure.in Mon Jan 21 22:44:25 2002 +@@ -18,6 +18,7 @@ + AC_PREREQ(2.13) + + AC_CANONICAL_HOST ++AM_PROG_LIBTOOL + + case "$host_cpu" in + i[[3456]]86) host_cpu=i386 ;; +@@ -610,6 +611,12 @@ + ASFLAGS='$(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(CPPFLAGS) $(CFLAGS)' + AC_SUBST(ASFLAGS) + ++AC_ARG_ENABLE(vga16, ++ [ --disable-vga16 disable VGA graphics interface]) ++ ++if test x"$enable_vga16" != xno; then ++ STAGE2_CFLAGS="$STAGE2_CFLAGS -DVGA16=1" ++fi + + dnl Output. + AC_OUTPUT([Makefile stage1/Makefile stage2/Makefile docs/Makefile \ +diff -urN grub-0.91/stage2/asm.S grub/stage2/asm.S +--- grub-0.91/stage2/asm.S Sat Dec 29 13:05:36 2001 ++++ grub/stage2/asm.S Mon Jan 21 22:44:25 2002 +@@ -1865,7 +1865,7 @@ + * %cl = cursor ending scanline + */ + +-ENTRY(nocursor) ++ENTRY(grub_nocursor) + push %ebp + push %ebx /* save EBX */ + +@@ -1951,7 +1951,7 @@ + + + /* +- * console_set_attrib(attr) : Sets the character attributes for character at ++ * grub_set_attrib(attr) : Sets the character attributes for character at + * current cursor position. + * + * Bitfields for character's display attribute: +@@ -1985,7 +1985,7 @@ + * %cx = count to display (???, possible side-effects!!) + */ + +-ENTRY(console_set_attrib) ++ENTRY(grub_set_attrib) + push %ebp + push %ebx + +@@ -2009,6 +2009,263 @@ + pop %ebp + ret + ++#ifdef VGA16 ++VARIABLE(cursorX) ++.word 0 ++VARIABLE(cursorY) ++.word 0 ++VARIABLE(cursorWidth) ++.word 0 ++VARIABLE(cursorHeight) ++.word 0 ++VARIABLE(cursorCount) ++.word 0 ++VARIABLE(cursorBuf) ++.byte 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ++ ++/* ++ * set_int1c_handler(void) ++ */ ++ENTRY(set_int1c_handler) ++ pushl %edi ++ ++ /* save the original int1c handler */ ++ movl $0x70, %edi ++ movw (%edi), %ax ++ movw %ax, ABS(int1c_offset) ++ movw 2(%edi), %ax ++ movw %ax, ABS(int1c_segment) ++ ++ /* save the new int1c handler */ ++ movw $ABS(int1c_handler), %ax ++ movw %ax, (%edi) ++ xorw %ax, %ax ++ movw %ax, 2(%edi) ++ ++ popl %edi ++ ret ++ ++ ++/* ++ * unset_int1c_handler(void) ++ */ ++ENTRY(unset_int1c_handler) ++ pushl %edi ++ ++ /* check if int1c_handler is set */ ++ movl $0x70, %edi ++ movw $ABS(int1c_handler), %ax ++ cmpw %ax, (%edi) ++ jne int1c_1 ++ xorw %ax, %ax ++ cmpw %ax, 2(%edi) ++ jne int1c_1 ++ ++ /* restore the original */ ++ movw ABS(int1c_offset), %ax ++ movw %ax, (%edi) ++ movw ABS(int1c_segment), %ax ++ movw %ax, 2(%edi) ++ ++int1c_1: ++ popl %edi ++ ret ++ ++/* ++ * blinks graphics cursor ++ */ ++ .code16 ++write_data: ++ movw $0, %ax ++ movw %ax, %ds ++ ++ mov $0xA000, %ax /* video in es:di */ ++ mov %ax, %es ++ mov $80, %ax ++ movw $ABS(cursorY), %si ++ mov %ds:(%si), %bx ++ mul %bx ++ movw $ABS(cursorX), %si ++ mov %ds:(%si), %bx ++ shr $3, %bx /* %bx /= 8 */ ++ add %bx, %ax ++ mov %ax, %di ++ ++ movw $ABS(cursorBuf), %si /* fontBuf in ds:si */ ++ ++ /* prepare for data moving */ ++ mov $16, %dx /* altura da fonte */ ++ mov $80, %bx /* bytes por linha */ ++ ++write_loop: ++ movb %ds:(%si), %al ++ xorb $0xff, %al ++ movb %al, %ds:(%si) /* invert cursorBuf */ ++ movb %al, %es:(%di) /* write to video */ ++ add %bx, %di ++ inc %si ++ dec %dx ++ jg write_loop ++ ret ++ ++int1c_handler: ++ pusha ++ mov $0, %ax ++ mov %ax, %ds ++ mov $ABS(cursorCount), %si ++ mov %ds:(%si), %ax ++ inc %ax ++ mov %ax, %ds:(%si) ++ cmp $9, %ax ++ jne int1c_done ++ ++ mov $0, %ax ++ mov %ax, %ds:(%si) ++/* ++ movw $0x3c4, %dx ++ movb $0x020f, %ax ++ outw %ax, %dx ++*/ ++ call write_data ++ ++int1c_done: ++ popa ++ iret ++ /* call previous int1c handler */ ++ /* ljmp */ ++ .byte 0xea ++int1c_offset: .word 0 ++int1c_segment: .word 0 ++ .code32 ++ ++ ++ENTRY(get_font) ++ push %ebp ++ push %ebx ++ push %ecx ++ push %edx ++ ++ call EXT_C(prot_to_real) ++ .code16 ++ ++ movw $0x1130, %ax ++ movb $6, %bh /* font 8x16 */ ++ int $0x10 ++ movw %bp, %dx ++ movw %es, %cx ++ ++ DATA32 call EXT_C(real_to_prot) ++ .code32 ++ ++ xorl %eax, %eax ++ movw %cx, %ax ++ shll $4, %eax ++ movw %dx, %ax ++ ++ pop %edx ++ pop %ecx ++ pop %ebx ++ pop %ebp ++ ret ++ ++/* ++ * set_videomode(mode) ++ * BIOS call "INT 10H Function 0h" to set video mode ++ * Call with %ah = 0x0 ++ * %al = video mode ++ */ ++ENTRY(set_videomode) ++ push %ebp ++ push %ebx ++ push %ecx ++ ++ movb 0x10(%esp), %cl ++ ++ call EXT_C(prot_to_real) ++ .code16 ++ ++ xorw %bx, %bx ++ movb $0xf, %ah ++ int $0x10 /* Get Current Video mode */ ++ movb %al, %ch ++ xorb %ah, %ah ++ movb %cl, %al ++ int $0x10 /* Set Video mode */ ++ ++ DATA32 call EXT_C(real_to_prot) ++ .code32 ++ ++ xorb %ah, %ah ++ movb %ch, %al ++ ++ pop %ecx ++ pop %ebx ++ pop %ebp ++ ret ++ ++/* ++ * set_palette(index, red, green, blue) ++ * BIOS call "INT 10H Function 10h" to set individual dac register ++ * Call with %ah = 0x10 ++ * %bx = register number ++ * %ch = new value for green (0-63) ++ * %cl = new value for blue (0-63) ++ * %dh = new value for red (0-63) ++ */ ++ ++ENTRY(set_palette) ++ push %ebp ++ push %eax ++ push %ebx ++ push %ecx ++ push %edx ++ ++ movw $0x3c8, %bx /* address write mode register */ ++ ++ /* wait vertical retrace */ ++ ++ movw $0x3da, %dx ++l1b: inb %dx, %al /* wait vertical active display */ ++ test $8, %al ++ jnz l1b ++ ++l2b: inb %dx, %al /* wait vertical retrace */ ++ test $8, %al ++ jnz l2b ++ ++ mov %bx, %dx ++ movb 0x18(%esp), %al /* index */ ++ outb %al, %dx ++ inc %dx ++ ++ movb 0x1c(%esp), %al /* red */ ++ outb %al, %dx ++ ++ movb 0x20(%esp), %al /* green */ ++ outb %al, %dx ++ ++ movb 0x24(%esp), %al /* blue */ ++ outb %al, %dx ++ ++ movw 0x18(%esp), %bx ++ ++ call EXT_C(prot_to_real) ++ .code16 ++ ++ movb %bl, %bh ++ movw $0x1000, %ax ++ int $0x10 ++ ++ DATA32 call EXT_C(real_to_prot) ++ .code32 ++ ++ pop %edx ++ pop %ecx ++ pop %ebx ++ pop %eax ++ pop %ebp ++ ret ++#endif + + /* + * getrtsecs() +diff -urN grub-0.91/stage2/builtins.c grub/stage2/builtins.c +--- grub-0.91/stage2/builtins.c Wed Jan 2 18:23:30 2002 ++++ grub/stage2/builtins.c Mon Jan 21 22:44:25 2002 +@@ -133,6 +133,36 @@ + grub_printf ("[%d,%d,%d]", sector, offset, length); + } + ++#ifdef VGA16 ++/* background */ ++static int ++background_func(char *arg, int flags) ++{ ++ if (grub_strlen(arg) == 6) { ++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; ++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; ++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; ++ ++ background = (r << 16) | (g << 8) | b; ++ if (vga_inited) ++ set_palette(0, r, g, b); ++ return (0); ++ } ++ ++ return (1); ++} ++ ++static struct builtin builtin_background = ++{ ++ "background", ++ background_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "background RRGGBB", ++ "Sets the background color when in graphics mode." ++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." ++}; ++#endif /* VGA16 */ ++ + + /* blocklist */ + static int +@@ -399,6 +429,40 @@ + #endif /* SUPPORT_NETBOOT */ + + ++#ifdef VGA16 ++ ++/* foreground */ ++static int ++border_func(char *arg, int flags) ++{ ++ if (grub_strlen(arg) == 6) { ++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; ++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; ++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; ++ ++ border = (r << 16) | (g << 8) | b; ++ if (vga_inited) ++ set_palette(0x11, r, g, b); ++ ++ return (0); ++ } ++ ++ return (1); ++} ++ ++static struct builtin builtin_border = ++{ ++ "border", ++ border_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "border RRGGBB", ++ "Sets the border video color when in graphics mode." ++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." ++}; ++ ++#endif /* VGA16 */ ++ ++ + /* cat */ + static int + cat_func (char *arg, int flags) +@@ -409,7 +473,7 @@ + return 1; + + while (grub_read (&c, 1)) +- grub_putchar (c); ++ putchar (c); + + grub_close (); + return 0; +@@ -963,6 +1027,44 @@ + return 0; + } + ++ ++#ifdef VGA16 ++/* display */ ++static int ++display_func(char *arg, int flags) ++{ ++ int i; ++ ++ for (i = 0; i < MAX_DISPLAYS; i++) { ++ if (grub_strcmp(arg, display_entries[i].name) == 0) ++ break; ++ } ++ ++ if (i >= MAX_DISPLAYS) ++ return (1); ++ ++ display_idx = i; ++ if (display->End) ++ (*display->End)(); ++ display = &display_entries[display_idx]; ++ ++ /* Restart cmain */ ++ grub_longjmp (restart_env, 0); ++ /*NOTREACHED*/ ++ ++ return (0); ++} ++ ++static struct builtin builtin_display = ++{ ++ "display", ++ display_func, ++ BUILTIN_CMDLINE, ++ "display MODEL", ++ "Changes display type. Available modes are \"text\" and \"vga16\"." ++}; ++#endif /* VGA16 */ ++ + static struct builtin builtin_displaymem = + { + "displaymem", +@@ -1238,6 +1340,39 @@ + " the devices which contain the file." + }; + ++#ifdef VGA16 ++ ++/* foreground */ ++static int ++foreground_func(char *arg, int flags) ++{ ++ if (grub_strlen(arg) == 6) { ++ int r = ((hex(arg[0]) << 4) | hex(arg[1])) >> 2; ++ int g = ((hex(arg[2]) << 4) | hex(arg[3])) >> 2; ++ int b = ((hex(arg[4]) << 4) | hex(arg[5])) >> 2; ++ ++ foreground = (r << 16) | (g << 8) | b; ++ if (vga_inited) ++ set_palette(15, r, g, b); ++ ++ return (0); ++ } ++ ++ return (1); ++} ++ ++static struct builtin builtin_foreground = ++{ ++ "foreground", ++ foreground_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "foreground RRGGBB", ++ "Sets the foreground color when in graphics mode." ++ "RR is red, GG is green, and BB blue. Numbers must be in hexadecimal." ++}; ++ ++#endif /* VGA16 */ ++ + + /* fstest */ + static int +@@ -1390,12 +1525,13 @@ + + + /* help */ +-#define MAX_SHORT_DOC_LEN 39 +-#define MAX_LONG_DOC_LEN 66 + + static int + help_func (char *arg, int flags) + { ++ int MAX_SHORT_DOC_LEN = (view_x1 - view_x0 + 1) / 2 - 1; ++ int MAX_LONG_DOC_LEN = (view_x1 - view_x0) - 14; ++ + if (! *arg) + { + /* Invoked with no argument. Print the list of the short docs. */ +@@ -1418,13 +1554,13 @@ + len = MAX_SHORT_DOC_LEN - 1; + + for (i = 0; i < len; i++) +- grub_putchar ((*builtin)->short_doc[i]); ++ putchar ((*builtin)->short_doc[i]); + + for (; i < MAX_SHORT_DOC_LEN; i++) +- grub_putchar (' '); ++ putchar (' '); + + if (! left) +- grub_putchar ('\n'); ++ putchar ('\n'); + + left = ! left; + } +@@ -1474,8 +1610,8 @@ + + grub_printf (" "); + for (i = 0; i < len; i++) +- grub_putchar (*doc++); +- grub_putchar ('\n'); ++ putchar (*doc++); ++ putchar ('\n'); + } + } + } +@@ -3149,6 +3285,74 @@ + "Save the current entry as the default boot entry." + }; + ++#ifdef VGA16 ++/*splashimage*/ ++static int ++splashimage_func(char *arg, int flags) ++{ ++ if (strlen(arg) > 63) ++ return (1); ++ if (flags == BUILTIN_CMDLINE) { ++ if (!grub_open(arg)) ++ return (1); ++ grub_close(); ++ } ++ ++ if (flags == BUILTIN_CMDLINE || !splash_set) { ++ strcpy(splashimage, arg); ++ splash_set = 1; ++ } ++ ++ if (flags == BUILTIN_CMDLINE && vga_inited) { ++ display->End(); ++ display->Begin(); ++ cls(); ++/* grub_longjmp(restart_env, 0);*/ ++ } ++ ++ return (0); ++} ++ ++static struct builtin builtin_splashimage = ++{ ++ "splashimage", ++ splashimage_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "splashimage FILE", ++ "Load FILE as the background image when in graphics mode." ++}; ++ ++/*shade*/ ++static int ++shade_func(char *arg, int flags) ++{ ++ int new_shade; ++ ++ if (!arg || safe_parse_maxint(&arg, &new_shade) == 0) ++ return (1); ++ ++ if (shade != new_shade) { ++ shade = new_shade; ++ if (flags == BUILTIN_CMDLINE && vga_inited) { ++ display->End(); ++ display->Begin(); ++ cls(); ++ } ++ } ++ ++ return (0); ++} ++ ++static struct builtin builtin_shade = ++{ ++ "shade", ++ shade_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "shade INTEGER", ++ "If set to 0, disables the use of shaded text, else enables it." ++}; ++#endif /* VGA16 */ ++ + + #ifdef SUPPORT_SERIAL + /* serial */ +@@ -4438,16 +4642,79 @@ + "Probe VBE information. If the mode number MODE is specified, show only" + " the information about only the mode." + }; +- ++ ++#ifdef VGA16 + ++/* viewport */ ++static int ++viewport_func (char *arg, int flags) ++{ ++ int i; ++ int x0 = 80, y0 = 25, x1 = 0, y1 = 0; ++ int *pos[4] = { &x0, &y0, &x1, &y1 }; ++ extern int viewport_set; ++ ++ if (!arg) ++ return (1); ++ for (i = 0; i < 4; i++) { ++ if (!*arg) ++ return (1); ++ while (*arg && (*arg == ' ' || *arg == '\t')) ++ ++arg; ++ if (!safe_parse_maxint(&arg, pos[i])) ++ return (1); ++ while (*arg && (*arg != ' ' && *arg != '\t')) ++ ++arg; ++ } ++ ++ x1 += x0; ++ y1 += y0; ++ ++ /* minimum size is 60 colums and 16 rows */ ++ if (x0 > x1 - 60 || y0 > y1 - 16 || x0 < 0 || y0 < 0 || x1 > 80 || y1 > 30) ++ return (1); ++ ++ viewport_set = 1; ++ view_x0 = x0; ++ view_y0 = y0; ++ view_x1 = x1; ++ view_y1 = y1; ++ ++ if (flags == BUILTIN_CMDLINE && vga_inited) { ++ display->End(); ++ display->Begin(); ++ cls(); ++ } ++ ++ return (0); ++} ++ ++static struct builtin builtin_viewport = ++{ ++ "viewport", ++ viewport_func, ++ BUILTIN_CMDLINE | BUILTIN_MENU, ++ "viewport x y width height", ++ "Changes grub internals to output text in the window defined by" ++ " four parameters. The x and y parameters are 0 based. This option" ++ " only works with the vga interface." ++}; ++#endif /* VGA16 */ ++ + /* The table of builtin commands. Sorted in dictionary order. */ + struct builtin *builtin_table[] = + { ++#ifdef VGA16 ++ &builtin_background, ++#endif /* VGA16 */ + &builtin_blocklist, + &builtin_boot, + #ifdef SUPPORT_NETBOOT + &builtin_bootp, + #endif /* SUPPORT_NETBOOT */ ++#ifdef VGA16 ++ &builtin_border, ++#endif /* VGA16 */ + &builtin_cat, + &builtin_chainloader, + &builtin_cmp, +@@ -4461,11 +4728,17 @@ + #ifdef SUPPORT_NETBOOT + &builtin_dhcp, + #endif /* SUPPORT_NETBOOT */ ++#ifdef VGA16 ++ &builtin_display, ++#endif /* VGA16 */ + &builtin_displayapm, + &builtin_displaymem, + &builtin_embed, + &builtin_fallback, + &builtin_find, ++#ifdef VGA16 ++ &builtin_foreground, ++#endif /* VGA16 */ + &builtin_fstest, + &builtin_geometry, + &builtin_halt, +@@ -4508,6 +4781,10 @@ + #endif /* SUPPORT_SERIAL */ + &builtin_setkey, + &builtin_setup, ++#ifdef VGA16 ++ &builtin_shade, ++ &builtin_splashimage, ++#endif /* VGA16 */ + #if defined(SUPPORT_SERIAL) || defined(SUPPORT_HERCULES) + &builtin_terminal, + #endif /* SUPPORT_SERIAL || SUPPORT_HERCULES */ +@@ -4521,5 +4798,8 @@ + &builtin_unhide, + &builtin_uppermem, + &builtin_vbeprobe, ++#ifdef VGA16 ++ &builtin_viewport, ++#endif /* VGA16 */ + 0 + }; +diff -urN grub-0.91/stage2/char_io.c grub/stage2/char_io.c +--- grub-0.91/stage2/char_io.c Fri Jan 18 13:01:26 2002 ++++ grub/stage2/char_io.c Mon Jan 21 22:47:43 2002 +@@ -262,8 +262,8 @@ + + /* XXX: These should be defined in shared.h, but I leave these here, + until this code is freezed. */ +-#define CMDLINE_WIDTH 78 +-#define CMDLINE_MARGIN 10 ++ int CMDLINE_WIDTH = (view_x1 - view_x0) - 2; ++ int CMDLINE_MARGIN = 10; + + int xpos, lpos, c, section; + /* The length of PROMPT. */ +@@ -313,7 +313,7 @@ + { + int y = getxy () & 0xFF; + +- gotoxy (xpos, y); ++ gotoxy (xpos + view_x0, y); + } + # ifdef SUPPORT_SERIAL + else if (! (terminal & TERMINAL_DUMB) && (count > 4)) +@@ -325,7 +325,7 @@ + int i; + + for (i = 0; i < count; i++) +- grub_putchar ('\b'); ++ putchar ('\b'); + } + # endif /* SUPPORT_SERIAL */ + } +@@ -351,7 +351,7 @@ + { + int y = getxy () & 0xFF; + +- gotoxy (xpos, y); ++ gotoxy (xpos + view_x0, y); + } + # ifdef SUPPORT_SERIAL + else if (! (terminal & TERMINAL_DUMB) && (count > 4)) +@@ -365,9 +365,9 @@ + for (i = lpos - count; i < lpos; i++) + { + if (! echo_char) +- grub_putchar (buf[i]); ++ putchar (buf[i]); + else +- grub_putchar (echo_char); ++ putchar (echo_char); + } + } + # endif /* SUPPORT_SERIAL */ +@@ -395,7 +395,7 @@ + /* From the start to the end. */ + len = CMDLINE_WIDTH; + pos = 0; +- grub_putchar ('\r'); ++ putchar ('\r'); + + /* If SECTION is the first section, print the prompt, otherwise, + print `<'. */ +@@ -407,7 +407,7 @@ + } + else + { +- grub_putchar ('<'); ++ putchar ('<'); + len--; + pos++; + } +@@ -443,9 +443,9 @@ + for (i = start; i < start + len && i < llen; i++) + { + if (! echo_char) +- grub_putchar (buf[i]); ++ putchar (buf[i]); + else +- grub_putchar (echo_char); ++ putchar (echo_char); + + pos++; + } +@@ -455,7 +455,7 @@ + /* Fill up the rest of the line with spaces. */ + for (; i < start + len; i++) + { +- grub_putchar (' '); ++ putchar (' '); + pos++; + } + +@@ -464,9 +464,9 @@ + if (pos == CMDLINE_WIDTH) + { + if (start + len < llen) +- grub_putchar ('>'); ++ putchar ('>'); + else +- grub_putchar (' '); ++ putchar (' '); + + pos++; + } +@@ -480,7 +480,7 @@ + { + int y = getxy () & 0xFF; + +- gotoxy (xpos, y); ++ gotoxy (xpos + view_x0, y); + } + # ifdef SUPPORT_SERIAL + else if (! (terminal & TERMINAL_SERIAL) && (pos - xpos > 4)) +@@ -490,7 +490,7 @@ + else + { + for (i = 0; i < pos - xpos; i++) +- grub_putchar ('\b'); ++ putchar ('\b'); + } + # endif /* SUPPORT_SERIAL */ + } +@@ -500,7 +500,7 @@ + void cl_init (void) + { + /* Distinguish us from other lines and error messages! */ +- grub_putchar ('\n'); ++ putchar ('\n'); + + /* Print full line and set position here. */ + cl_refresh (1, 0); +@@ -631,7 +631,7 @@ + /* There are more than one candidates, so print + the list. */ + +- grub_putchar ('\n'); ++ putchar ('\n'); + /* Enable the auto fill mode temporarily. */ + auto_fill = 1; + print_completions (is_filename, 0); +@@ -773,7 +773,7 @@ + } + } + +- grub_putchar ('\n'); ++ putchar ('\n'); + + /* If ECHO_CHAR is NUL, remove the leading spaces. */ + lpos = 0; +@@ -1119,7 +1119,7 @@ + { + /* Fold a line only if AUTO_FILL is true. */ + if (auto_fill && col >= 79) +- grub_putchar ('\n'); ++ putchar ('\n'); + + col++; + } +@@ -1142,7 +1142,7 @@ + + #ifndef STAGE1_5 + void +-gotoxy (int x, int y) ++grub_gotoxy (int x, int y) + { + if (terminal & TERMINAL_CONSOLE) + console_gotoxy (x, y); +@@ -1166,7 +1166,7 @@ + #endif /* SUPPORT_SERIAL */ + + int +-getxy (void) ++grub_getxy (void) + { + int ret = 0; + +@@ -1271,7 +1271,7 @@ + #endif /* SUPPORT_SERIAL */ + + void +-cls (void) ++grub_cls (void) + { + if (terminal & TERMINAL_CONSOLE) + console_cls (); +@@ -1292,7 +1292,7 @@ + { + /* If the terminal is dumb, there is no way to clean the terminal. */ + if (terminal & TERMINAL_DUMB) +- grub_putchar ('\n'); ++ putchar ('\n'); + else + grub_printf ("\e[H\e[J"); + } +diff -urN grub-0.91/stage2/cmdline.c grub/stage2/cmdline.c +--- grub-0.91/stage2/cmdline.c Wed Jan 2 18:23:30 2002 ++++ grub/stage2/cmdline.c Mon Jan 21 22:44:25 2002 +@@ -125,7 +125,7 @@ + init_page (); + #ifdef SUPPORT_DISKLESS + print_network_configuration (); +- grub_putchar ('\n'); ++ putchar ('\n'); + #endif + print_cmdline_message (forever); + +diff -urN grub-0.91/stage2/disk_io.c grub/stage2/disk_io.c +--- grub-0.91/stage2/disk_io.c Wed Nov 28 13:43:56 2001 ++++ grub/stage2/disk_io.c Mon Jan 21 22:44:25 2002 +@@ -1267,7 +1267,7 @@ + } + + if (! is_completion) +- grub_putchar ('\n'); ++ putchar ('\n'); + + print_error (); + do_completion = 0; +@@ -1334,7 +1334,7 @@ + } + + if (! is_completion) +- grub_putchar ('\n'); ++ putchar ('\n'); + } + else + { +@@ -1408,7 +1408,7 @@ + } + + if (! is_completion) +- grub_putchar ('\n'); ++ putchar ('\n'); + } + else + errnum = ERR_BAD_FILENAME; +diff -urN grub-0.91/stage2/shared.h grub/stage2/shared.h +--- grub-0.91/stage2/shared.h Mon Jan 7 21:57:36 2002 ++++ grub/stage2/shared.h Mon Jan 21 22:44:25 2002 +@@ -44,6 +44,12 @@ + # define RAW_SEG(x) (x) + #endif + ++#if defined(VGA16) ++#if defined(GRUB_UTIL) || defined(STAGE1_5) ++#undef VGA16 ++#endif ++#endif ++ + /* + * Integer sizes + */ +@@ -367,8 +373,10 @@ + #define isspace grub_isspace + #define printf grub_printf + #define sprintf grub_sprintf ++#ifndef VGA16 + #undef putchar + #define putchar grub_putchar ++#endif + #define strncat grub_strncat + #define strstr grub_strstr + #define memcmp grub_memcmp +@@ -383,6 +391,9 @@ + /* + * Below this should be ONLY defines and other constructs for C code. + */ ++#ifdef VGA16 ++#define VIDEO 0xA0000 ++#endif + + /* multiboot stuff */ + +@@ -773,26 +784,26 @@ + int currticks (void); + + /* Clear the screen. */ +-void cls (void); ++void grub_cls (void); + + /* The console part of cls. */ + void console_cls (void); + + #ifndef GRUB_UTIL + /* Turn off cursor. */ +-void nocursor (void); ++void grub_nocursor (void); + #endif + + /* 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); ++int grub_getxy (void); + + /* The console part of getxy. */ + int console_getxy (void); + + /* Set the cursor position. */ +-void gotoxy (int x, int y); ++void grub_gotoxy (int x, int y); + + /* The console part of gotoxy. */ + void console_gotoxy (int x, int y); +@@ -822,8 +833,64 @@ + constants defined above. */ + void set_attrib (int attr); + ++extern int view_x0, view_y0, view_x1, view_y1; ++#ifdef VGA16 ++#define MAX_DISPLAYS 2 ++ ++#define cls() (display->Cls ? (*display->Cls)() : 0) ++#define gotoxy(x, y) (display->Gotoxy ? (*display->Gotoxy)(x, y) : 0) ++#define putchar(c) (display->Putchar ? (*display->Putchar)(c) : 0) ++#define console_set_attrib(a) (display->SetAttrib ? (*display->SetAttrib)(a) : 0) ++#define getxy() (display->Getxy ? (*display->Getxy)() : 0) ++#define nocursor() (display->Nocursor ? (*display->Nocursor)() : 0) ++struct display_entry { ++ char *name; ++ int (*Begin)(void); ++ void (*End)(void); ++ void (*Cls)(void); ++ void (*Gotoxy)(int x, int y); ++ void (*Putchar)(int ch); ++ void (*SetAttrib)(int attr); ++ int (*Getxy)(void); ++ void (*Nocursor)(void); ++}; ++struct display_entry display_entries[MAX_DISPLAYS + 1]; ++extern struct display_entry *display; ++ ++extern int vga_inited, foreground, background, shade, border; ++extern int display_idx, splash_set; ++extern short cursorX, cursorY, cursorWidth, cursorHeight; ++extern char cursorBuf[16], splashimage[64]; ++ ++int vga16_begin(void); ++void vga16_end(void); ++void vga16_cls(void); ++void vga16_gotoxy(int x, int y); ++void vga16_putchar(int ch); ++int vga16_getxy(void); ++void vga16_nocursor(void); ++void vga16_set_attrib(int attr); ++ ++int read_image(); ++void set_palette(int index, int red, int green, int blue); ++void *get_font(void); ++/* return previous video mode */ ++int set_videomode(int mode); ++ ++int hex(int); ++void set_int1c_handler(); ++void unset_int1c_handler(); ++void cursor(int state); ++#else ++#define cls grub_cls ++#define gotoxy grub_gotoxy ++#define console_set_attrib grub_set_attrib ++#define getxy grub_getxy ++#define nocursor grub_nocursor ++#endif ++ + /* The console part of set_attrib. */ +-void console_set_attrib (int attr); ++void grub_set_attrib (int attr); + + /* Low-level disk I/O */ + int get_diskinfo (int drive, struct geometry *geometry); +diff -urN grub-0.91/stage2/stage2.c grub/stage2/stage2.c +--- grub-0.91/stage2/stage2.c Mon Jan 7 21:56:45 2002 ++++ grub/stage2/stage2.c Mon Jan 21 22:45:49 2002 +@@ -19,7 +19,12 @@ + + #include "shared.h" + ++int view_x0 = 0, view_y0 = 0, view_x1 = 80, view_y1 = 25; + grub_jmp_buf restart_env; ++#ifdef VGA16 ++int vga_disabled = 0, viewport_set = 0; ++int sx0, sy0, sx1, sy1; ++#endif + + #if defined(PRESET_MENU_STRING) || defined(SUPPORT_DISKLESS) + +@@ -109,12 +114,12 @@ + } + #endif /* SUPPORT_SERIAL */ + +- gotoxy (77, y + 1); ++ gotoxy (view_x1 - 3, y + 1); + + if (first) +- grub_putchar (disp_up); ++ putchar (disp_up); + else +- grub_putchar (' '); ++ putchar (' '); + + menu_entries = get_entry (menu_entries, first, 0); + +@@ -122,13 +127,13 @@ + { + int j = 0; + +- gotoxy (3, y + i); ++ gotoxy (view_x0 + 3, y + i); + + while (*menu_entries) + { +- if (j < 71) ++ if (j < (view_x1 - view_x0) - 9) + { +- grub_putchar (*menu_entries); ++ putchar (*menu_entries); + j++; + } + +@@ -138,16 +143,16 @@ + if (*(menu_entries - 1)) + menu_entries++; + +- for (; j < 71; j++) +- grub_putchar (' '); ++ for (; j < (view_x1 - view_x0) - 9; j++) ++ putchar (' '); + } + +- gotoxy (77, y + size); ++ gotoxy (view_x0 + 3, y + size); + + if (*menu_entries) +- grub_putchar (disp_down); ++ putchar (disp_down); + else +- grub_putchar (' '); ++ putchar (' '); + } + + +@@ -211,10 +216,10 @@ + ) + # endif + { +- for (i = 0; i < 14; i++) ++ for (i = 0; i < 12; i++) + { + int j; +- for (j = 0; j < 75; j++) ++ for (j = view_x0; j < (view_x1 - view_x0) - 5; j++) + { + gotoxy (j + 1, i + y); + set_attrib (normal_color); +@@ -223,33 +228,33 @@ + } + #endif + +- gotoxy (1, y); ++ gotoxy (view_x0 + 1, y); + +- grub_putchar (disp_ul); +- for (i = 0; i < 73; i++) +- grub_putchar (disp_horiz); +- grub_putchar (disp_ur); ++ putchar (disp_ul); ++ for (i = view_x0; i < view_x1 - 7; i++) ++ putchar (disp_horiz); ++ putchar (disp_ur); + + i = 1; + + while (1) + { +- gotoxy (1, y + i); ++ gotoxy (view_x0 + 1, y + i); + + if (i > size) + break; + +- grub_putchar (disp_vert); +- gotoxy (75, y + i); +- grub_putchar (disp_vert); ++ putchar (disp_vert); ++ gotoxy (view_x1 - 5, y + i); ++ putchar (disp_vert); + + i++; + } + +- grub_putchar (disp_ll); +- for (i = 0; i < 73; i++) +- grub_putchar (disp_horiz); +- grub_putchar (disp_lr); ++ putchar (disp_ll); ++ for (i = view_x0; i < view_x1 - 7; i++) ++ putchar (disp_horiz); ++ putchar (disp_lr); + } + + static void +@@ -261,27 +266,27 @@ + if (terminal & TERMINAL_SERIAL) + { + menu_entries = get_entry (menu_entries, entryno, 0); +- gotoxy (2, y); +- grub_putchar (' '); +- for (x = 3; x < 75; x++) ++ gotoxy (view_x0 + 2, y); ++ putchar (' '); ++ for (x = view_x0 + 3; x < view_x1 - 5; x++) + { +- if (*menu_entries && x < 71) +- grub_putchar (*menu_entries++); ++ if (*menu_entries && x < view_x1 - 9) ++ putchar (*menu_entries++); + else +- grub_putchar (' '); ++ putchar (' '); + } + } + else + #endif /* SUPPORT_SERIAL */ + { +- for (x = 2; x < 75; x++) ++ for (x = view_x0 + 2; x < view_x1 - 5; x++) + { + gotoxy (x, y); + set_attrib (attr); + } + } + +- gotoxy (74, y); ++ gotoxy (view_x1 - 6, y); + } + + /* Set the attribute of the line Y to normal state. */ +@@ -334,7 +339,8 @@ + invariant for TERMINAL_DUMB: first_entry == 0 */ + if (! (terminal & TERMINAL_DUMB)) + { +- while (entryno > 11) ++ errnum = ERR_NONE; ++ while (entryno > 9) + { + first_entry++; + entryno--; +@@ -399,7 +405,7 @@ + #endif /* ! GRUB_UTIL */ + + if (! (terminal & TERMINAL_DUMB)) +- print_border (3, 12); ++ print_border (3 + view_y0, 12); + + #ifdef GRUB_UTIL + /* In the grub shell, always use ACS_*. */ +@@ -455,10 +461,10 @@ + grub_printf ("\n\nThe selected entry is %d ", entryno); + else + { +- print_entries (3, 12, first_entry, menu_entries); ++ print_entries (view_y0 + 3, 12, first_entry, menu_entries); + + /* highlight initial line */ +- set_line_highlight (4 + entryno, first_entry + entryno, ++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + } + } +@@ -487,9 +493,9 @@ + entryno, grub_timeout); + else + { +- gotoxy (3, 22); ++ gotoxy (view_x0 + 3, view_y1 - 3); + printf ("The highlighted entry will be booted automatically in %d seconds. ", grub_timeout); +- gotoxy (74, 4 + entryno); ++ gotoxy (view_x0 - 6, view_y0 + 4 + entryno); + } + + grub_timeout--; +@@ -515,12 +521,12 @@ + if (terminal & TERMINAL_DUMB) + grub_putchar ('\r'); + else +- gotoxy (3, 22); ++ gotoxy (view_x0 + 3, 22); + printf (" "); + grub_timeout = -1; + fallback_entry = -1; + if (! (terminal & TERMINAL_DUMB)) +- gotoxy (74, 4 + entryno); ++ gotoxy (view_x1 - 6, view_x0 + 4 + entryno); + } + + /* We told them above (at least in SUPPORT_SERIAL) to use +@@ -536,17 +542,17 @@ + { + if (entryno > 0) + { +- set_line_normal (4 + entryno, first_entry + entryno, ++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + entryno--; +- set_line_highlight (4 + entryno, first_entry + entryno, ++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + } + else if (first_entry > 0) + { + first_entry--; +- print_entries (3, 12, first_entry, menu_entries); +- set_line_highlight (4, first_entry + entryno, ++ print_entries (view_y0 + 3, 12, first_entry, menu_entries); ++ set_line_highlight (view_y0 + 4, first_entry + entryno, + menu_entries); + } + } +@@ -558,17 +564,17 @@ + else + if (entryno < 11) + { +- set_line_normal (4 + entryno, first_entry + entryno, ++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + entryno++; +- set_line_highlight (4 + entryno, first_entry + entryno, ++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + } + else if (num_entries > 12 + first_entry) + { + first_entry++; +- print_entries (3, 12, first_entry, menu_entries); +- set_line_highlight (15, first_entry + entryno, menu_entries); ++ print_entries (view_y0 + 3, 12, first_entry, menu_entries); ++ set_line_highlight (view_y0 + 15, first_entry + entryno, menu_entries); + } + } + +@@ -582,7 +588,7 @@ + if ((c == 'd') || (c == 'o') || (c == 'O')) + { + if (! (terminal & TERMINAL_DUMB)) +- set_line_normal (4 + entryno, first_entry + entryno, ++ set_line_normal (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + + /* insert after is almost exactly like insert before */ +@@ -640,8 +646,8 @@ + } + else + { +- print_entries (3, 12, first_entry, menu_entries); +- set_line_highlight (4 + entryno, first_entry + entryno, ++ print_entries (view_y0 + 3, 12, first_entry, menu_entries); ++ set_line_highlight (view_y0 + 4 + entryno, first_entry + entryno, + menu_entries); + } + } +@@ -664,7 +670,7 @@ + if (terminal & TERMINAL_DUMB) + grub_printf ("\r "); + else +- gotoxy (1, 21); ++ gotoxy (view_x0 + 1, view_y1 + 21); + + /* Wipe out the previously entered password */ + memset (entered, 0, sizeof (entered)); +@@ -811,6 +817,11 @@ + while (1) + { + cls (); ++#ifdef VGA16 ++ if (display->End) ++ (*display->End)(); ++ display = &display_entries[0]; ++#endif + + if (config_entries) + printf (" Booting \'%s\'\n\n", +@@ -840,6 +851,16 @@ + break; + } + ++#ifdef VGA16 ++ if (display_idx >= 0) ++ display = &display_entries[display_idx]; ++ else if (!vga_disabled) ++ display = &display_entries[1]; ++ ++ if (!display->Begin || !(*display->Begin)()) ++ display = &display_entries[0]; ++#endif ++ + show_menu = 1; + goto restart; + } +@@ -904,6 +925,560 @@ + return pos; + } + ++#ifdef VGA16 ++struct display_entry display_entries[MAX_DISPLAYS + 1] = { ++ {"text", 0, 0, grub_cls, grub_gotoxy, grub_putchar, grub_set_attrib, ++ grub_getxy, grub_nocursor}, ++ {"vga16", ++ vga16_begin, vga16_end, vga16_cls, vga16_gotoxy, vga16_putchar, ++ vga16_set_attrib, vga16_getxy, vga16_nocursor}, ++ {0, 0, 0, 0, 0, 0, 0, 0, 0} ++}; ++struct display_entry *display; ++int display_idx = -1; ++ ++/* default vga palette */ ++char vga16pal[16][3] = { ++ { 0, 0, 0}, ++ { 0, 0, 42}, ++ { 0, 42, 0}, ++ { 0, 42, 42}, ++ {42, 0, 0}, ++ {42, 0, 42}, ++ {42, 21, 0}, ++ {42, 42, 42}, ++ {21, 21, 21}, ++ {21, 21, 63}, ++ {21, 63, 21}, ++ {21, 63, 63}, ++ {63, 21, 21}, ++ {63, 21, 63}, ++ {63, 63, 21}, ++ {63, 63, 63}, ++}; ++ ++int fontx, fonty; ++unsigned char *font8x16; ++int saved_videomode, no_scroll = 0, no_cursor = 0, shade = 1, vga_inited = 0; ++unsigned short text[80 * 30]; ++int foreground = (63 << 16) | (63 << 8) | (63), background = 0, border = 0; ++int splash_set; ++char splashimage[64]; ++#define VSHADOW VSHADOW1 ++unsigned char VSHADOW1[38400]; ++unsigned char VSHADOW2[38400]; ++unsigned char VSHADOW4[38400]; ++unsigned char VSHADOW8[38400]; ++ ++static inline void ++outb(unsigned short port, unsigned char val) ++{ ++ __asm __volatile ("outb %0,%1"::"a" (val), "d" (port)); ++} ++ ++static void ++ModeReg(int value) ++{ ++ outb(0x3ce, 5); ++ outb(0x3cf, value); ++} ++ ++static void ++MapMask(int value) ++{ ++ outb(0x3c4, 2); ++ outb(0x3c5, value); ++} ++ ++/* set/reset register */ ++static void ++SetRes(int value) ++{ ++ outb(0x3ce, 0); ++ outb(0x3cf, value); ++} ++ ++/* enable set/reset register */ ++static void ++ESetRes(int value) ++{ ++ outb(0x3ce, 1); ++ outb(0x3cf, value); ++} ++ ++static void ++ReadMap(int value) ++{ ++ outb(0x3ce, 4); ++ outb(0x3cf, value); ++} ++ ++/* bit mask register */ ++static void ++BitMask(int value) ++{ ++ outb(0x3ce, 8); ++ outb(0x3cf, value); ++} ++ ++void ++grub_memcpy(void *dest, const void *src, int len) ++{ ++ int i; ++ register char *d = (char*)dest, *s = (char*)src; ++ ++ for (i = 0; i < len; i++) ++ d[i] = s[i]; ++} ++ ++int ++hex(int v) ++{ ++ if (v >= 'A' && v <= 'F') ++ return (v - 'A' + 10); ++ if (v >= 'a' && v <= 'f') ++ return (v - 'a' + 10); ++ return (v - '0'); ++} ++ ++static void ++SetXY(int col, int row) ++{ ++ if (col >= view_x0 && col < view_x1) { ++ fontx = col; ++ cursorX = col << 3; ++ } ++ if (row >= view_y0 && row < view_y1) { ++ fonty = row; ++ cursorY = row << 4; ++ } ++} ++ ++void ++cursor(int set) ++{ ++ unsigned char *pat, *mem, *ptr, chr[16 << 2]; ++ int i, ch, invert, offset; ++ ++ if (set && (no_cursor || no_scroll)) ++ return; ++ ++ offset = cursorY * 80 + fontx; ++ ch = text[fonty * 80 + fontx] & 0xff; ++ invert = (text[fonty * 80 + fontx] & 0xff00) != 0; ++ pat = font8x16 + (ch << 4); ++ ++ mem = (unsigned char*)VIDEO + offset; ++ ++ if (!set) { ++ for (i = 0; i < 16; i++) { ++ unsigned char mask = pat[i]; ++ ++ if (!invert) { ++ chr[i ] = ((unsigned char*)VSHADOW1)[offset]; ++ chr[16 + i] = ((unsigned char*)VSHADOW2)[offset]; ++ chr[32 + i] = ((unsigned char*)VSHADOW4)[offset]; ++ chr[48 + i] = ((unsigned char*)VSHADOW8)[offset]; ++ ++ if (shade) { ++ if (ch == DISP_VERT || ch == DISP_LL || ++ ch == DISP_UR || ch == DISP_LR) { ++ unsigned char pmask = ~(pat[i] >> 1); ++ ++ chr[i ] &= pmask; ++ chr[16 + i] &= pmask; ++ chr[32 + i] &= pmask; ++ chr[48 + i] &= pmask; ++ } ++ if (i > 0 && ch != DISP_VERT) { ++ unsigned char pmask = ~(pat[i - 1] >> 1); ++ ++ chr[i ] &= pmask; ++ chr[16 + i] &= pmask; ++ chr[32 + i] &= pmask; ++ chr[48 + i] &= pmask; ++ if (ch == DISP_HORIZ || ch == DISP_UR || ch == DISP_LR) { ++ pmask = ~pat[i - 1]; ++ ++ chr[i ] &= pmask; ++ chr[16 + i] &= pmask; ++ chr[32 + i] &= pmask; ++ chr[48 + i] &= pmask; ++ } ++ } ++ } ++ chr[i ] |= mask; ++ chr[16 + i] |= mask; ++ chr[32 + i] |= mask; ++ chr[48 + i] |= mask; ++ ++ offset += 80; ++ } ++ else { ++ chr[i ] = mask; ++ chr[16 + i] = mask; ++ chr[32 + i] = mask; ++ chr[48 + i] = mask; ++ } ++ } ++ } ++ else { ++ MapMask(15); ++ ptr = mem; ++ for (i = 0; i < 16; i++, ptr += 80) { ++ cursorBuf[i] = pat[i]; ++ *ptr = ~pat[i]; ++ } ++ return; ++ } ++ ++ offset = 0; ++ for (i = 1; i < 16; i <<= 1, offset += 16) { ++ int j; ++ ++ MapMask(i); ++ ptr = mem; ++ for (j = 0; j < 16; j++, ptr += 80) ++ *ptr = chr[j + offset]; ++ } ++ ++ MapMask(15); ++} ++ ++int ++read_image(void) ++{ ++ char buf[32], pal[16]; ++ unsigned char c, base, mask, *s1, *s2, *s4, *s8; ++ unsigned i, len, idx, colors, x, y, width, height; ++ ++ if (!grub_open(splashimage)) ++ return (0); ++ ++ /* read header */ ++ if (!grub_read((char*)&buf, 10) || grub_memcmp(buf, "/* XPM */\n", 10)) { ++ grub_close(); ++ return (0); ++ } ++ ++ /* parse info */ ++ while (grub_read(&c, 1)) { ++ if (c == '"') ++ break; ++ } ++ ++ while (grub_read(&c, 1) && (c == ' ' || c == '\t')) ++ ; ++ ++ i = 0; ++ width = c - '0'; ++ while (grub_read(&c, 1)) { ++ if (c >= '0' && c <= '9') ++ width = width * 10 + c - '0'; ++ else ++ break; ++ } ++ while (grub_read(&c, 1) && (c == ' ' || c == '\t')) ++ ; ++ ++ height = c - '0'; ++ while (grub_read(&c, 1)) { ++ if (c >= '0' && c <= '9') ++ height = height * 10 + c - '0'; ++ else ++ break; ++ } ++ while (grub_read(&c, 1) && (c == ' ' || c == '\t')) ++ ; ++ ++ colors = c - '0'; ++ while (grub_read(&c, 1)) { ++ if (c >= '0' && c <= '9') ++ colors = colors * 10 + c - '0'; ++ else ++ break; ++ } ++ ++ base = 0; ++ while (grub_read(&c, 1) && c != '"') ++ ; ++ ++ /* palette */ ++ for (i = 0, idx = 1; i < colors; i++) { ++ len = 0; ++ ++ while (grub_read(&c, 1) && c != '"') ++ ; ++ grub_read(&c, 1); /* char */ ++ base = c; ++ grub_read(buf, 4); /* \t c # */ ++ ++ while (grub_read(&c, 1) && c != '"') { ++ if (len < sizeof(buf)) ++ buf[len++] = c; ++ } ++ ++ if (len == 6 && idx < 15) { ++ int r = ((hex(buf[0]) << 4) | hex(buf[1])) >> 2; ++ int g = ((hex(buf[2]) << 4) | hex(buf[3])) >> 2; ++ int b = ((hex(buf[4]) << 4) | hex(buf[5])) >> 2; ++ ++ pal[idx] = base; ++ set_palette(idx, r, g, b); ++ ++idx; ++ } ++ } ++ ++ x = y = len = 0; ++ ++ s1 = (unsigned char*)VSHADOW1; ++ s2 = (unsigned char*)VSHADOW2; ++ s4 = (unsigned char*)VSHADOW4; ++ s8 = (unsigned char*)VSHADOW8; ++ ++ for (i = 0; i < 38400; i++) ++ s1[i] = s2[i] = s4[i] = s8[i] = 0; ++ ++ /* parse xpm data */ ++ while (y < height) { ++ while (1) { ++ if (!grub_read(&c, 1)) { ++ grub_close(); ++ return (0); ++ } ++ if (c == '"') ++ break; ++ } ++ ++ while (grub_read(&c, 1) && c != '"') { ++ for (i = 1; i < 15; i++) ++ if (pal[i] == c) { ++ c = i; ++ break; ++ } ++ ++ mask = 0x80 >> (x & 7); ++ if (c & 1) ++ s1[len + (x >> 3)] |= mask; ++ if (c & 2) ++ s2[len + (x >> 3)] |= mask; ++ if (c & 4) ++ s4[len + (x >> 3)] |= mask; ++ if (c & 8) ++ s8[len + (x >> 3)] |= mask; ++ ++ if (++x >= 640) { ++ x = 0; ++ ++ if (y < 480) ++ len += 80; ++ ++y; ++ } ++ } ++ } ++ ++ grub_close(); ++ ++ set_palette(0, (background >> 16), (background >> 8) & 63, background & 63); ++ set_palette(15, (foreground >> 16), (foreground >> 8) & 63, foreground & 63); ++ ++ set_palette(0x11, (border >> 16), (border >> 8) & 63, border & 63); ++ ++ return (1); ++} ++ ++int ++vga16_begin(void) ++{ ++ if (vga_inited) ++ return (1); ++ ++ if (!*splashimage) ++ grub_strcpy(splashimage, "/boot/grub/splash.xpm"); ++ ++ saved_videomode = set_videomode(0x12); ++ if (!read_image()) { ++ set_videomode(saved_videomode); ++ return (0); ++ } ++ ++ font8x16 = (unsigned char*)get_font(); ++ ++ cursorWidth = 8; ++ cursorHeight = 16; ++ ++ set_int1c_handler(); ++ ++ view_x0 = sx0; ++ view_y0 = sy0; ++ view_x1 = sx1; ++ view_y1 = sy1; ++ ++ return (vga_inited = 1); ++} ++ ++void ++vga16_end(void) ++{ ++ if (vga_inited) { ++ unset_int1c_handler(); ++ set_videomode(saved_videomode); ++ vga_inited = 0; ++ no_cursor = 0; ++ } ++ ++ sx0 = view_x0; ++ sy0 = view_y0; ++ sx1 = view_x1; ++ sy1 = view_y1; ++ view_x0 = 0; ++ view_x1 = 80; ++ view_y0 = 0; ++ view_y1 = 25; ++} ++ ++void ++vga16_cls(void) ++{ ++ int i; ++ unsigned char *mem, *s1, *s2, *s4, *s8; ++ ++ SetXY(view_x0, view_y0); ++ ++ mem = (unsigned char*)VIDEO; ++ s1 = (unsigned char*)VSHADOW1; ++ s2 = (unsigned char*)VSHADOW2; ++ s4 = (unsigned char*)VSHADOW4; ++ s8 = (unsigned char*)VSHADOW8; ++ ++ for (i = 0; i < 80 * 30; i++) ++ text[i] = ' '; ++ ++ BitMask(0xff); ++ ++ /* plano 1 */ ++ MapMask(1); ++ grub_memcpy(mem, s1, 38400); ++ ++ /* plano 2 */ ++ MapMask(2); ++ grub_memcpy(mem, s2, 38400); ++ ++ /* plano 3 */ ++ MapMask(4); ++ grub_memcpy(mem, s4, 38400); ++ ++ /* plano 4 */ ++ MapMask(8); ++ grub_memcpy(mem, s8, 38400); ++ ++ MapMask(15); ++ ++ if (no_cursor) { ++ no_cursor = 0; ++ set_int1c_handler(); ++ } ++} ++ ++void ++vga16_gotoxy(int x, int y) ++{ ++ cursor(0); ++ ++ SetXY(x, y); ++ ++ cursor(1); ++} ++ ++static void ++scroll(void) ++{ ++ int i, j; ++ ++ if (no_scroll) ++ return; ++ ++ no_scroll = 1; ++ ++ for (j = view_y0 + 1; j < view_y1; j++) { ++ gotoxy(view_x0, j - 1); ++ for (i = view_x0; i < view_x1; i++) ++ putchar(text[j * 80 + i]); ++ } ++ ++ gotoxy(view_x0, view_y1 - 1); ++ for (i = view_x0; i < view_x1; i++) ++ putchar(' '); ++ ++ SetXY(view_x0, view_y1 - 1); ++ ++ no_scroll = 0; ++} ++ ++void ++vga16_putchar(int ch) ++{ ++ ch &= 0xff; ++ ++ cursor(0); ++ ++ if (ch == '\n') { ++ SetXY(view_x0, fonty); ++ if (fonty + 1 < view_y1) ++ SetXY(view_x0, fonty + 1); ++ else ++ scroll(); ++ cursor(1); ++ return; ++ } ++ else if (ch == '\r') { ++ SetXY(view_x0, fonty); ++ cursor(1); ++ return; ++ } ++ ++ text[fonty * 80 + fontx] = ch; ++ ++ cursor(0); ++ ++ if ((fontx + 1) >= view_x1) { ++ SetXY(view_x0, fonty); ++ if (fonty + 1 < view_y1) ++ SetXY(view_x0, fonty + 1); ++ else ++ scroll(); ++ } ++ else ++ SetXY(fontx + 1, fonty); ++ ++ cursor(1); ++} ++ ++int ++vga16_getxy() ++{ ++ return ((fontx << 8) | fonty); ++} ++ ++void ++vga16_nocursor() ++{ ++ if (!no_cursor) { ++ no_cursor = 1; ++ unset_int1c_handler(); ++ cursor(0); ++ } ++} ++ ++void ++vga16_set_attrib(int attrib) ++{ ++ text[fonty * 80 + fontx] &= 0x00ff; ++ if (attrib & 0xf0) ++ text[fonty * 80 + fontx] |= 0x100; ++ cursor(0); ++} ++#endif + + /* This is the starting function in C. */ + void +@@ -924,6 +1499,14 @@ + menu_entries = (char *) MENU_BUF; + init_config (); + } ++ ++#ifdef VGA16 ++ /* Make sure it points to a valid entry */ ++ display = &display_entries[0]; ++ ++ if (ASCII_CHAR(checkkey()) == 0x1b) ++ vga_disabled = 1; ++#endif + + /* Initialize the environment for restarting Stage 2. */ + grub_setjmp (restart_env); +@@ -1069,6 +1652,29 @@ + while (is_preset); + } + ++#ifdef VGA16 ++ if (display_idx >= 0) ++ display = &display_entries[display_idx]; ++ else if (!vga_disabled) { ++ display = &display_entries[1]; ++ } ++ if (!viewport_set) ++ view_y1 = 30; ++ sx0 = view_x0; ++ sy0 = view_y0; ++ sx1 = view_x1; ++ sy1 = view_y1; ++ ++ if (!display->Begin || !(*display->Begin)()) ++ display = &display_entries[0]; ++ ++ if (!vga_inited) { ++ sx0 = sy0 = view_x0 = view_y0 = 0; ++ sx1 = view_x1 = 80; ++ sy1 = view_y1 = 25; ++ } ++#endif ++ + if (! num_entries) + { + /* If no acceptable config file, goto command-line, starting diff --git a/sys-apps/grub/files/grub-0.91/splash.xpm.gz b/sys-apps/grub/files/grub-0.91/splash.xpm.gz Binary files differnew file mode 100644 index 000000000000..8abf87065af2 --- /dev/null +++ b/sys-apps/grub/files/grub-0.91/splash.xpm.gz diff --git a/sys-apps/grub/grub-0.5.96.1-r4.ebuild b/sys-apps/grub/grub-0.5.96.1-r4.ebuild deleted file mode 100644 index 6c429ae06d13..000000000000 --- a/sys-apps/grub/grub-0.5.96.1-r4.ebuild +++ /dev/null @@ -1,32 +0,0 @@ -# Copyright 1999-2001 Gentoo Technologies, Inc. -# Distributed under the terms of the GNU General Public License, v2 or later -# Author: Daniel Robbins <drobbins@gentoo.org> -# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.5.96.1-r4.ebuild,v 1.7 2001/10/06 17:04:49 drobbins Exp $ - -S=${WORKDIR}/${P} -DESCRIPTION="GNU GRUB boot loader" -SRC_URI="ftp://alpha.gnu.org/gnu/grub/${P}.tar.gz" -HOMEPAGE="http://www.gnu.org/software/grub" - -DEPEND="virtual/glibc >=sys-libs/ncurses-5.2-r2" - -src_unpack() { - unpack ${A} - cd ${S} - patch -p1 < ${FILESDIR}/${PF}-gentoo.diff || die -} - -src_compile() { - ./configure --prefix=/usr sbindir=/sbin --mandir=/usr/share/man --infodir=/usr/share/info --host=${CHOST} || die - emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused -Wshadow -malign-jumps=1 -malign-loops=1 -malign-functions=1 -Wundef" || die -} - -src_install() { - make prefix=${D}/usr sbindir=${D}/sbin mandir=${D}/usr/share/man infodir=${D}/usr/share/info install || die - dodir /boot/grub - cd ${D}/usr/share/grub/i386-pc - cp stage1 stage2 *stage1_5 ${D}/boot/grub - dosym . /boot/boot - cd ${S} - dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO -} diff --git a/sys-apps/grub/grub-0.90-r3.ebuild b/sys-apps/grub/grub-0.90-r3.ebuild deleted file mode 100644 index 80c2df8e9151..000000000000 --- a/sys-apps/grub/grub-0.90-r3.ebuild +++ /dev/null @@ -1,64 +0,0 @@ -# Copyright 1999-2000 Gentoo Technologies, Inc. -# Distributed under the terms of the GNU General Public License, v2 or later -# Author Mikael Hallendal <hallski@gentoo.org> -# /home/cvsroot/gentoo-x86/sys-apps/grub/grub-0.5.96.1-r2.ebuild,v 1.2 2001/02/07 20:05:43 achim Exp -# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.90-r3.ebuild,v 1.1 2001/10/31 23:17:42 g2boojum Exp $ - - -A=${P}.tar.gz -S=${WORKDIR}/${P} -DESCRIPTION="GNU GRUB boot loader" -SRC_URI="ftp://alpha.gnu.org/gnu/grub/${A}" -HOMEPAGE="http://www.gnu.org/software/grub" - -DEPEND="virtual/glibc - >=sys-libs/ncurses-5.2-r2" - -src_unpack() { - unpack ${A} - cd ${S} - try patch -p1 < ${FILESDIR}/${P}/grub-0.5.97-vga16.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-special-raid-devices.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-dont-give-mem-to-kernel.patch -# try patch -p1 < ${FILESDIR}/${P}/grub-0.90-configfile.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.90-vga16-keypressclear.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.90-passwordprompt.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.90-install.in.patch - try patch -p1 < ${FILESDIR}/${P}/grub-0.90-installcopyonly.patch -} - -src_compile() { - - ./configure --prefix=/usr --sbindir=/sbin \ - --mandir=/usr/share/man --infodir=/usr/share/info \ - --host=${CHOST} - assert "Configuration of package failed." - - # Have to do this since the configure-script seems a little brooken - echo "#define VGA16 1" >> config.h - - emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused \ - -Wshadow -malign-jumps=1 -malign-loops=1 \ - -malign-functions=1 -Wundef" - assert "Building failed." -} - -src_install() { - - make prefix=${D}/usr sbindir=${D}/sbin mandir=${D}/usr/share/man \ - infodir=${D}/usr/share/info install - assert "Installation failed." - - if [ -z "`use bootcd`" ] - then - dodir /boot/grub - cd ${D}/usr/share/grub/i386-pc - cp stage1 stage2 *stage1_5 ${D}/boot/grub - cp ${FILESDIR}/${P}/splash.xpm.gz ${D}/boot/grub - - cd ${S} - dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO - else - rm -rf ${D}/usr/share/{man,info,doc} - fi -} diff --git a/sys-apps/grub/grub-0.91.ebuild b/sys-apps/grub/grub-0.91.ebuild new file mode 100644 index 000000000000..63658891307e --- /dev/null +++ b/sys-apps/grub/grub-0.91.ebuild @@ -0,0 +1,72 @@ +# Copyright 1999-2002 Gentoo Technologies, Inc. +# Distributed under the terms of the GNU General Public License, v2 or later +# Maintainer: Mikael Hallendal <hallski@gentoo.org> +# $Header: /var/cvsroot/gentoo-x86/sys-apps/grub/grub-0.91.ebuild,v 1.1 2002/01/29 15:58:41 gbevin Exp $ + + +S=${WORKDIR}/${P} +DESCRIPTION="GNU GRUB boot loader" +SRC_URI="ftp://alpha.gnu.org/gnu/grub/${P}.tar.gz" +HOMEPAGE="http://www.gnu.org/software/grub" + +DEPEND="virtual/glibc + >=sys-devel/binutils-2.9.1.0.23 + >=sys-libs/ncurses-5.2-r2" + +src_unpack() { + + unpack ${A} + cd ${S} + patch -p1 < ${FILESDIR}/${P}/grub-0.91-vga16.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-dont-give-mem-to-kernel.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-vga16-keypressclear.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-passwordprompt.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-install.in.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-installcopyonly.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-symlinkmenulst.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-append.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.90-addsyncs.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.5.96.1-special-raid-devices.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.91-splashimagehelp.patch || die + patch -p1 < ${FILESDIR}/${P}/grub-0.91-initrdusemem.patch || die +} + +src_compile() { + + ./configure --prefix=/usr \ + --sbindir=/sbin \ + --mandir=/usr/share/man \ + --infodir=/usr/share/info \ + --host=${CHOST} || die "Configuration of package failed." + + # Have to do this since the configure-script seems a little brooken + echo "#define VGA16 1" >> config.h + mv Makefile Makefile_orig + sed -e "s#config.h: stamp-h#config.h:#" Makefile_orig > Makefile + + emake -e CPPFLAGS="-Wall -Wmissing-prototypes -Wunused \ + -Wshadow -malign-jumps=1 -malign-loops=1 \ + -malign-functions=1 -Wundef" || die "Building failed." +} + +src_install() { + + make prefix=${D}/usr \ + sbindir=${D}/sbin \ + mandir=${D}/usr/share/man \ + infodir=${D}/usr/share/info \ + install || die "Installation failed." + + if [ -z "`use bootcd`" ] + then + dodir /boot/grub + cd ${D}/usr/share/grub/i386-pc + cp stage1 stage2 *stage1_5 ${D}/boot/grub + cp ${FILESDIR}/${P}/splash.xpm.gz ${D}/boot/grub + + cd ${S} + dodoc AUTHORS BUGS COPYING ChangeLog NEWS README THANKS TODO + else + rm -rf ${D}/usr/share/{man,info,doc} + fi +} |