summaryrefslogtreecommitdiff
path: root/kernel/trap.c
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2024-02-11 17:51:28 +0800
committerMole Shang <[email protected]>2024-02-11 17:51:28 +0800
commit4a6593f1a6f666c618d303a4858c4c6d31b41c63 (patch)
tree29d5302aec4e0f3c34a70baa9fb83c0bb35dbf7c /kernel/trap.c
parent2fe04bc8faa4bf737a86c36a8017473e84814f3b (diff)
downloadxv6-labs-cow.tar.gz
xv6-labs-cow.tar.bz2
xv6-labs-cow.zip
lab cow: finishcow
Diffstat (limited to 'kernel/trap.c')
-rw-r--r--kernel/trap.c7
1 files changed, 7 insertions, 0 deletions
diff --git a/kernel/trap.c b/kernel/trap.c
index eb8009f..bd3b100 100644
--- a/kernel/trap.c
+++ b/kernel/trap.c
@@ -73,9 +73,16 @@ usertrap(void)
syscall();
} else if((which_dev = devintr()) != 0){
// ok
+ } else if(r_scause() == 13 || r_scause() == 15){
+ // deal with page fault
+ uint64 va = r_stval();
+ if(cow_handler(p->pagetable, va) < 0)
+ goto err;
} else {
printf("usertrap(): unexpected scause %p pid=%d\n", r_scause(), p->pid);
printf(" sepc=%p stval=%p\n", r_sepc(), r_stval());
+ err:
+ printf("killing the process...\n");
setkilled(p);
}