3462799
diff --git a/hw/xfree86/loader/xf86sym.c b/hw/xfree86/loader/xf86sym.c
3462799
index d925bed..8a2768d 100644
3462799
--- a/hw/xfree86/loader/xf86sym.c
3462799
+++ b/hw/xfree86/loader/xf86sym.c
3462799
@@ -259,6 +259,7 @@ _X_HIDDEN void *xfree86LookupTab[] = {
3462799
     SYMFUNC(xf86UDelay)
3462799
     SYMFUNC(xf86IODelay)
3462799
     SYMFUNC(xf86SlowBcopy)
3462799
+    SYMFUNC(xf86SetReallySlowBcopy)
3462799
 #ifdef __alpha__
3462799
     SYMFUNC(xf86SlowBCopyToBus)
3462799
     SYMFUNC(xf86SlowBCopyFromBus)
3462799
diff --git a/hw/xfree86/os-support/misc/SlowBcopy.c b/hw/xfree86/os-support/misc/SlowBcopy.c
3462799
index 7694eaa..5cd7168 100644
3462799
--- a/hw/xfree86/os-support/misc/SlowBcopy.c
3462799
+++ b/hw/xfree86/os-support/misc/SlowBcopy.c
3462799
@@ -22,21 +22,37 @@
3462799
 #include "xf86_OSlib.h"
3462799
 #include "compiler.h"
3462799
 
3462799
-/* The outb() isn't needed on my machine, but who knows ... -- ost */
3462799
+static int really_slow_bcopy;
3462799
+
3462799
 _X_EXPORT void
3462799
-xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len)
3462799
+xf86SetReallySlowBcopy(void)
3462799
+{
3462799
+	really_slow_bcopy = 1;
3462799
+}
3462799
+
3462799
+#if defined(__i386__) || defined(__x86_64__)
3462799
+static void xf86_really_slow_bcopy(unsigned char *src, unsigned char *dst, int len)
3462799
 {
3462799
     while(len--)
3462799
     {
3462799
 	*dst++ = *src++;
3462799
-#if !defined(__sparc__) && \
3462799
-    !defined(__powerpc__) && \
3462799
-    !defined(__mips__) && \
3462799
-    !defined(__ia64__) && \
3462799
-    !defined(__arm__)
3462799
 	outb(0x80, 0x00);
3462799
+    }
3462799
+}
3462799
 #endif
3462799
+
3462799
+/* The outb() isn't needed on my machine, but who knows ... -- ost */
3462799
+_X_EXPORT void
3462799
+xf86SlowBcopy(unsigned char *src, unsigned char *dst, int len)
3462799
+{
3462799
+#if defined(__i386__) || defined(__x86_64__)
3462799
+    if (really_slow_bcopy) {
3462799
+	xf86_really_slow_bcopy(src, dst, len);
3462799
+	return;
3462799
     }
3462799
+#endif
3462799
+    while(len--)
3462799
+	*dst++ = *src++;
3462799
 }
3462799
 
3462799
 #ifdef __alpha__
3462799
diff --git a/hw/xfree86/os-support/xf86_OSproc.h b/hw/xfree86/os-support/xf86_OSproc.h
3462799
index 1bbbf56..6f0391d 100644
3462799
--- a/hw/xfree86/os-support/xf86_OSproc.h
3462799
+++ b/hw/xfree86/os-support/xf86_OSproc.h
3462799
@@ -159,6 +159,7 @@ extern void xf86BusToMem(unsigned char *, unsigned char *, int);
3462799
 extern void xf86MemToBus(unsigned char *, unsigned char *, int);
3462799
 extern void xf86IODelay(void);
3462799
 extern void xf86UDelay(long usec);
3462799
+extern void xf86SetReallySlowBcopy(void);
3462799
 extern void xf86SlowBcopy(unsigned char *, unsigned char *, int);
3462799
 extern int xf86OpenSerial(pointer options);
3462799
 extern int xf86SetSerial(int fd, pointer options);