From ad0686cc6dcb5e0fae8cc48f9fe3540adf5cb15a Mon Sep 17 00:00:00 2001 From: robertmh Date: Sun, 22 Jul 2007 09:05:11 +0000 Subject: [PATCH] 2007-07-22 Robert Millan * include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): Add GRUB_IEEE1275_FLAG_BROKEN_OUTPUT flag. * kern/powerpc/ieee1275/cmain.c (grub_ieee1275_find_options): Set this flag when running on SmartFirmware. * term/ieee1275/ofconsole.c (grub_ofconsole_init): Avoid running "output-device output" command when GRUB_IEEE1275_FLAG_BROKEN_OUTPUT was set. * kern/powerpc/ieee1275/openfw.c (grub_ieee1275_encode_devname): Increase partno when GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS flag is set, rather than decreasing it. * util/i386/pc/grub-setup.c (setup): When embedding is required, but there's not enough space to do it, fail in the same way as when it can't be done because there are no partitions. * util/powerpc/ieee1275/grub-install.in: Improve error message shown when nvsetenv failed. --- ChangeLog | 21 +++++++++++++++++++++ include/grub/ieee1275/ieee1275.h | 3 +++ kern/powerpc/ieee1275/cmain.c | 5 ++++- kern/powerpc/ieee1275/openfw.c | 2 +- term/ieee1275/ofconsole.c | 6 ++++-- util/i386/pc/grub-setup.c | 8 +++++++- util/powerpc/ieee1275/grub-install.in | 6 ++++-- 7 files changed, 44 insertions(+), 7 deletions(-) diff --git a/ChangeLog b/ChangeLog index c85fa1dcf..eb5e6158d 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,24 @@ +2007-07-22 Robert Millan + + * include/grub/ieee1275/ieee1275.h (grub_ieee1275_flag): Add + GRUB_IEEE1275_FLAG_BROKEN_OUTPUT flag. + * kern/powerpc/ieee1275/cmain.c (grub_ieee1275_find_options): Set this + flag when running on SmartFirmware. + * term/ieee1275/ofconsole.c (grub_ofconsole_init): Avoid running + "output-device output" command when GRUB_IEEE1275_FLAG_BROKEN_OUTPUT + was set. + + * kern/powerpc/ieee1275/openfw.c (grub_ieee1275_encode_devname): + Increase partno when GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS flag is set, + rather than decreasing it. + + * util/i386/pc/grub-setup.c (setup): When embedding is required, but + there's not enough space to do it, fail in the same way as when it + can't be done because there are no partitions. + + * util/powerpc/ieee1275/grub-install.in: Improve error message shown + when nvsetenv failed. + 2007-07-22 Yoshinori K. Okuji * conf/i386-pc.rmk (CLEANFILES): Removed for grub-mkrescue, diff --git a/include/grub/ieee1275/ieee1275.h b/include/grub/ieee1275/ieee1275.h index 92b1c8812..6fe5cd1a5 100644 --- a/include/grub/ieee1275/ieee1275.h +++ b/include/grub/ieee1275/ieee1275.h @@ -79,6 +79,9 @@ enum grub_ieee1275_flag /* CHRP specifies partitions are numbered from 1 (partition 0 refers to the whole disk). However, CodeGen firmware numbers partitions from 0. */ GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS, + + /* CodeGen firmware does not correctly implement "output-device output" */ + GRUB_IEEE1275_FLAG_BROKEN_OUTPUT, }; extern int EXPORT_FUNC(grub_ieee1275_test_flag) (enum grub_ieee1275_flag flag); diff --git a/kern/powerpc/ieee1275/cmain.c b/kern/powerpc/ieee1275/cmain.c index 3a2ebeb2b..56878de8c 100644 --- a/kern/powerpc/ieee1275/cmain.c +++ b/kern/powerpc/ieee1275/cmain.c @@ -62,7 +62,10 @@ grub_ieee1275_find_options (void) grub_ieee1275_finddevice ("/openprom", &openprom); rc = grub_ieee1275_get_property (openprom, "SmartFirmware-version", 0, 0, 0); if (rc >= 0) - grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS); + { + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS); + grub_ieee1275_set_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT); + } } void cmain (uint32_t r3, uint32_t r4, uint32_t r5); diff --git a/kern/powerpc/ieee1275/openfw.c b/kern/powerpc/ieee1275/openfw.c index 15ded152c..b8207b028 100644 --- a/kern/powerpc/ieee1275/openfw.c +++ b/kern/powerpc/ieee1275/openfw.c @@ -372,7 +372,7 @@ grub_ieee1275_encode_devname (const char *path) if (grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_0_BASED_PARTITIONS)) /* GRUB partition 1 is OF partition 0. */ - partno--; + partno++; /* Assume partno will require less than five bytes to encode. */ encoding = grub_malloc (grub_strlen (device) + 3 + 5); diff --git a/term/ieee1275/ofconsole.c b/term/ieee1275/ofconsole.c index fc59820d6..9eb1202a0 100644 --- a/term/ieee1275/ofconsole.c +++ b/term/ieee1275/ofconsole.c @@ -311,8 +311,10 @@ grub_ofconsole_init (void) int col; /* The latest PowerMacs don't actually initialize the screen for us, so we - * use this trick to re-open the output device. */ - grub_ieee1275_interpret ("output-device output", 0); + * use this trick to re-open the output device (but we avoid doing this on + * platforms where it's known to be broken). */ + if (! grub_ieee1275_test_flag (GRUB_IEEE1275_FLAG_BROKEN_OUTPUT)) + grub_ieee1275_interpret ("output-device output", 0); if (grub_ieee1275_get_property (grub_ieee1275_chosen, "stdout", data, sizeof data, &actual) diff --git a/util/i386/pc/grub-setup.c b/util/i386/pc/grub-setup.c index c37dabcd0..240a9553e 100644 --- a/util/i386/pc/grub-setup.c +++ b/util/i386/pc/grub-setup.c @@ -105,6 +105,7 @@ setup (const char *prefix, const char *dir, grub_file_t file; FILE *fp; unsigned long first_start = ~0UL; + int able_to_embed = 1; auto void save_first_sector (grub_disk_addr_t sector, unsigned offset, unsigned length); @@ -323,8 +324,13 @@ setup (const char *prefix, const char *dir, goto finish; } + else + able_to_embed = 0; } - else if (must_embed) + else + able_to_embed = 0; + + if (must_embed && !able_to_embed) grub_util_error ("Can't embed the core image, but this is required when\n" "the root device is on a RAID array or LVM volume."); diff --git a/util/powerpc/ieee1275/grub-install.in b/util/powerpc/ieee1275/grub-install.in index 915ac5e39..2f917829c 100644 --- a/util/powerpc/ieee1275/grub-install.in +++ b/util/powerpc/ieee1275/grub-install.in @@ -208,9 +208,11 @@ if test $update_nvram = yes; then } # Point boot-device at the new grub install - "$nvsetenv" boot-device "$ofpath:$partno,"'\grub' || { + boot_device="boot-device $ofpath:$partno,\\grub" + "$nvsetenv" "$boot_device" || { echo "$nvsetenv failed." - echo "You will have to set boot-device manually." + echo "You will have to set boot-device manually. At the Open Firmware prompt, type:" + echo " setenv $boot_device" exit 1 } fi