diff -ur u-boot-1.2.0.orig/common/main.c u-boot-1.2.0/common/main.c
--- u-boot-1.2.0.orig/common/main.c	2008-08-11 12:11:33.204454431 +0100
+++ u-boot-1.2.0/common/main.c	2008-08-11 12:12:16.514990702 +0100
@@ -39,6 +39,7 @@
 #endif
 
 #include <post.h>
+#include <stb225_gpio.h>
 
 #ifdef CONFIG_SILENT_CONSOLE
 DECLARE_GLOBAL_DATA_PTR;
@@ -320,6 +321,14 @@
 	char bcs_set[16];
 #endif /* CONFIG_BOOTCOUNT_LIMIT */
 
+	// Ensure Monaco upgrade LED is off
+	gpio_set_low(GPIO_14);
+
+	// Ensure that the reset button is no longer held
+	gpio_set_as_input(GPIO_12);
+	while (!gpio_get_value(GPIO_12))
+	   ;
+
 #if defined(CONFIG_VFD) && defined(VFD_TEST_LOGO)
 	ulong bmp = 0;		/* default bitmap */
 	extern int trab_vfd (ulong bitmap);
@@ -415,6 +419,15 @@
 	debug ("### main_loop: bootcmd=\"%s\"\n", s ? s : "<UNDEFINED>");
 
 	if (bootdelay >= 0 && s && !abortboot (bootdelay)) {
+		// If our button is still held down then force a safe mode
+		// boot. Turn the upgrade LED on so that the user knows that
+		// they can let go.
+		if (gpio_get_value(GPIO_23) == 0) {
+			gpio_set_high(GPIO_14);
+			s = getenv("altbootcmd");
+			printf("Forcing safe mode: %s\n", s);
+		}
+		
 # ifdef CONFIG_AUTOBOOT_KEYED
 		int prev = disable_ctrlc(1);	/* disable Control C checking */
 # endif
Only in u-boot-1.2.0/common: main.c~
