* Patch by Marc Singer, 29 May 2003:
  Fixed rarp boot method for IA32 and other little-endian CPUs.

* Patch by Marc Singer, 28 May 2003:
  Added port I/O commands.

* Patch by Matthew McClintock, 28 May 2003
  - cpu/mpc824x/start.S: fix relocation code when booting from RAM
  - minor patches for utx8245

* Patch by Daniel Engström, 28 May 2003:
  x86 update

* Patch by Dave Ellis, 9 May 2003 + 27 May 2003:
  add nand flash support to SXNI855T configuration
  fix/extend nand flash support:
  - fix 'nand erase' command so does not erase bad blocks
  - fix 'nand write' command so does not write to bad blocks
  - fix nand_probe() so handles no flash detected properly
  - add doc/README.nand
  - add .jffs2 and .oob options to nand read/write
  - add 'nand bad' command to list bad blocks
  - add 'clean' option to 'nand erase' to write JFFS2 clean markers
  - make NAND read/write faster

* Patch by Rune Torgersen, 23 May 2003:
  Update for MPC8266ADS board
diff --git a/lib_i386/realmode.c b/lib_i386/realmode.c
index 27d4693..d7bb81c 100644
--- a/lib_i386/realmode.c
+++ b/lib_i386/realmode.c
@@ -33,7 +33,21 @@
 
 extern char realmode_enter;
 
-
+int realmode_setup(void)
+{
+	/* copy the realmode switch code */
+	if (i386boot_realmode_size > (REALMODE_MAILBOX-REALMODE_BASE)) {
+		printf("realmode switch too large (%ld bytes, max is %d)\n", 
+		       i386boot_realmode_size, (REALMODE_MAILBOX-REALMODE_BASE));
+		return -1;
+	}
+	
+	memcpy(REALMODE_BASE, (void*)i386boot_realmode, i386boot_realmode_size);
+	asm("wbinvd\n");
+	
+	return 0;
+}
+		
 int enter_realmode(u16 seg, u16 off, struct pt_regs *in, struct pt_regs *out)
 {
 	
@@ -41,17 +55,11 @@
 	if (bios_setup()) {
 		return -1;
 	}
-		
-	/* copy the realmode switch code */
-	if (i386boot_realmode_size > (REALMODE_MAILBOX-REALMODE_BASE)) {
-		printf("realmode switch too large (%ld bytes, max is %d)\n", 
-		       i386boot_realmode_size, (int)(REALMODE_MAILBOX-REALMODE_BASE));
+	
+	if (realmode_setup()) {
 		return -1;
 	}
-	
-	memcpy(REALMODE_BASE, (void*)i386boot_realmode, i386boot_realmode_size);
-		
-	
+		       	
 	in->eip = off;
 	in->xcs = seg;
 	if (3>(in->esp & 0xffff)) {
@@ -59,12 +67,30 @@
 	}
 	
 	memcpy(REALMODE_MAILBOX, in, sizeof(struct pt_regs));
+	asm("wbinvd\n");
 	
 	__asm__ volatile ( 
 		 "lcall $0x20,%0\n"  : :  "i" (&realmode_enter) );
 
+	asm("wbinvd\n");
 	memcpy(out, REALMODE_MAILBOX, sizeof(struct pt_regs));
 
 	return out->eax;
 }
 
+
+/* This code is supposed to access a realmode interrupt
+ * it does currently not work for me */
+int enter_realmode_int(u8 lvl, struct pt_regs *in, struct pt_regs *out)
+{
+	/* place two instructions at 0x700 */
+	writeb(0xcd, 0x700);  /* int $lvl */
+	writeb(lvl, 0x701);
+	writeb(0xcb, 0x702);  /* lret */
+	asm("wbinvd\n");
+      
+	enter_realmode(0x00, 0x700, in, out);	
+	
+	return out->eflags&1;
+}
+