Skip to content

Commit 50a7856

Browse files
committed
Handling page faults
1 parent 79c0e5f commit 50a7856

File tree

2 files changed

+24
-6
lines changed

2 files changed

+24
-6
lines changed

kernel/exception/exception.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,10 @@ void handle_entry_c(int type, u64 esr, u64 address)
5252
kinfo("%s", UNKNOWN);
5353
sys_exit(-ESUPPORT);
5454
break;
55+
case ESR_EL1_EC_DABT_LEL:
56+
case ESR_EL1_EC_IABT_LEL:
57+
do_page_fault(esr, address);
58+
break;
5559
default:
5660
kdebug("Unsupported Exception ESR %lx\n", esr);
5761
break;

kernel/exception/pgfault.c

Lines changed: 20 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)