@@ -47,9 +47,7 @@ void do_page_fault(u64 esr, u64 fault_ins_addr)
4747 case DFSC_TRANS_FAULT_L3 :{
4848 int ret ;
4949
50- ret =
51- handle_trans_fault (current_thread -> vmspace ,
52- fault_addr );
50+ ret = handle_trans_fault (current_thread -> vmspace , fault_addr );
5351 if (ret != 0 ) {
5452 kinfo ("pgfault at 0x%p failed\n" , fault_addr );
5553 sys_exit (ret );
@@ -68,10 +66,10 @@ int handle_trans_fault(struct vmspace *vmspace, vaddr_t fault_addr)
6866 struct vmregion * vmr ;
6967 struct pmobject * pmo ;
7068 paddr_t pa ;
71- u64 offset ;
69+ // u64 offset;
70+ int ret ;
7271
7372 /*
74- * Lab3: your code here
7573 * In this function, you should:
7674 * 1. Get the vmregion of the fault_addr using find_vmr_for_va
7775 * 2. If the pmo is not of type PMO_ANONYM, return -ENOMAPPING
@@ -86,6 +84,22 @@ int handle_trans_fault(struct vmspace *vmspace, vaddr_t fault_addr)
8684 * are recorded in a radix tree for easy management. Such code
8785 * has been omitted in our lab for simplification.
8886 */
87+ vmr = find_vmr_for_va (vmspace , fault_addr );
88+ if (!vmr ) {
89+ kinfo ("handle_trans_fault: no vmr find for va 0x%lx!\n" , fault_addr );
90+ return - ENOMAPPING ;
91+ }
92+
93+ pmo = vmr -> pmo ;
94+ if (pmo -> type != PMO_ANONYM ) {
95+ kinfo ("handle_trans_fault: pmo for va 0x%lx is not of type PMO_ANONYM" ,
96+ fault_addr );
97+ return - ENOMAPPING ;
98+ }
8999
90- return 0 ;
100+ pa = (paddr_t )virt_to_phys (get_pages (0 ));
101+ fault_addr = ROUND_DOWN (fault_addr , PAGE_SIZE );
102+ ret = map_range_in_pgtbl (vmspace -> pgtbl , fault_addr , pa ,
103+ PAGE_SIZE , vmr -> perm );
104+ return ret ;
91105}
0 commit comments