Changeset 534 for soft/giet_vm


Ignore:
Timestamp:
Mar 27, 2015, 12:24:12 PM (10 years ago)
Author:
alain
Message:

Simplify the _v2p_translate function prototype.

Location:
soft/giet_vm/giet_common
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/giet_common/vmem.c

    r495 r534  
    99#include <utils.h>
    1010#include <vmem.h>
     11#include <ctx_handler.h>
    1112#include <giet_config.h>
    1213
    13 /////////////////////////////////////////
    14 void _v2p_translate( page_table_t*  ptab,
    15                      unsigned int   vpn,
    16                      unsigned int*  ppn,
    17                      unsigned int*  flags )
     14///////////////////////////////////////////////////////
     15unsigned long long _v2p_translate( unsigned int  vaddr,
     16                                   unsigned int* flags )
    1817{
    1918    unsigned long long ptba;
     
    2524    unsigned int ppn_value;
    2625
    27     unsigned int ix1 = vpn >> 9;
    28     unsigned int ix2 = vpn & 0x1FF;
     26    unsigned int save_sr;
     27 
     28    // decode the vaddr fields
     29    unsigned int offset = vaddr & 0xFFF;
     30    unsigned int ix1    = (vaddr >> 21) & 0x7FF;
     31    unsigned int ix2    = (vaddr >> 12) & 0x1FF;
    2932
    30     unsigned int save_sr;
     33    // get page table vbase address
     34    page_table_t* pt = (page_table_t*)_get_context_slot(CTX_PTAB_ID);
    3135
    3236    // get PTE1
    33     unsigned int pte1 = ptab->pt1[ix1];
     37    unsigned int pte1 = pt->pt1[ix1];
    3438
    3539    // check PTE1 mapping
     
    3741    {
    3842        _printf("\n[VMEM ERROR] _v2p_translate() : pte1 unmapped\n"
    39                 "  vpn = %x / ptab = %x / pte1_vaddr = %x / pte1_value = %x\n",
    40                 vpn , (unsigned int)ptab, &(ptab->pt1[ix1]) , pte1 );
     43                "  vaddr = %x / ptab = %x / pte1_vaddr = %x / pte1_value = %x\n",
     44                vaddr , (unsigned int)pt, &(pt->pt1[ix1]) , pte1 );
    4145        _exit();
    4246    }
     
    4549    if ( (pte1 & PTE_T) == 0 )  // big page
    4650    {
    47         // set return values
    48         *ppn   = ((pte1 << 9) & 0x0FFFFE00) | (vpn & 0X000001FF);
    4951        *flags = pte1 & 0xFFC00000;
     52        offset = offset | (ix2<<12);
     53        return (((unsigned long long)(pte1 & 0x7FFFF)) << 21) | offset;
    5054    }
    5155    else                        // small page
     
    8488        _it_restore( &save_sr );
    8589
    86         // set return values
    87         *ppn   = ppn_value   & 0x0FFFFFFF;
    88         *flags = flags_value & 0xFFC00000;
    89 
    9090        // check PTE2 mapping
    9191        if ( (flags_value & PTE_V) == 0 )
    9292        {
    9393            _printf("\n[VMEM ERROR] _v2p_translate() : pte2 unmapped\n"
    94                     "  vpn = %x / ptab = %x / pte1_value = %x\n"
     94                    "  vaddr = %x / ptab = %x / pte1_value = %x\n"
    9595                    "  pte2_paddr = %l / ppn = %x / flags = %x\n",
    96                     vpn , ptab , pte1 , pte2_paddr ,  ppn_value , flags_value );
     96                    vaddr , pt , pte1 , pte2_paddr ,  ppn_value , flags_value );
    9797            _exit();
    9898        }
     99
     100        *flags = flags_value & 0xFFC00000;
     101        return (((unsigned long long)(ppn_value & 0x0FFFFFFF)) << 12) | offset;
    99102    }
    100103} // end _v2p_translate()
  • soft/giet_vm/giet_common/vmem.h

    r476 r534  
    4545#define PTE_D  0x00400000
    4646
    47 /////////////////////////////////////////////////////////////////////////////////////
     47///////////////////////////////////////////////////////////////////////////////////
    4848// MMU error codes definition
    49 /////////////////////////////////////////////////////////////////////////////////////
     49///////////////////////////////////////////////////////////////////////////////////
    5050
    5151#define MMU_ERR_PT1_UNMAPPED         0x001 // Page fault on Table1 (invalid PTE)
     
    5959#define MMU_ERR_CACHE_ILLEGAL_ACCESS 0x100 // Bus Error during the cache access
    6060
    61 /////////////////////////////////////////////////////////////////////////////////////
     61///////////////////////////////////////////////////////////////////////////////////
    6262// Page table structure definition
    63 /////////////////////////////////////////////////////////////////////////////////////
     63///////////////////////////////////////////////////////////////////////////////////
    6464
    6565typedef struct PageTable
     
    6969} page_table_t;
    7070
    71 ////////////////////////////////////////////////////////////////////////////////////
     71///////////////////////////////////////////////////////////////////////////////////
    7272// functions prototypes
    73 ////////////////////////////////////////////////////////////////////////////////////
     73///////////////////////////////////////////////////////////////////////////////////
    7474
    7575///////////////////////////////////////////////////////////////////////////////////
    76 // This function makes a "vpn" to "ppn" translation, from the page table
    77 // defined by the virtual address "pt". The MMU is supposed to be activated.
     76// This function makes a "virtual" to "physical" address translation,
     77// using the page table of the calling task.
     78// The MMU is supposed to be activated.
    7879// It supports both small (4 Kbytes) & big (2 Mbytes) pages.
     80// The page flags are written in the flags buffer.
    7981// It uses the address extension mechanism for physical addressing.
    80 // Return 0 if success. Return 1 if PTE1 or PTE2 unmapped.
     82// Returns the physical address if success, exit if PTE1 or PTE2 unmapped.
    8183///////////////////////////////////////////////////////////////////////////////////
    82 void _v2p_translate( page_table_t* pt,
    83                      unsigned int  vpn,
    84                      unsigned int* ppn,
    85                      unsigned int* flags );
     84unsigned long long _v2p_translate( unsigned int  vaddr,
     85                                   unsigned int* flags );
    8686
    8787#endif
Note: See TracChangeset for help on using the changeset viewer.