Ignore:
Timestamp:
Aug 3, 2017, 10:15:18 AM (7 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/hal/tsar_mips32/core/hal_gpt.c

    r124 r315  
    6969#define TSAR_MMU_IX2_FROM_VPN( vpn )       (vpn & 0x1FF)
    7070
    71 #define TSAR_MMU_PTBA_FROM_PTE1( pte1 )    (pte1 & 0xFFFFFFF)
    72 #define TSAR_MMU_PPN_FROM_PTE1( pte1 )     ((pte1 & 0x7FFFF)<<9)
     71#define TSAR_MMU_PTBA_FROM_PTE1( pte1 )    (pte1 & 0x0FFFFFFF)
     72#define TSAR_MMU_PPN_FROM_PTE1( pte1 )     ((pte1 & 0x0007FFFF)<<9)
    7373#define TSAR_MMU_ATTR_FROM_PTE1( pte1 )    (pte1 & 0xFFC00000)
    7474
     
    9999{
    100100        page_t   * page;
     101    xptr_t     page_xp;
    101102
    102103    // check page size
     
    121122
    122123    // initialize generic page table descriptor
    123         gpt->ptr  = ppm_page2vaddr( page );
    124         gpt->ppn  = ppm_page2ppn( page );
    125         gpt->page = page;
     124    page_xp   = XPTR( local_cxy , page );
     125
     126        gpt->ptr  = GET_PTR( ppm_page2base( page_xp ) );
     127        gpt->ppn  = ppm_page2ppn( page_xp );
     128        gpt->page = GET_PTR( page_xp );
    126129
    127130    // initialize PTE entries attributes masks
     
    191194            else                           // SMALL page
    192195            {
    193                 // get pointer on PT2
     196                // get local pointer on PT2
    194197                pt2_ppn = TSAR_MMU_PTBA_FROM_PTE1( pte1 );
    195                 pt2 = ppm_ppn2vaddr( pt2_ppn );
     198                xptr_t base_xp = ppm_ppn2base( pt2_ppn );
     199                pt2 = (uint32_t *)GET_PTR( base_xp );
    196200
    197201                // scan the PT2 to release all entries VALID and USER if reference cluster
     
    212216                // release the PT2
    213217                req.type = KMEM_PAGE;
    214                 req.ptr  = ppm_vaddr2page( pt2 );
     218                req.ptr  = GET_PTR( ppm_base2page( XPTR(local_cxy , pt2 ) ) );
    215219                kmem_free( &req );
    216220            }
     
    220224    // release the PT1
    221225    req.type = KMEM_PAGE;
    222     req.ptr  = ppm_vaddr2page( pt1 );
     226    req.ptr  = GET_PTR( ppm_base2page( XPTR(local_cxy , pt1 ) ) );
    223227    kmem_free( &req );
    224228
     
    255259            {
    256260                pt2_ppn = TSAR_MMU_PTBA_FROM_PTE1( pte1 );
    257                 pt2 = ppm_ppn2vaddr( pt2_ppn );
     261                xptr_t base_xp = ppm_ppn2base ( pt2_ppn );
     262                pt2 = (uint32_t *)GET_PTR( base_xp );
    258263
    259264                // scan the PT2
     
    288293
    289294        uint32_t            small;       // requested PTE is for a small page
    290         bool_t              atomic;      //
     295        bool_t              atomic;
     296
    291297        page_t            * page;        // pointer on new physical page descriptor
     298    xptr_t              page_xp;     // extended pointer on new page descriptor
    292299
    293300    uint32_t            ix1;         // index in PT1
     
    338345            return ENOMEM;
    339346        }
    340         pt2_ppn = ppm_page2ppn( page );
    341         pt2     = ppm_page2vaddr( page );
     347
     348        page_xp = XPTR( local_cxy , page );       
     349        pt2_ppn = ppm_page2ppn( page_xp );
     350        pt2     = (uint32_t *)GET_PTR( ppm_page2base( page_xp ) );
    342351
    343352        // try to atomicaly set a PTD1 in the PT1 entry
     
    361370
    362371            // compute pointer on PT2 base
    363                         pt2 = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     372                        pt2 = (uint32_t*)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    364373                }
    365374        }
     
    378387
    379388        // compute pointer on PT2 base
    380             pt2 = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     389            pt2 = (uint32_t*)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    381390        }
    382391
     
    424433        // compute PT2 base address
    425434        pt2_ppn = TSAR_MMU_PTBA_FROM_PTE1( pte1 );
    426         pt2     = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     435        pt2     = (uint32_t*)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    427436
    428437            *ppn  = pt2[2*ix2+1] & ((1<<TSAR_MMU_PPN_WIDTH)-1);
     
    478487        // compute PT2 base address
    479488        pt2_ppn = TSAR_MMU_PTBA_FROM_PTE1( pte1 );
    480         pt2 = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     489        pt2 = (uint32_t*)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    481490       
    482491        // get PPN
     
    514523        bool_t              atomic;
    515524    page_t            * page;
     525    xptr_t              page_xp;
    516526
    517527    uint32_t  ix1 = TSAR_MMU_IX1_FROM_VPN( vpn );    // index in PT1
     
    547557        }
    548558
    549         pt2_ppn = ppm_page2ppn( page );
    550         pt2     = ppm_page2vaddr( page );
     559        page_xp = XPTR( local_cxy , page );
     560        pt2_ppn = ppm_page2ppn( page_xp );
     561        pt2     = (uint32_t *)GET_PTR( ppm_page2base( page_xp ) );
    551562
    552563        // try to set the PT1 entry
     
    568579            // get the PT2 base address
    569580                        pt2_ppn = TSAR_MMU_PPN_FROM_PTE1( pte1 );
    570                         pt2     = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     581                        pt2     = (uint32_t*)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    571582                }
    572583        }
     
    585596
    586597        // compute pointer on PT2 base
    587             pt2 = (uint32_t*)ppm_ppn2vaddr( pt2_ppn );
     598            pt2 = (uint32_t *)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    588599    }
    589600   
     
    645656    // get pointer on PT2 base
    646657    pt2_ppn = TSAR_MMU_PPN_FROM_PTE1( pte1 );
    647     pt2     = ppm_ppn2vaddr( pt2_ppn );
     658    pt2     = (uint32_t *)GET_PTR( ppm_ppn2base( pt2_ppn ) );
    648659 
    649660    // get pointer on PTE2
     
    686697
    687698    page_t     * page;
     699    xptr_t       page_xp;
    688700
    689701    ppn_t        src_pt2_ppn;
     
    721733                }
    722734
     735                // get extended pointer on page descriptor
     736                page_xp = XPTR( local_cxy , page );
     737
    723738                // get pointer on new PT2 in DST_GPT
    724                 dst_pt2 = (uint32_t *)ppm_page2vaddr( page );
     739                xptr_t base_xp = ppm_page2base( page_xp );
     740                dst_pt2 = (uint32_t *)GET_PTR( base_xp );
    725741
    726742                // set a new PTD1 in DST_GPT
    727                 dst_pt2_ppn  = (ppn_t)ppm_page2ppn( page );
     743                dst_pt2_ppn  = (ppn_t)ppm_page2ppn( page_xp );
    728744                dst_pt1[ix1] = TSAR_MMU_PRESENT | TSAR_MMU_PTD1 | dst_pt2_ppn;
    729745
    730746                // get pointer on PT2 in SRC_GPT
    731747                src_pt2_ppn = (ppn_t)TSAR_MMU_PTBA_FROM_PTE1( pte1 );
    732                 src_pt2     = (uint32_t *)ppm_ppn2vaddr( src_pt2_ppn );
     748                src_pt2     = (uint32_t *)GET_PTR( ppm_ppn2base( src_pt2_ppn ) );
    733749
    734750                // scan the SRC_PT2
     
    756772
    757773                            // register PG_COW in page descriptor
    758                             page = ppm_ppn2page( pte2_ppn );
     774                            page = (page_t *)GET_PTR( ppm_ppn2page( pte2_ppn ) );
    759775                            hal_atomic_or( &page->flags , PG_COW );
    760776                                                        hal_atomic_add( &page->fork_nr , 1 );
Note: See TracChangeset for help on using the changeset viewer.