Index: /trunk/softs/tsar_boot/include/defs.h
===================================================================
--- /trunk/softs/tsar_boot/include/defs.h	(revision 704)
+++ /trunk/softs/tsar_boot/include/defs.h	(revision 705)
@@ -8,4 +8,8 @@
 #define BLOCK_SIZE          512
 
+#ifndef CLUSTER_IO
+#  define CLUSTER_IO        0
+#endif
+
 // vim: tabstop=4 : softtabstop=4 : shiftwidth=4 : expandtab
 
Index: /trunk/softs/tsar_boot/include/io.h
===================================================================
--- /trunk/softs/tsar_boot/include/io.h	(revision 704)
+++ /trunk/softs/tsar_boot/include/io.h	(revision 705)
@@ -1,6 +1,6 @@
 /**********************************************************************
- * \file	io.h
- * \date	5 September 2012
- * \author	Cesar Fuguet / Alain Greiner
+ * \file    io.h
+ * \date    5 September 2012
+ * \author  Cesar Fuguet / Alain Greiner
  *
  * Utility functions to write or read memory mapped hardware registers
@@ -26,7 +26,8 @@
         "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
         : "=r" (value)
-        : "r" (addr), "r" (ext) );
+        : "r" (addr), "r" (ext)
+        : "memory" );
 
-    return value;
+    return (volatile unsigned int)value;
 }
 
@@ -36,5 +37,16 @@
 static inline unsigned short ioread16(void * addr)
 {
-	return *(volatile unsigned short *) addr;
+    unsigned short value;
+    unsigned int ext = CLUSTER_IO;
+
+    asm volatile(
+        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
+        "lhu   %0,    0(%1)          \n"  /* value <= *(ext\addr)    */
+        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
+        : "=r" (value)
+        : "r" (addr), "r" (ext)
+        : "memory" );
+
+    return (volatile unsigned short)value;
 }
 
@@ -44,5 +56,16 @@
 static inline unsigned char ioread8(void * addr)
 {
-	return *(volatile unsigned char *) addr;
+    unsigned char value;
+    unsigned int ext = CLUSTER_IO;
+
+    asm volatile(
+        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
+        "lbu   %0,    0(%1)          \n"  /* value <= *(ext\addr)    */
+        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
+        : "=r" (value)
+        : "r" (addr), "r" (ext)
+        : "memory" );
+
+    return (volatile unsigned char)value;
 }
 
@@ -59,7 +82,8 @@
         "sw    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
         "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
-	    "sync                        \n"  /* sync barrier            */
+        "sync                        \n"  /* sync barrier            */
         :
-        : "r" (value), "r" (addr), "r" (ext) );
+        : "r" (value), "r" (addr), "r" (ext)
+        : "memory" );
 }
 
@@ -69,6 +93,14 @@
 static inline void iowrite16(void * addr, unsigned short value)
 {
-	*(volatile unsigned short *) addr = value;
-	asm volatile("sync" ::: "memory");
+    unsigned int ext = CLUSTER_IO;
+
+    asm volatile(
+        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
+        "sh    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
+        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
+        "sync                        \n"  /* sync barrier            */
+        :
+        : "r" (value), "r" (addr), "r" (ext)
+        : "memory" );
 }
 
@@ -78,7 +110,17 @@
 static inline void iowrite8(void * addr, unsigned char value)
 {
-	*(volatile unsigned char *) addr = value;
-	asm volatile("sync" ::: "memory");
+    unsigned int ext = CLUSTER_IO;
+
+    asm volatile(
+        "mtc2  %2,    $24            \n"  /* PADDR_EXT <= cluster_io */
+        "sb    %0,    0(%1)          \n"  /* *(ext\addr) <= value    */
+        "mtc2  $0,    $24            \n"  /* PADDR_EXT <= 0          */
+        "sync                        \n"  /* sync barrier            */
+        :
+        : "r" (value), "r" (addr), "r" (ext)
+        : "memory" );
 }
 
 #endif
+
+// vim: tabstop=4 : softtabstop=4 : shiftwidth=4 : expandtab
