Enable SIGHUP to reset point to flash are reread flash.
diff --git a/mboxd.c b/mboxd.c
index d920cc7..63dcb30 100644
--- a/mboxd.c
+++ b/mboxd.c
@@ -26,6 +26,7 @@
 #include <stdlib.h>
 #include <string.h>
 #include <syslog.h>
+#include <signal.h>
 #include <sys/ioctl.h>
 #include <sys/mman.h>
 #include <sys/stat.h>
@@ -70,6 +71,7 @@
 };
 
 static int running = 1;
+static int sighup = 0;
 
 static int point_to_flash(struct mbox_context *context)
 {
@@ -98,7 +100,7 @@
 	MSG_OUT("Pointing HOST LPC bus at the actual flash\n");
 	MSG_OUT("Assuming 32MB of flash: HOST LPC 0x%08x\n", map.addr);
 
-	if (ioctl(-context->fds[LPC_CTRL_FD].fd, ASPEED_LPC_CTRL_IOCTL_MAP, &map) == -1) {
+	if (ioctl(context->fds[LPC_CTRL_FD].fd, ASPEED_LPC_CTRL_IOCTL_MAP, &map) == -1) {
 		r = -errno;
 		MSG_ERR("Couldn't MAP the host LPC bus to the platform flash\n");
 	}
@@ -313,6 +315,37 @@
 	return r;
 }
 
+int copy_flash(struct mbox_context *context)
+{
+	int r;
+
+	/*
+	 * Copy flash into RAM early, same time.
+	 * The kernel has created the LPC->AHB mapping also, which means
+	 * flash should work.
+	 * Ideally we tell the kernel whats up and when to do stuff...
+	 */
+	MSG_OUT("Loading flash into ram at %p for 0x%08x bytes\n",
+		context->lpc_mem, context->size);
+	if (lseek(context->fds[MTD_FD].fd, 0, SEEK_SET) != 0) {
+		r = -errno;
+		MSG_ERR("Couldn't reset MBOX pos to zero\n");
+		return r;
+	}
+	r = read(context->fds[MTD_FD].fd, context->lpc_mem, context->size);
+	if (r != context->size) {
+		r = -errno;
+		MSG_ERR("Couldn't copy mtd into ram: %d\n", r);
+		return r;
+	}
+	return 0;
+}
+
+void signal_hup(int signum, siginfo_t *info, void *uc)
+{
+	sighup = 1;
+}
+
 static void usage(const char *name)
 {
 	fprintf(stderr, "Usage %s [ -v[v] | --syslog ]\n", name);
@@ -327,6 +360,7 @@
 	char *pnor_filename = NULL;
 	int opt, polled, r, i;
 	struct aspeed_lpc_ctrl_mapping map;
+	struct sigaction act;
 
 	static const struct option long_options[] = {
 		{ "verbose", no_argument, 0, 'v' },
@@ -365,6 +399,16 @@
 	if (verbosity == MBOX_LOG_DEBUG)
 		MSG_OUT("Debug logging\n");
 
+	MSG_OUT("Registering SigHUP hander\n");
+	act.sa_sigaction = signal_hup;
+	sigemptyset(&act.sa_mask);
+	act.sa_flags = SA_SIGINFO;
+	if (sigaction(SIGHUP, &act, NULL) < 0) {
+		perror("Registering SIGHUP");
+		exit(1);
+	}
+	sighup = 0;
+
 	MSG_OUT("Starting\n");
 
 	MSG_OUT("Opening %s\n", MBOX_HOST_PATH);
@@ -439,19 +483,8 @@
 		return -1;
 	}
 
-	/*
-	 * Copy flash into RAM early, same time.
-	 * The kernel has created the LPC->AHB mapping also, which means
-	 * flash should work.
-	 * Ideally we tell the kernel whats up and when to do stuff...
-	 */
-	MSG_OUT("Loading flash into ram at %p for 0x%08x bytes\n",
-			context->lpc_mem, context->size);
-	r = read(context->fds[MTD_FD].fd, context->lpc_mem, context->size);
-	if (r != context->size) {
-		MSG_ERR("Couldn't copy mtd into ram: %d\n", r);
+	if (copy_flash(context))
 		goto finish;
-	}
 
 	context->fds[MBOX_FD].events = POLLIN;
 	/* Ignore in poll() */
@@ -489,6 +522,23 @@
 		polled = poll(context->fds, TOTAL_FDS, 1000);
 		if (polled == 0)
 			continue;
+		if ((polled == -1) && (errno != -EINTR) && (sighup == 1)) {
+			/* Got sighup. reset to point to flash and
+			 * reread flash */
+			context->fds[LPC_CTRL_FD].fd = -context->fds[LPC_CTRL_FD].fd;
+			r = point_to_flash(context);
+			if (r) {
+				goto finish;
+			}
+			context->fds[LPC_CTRL_FD].fd = -context->fds[LPC_CTRL_FD].fd;
+			context->fds[MTD_FD].fd = -context->fds[MTD_FD].fd;
+			r = copy_flash(context);
+			if (r)
+				goto finish;
+			context->fds[MTD_FD].fd = -context->fds[MTD_FD].fd;
+			sighup = 0;
+			continue;
+		}
 		if (polled < 0) {
 			r = -errno;
 			MSG_ERR("Error from poll(): %s\n", strerror(errno));