+2007-07-22 Robert Millan <rmh@aybabtu.com>
+
+ * 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 <okuji@enbug.org>
* conf/i386-pc.rmk (CLEANFILES): Removed for grub-mkrescue,
/* 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);
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);
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);
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)
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);
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.");
}
# 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