Index: trunk/softs/giet_tsar/stdio.c
===================================================================
--- trunk/softs/giet_tsar/stdio.c	(revision 629)
+++ trunk/softs/giet_tsar/stdio.c	(revision 631)
@@ -87,4 +87,5 @@
 extern struct plouf seg_ioc_base;
 extern struct plouf seg_mmc_base;
+extern struct plouf seg_ramdisk_base;
 
 ////////////////////////////////////////////////////////////////////////////////////////
@@ -915,4 +916,5 @@
 //   BLOCK_DEVICE (IOC)
 //////////////////////////////////////////////////////////////////////////////////////////
+// The block size is 512 bytes.
 // The functions below use the three variables _ioc_lock _ioc_done, 
 // and _ioc_status for synchronisation.
@@ -933,4 +935,8 @@
 //  (x = X_SIZE-1 / y = Y_SIZE), which requires and extended address access. 
 //  If USE_EXT_IO not set, we use the IOC contrÃŽler in cluster (0,0).
+//
+//  If USE_RAMDISK is set, we access a "virtual" block device controler  implemented 
+//  as a memory-mapped segment in cluster [0,0] at address seg_ramdisk_base.
+//  The tranfer being fully synchronous, the IOC interrupt is not activated.
 ///////////////////////////////////////////////////////////////////////////////////////
 
@@ -967,5 +973,21 @@
     _ioc_get_lock();
 
-    if ( USE_EXT_IO )   // extended addressing to cluster_io
+    if ( USE_RAMDISK )  // we use an extended_memcpy
+    {
+        unsigned int  src_address = (unsigned int)buffer;
+        unsigned int  src_cluster = ext;
+        unsigned int  dst_address = (unsigned int)&seg_ramdisk_base + lba*512;
+        unsigned int  dst_cluster = 0;
+
+        _extended_memcpy( dst_cluster,
+                          dst_address,
+                          src_cluster,
+                          src_address,
+                          count*512 );
+        
+        _ioc_status = BLOCK_DEVICE_WRITE_SUCCESS;
+        _ioc_done   = 1;
+    }
+    else if ( USE_EXT_IO )   // extended addressing to cluster_io
     {
         unsigned int    cluster = ((X_SIZE-1)<<Y_WIDTH) + Y_SIZE;
@@ -1007,5 +1029,21 @@
     _ioc_get_lock();
 
-    if ( USE_EXT_IO )   // extended addressing to cluster_io
+    if ( USE_RAMDISK )  // we use an extended_memcpy
+    {
+        unsigned int  dst_address = (unsigned int)buffer;
+        unsigned int  dst_cluster = ext;
+        unsigned int  src_address = (unsigned int)&seg_ramdisk_base + lba*512;
+        unsigned int  src_cluster = 0;
+
+        _extended_memcpy( dst_cluster,
+                          dst_address,
+                          src_cluster,
+                          src_address,
+                          count*512 );
+
+        _ioc_status = BLOCK_DEVICE_READ_SUCCESS;
+        _ioc_done   = 1;
+    }
+    else if ( USE_EXT_IO )   // extended addressing to cluster_io
     {
         unsigned int    cluster = ((X_SIZE-1)<<Y_WIDTH) + Y_SIZE;
@@ -1081,18 +1119,4 @@
 
 //////////////////////////////////////////////////////////////////////////////////////
-//  This ISR must be executed when an IRQ is activated by MEMC to signal
-//  an error detected by the TSAR memory cache after a write transaction.
-//  It displays an error message on the TTY terminal allocated to the processor
-//  executing the ISR.
-//////////////////////////////////////////////////////////////////////////////////////
-in_drivers void _mmc_isr()
-{
-    int*         mmc_address = (int*)&seg_mmc_base;
-    unsigned int cluster_xy  = _procid() / NB_PROCS_MAX;
-    
-    _tty_printf( "WRITE ERROR signaled by Memory Cache in cluster %x\n", cluster_xy );
-}
-
-//////////////////////////////////////////////////////////////////////////////////////
 //  FRAME_BUFFER
 //////////////////////////////////////////////////////////////////////////////////////
@@ -1150,4 +1174,18 @@
                       src_address,
                       length );
+}
+
+//////////////////////////////////////////////////////////////////////////////////////
+//  This ISR must be executed when an IRQ is activated by MEMC to signal
+//  an error detected by the TSAR memory cache after a write transaction.
+//  It displays an error message on the TTY terminal allocated to the processor
+//  executing the ISR.
+//////////////////////////////////////////////////////////////////////////////////////
+in_drivers void _mmc_isr()
+{
+    int*         mmc_address = (int*)&seg_mmc_base;
+    unsigned int cluster_xy  = _procid() / NB_PROCS_MAX;
+    
+    _tty_printf( "WRITE ERROR signaled by Memory Cache in cluster %x\n", cluster_xy );
 }
 
Index: trunk/softs/soft_hello_giet/hard_config.h
===================================================================
--- trunk/softs/soft_hello_giet/hard_config.h	(revision 629)
+++ trunk/softs/soft_hello_giet/hard_config.h	(revision 631)
@@ -12,7 +12,8 @@
 #define	 Y_WIDTH             4
 
-#define	 NB_PROCS_MAX        4
+#define	 NB_PROCS_MAX        1
 
-#define  USE_EXT_IO          1
+#define  USE_RAMDISK         1
+#define  USE_EXT_IO          0
 
 #define	 NB_DMA_CHANNELS     0
@@ -21,5 +22,5 @@
 #define	 NB_CMA_CHANNELS     0
 
-#define	 NB_TTY_CHANNELS     4
+#define	 NB_TTY_CHANNELS     1
 
 #endif //_HARD_CONFIG_H
Index: trunk/softs/soft_hello_giet/ldscript
===================================================================
--- trunk/softs/soft_hello_giet/ldscript	(revision 629)
+++ trunk/softs/soft_hello_giet/ldscript	(revision 631)
@@ -10,24 +10,26 @@
 peripherals are not present in the architecture */
 
-seg_reset_base  = 0x00000000;       /* boot code */
+seg_reset_base   = 0x00000000;       /* boot code                   */
 
-seg_kcode_base  = 0x00010000;       /* kernel code */
-seg_kdata_base  = 0x00020000;       /* kernel cacheable data */
-seg_kunc_base   = 0x00030000;       /* kernel uncacheable data */
+seg_kcode_base   = 0x00010000;       /* kernel code                 */
+seg_kdata_base   = 0x00020000;       /* kernel cacheable data       */
+seg_kunc_base    = 0x00030000;       /* kernel uncacheable data     */
 
-seg_code_base   = 0x00040000;       /* application code */ 
-seg_data_base   = 0x00050000;       /* application data */
+seg_code_base    = 0x00040000;       /* application code            */ 
+seg_data_base    = 0x00050000;       /* application data            */
 
-seg_heap_base   = 0x00100000;       /* heaps for application tasks */
-seg_stack_base  = 0x00300000;       /* stacks */
+seg_heap_base    = 0x00100000;       /* heaps for applications      */
+seg_stack_base   = 0x00300000;       /* stacks ifor applications    */
 
-seg_xcu_base    = 0xF0000000;       /* controler XCU */
-seg_tty_base    = 0xF4000000;       /* controler TTY */
-seg_fbf_base    = 0xF3000000;       /* controler FBF */
-seg_ioc_base    = 0xF2000000;       /* controler IOC */
-seg_nic_base    = 0xF7000000;       /* controler NIC */
-seg_cma_base    = 0xF8000000;       /* controler CMA */
-seg_pic_base    = 0xF9000000;       /* controler PIC */
-seg_mmc_base    = 0xE0000000;       /* config    MMC */
+seg_ramdisk_base = 0x00800000;       /* virtual disk                */
+
+seg_xcu_base     = 0xF0000000;       /* controler XCU               */
+seg_tty_base     = 0xF4000000;       /* controler TTY               */
+seg_fbf_base     = 0xF3000000;       /* controler FBF               */
+seg_ioc_base     = 0xF2000000;       /* controler IOC               */
+seg_nic_base     = 0xF7000000;       /* controler NIC               */
+seg_cma_base     = 0xF8000000;       /* controler CMA               */
+seg_pic_base     = 0xF9000000;       /* controler PIC               */
+seg_mmc_base     = 0xE0000000;       /* config    MMC               */
 
 
Index: trunk/softs/soft_sort_giet/hard_config.h
===================================================================
--- trunk/softs/soft_sort_giet/hard_config.h	(revision 629)
+++ trunk/softs/soft_sort_giet/hard_config.h	(revision 631)
@@ -12,7 +12,8 @@
 #define	 Y_WIDTH             4
 
-#define	 NB_PROCS_MAX        4
+#define	 NB_PROCS_MAX        1
 
-#define  USE_EXT_IO          1
+#define  USE_RAMDISK         1
+#define  USE_EXT_IO          0
 
 #define	 NB_DMA_CHANNELS     0
@@ -21,5 +22,5 @@
 #define	 NB_CMA_CHANNELS     0
 
-#define	 NB_TTY_CHANNELS     4
+#define	 NB_TTY_CHANNELS     1
 
 #endif //_HARD_CONFIG_H
Index: trunk/softs/soft_sort_giet/ldscript
===================================================================
--- trunk/softs/soft_sort_giet/ldscript	(revision 629)
+++ trunk/softs/soft_sort_giet/ldscript	(revision 631)
@@ -10,24 +10,26 @@
 peripherals are not present in the architecture */
 
-seg_reset_base  = 0x00000000;       /* boot code */
+seg_reset_base   = 0x00000000;       /* boot code                   */
 
-seg_kcode_base  = 0x00010000;       /* kernel code */
-seg_kdata_base  = 0x00020000;       /* kernel cacheable data */
-seg_kunc_base   = 0x00030000;       /* kernel uncacheable data */
+seg_kcode_base   = 0x00010000;       /* kernel code                 */
+seg_kdata_base   = 0x00020000;       /* kernel cacheable data       */
+seg_kunc_base    = 0x00030000;       /* kernel uncacheable data     */
 
-seg_code_base   = 0x00040000;       /* application code */ 
-seg_data_base   = 0x00050000;       /* application data */
+seg_code_base    = 0x00040000;       /* application code            */ 
+seg_data_base    = 0x00050000;       /* application data            */
 
-seg_heap_base   = 0x00100000;       /* heaps for application tasks */
-seg_stack_base  = 0x00300000;       /* stacks */
+seg_heap_base    = 0x00100000;       /* heaps for applications      */
+seg_stack_base   = 0x00300000;       /* stacks ifor applications    */
 
-seg_xcu_base    = 0xF0000000;       /* controler XCU */
-seg_tty_base    = 0xF4000000;       /* controler TTY */
-seg_fbf_base    = 0xF3000000;       /* controler FBF */
-seg_ioc_base    = 0xF2000000;       /* controler IOC */
-seg_nic_base    = 0xF7000000;       /* controler NIC */
-seg_cma_base    = 0xF8000000;       /* controler CMA */
-seg_pic_base    = 0xF9000000;       /* controler PIC */
-seg_mmc_base    = 0xE0000000;       /* config    MMC */
+seg_ramdisk_base = 0x00800000;       /* virtual disk                */
+
+seg_xcu_base     = 0xF0000000;       /* controler XCU               */
+seg_tty_base     = 0xF4000000;       /* controler TTY               */
+seg_fbf_base     = 0xF3000000;       /* controler FBF               */
+seg_ioc_base     = 0xF2000000;       /* controler IOC               */
+seg_nic_base     = 0xF7000000;       /* controler NIC               */
+seg_cma_base     = 0xF8000000;       /* controler CMA               */
+seg_pic_base     = 0xF9000000;       /* controler PIC               */
+seg_mmc_base     = 0xE0000000;       /* config    MMC               */
 
 
Index: trunk/softs/soft_transpose_giet/ldscript
===================================================================
--- trunk/softs/soft_transpose_giet/ldscript	(revision 629)
+++ trunk/softs/soft_transpose_giet/ldscript	(revision 631)
@@ -10,24 +10,26 @@
 peripherals are not present in the architecture */
 
-seg_reset_base  = 0x00000000;       /* boot code */
+seg_reset_base   = 0x00000000;       /* boot code                   */
 
-seg_kcode_base  = 0x00010000;       /* kernel code */
-seg_kdata_base  = 0x00020000;       /* kernel cacheable data */
-seg_kunc_base   = 0x00030000;       /* kernel uncacheable data */
+seg_kcode_base   = 0x00010000;       /* kernel code                 */
+seg_kdata_base   = 0x00020000;       /* kernel cacheable data       */
+seg_kunc_base    = 0x00030000;       /* kernel uncacheable data     */
 
-seg_code_base   = 0x00040000;       /* application code */ 
-seg_data_base   = 0x00050000;       /* application data */
+seg_code_base    = 0x00040000;       /* application code            */ 
+seg_data_base    = 0x00050000;       /* application data            */
 
-seg_heap_base   = 0x00100000;       /* heaps for application tasks */
-seg_stack_base  = 0x00300000;       /* stacks */
+seg_heap_base    = 0x00100000;       /* heaps for applications      */
+seg_stack_base   = 0x00300000;       /* stacks ifor applications    */
 
-seg_xcu_base    = 0xF0000000;       /* controler XCU */
-seg_tty_base    = 0xF4000000;       /* controler TTY */
-seg_fbf_base    = 0xF3000000;       /* controler FBF */
-seg_ioc_base    = 0xF2000000;       /* controler IOC */
-seg_nic_base    = 0xF7000000;       /* controler NIC */
-seg_cma_base    = 0xF8000000;       /* controler CMA */
-seg_pic_base    = 0xF9000000;       /* controler PIC */
-seg_mmc_base    = 0xE0000000;       /* config    MMC */
+seg_ramdisk_base = 0x00800000;       /* virtual disk                */
+
+seg_xcu_base     = 0xF0000000;       /* controler XCU               */
+seg_tty_base     = 0xF4000000;       /* controler TTY               */
+seg_fbf_base     = 0xF3000000;       /* controler FBF               */
+seg_ioc_base     = 0xF2000000;       /* controler IOC               */
+seg_nic_base     = 0xF7000000;       /* controler NIC               */
+seg_cma_base     = 0xF8000000;       /* controler CMA               */
+seg_pic_base     = 0xF9000000;       /* controler PIC               */
+seg_mmc_base     = 0xE0000000;       /* config    MMC               */
 
 
Index: trunk/softs/soft_transpose_giet/main.c
===================================================================
--- trunk/softs/soft_transpose_giet/main.c	(revision 629)
+++ trunk/softs/soft_transpose_giet/main.c	(revision 631)
@@ -8,10 +8,13 @@
 #define NP              128
 #define NB_IMAGES       5
-
+ 
+// Only processor 0 in each cluster access TTY
 #define PRINTF(...)      ({ if (lpid == 0) { _tty_printf(__VA_ARGS__); } })
 
-#define DISPLAY_OK
-
-// tricks to read parameters from ldscript
+#define DISPLAY_OK          1   // enable display on frame buffer when non zero 
+#define CHECK_VERBOSE       1   // display a detailed check on TTY  when non zero
+#define INSTRUMENTATION_OK  0   // display statistcs on TTY when non zero
+
+// tricks to read some addresses from ldscript
 extern struct plaf seg_ioc_base;
 extern struct plaf seg_heap_base;
@@ -19,5 +22,5 @@
 // global variables stored in seg_data (cluster 0)
 
-// instrumentation counters for each processor
+// instrumentation counters (for each processor)
 unsigned int LOAD_START[256][4];
 unsigned int LOAD_END  [256][4];
@@ -27,5 +30,5 @@
 unsigned int DISP_END  [256][4];
 
-// checksum variables
+// checksum variables (used by proc(0,0,0) only
 unsigned check_line_before[NL];
 unsigned check_line_after[NL];
@@ -58,5 +61,5 @@
     unsigned int cluster_id  = (x * Y_SIZE) + y;               
 
-    PRINTF("\n *** Proc 0 in cluster [%d,%d] enters main at cycle %d ***\n\n", 
+    PRINTF("\n *** Proc [%d,%d,0] enters main at cycle %d ***\n\n", 
            x, y, _proctime());
 
@@ -96,5 +99,5 @@
    _barrier_init(3, ntasks);
 
-   PRINTF("*** Proc 0 in cluster [%d,%d] completes barrier init at cycle %d\n",
+   PRINTF("*** Proc [%d,%d,0] completes barrier init at cycle %d\n",
           x, y, _proctime());
 
@@ -109,4 +112,7 @@
       if (lpid == 0)
       {
+         PRINTF("\n*** Proc [%d,%d,0] starts load for image %d at cycle %d\n",
+                x, y, image, _proctime() );
+
          _ioc_read( ((image * nblocks) + ((nblocks * cluster_id) / nclusters)), 
                     buf_in,
@@ -114,10 +120,7 @@
                     cluster_xy );
 
-         PRINTF("\n*** Proc 0 in cluster [%d,%d] starts load for image %d at cycle %d\n",
-                x, y, image, _proctime() );
-
          _ioc_completed();
 
-         PRINTF("*** Proc 0 in cluster [%d,%d] completes load for image %d at cycle %d\n",
+         PRINTF("*** Proc [%d,%d,0] completes load for image %d at cycle %d\n",
                 x, y, image, _proctime() );
       }
@@ -131,5 +134,5 @@
       // (p,l) are the pixel coordinates in the source image
 
-      PRINTF("\n*** proc 0 in cluster [%d,%d] starts transpose for image %d at cycle %d\n", 
+      PRINTF("\n*** proc [%d,%d,0] starts transpose for image %d at cycle %d\n", 
              x, y, image, _proctime());
 
@@ -203,5 +206,5 @@
       }
 
-      PRINTF("*** proc 0 in cluster [%d,%d] complete transpose for image %d at cycle %d\n", 
+      PRINTF("*** proc [%d,%d,0] complete transpose for image %d at cycle %d\n", 
              x, y, image, _proctime() );
 
@@ -212,34 +215,36 @@
       // optional parallel display from local buf_out to frame buffer
 
-#ifdef DISPLAY_OK
-
-      PRINTF("\n*** proc 0 in cluster [%d,%d] starts display for image %d at cycle %d\n", 
-             x, y, image, _proctime() );
-
-      DISP_START[cluster_id][lpid] = _proctime();
-
-      unsigned int npxt = npixels / ntasks;   // number of pixels per task
-      unsigned int buffer = (unsigned int)buf_out + npxt*lpid;
-
-      _fb_sync_write( npxt * task_id, buffer, npxt, cluster_xy );
-
-      PRINTF("*** Proc 0 in cluster [%d,%d] completes display for image %d at cycle %d\n",
-             x, y, image, _proctime() );
-
-      DISP_END[cluster_id][lpid] = _proctime();
-
-      _barrier_wait(2);
-
-#endif
-
-      // Instrumentation and checksum (done by processor 0 in cluster 0)
-      if (proc_id == 0)
-      { 
-         PRINTF("\n*** Proc [0,0,0] starts checks for image %d at cycle %d\n\n",
-                  image, _proctime() );
+      if ( DISPLAY_OK )
+      {
+          PRINTF("\n*** proc [%d,%d,0] starts display for image %d at cycle %d\n", 
+                 x, y, image, _proctime() );
+
+          DISP_START[cluster_id][lpid] = _proctime();
+
+          unsigned int npxt = npixels / ntasks;   // number of pixels per task
+          unsigned int buffer = (unsigned int)buf_out + npxt*lpid;
+
+          _fb_sync_write( npxt * task_id, buffer, npxt, cluster_xy );
+
+          PRINTF("*** Proc [%d,%d,0] completes display for image %d at cycle %d\n",
+                 x, y, image, _proctime() );
+
+          DISP_END[cluster_id][lpid] = _proctime();
+
+          _barrier_wait(2);
+      }
+
+      // checksum (done by processor 0 in each cluster)
+
+      if ( lpid == 0 )
+      {
+         PRINTF("\n*** Proc [%d,%d,0] starts checks for image %d at cycle %d\n\n",
+                x, y, image, _proctime() );
 
          unsigned int success = 1;
-
-         for ( l = 0 ; l < NL ; l++ )
+         unsigned int start   = cluster_id * (NL / nclusters);
+         unsigned int stop    = start + (NL / nclusters);
+
+         for ( l = start ; l < stop ; l++ )
          {
             check_line_after[l] = 0;
@@ -258,13 +263,21 @@
             }
 
-            PRINTF(" - l = %d / before = %d / after = %d \n",
-                   l, check_line_before[l], check_line_after[l] );
+            if( CHECK_VERBOSE )
+            {
+                PRINTF(" - l = %d / before = %d / after = %d \n",
+                       l, check_line_before[l], check_line_after[l] );
+            }
 
             if ( check_line_before[l] != check_line_after[l] ) success = 0;
          }
 
-         if ( success ) PRINTF("\n*** proc [0,0,0] : CHECKSUM OK \n\n");
-         else           PRINTF("\n*** proc [0,0,0] : CHECKSUM KO \n\n");
-
+         if ( success ) PRINTF("\n*** proc [%d,%d,0] : CHECKSUM OK \n\n", x, y);
+         else           PRINTF("\n*** proc [%d,%d,0] : CHECKSUM KO \n\n", x, y);
+      }
+
+      // instrumentation ( done by processor [0,0,0]
+
+      if ( (proc_id == 0) && INSTRUMENTATION_OK )
+      {
          int cc, pp;
          unsigned int min_load_start = INT_MAX;
