On Sun, May 13, 2012 at 01:02:10PM +0300, Gleb Natapov wrote:
On Sat, May 12, 2012 at 10:01:49AM -0400, Kevin O'Connor wrote:
On Sat, May 12, 2012 at 03:04:52AM +0200, Peter Stuge wrote:
Kevin O'Connor wrote:
+// Unable to find bootable device - warn user and eventually retry. +static void +boot_fail(void) +{
- printf("No bootable device.\n");
- // Wait for 60 seconds and then reboot.
- u32 end = calc_future_timer(60*1000);
I'd suggest printf("No bootable device found. Retrying in 5 seconds...\n"); and lowering the timeout.
I'd only do this if the timeout was large - indeed I think 60 seconds is a little on the low side. (Not being able to boot is almost always an error - it should be fixed not covered up.)
Agree. For VM use it's better to notify management about it.
That said, making it a config option is trivial.
The patch below does not allow to disable the behaviour (short of setting ridiculously long timeout). Lets make 0 timeout to mean never timeout and make it a default.
How about -1 to indicate no reboot. Also, I think a 60 second reboot is a good default. Maurits indicated his off-the-shelf BIOS did this, and I can see where it would be useful. (I've run into cases where a USB device didn't spin up in time and there was no indication it was present - if this were to happen in a datacenter environment, it would be a real pain to have to go find the machine.)
-Kevin
--- a/src/boot.c +++ b/src/boot.c @@ -617,6 +617,29 @@ boot_rom(u32 vector) call_boot_entry(so, 0); }
+// Unable to find bootable device - warn user and eventually retry. +static void +boot_fail(void) +{ + u32 retrytime = romfile_loadint("etc/boot-fail-wait", 60*1000); + if (retrytime == (u32)-1) + printf("No bootable device.\n"); + else + printf("No bootable device. Retrying in %d seconds.\n", retrytime/1000); + // Wait for 'retrytime' milliseconds and then reboot. + u32 end = calc_future_timer(retrytime); + for (;;) { + if (retrytime != (u32)-1 && check_timer(end)) + break; + wait_irq(); + } + printf("Rebooting.\n"); + struct bregs br; + memset(&br, 0, sizeof(br)); + br.code = SEGOFF(SEG_BIOS, (u32)reset_vector); + call16big(&br); +} + // Determine next boot method and attempt a boot using it. static void do_boot(u16 seq_nr) @@ -624,12 +647,8 @@ do_boot(u16 seq_nr) if (! CONFIG_BOOT) panic("Boot support not compiled in.\n");
- if (seq_nr >= BEVCount) { - printf("No bootable device.\n"); - // Loop with irqs enabled - this allows ctrl+alt+delete to work. - for (;;) - wait_irq(); - } + if (seq_nr >= BEVCount) + boot_fail();
// Boot the given BEV type. struct bev_s *ie = &BEV[seq_nr];