diff options
author | Mole Shang <[email protected]> | 2024-02-11 17:51:28 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-11 17:51:28 +0800 |
commit | 4a6593f1a6f666c618d303a4858c4c6d31b41c63 (patch) | |
tree | 29d5302aec4e0f3c34a70baa9fb83c0bb35dbf7c /kernel/trap.c | |
parent | 2fe04bc8faa4bf737a86c36a8017473e84814f3b (diff) | |
download | xv6-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.c | 7 |
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); } |