diff options
Diffstat (limited to 'usr/src/grub')
-rw-r--r-- | usr/src/grub/Makefile | 6 | ||||
-rw-r--r-- | usr/src/grub/Makefile.grub | 1 | ||||
-rw-r--r-- | usr/src/grub/grub-0.97/stage2/boot.c | 13 | ||||
-rw-r--r-- | usr/src/grub/grub-0.97/stage2/cmdline.c | 23 |
4 files changed, 41 insertions, 2 deletions
diff --git a/usr/src/grub/Makefile b/usr/src/grub/Makefile index 28c2eca2ff..c31e9a802c 100644 --- a/usr/src/grub/Makefile +++ b/usr/src/grub/Makefile @@ -29,6 +29,7 @@ INST_TARGETS += $(ROOT_BOOT_GRUB)/$(GRUB_MENU) INST_TARGETS += $(ROOT_BOOT_GRUB)/$(INSTALL_MENU) INST_TARGETS += $(ROOT_BOOT_GRUB)/$(GRUB_DEFAULT) INST_TARGETS += $(ROOT_BOOT_GRUB)/$(CAPABILITY) +INST_TARGETS += $(ROOT_USR_SBIN)/grub $(ROOT_BOOT_GRUB)/$(GRUB_DEFAULT) := FILEMODE = 444 $(ROOT_BOOT_GRUB)/$(CAPABILITY) := FILEMODE = 444 @@ -45,9 +46,14 @@ $(GRUB): FRC $(ROOT_BOOT_GRUB)/%: $(ROOT_BOOT_GRUB) % $(INS.file) +$(ROOT_USR_SBIN)/%: $(GRUB)/grub/grub $(ROOT_USR_SBIN) + $(INS.file) + $(ROOT_BOOT_GRUB): $(INS.dir) +$(ROOT_USR_SBIN): + $(INS.dir) clean clobber: $(SUBDIRS) diff --git a/usr/src/grub/Makefile.grub b/usr/src/grub/Makefile.grub index 18354324ae..99942fa2ed 100644 --- a/usr/src/grub/Makefile.grub +++ b/usr/src/grub/Makefile.grub @@ -10,3 +10,4 @@ PLATFORM = i86pc ROOT_BOOT_GRUB = $(ROOT)/boot/grub ROOT_PLAT_GRUB = $(ROOT)/platform/$(PLATFORM)/boot/grub ROOT_SRC = $(ROOT)/usr/share/src/grub +ROOT_USR_SBIN = $(ROOT)/usr/sbin diff --git a/usr/src/grub/grub-0.97/stage2/boot.c b/usr/src/grub/grub-0.97/stage2/boot.c index cfc2336a4c..027de7709b 100644 --- a/usr/src/grub/grub-0.97/stage2/boot.c +++ b/usr/src/grub/grub-0.97/stage2/boot.c @@ -25,6 +25,8 @@ #include "imgact_aout.h" #include "i386-elf.h" +#define SAFE_LOAD_BASE 0xc800000 + static int cur_addr; entry_func entry_addr; static struct mod_list mll[99]; @@ -773,6 +775,17 @@ load_module (char *module, char *arg) { int len; + /* + * XXX Workaround for RICHMOND-16: on some systems, the region + * [c700000, c800000) is corrupted by an unknown external (off-CPU) actor(s) + * during boot. To be on the safe side, we will simply ensure that every + * module is loaded above this region. Note that this means this particular + * boot loader supports only systems with at least 200 MB of DRAM plus the + * amount of space used by any modules. + */ + if (cur_addr < SAFE_LOAD_BASE) + cur_addr = SAFE_LOAD_BASE; + /* if we are supposed to load on 4K boundaries */ cur_addr = (cur_addr + 0xFFF) & 0xFFFFF000; diff --git a/usr/src/grub/grub-0.97/stage2/cmdline.c b/usr/src/grub/grub-0.97/stage2/cmdline.c index 46c5fda027..6d5591e1de 100644 --- a/usr/src/grub/grub-0.97/stage2/cmdline.c +++ b/usr/src/grub/grub-0.97/stage2/cmdline.c @@ -212,8 +212,27 @@ run_script (char *script, char *heap) intervention. */ if (fallback_entryno < 0) { - grub_printf ("\nPress any key to continue..."); - (void) getkey (); + int time1, time2 = -1; + + grub_printf ( + "\nRebooting in 2 minutes (press any key to continue)..."); + grub_timeout = 120; + + /* using RT clock now, need to initialize value */ + while ((time1 = getrtsecs()) == 0xFF); + + while (grub_timeout >= 0) { + if ((time1 = getrtsecs()) != time2 && time1 != 0xFF) { + time2 = time1; + grub_timeout--; + } + + if (checkkey() >= 0) + break; + } + + grub_printf ("\nresetting..."); + grub_reboot(); } return 1; |