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

Simplify the _v2p_translate function prototype.

File:
1 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()
Note: See TracChangeset for help on using the changeset viewer.