Changeset 315 for trunk/kernel/mm/vmm.c


Ignore:
Timestamp:
Aug 3, 2017, 10:15:18 AM (5 years ago)
Author:
alain
Message:

Redefine the fuctions ppm_base2page() / ppm_page2base() / ppm_page2ppn() / ppm_ppn2page() / ppm_base2ppn() / ppm_ppn2base(),
to use explicitely extended pointers.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/kernel/mm/vmm.c

    r313 r315  
    524524
    525525    // initialize vseg descriptor
    526         vseg_init( vseg , base, size , vpn_base , vpn_size , type , local_cxy , 0 , 0 );
     526        vseg_init( vseg , base, size , vpn_base , vpn_size , type , local_cxy );
    527527
    528528    // update "heap_vseg" in VMM
     
    633633
    634634        // set page table entry
    635         ppn = ppm_page2ppn( page );
     635        ppn = ppm_page2ppn( XPTR( local_cxy , page ) );
    636636        error = hal_gpt_set_pte( gpt , vpn , ppn , attr );
    637637                if( error )
     
    752752    uint32_t   type      = vseg->type;
    753753    xptr_t     mapper_xp = vseg->mapper_xp;
     754    uint32_t   flags     = vseg->flags;
    754755
    755756    // get mapper cluster and local pointer
     
    816817
    817818            // compute missing page offset in .elf file
    818             intptr_t page_offset = vseg->file_offset + (page_index << PPM_PAGE_SHIFT);
    819 
    820             // compute both local and extended pointer on page first byte
    821             // WARNING : the pages_offset must have the same value in all clusters !!!
    822             //           to use this ppm_page2vaddr() function for a remote cluster
    823             uint8_t * base_ptr = (uint8_t *)ppm_page2vaddr( page_ptr );
    824             xptr_t    base_xp  = XPTR( page_cxy , base_ptr );
     819            intptr_t page_offset = vseg->file_offset +
     820                                   (page_index << CONFIG_PPM_PAGE_SHIFT);
     821
     822            // compute extended pointer on page first byte
     823            xptr_t base_xp = ppm_page2base( XPTR( page_cxy , page_ptr ) );
    825824
    826825            // file_size can be smaller than vseg_size for BSS
    827             file_size = vseg->file_size;
    828 
    829             if( file_size < page_offset )                          // page fully in  BSS
     826            intptr_t file_size = vseg->file_size;
     827
     828            if( file_size < page_offset )                                // fully in  BSS
    830829            {
    831830                if( page_cxy == local_cxy )
    832831                {
    833                     memset( base_ptr , 0 , PPM_PAGE_SIZE );
     832                    memset( GET_PTR( base_xp ) , 0 , CONFIG_PPM_PAGE_SIZE );
    834833                }
    835834                else
    836835                {
    837                    hal_remote_memset( base_xp , 0 , PPM_PAGE_SIZE );       
     836                   hal_remote_memset( base_xp , 0 , CONFIG_PPM_PAGE_SIZE );       
    838837                }
    839838            }
    840             else if( file size >= (page_offset + PPM_PAGE_SIZE) )  // page fully in  mapper
    841    
     839            else if( file_size >= (page_offset + CONFIG_PPM_PAGE_SIZE) )  // fully in  mapper
     840            {
    842841                if( mapper_cxy == local_cxy )
    843842                {
     
    846845                                                page_offset,
    847846                                                base_xp,
    848                                                 PPM_PAGE_SIZE );
     847                                                CONFIG_PPM_PAGE_SIZE );
    849848                }
    850849                else
     
    856855                                                   page_offset,
    857856                                                   (uint64_t)base_xp,
    858                                                    PPM_PAGE_SIZE,
     857                                                   CONFIG_PPM_PAGE_SIZE,
    859858                                                   &error );
    860859                }
     
    865864            {
    866865                // initialize mapper part
    867                 if( mapper_cxy == local_cxy )                    // mapper is local
     866                if( mapper_cxy == local_cxy )
    868867                {
    869868                    error = mapper_move_kernel( mapper_ptr,
    870                                                 true,         // to_buffer
     869                                                true,         // to buffer
    871870                                                page_offset,
    872871                                                base_xp,
    873872                                                file_size - page_offset );
    874873                }
    875                 else                                             // mapper is remote
     874                else                               
    876875                {
    877876                    rpc_mapper_move_buffer_client( mapper_cxy,
    878877                                                   mapper_ptr,
    879                                                    true,
     878                                                   true,         // to buffer
    880879                                                   false,        // kernel buffer
    881880                                                   page_offset,
     
    889888                if( page_cxy == local_cxy )
    890889                {
    891                     memset( base_ptr + file_size - page_offset , 0 ,
    892                             page_offset + PPM_PAGE_SIZE - file_size );
     890                    memset( GET_PTR( base_xp ) + file_size - page_offset , 0 ,
     891                            page_offset + CONFIG_PPM_PAGE_SIZE - file_size );
    893892                }
    894893                else
    895894                {
    896895                   hal_remote_memset( base_xp + file_size - page_offset , 0 ,
    897                                       page_offset + PPM_PAGE_SIZE - file_size );
     896                                      page_offset + CONFIG_PPM_PAGE_SIZE - file_size );
    898897                }
    899898            }   
     
    902901
    903902    // return ppn
    904     *ppn = hal_page2ppn( XPTR( page_cxy , page_ptr ) );
     903    *ppn = ppm_page2ppn( XPTR( page_cxy , page_ptr ) );
    905904    return 0;
    906905
     
    10641063    return error;
    10651064
    1066 }
    1067 /*
     1065}  // end vmm_v2p_translate()
     1066
     1067/* deprecated
    10681068
    10691069///////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.