Index: /soft/giet_vm/giet_common/vmem.c
===================================================================
--- /soft/giet_vm/giet_common/vmem.c	(revision 533)
+++ /soft/giet_vm/giet_common/vmem.c	(revision 534)
@@ -9,11 +9,10 @@
 #include <utils.h>
 #include <vmem.h>
+#include <ctx_handler.h>
 #include <giet_config.h>
 
-/////////////////////////////////////////
-void _v2p_translate( page_table_t*  ptab,
-                     unsigned int   vpn,
-                     unsigned int*  ppn,
-                     unsigned int*  flags ) 
+///////////////////////////////////////////////////////
+unsigned long long _v2p_translate( unsigned int  vaddr,
+                                   unsigned int* flags )
 {
     unsigned long long ptba;
@@ -25,11 +24,16 @@
     unsigned int ppn_value;
 
-    unsigned int ix1 = vpn >> 9;
-    unsigned int ix2 = vpn & 0x1FF;
+    unsigned int save_sr;
+  
+    // decode the vaddr fields
+    unsigned int offset = vaddr & 0xFFF;
+    unsigned int ix1    = (vaddr >> 21) & 0x7FF;
+    unsigned int ix2    = (vaddr >> 12) & 0x1FF;
 
-    unsigned int save_sr;
+    // get page table vbase address
+    page_table_t* pt = (page_table_t*)_get_context_slot(CTX_PTAB_ID);
 
     // get PTE1
-    unsigned int pte1 = ptab->pt1[ix1];
+    unsigned int pte1 = pt->pt1[ix1];
 
     // check PTE1 mapping
@@ -37,6 +41,6 @@
     {
         _printf("\n[VMEM ERROR] _v2p_translate() : pte1 unmapped\n"
-                "  vpn = %x / ptab = %x / pte1_vaddr = %x / pte1_value = %x\n",
-                vpn , (unsigned int)ptab, &(ptab->pt1[ix1]) , pte1 );
+                "  vaddr = %x / ptab = %x / pte1_vaddr = %x / pte1_value = %x\n",
+                vaddr , (unsigned int)pt, &(pt->pt1[ix1]) , pte1 );
         _exit();
     }
@@ -45,7 +49,7 @@
     if ( (pte1 & PTE_T) == 0 )  // big page
     {
-        // set return values
-        *ppn   = ((pte1 << 9) & 0x0FFFFE00) | (vpn & 0X000001FF);
         *flags = pte1 & 0xFFC00000;
+        offset = offset | (ix2<<12);
+        return (((unsigned long long)(pte1 & 0x7FFFF)) << 21) | offset;
     }
     else                        // small page
@@ -84,17 +88,16 @@
         _it_restore( &save_sr );
 
-        // set return values 
-        *ppn   = ppn_value   & 0x0FFFFFFF;
-        *flags = flags_value & 0xFFC00000;
-
         // check PTE2 mapping
         if ( (flags_value & PTE_V) == 0 )
         {
             _printf("\n[VMEM ERROR] _v2p_translate() : pte2 unmapped\n"
-                    "  vpn = %x / ptab = %x / pte1_value = %x\n"
+                    "  vaddr = %x / ptab = %x / pte1_value = %x\n"
                     "  pte2_paddr = %l / ppn = %x / flags = %x\n",
-                    vpn , ptab , pte1 , pte2_paddr ,  ppn_value , flags_value );
+                    vaddr , pt , pte1 , pte2_paddr ,  ppn_value , flags_value );
             _exit();
         }
+
+        *flags = flags_value & 0xFFC00000;
+        return (((unsigned long long)(ppn_value & 0x0FFFFFFF)) << 12) | offset;
     }
 } // end _v2p_translate()
Index: /soft/giet_vm/giet_common/vmem.h
===================================================================
--- /soft/giet_vm/giet_common/vmem.h	(revision 533)
+++ /soft/giet_vm/giet_common/vmem.h	(revision 534)
@@ -45,7 +45,7 @@
 #define PTE_D  0x00400000
 
-/////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 // MMU error codes definition 
-/////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 
 #define MMU_ERR_PT1_UNMAPPED         0x001 // Page fault on Table1 (invalid PTE) 
@@ -59,7 +59,7 @@
 #define MMU_ERR_CACHE_ILLEGAL_ACCESS 0x100 // Bus Error during the cache access 
 
-/////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 // Page table structure definition
-/////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 
 typedef struct PageTable 
@@ -69,19 +69,19 @@
 } page_table_t;
 
-////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 // functions prototypes
-////////////////////////////////////////////////////////////////////////////////////
+///////////////////////////////////////////////////////////////////////////////////
 
 ///////////////////////////////////////////////////////////////////////////////////
-// This function makes a "vpn" to "ppn" translation, from the page table 
-// defined by the virtual address "pt". The MMU is supposed to be activated.
+// This function makes a "virtual" to "physical" address translation,
+// using the page table of the calling task.
+// The MMU is supposed to be activated.
 // It supports both small (4 Kbytes) & big (2 Mbytes) pages.
+// The page flags are written in the flags buffer.
 // It uses the address extension mechanism for physical addressing.
-// Return 0 if success. Return 1 if PTE1 or PTE2 unmapped.
+// Returns the physical address if success, exit if PTE1 or PTE2 unmapped.
 ///////////////////////////////////////////////////////////////////////////////////
-void _v2p_translate( page_table_t* pt, 
-                     unsigned int  vpn, 
-                     unsigned int* ppn, 
-                     unsigned int* flags );
+unsigned long long _v2p_translate( unsigned int  vaddr,
+                                   unsigned int* flags );
 
 #endif 
