Ignore:
Timestamp:
May 29, 2013, 1:24:09 AM (11 years ago)
Author:
alain
Message:

Major evolution to support physical addresses larger than 32 bits.
The map.xml format has been modified: the vsegs associated to schedulers
are now explicitely defined and mapped in the page tables.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/memo/src/pseg.cpp

    r227 r238  
    11/* -*- c++ -*-
    22 *
    3  * SOCLIB_LGPL_HEADER_BEGIN
     3 * GIET_VM_LGPL_HEADER_BEGIN
    44 *
    55 * This file is part of SoCLib, GNU LGPLv2.1.
     
    1919 * 02110-1301 USA
    2020 *
    21  * SOCLIB_LGPL_HEADER_END
     21 * GIET_VM_LGPL_HEADER_END
    2222 *
    2323 * Copyright (c) UPMC, Lip6, SoC
     
    4343 */
    4444
     45//////////////////////////////////////
    4546const std::string & VSeg::name() const
    4647{
     
    4849}
    4950
     51//////////////////////////////////////
    5052const std::string & VSeg::file() const
    5153{
     
    5355}
    5456
     57///////////////////////////
    5558uintptr_t VSeg::vma() const
    5659{
     
    5861}
    5962
    60 uintptr_t VSeg::lma() const
     63/////////////////////////
     64paddr_t VSeg::lma() const
    6165{
    6266        return m_lma;
    6367}
    6468
     69///////////////////////////
    6570size_t VSeg::length() const
    6671{
     
    6873}
    6974
     75/////////////////////////
    7076size_t VSeg::type() const
    7177{
     
    7379}
    7480
     81/////////////////////////////////////////
    7582void VSeg::print( std::ostream &o ) const
    7683{
     
    7986      << std::setw (8) << std::setfill('0')
    8087      << m_vma << ", to(paddr) 0x"
    81       << std::setw (8) << std::setfill('0')
     88      << std::setw (16) << std::setfill('0')
    8289      << m_lma << ", size: 0x"
    8390      << std::setw (8) << std::setfill('0')
     
    8794}
    8895
     96/////////////
    8997VSeg::~VSeg()
    9098{
    91 //    std::cout << "Deleted VSeg " << *this << std::endl;
    92 }
    93 
     99}
     100
     101/////////////////////////////////////////
    94102VSeg & VSeg::operator=( const VSeg &ref )
    95103{
     
    97105        return *this;
    98106
    99     //std::cout << "Copying " << ref << " to " << *this << std::endl;
    100107    m_name = ref.m_name,
    101108    m_file = ref.m_file;
     
    107114}
    108115
     116////////////
    109117VSeg::VSeg()
    110118    : m_name("No Name"),
     
    115123      m_ident(0)
    116124{
    117     //std::cout << "New empty VSeg " << *this << std::endl;
    118 }
    119 
    120 VSeg::VSeg(std::string& binaryName, std::string& name, uintptr_t vma, size_t length, bool loadable, bool ident)
     125}
     126
     127////////////////////////////////////
     128VSeg::VSeg(std::string&  binaryName,
     129           std::string&  name,
     130           uintptr_t     vma,
     131           size_t        length,
     132           bool          loadable,
     133           bool          ident)
    121134    : m_name(name),
    122135      m_file(binaryName),
     
    126139      m_ident(ident)
    127140{
    128     //std::cout << "New VSeg " << *this << std::endl;
    129 }
    130 
     141}
     142
     143/////////////////////////////
    131144VSeg::VSeg( const VSeg &ref )
    132145    : m_name("To be copied"),
     
    137150      m_ident(0)
    138151{
    139     //std::cout << "New VSeg " << *this << " copied from " << ref << std::endl;
    140152    (*this) = ref;
    141153}
    142 
    143 
    144154
    145155
     
    147157 * PSeg
    148158 */
    149 uintptr_t PSeg::lma() const
     159
     160/////////////////////////
     161paddr_t PSeg::lma() const
    150162{
    151163        return m_lma;
    152164}
    153165
    154 uintptr_t PSeg::limit() const
     166///////////////////////////
     167paddr_t PSeg::limit() const
    155168{
    156169        return m_limit;
    157170}
    158171
    159 size_t PSeg::length() const
     172/////////////////////////////
     173paddr_t PSeg::length() const
    160174{
    161175        return m_length;
    162176}
    163177
     178/////////////////////////
    164179size_t PSeg::type() const
    165180{
     
    167182}
    168183
    169 uintptr_t PSeg::nextLma() const
     184/////////////////////////////
     185paddr_t PSeg::nextLma() const
    170186{
    171187        return m_nextLma;
    172188}
    173189
     190//////////////////////////////////////
    174191const std::string & PSeg::name() const
    175192{
     
    177194}
    178195
     196//////////////////////// initialisation used[][] ??? (AG)
    179197void PSeg::check() const
    180198{
     
    184202
    185203    std::vector<VSeg>::const_iterator it;
    186     size_t size = m_vsegs.size();
    187     size_t used[size][2];//lma, lma+length
    188     size_t i,j,error=0;
     204    size_t    size = m_vsegs.size();
     205    paddr_t   used[size][2];          // lma, lma+length
     206    size_t    i,j,error=0;
    189207   
    190     for(it = m_vsegs.begin(), i= 0; it < m_vsegs.end(); it++, i++)
     208    for(it = m_vsegs.begin(), i= 0 ; it < m_vsegs.end() ; it++, i++)
    191209    {
    192         size_t it_limit = (*it).lma() + (*it).length();
     210        paddr_t it_limit = (*it).lma() + (*it).length();
    193211        for(j=0; j< i; j++)
    194212        {
    195            if(  (used[j][0] == (*it).lma() /*and (*it).length()?*/) ) //not the same lma ,
     213            if( used[j][0] == (*it).lma() ) //not the same lma ,
    196214            {
    197215                error = 1;
    198216                std::cout << "ok \n";
    199217            }
    200            if(  (used[j][1] == it_limit /*and (*it).legth()?*/))  // and not the same limit
     218            if( used[j][1] == it_limit )  // and not the same limit
    201219            {
    202220                error = 2;
    203221            }
    204            if(  ((used[j][0] < (*it).lma()) and ((*it).lma() < used[j][1] )) ) //lma  within the used slice
     222            if( (used[j][0] < (*it).lma()) and ((*it).lma() < used[j][1]) ) // lma  within
    205223            {
    206224                error = 3;
    207225            }
    208            if(  ((used[j][0] < it_limit) and (it_limit < used[j][1] )) )//limit not within the used slice
     226            if(  ((used[j][0] < it_limit) and (it_limit < used[j][1] )) ) // limit no within
    209227            {
    210228                error = 4;
     
    228246}
    229247
     248//////////////////////////////////////
    230249void PSeg::setName(std::string& name )
    231250{
     
    233252}
    234253
    235 size_t PSeg::align( unsigned toAlign, unsigned alignPow2)
    236 {
    237     return ((toAlign + (1 << alignPow2) - 1 ) >> alignPow2) << alignPow2;//page aligned
    238 }
    239 
    240 
    241 size_t PSeg::pageAlign( size_t toAlign )
     254/////////////////////////////////////////////////////////
     255paddr_t PSeg::align( paddr_t toAlign, unsigned alignPow2)
     256{
     257    return ((toAlign + (1 << alignPow2) - 1 ) >> alignPow2) << alignPow2;
     258}
     259
     260//////////////////////////////////////////
     261paddr_t PSeg::pageAlign( paddr_t toAlign )
    242262{
    243263    size_t pgs = pageSize();
    244264    size_t pageSizePow2 = __builtin_ctz(pgs);
    245265   
    246     return align(toAlign, pageSizePow2);//page aligned
    247 
    248 }
    249 
    250 void PSeg::setLma( uintptr_t lma )
     266    return align(toAlign, pageSizePow2);
     267}
     268
     269////////////////////////////////
     270void PSeg::setLma( paddr_t lma )
    251271{
    252272    m_lma = lma;
    253273   
    254     m_nextLma = pageAlign(lma);//page aligned
     274    m_nextLma = pageAlign(lma);
    255275
    256276    m_pageLimit = pageAlign(m_lma+m_length);
    257277
    258278    m_limit = (m_lma + m_length);
    259 
    260 }
    261 
    262 void PSeg::setLength( size_t length )
     279}
     280
     281/////////////////////////////////////
     282void PSeg::setLength( paddr_t length )
    263283{
    264284    m_length = length;
     
    267287
    268288    m_limit = (m_lma + m_length);
    269 
    270     //std::cout << std::hex << " length seted, m_limit: " << m_limit  << std::endl;
    271     //std::cout << *this <<std::endl;
    272 }
    273 
     289}
     290
     291////////////////////////////
    274292void PSeg::add( VSeg& vseg )
    275293{
    276294    vseg.m_lma = m_nextLma;
    277     incNextLma(vseg.length());//for the next vseg
     295//    incNextLma(vseg.length());   //for the next vseg
    278296    m_vsegs.push_back(vseg);
    279297}
    280298
     299/////////////////////////////////
    281300void PSeg::addIdent( VSeg& vseg )
    282301{
    283302    vseg.m_lma = vseg.m_vma;
    284     //incNextLma(vseg.length());//to keep track of space used
    285303    m_vsegs.push_back(vseg);
    286304}
    287305
    288 void PSeg::setNextLma( uintptr_t nextLma)
     306/////////////////////////////////////////
     307void PSeg::setNextLma( paddr_t nextLma)
    289308{
    290309    m_nextLma = nextLma;
    291 
    292310    confNextLma();
    293311}
    294312
    295 void PSeg::incNextLma( size_t inc_next)
    296 {
    297 
    298     m_nextLma += inc_next;
    299 
     313//////////////////////////////////
     314void PSeg::incNextLma( size_t inc)
     315{
     316    m_nextLma += inc;
    300317    confNextLma();
    301318}
    302319
     320////////////////////////
    303321void PSeg::confNextLma()
    304322{
     
    322340}
    323341
     342/////////////////////////////////
    324343void PSeg::setPageSize(size_t pg)
    325344{
     
    332351}
    333352
     353////////////////////////
    334354size_t& PSeg::pageSize()
    335355{
     
    338358}
    339359
     360/////////////////////////////////////////
    340361PSeg & PSeg::operator=( const PSeg &ref )
    341362{
    342363    if ( &ref == this )
    343364        return *this;
    344 
    345     //std::cout << "Copying " << ref << " to " << *this << std::endl;
    346365
    347366    m_name = ref.m_name;
     
    357376}
    358377
     378//////////////////////////////////////////
    359379void PSeg::print( std::ostream &o ) const
    360380{
     
    374394}
    375395
     396////////////////////////////////////
    376397PSeg::PSeg( const std::string &name,
    377                 uintptr_t lma,
    378                 size_t length,
    379                 size_t type)
     398            paddr_t          lma,
     399            paddr_t          length,
     400            size_t            type)
    380401{
    381402    m_name = name;
     
    384405
    385406    setLma(lma);
    386     //std::cout <<"New PSeg :"<< *this ;         
    387 }
    388 
     407}
     408
     409////////////////////////////////////
    389410PSeg::PSeg( const std::string &name):
    390411      m_lma(0),
     
    396417}
    397418
    398 PSeg::PSeg( uintptr_t lma):
     419////////////////////////
     420PSeg::PSeg( paddr_t lma):
    399421      m_name("No name"),
    400422      m_lma(0),
     
    406428}
    407429
    408 
     430////////////
    409431PSeg::PSeg()
    410432    :
     
    415437      m_limit(0)
    416438{
    417     //std::cout << "New empty PSeg " << *this << std::endl;
    418 }
    419 
     439}
     440
     441/////////////////////////////
    420442PSeg::PSeg( const PSeg &ref )
    421443    : m_name("To be copied"),
     
    425447      m_limit(0)
    426448{
    427     //std::cout << "New PSeg " << *this << " copied from " << ref << std::endl;
    428449    (*this) = ref;
    429450}
     
    431452PSeg::~PSeg()
    432453{
    433 //    std::cout << "Deleted PSeg " << *this << std::endl;
    434454}
    435455
Note: See TracChangeset for help on using the changeset viewer.