Changeset 409 for trunk/kernel/mm/vmm.c
- Timestamp:
- Dec 20, 2017, 4:51:09 PM (6 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/kernel/mm/vmm.c
r408 r409 28 28 #include <hal_special.h> 29 29 #include <hal_gpt.h> 30 #include <hal_vmm.h> 30 31 #include <printk.h> 31 32 #include <memcpy.h> … … 83 84 "STACK zone too small\n"); 84 85 85 // register kentry vseg in V MM86 // register kentry vseg in VSL 86 87 base = CONFIG_VMM_KENTRY_BASE << CONFIG_PPM_PAGE_SHIFT; 87 88 size = CONFIG_VMM_KENTRY_SIZE << CONFIG_PPM_PAGE_SHIFT; … … 100 101 vmm->kent_vpn_base = base; 101 102 102 // register args vseg in V MM103 // register args vseg in VSL 103 104 base = (CONFIG_VMM_KENTRY_BASE + 104 105 CONFIG_VMM_KENTRY_SIZE ) << CONFIG_PPM_PAGE_SHIFT; … … 118 119 vmm->args_vpn_base = base; 119 120 120 // register the envs vseg in V MM121 // register the envs vseg in VSL 121 122 base = (CONFIG_VMM_KENTRY_BASE + 122 123 CONFIG_VMM_KENTRY_SIZE + … … 137 138 vmm->envs_vpn_base = base; 138 139 139 // initialize generic page table140 // create GPT (empty) 140 141 error = hal_gpt_create( &vmm->gpt ); 141 142 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"); 143 150 144 151 // initialize STACK allocator … … 154 161 155 162 // initialize instrumentation counters 156 vmm->pgfault_nr 163 vmm->pgfault_nr = 0; 157 164 158 165 hal_fence(); … … 534 541 vmm_t * vmm = &process->vmm; 535 542 543 // @@@ 544 vmm_display( process , true ); 545 // @@@ 546 536 547 // get extended pointer on VSL root and VSL lock 537 548 xptr_t root_xp = XPTR( local_cxy , &vmm->vsegs_root ); … … 541 552 remote_rwlock_wr_lock( lock_xp ); 542 553 543 // remove all vsegs registered in VSL554 // remove all user vsegs registered in VSL 544 555 while( !xlist_is_empty( root_xp ) ) 545 556 { 557 // get pointer on first vseg in VSL 546 558 vseg_xp = XLIST_FIRST_ELEMENT( root_xp , vseg_t , xlist ); 547 559 vseg = (vseg_t *)GET_PTR( vseg_xp ); 560 561 printk("\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 548 567 vseg_detach( vmm , vseg ); 568 569 // release memory allocated to vseg descriptor 549 570 vseg_free( vseg ); 550 571 } … … 565 586 } 566 587 567 // release memory allocated to the local page table588 // release memory allocated to the GPT itself 568 589 hal_gpt_destroy( &vmm->gpt ); 569 590 … … 928 949 vpn_t vpn_min; // VPN of first PTE 929 950 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 958 vmm_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 , 960 vseg_type_str( vseg->type ), vseg->vpn_base, (uint32_t)hal_get_cycles() ); 961 962 // get pointer on process GPT 932 963 gpt_t * gpt = &process->vmm.gpt; 933 964 … … 937 968 for( vpn = vpn_min ; vpn < vpn_max ; vpn++ ) 938 969 { 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() 942 1005 943 1006 //////////////////////////////////////////////////////////////////////////////////////////
Note: See TracChangeset
for help on using the changeset viewer.