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


Ignore:
Timestamp:
Dec 20, 2017, 4:51:09 PM (6 years ago)
Author:
alain
Message:

Fix bugs in exec

File:
1 edited

Legend:

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

    r408 r409  
    2828#include <hal_special.h>
    2929#include <hal_gpt.h>
     30#include <hal_vmm.h>
    3031#include <printk.h>
    3132#include <memcpy.h>
     
    8384             "STACK zone too small\n");
    8485
    85     // register kentry vseg in VMM
     86    // register kentry vseg in VSL
    8687    base = CONFIG_VMM_KENTRY_BASE << CONFIG_PPM_PAGE_SHIFT;
    8788    size = CONFIG_VMM_KENTRY_SIZE << CONFIG_PPM_PAGE_SHIFT;
     
    100101    vmm->kent_vpn_base = base;
    101102
    102     // register args vseg in VMM
     103    // register args vseg in VSL
    103104    base = (CONFIG_VMM_KENTRY_BASE +
    104105            CONFIG_VMM_KENTRY_SIZE ) << CONFIG_PPM_PAGE_SHIFT;
     
    118119    vmm->args_vpn_base = base;
    119120
    120     // register the envs vseg in VMM
     121    // register the envs vseg in VSL
    121122    base = (CONFIG_VMM_KENTRY_BASE +
    122123            CONFIG_VMM_KENTRY_SIZE +
     
    137138    vmm->envs_vpn_base = base;
    138139
    139     // initialize generic page table
     140    // create GPT (empty)
    140141    error = hal_gpt_create( &vmm->gpt );
    141142
    142     assert( (error == 0) , __FUNCTION__ , "cannot initialize page table\n");
     143    assert( (error == 0) , __FUNCTION__ , "cannot create GPT\n");
     144
     145    // architecture specific GPT initialization
     146    // (For TSAR, identity map the kentry_vseg)
     147    error = hal_vmm_init( vmm );
     148
     149    assert( (error == 0) , __FUNCTION__ , "cannot initialize GPT\n");
    143150
    144151    // initialize STACK allocator
     
    154161
    155162    // initialize instrumentation counters
    156         vmm->pgfault_nr          = 0;
     163        vmm->pgfault_nr = 0;
    157164
    158165    hal_fence();
     
    534541    vmm_t  * vmm = &process->vmm;
    535542
     543// @@@
     544vmm_display( process , true );
     545// @@@
     546
    536547    // get extended pointer on VSL root and VSL lock
    537548    xptr_t   root_xp = XPTR( local_cxy , &vmm->vsegs_root );
     
    541552        remote_rwlock_wr_lock( lock_xp );
    542553
    543     // remove all vsegs registered in VSL
     554    // remove all user vsegs registered in VSL
    544555        while( !xlist_is_empty( root_xp ) )
    545556        {
     557        // get pointer on first vseg in VSL
    546558                vseg_xp = XLIST_FIRST_ELEMENT( root_xp , vseg_t , xlist );
    547559        vseg = (vseg_t *)GET_PTR( vseg_xp );
     560
     561printk("\n@@@ %s : vseg %s\n", __FUNCTION__ , vseg_type_str( vseg->type ) );
     562
     563        // unmap and release all pages
     564        vmm_unmap_vseg( process , vseg );
     565
     566        // remove vseg from VSL
    548567                vseg_detach( vmm , vseg );
     568
     569        // release memory allocated to vseg descriptor
    549570        vseg_free( vseg );
    550571        }
     
    565586    }
    566587
    567     // release memory allocated to the local page table
     588    // release memory allocated to the GPT itself
    568589    hal_gpt_destroy( &vmm->gpt );
    569590
     
    928949    vpn_t       vpn_min;    // VPN of first PTE
    929950    vpn_t       vpn_max;    // VPN of last PTE (excluded)
    930 
    931     // get pointer on process page table
     951    ppn_t       ppn;        // current PTE ppn value
     952    uint32_t    attr;       // current PTE attributes
     953    kmem_req_t  req;        // request to release memory
     954    xptr_t      page_xp;    // extended pointer on page descriptor
     955    cxy_t       page_cxy;   // page descriptor cluster
     956    page_t    * page_ptr;   // page descriptor pointer
     957
     958vmm_dmsg("\n[DBG] %s : core[%x, %d] enter / process %x / vseg %s / base %x / cycle %d\n",
     959__FUNCTION__, local_cxy, CURRENT_THREAD->core->lid, process->pid ,
     960vseg_type_str( vseg->type ), vseg->vpn_base, (uint32_t)hal_get_cycles() );
     961
     962    // get pointer on process GPT
    932963    gpt_t     * gpt = &process->vmm.gpt;
    933964
     
    937968        for( vpn = vpn_min ; vpn < vpn_max ; vpn++ )
    938969    {
    939         hal_gpt_reset_pte( gpt , vpn );
    940     }
    941 }
     970        // get GPT entry
     971        hal_gpt_get_pte( gpt , vpn , &attr , &ppn );
     972
     973        if( attr & GPT_MAPPED )  // entry is mapped
     974        {
     975            // check small page
     976            assert( (attr & GPT_SMALL) , __FUNCTION__ ,
     977            "an user vseg must use small pages" );
     978
     979            // unmap GPT entry
     980            hal_gpt_reset_pte( gpt , vpn );
     981
     982            // release memory if not identity mapped
     983            if( (vseg->flags & VSEG_IDENT)  == 0 )
     984            {
     985                // get extended pointer on page descriptor
     986                page_xp  = ppm_ppn2page( ppn );
     987                page_cxy = GET_CXY( page_xp );
     988                page_ptr = (page_t *)GET_PTR( page_xp );
     989
     990                // release physical page to relevant cluster
     991                if( page_cxy == local_cxy )                   // local cluster
     992                {
     993                    req.type = KMEM_PAGE;
     994                    req.ptr  = page_ptr;
     995                    kmem_free( &req );
     996                }
     997                else                                          // remote cluster
     998                {
     999                    rpc_pmem_release_pages_client( page_cxy , page_ptr );
     1000                }
     1001            }
     1002        }
     1003    }
     1004}  // end vmm_unmap_vseg()
    9421005
    9431006//////////////////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset for help on using the changeset viewer.