Index: /soft/giet_vm/giet_common/utils.c
===================================================================
--- /soft/giet_vm/giet_common/utils.c	(revision 300)
+++ /soft/giet_vm/giet_common/utils.c	(revision 301)
@@ -257,5 +257,5 @@
                   : "=r"(sr)
                   :
-                  : "$3" );
+                  : "$3", "memory" );
     *save_sr_ptr = sr;
 }
@@ -269,5 +269,5 @@
                   "or      $3,        $3, $4        \n"
                   "mtc0    $3,        $12           \n"  
-                  ::: "$3", "$4" );
+                  ::: "$3", "$4", "memory" );
 }
 
@@ -280,5 +280,6 @@
     asm volatile( "mtc0    %0,        $12           \n" 
                   :
-                  : "r"(sr) );
+                  : "r"(sr)
+                  : "memory" );
 }
 
@@ -325,11 +326,8 @@
     unsigned int lsb = (unsigned int) paddr;
     unsigned int msb = (unsigned int) (paddr >> 32);
-
+    unsigned int sr;
+
+    _it_disable(&sr);
     asm volatile(
-            "li     $3,     0xFFFFFFFE         \n"
-            "mfc0   $2,     $12                \n"
-            "and    $3,     $2,        $3      \n"
-            "mtc0   $3,     $12                \n"     /* IRQ disabled     */
-
             "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
             "andi   $3,     $2,        0xb     \n"
@@ -341,12 +339,8 @@
 
             "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
-
-            "li     $3,     0x00000001         \n"
-            "mfc0   $2,     $12                \n"
-            "or     $3,     $3,        $2      \n"
-            "mtc0   $3,     $12                \n"     /* IRQ enabled      */
             : "=r" (value)
             : "r" (lsb), "r" (msb)
             : "$2", "$3");
+    _it_restore(&sr);
     return value;
 }
@@ -360,11 +354,8 @@
     unsigned int lsb = (unsigned int)paddr;
     unsigned int msb = (unsigned int)(paddr >> 32);
-
+    unsigned int sr;
+
+    _it_disable(&sr);
     asm volatile(
-            "li     $3,     0xFFFFFFFE         \n"
-            "mfc0   $2,     $12                \n"
-            "and    $3,     $2,        $3      \n"
-            "mtc0   $3,     $12                \n"     /* IRQ disabled     */
-
             "mfc2   $2,     $1                 \n"     /* $2 <= MMU_MODE   */
             "andi   $3,     $2,        0xb     \n"
@@ -376,12 +367,8 @@
 
             "mtc2   $2,     $1                 \n"     /* restore MMU_MODE */
-
-            "li     $3,     0x00000001         \n"
-            "mfc0   $2,     $12                \n"
-            "or     $3,     $3,        $2      \n"
-            "mtc0   $3,     $12                \n"     /* IRQ enabled      */
             :
             : "r" (value), "r" (lsb), "r" (msb)
             : "$2", "$3");
+    _it_restore(&sr);
 }
 
Index: /soft/giet_vm/giet_kernel/giet.s
===================================================================
--- /soft/giet_vm/giet_kernel/giet.s	(revision 300)
+++ /soft/giet_vm/giet_kernel/giet.s	(revision 301)
@@ -56,6 +56,4 @@
 _sys_handler:
     addiu   $29,    $29,    -24     /* 2 slots for SR&EPC, 4 slots for args passing */
-    mfc0    $26,    $12             /* load SR */
-    sw      $26,    16($29)         /* save it in the stack */
     mfc0    $27,    $14             /* load EPC */
     addiu   $27,    $27,    4       /* increment EPC for return address */
@@ -73,11 +71,12 @@
     mtc0    $26,    $12             /* interrupt enabled */
     jalr    $3                      /* jump to the proper syscall */
-    mtc0    $0,     $12             /* interrupt disbled */
 
-    lw      $26,    16($29)         /* load SR from stack */
-    mtc0    $26,    $12             /* restore SR */
+    mfc0    $26,    $12             /* load SR */
+    ori     $26,    $26,    0x2     /* set EXL bit */
+    mtc0    $26,    $12
+
     lw      $26,    20($29)         /* load EPC from stack */
     mtc0    $26,    $14             /* restore EPC */
-    addiu   $29,    $29,     24     /* restore stack pointer */
+    addiu   $29,    $29,    24      /* restore stack pointer */
     eret                            /* exit GIET */
 
Index: /soft/giet_vm/giet_kernel/switch.s
===================================================================
--- /soft/giet_vm/giet_kernel/switch.s	(revision 300)
+++ /soft/giet_vm/giet_kernel/switch.s	(revision 301)
@@ -2,4 +2,6 @@
 * This function receives two arguments that are the current task context 
 * (virtual) addresses and the next task context (virtual) address.
+*
+* This function should be called in a critical section
 *
 * TODO (AG) Il semble possible de limiter le nombre de registres Ã  sauver:
@@ -18,10 +20,4 @@
 
 _task_switch:
-
-    /* enter critical section */
-    li      $2,     0xFFFFFFFE  
-    mfc0    $3,     $12        
-    and     $3,     $3, $2    
-    mtc0    $3,     $12    
 
     /* save _current task context */
@@ -123,10 +119,4 @@
     mtc2    $26,    $0          /* restore PTPR */
 
-    /* exit critical section */
-    li      $2,     0x00000001  
-    mfc0    $3,     $12        
-    or      $3,     $3, $2    
-    mtc0    $3,     $12    
-
     /* returns to caller */
     jr      $31 
Index: /soft/giet_vm/giet_kernel/sys_handler.c
===================================================================
--- /soft/giet_vm/giet_kernel/sys_handler.c	(revision 300)
+++ /soft/giet_vm/giet_kernel/sys_handler.c	(revision 301)
@@ -55,5 +55,5 @@
     &_sys_ukn,             /* 0x17 */
     &_sys_ukn,             /* 0x18 */   
-    &_ctx_switch,          /* 0x19 */
+    &_context_switch,      /* 0x19 */
     &_vobj_get_vbase,      /* 0x1A */
     &_sys_ukn,             /* 0x1B */
