summaryrefslogtreecommitdiff
path: root/kernel/trap.c
diff options
context:
space:
mode:
authorRobert Morris <[email protected]>2019-07-26 09:38:22 -0400
committerRobert Morris <[email protected]>2019-07-26 09:38:22 -0400
commitfa2e2e3c81b2686229acc204ece380953a8031ea (patch)
tree67c055fc880e8d286124814fff649c170434ea3e /kernel/trap.c
parent8d30e21b59d2f6d48e593cd6c2399d0743971155 (diff)
downloadxv6-labs-fa2e2e3c81b2686229acc204ece380953a8031ea.tar.gz
xv6-labs-fa2e2e3c81b2686229acc204ece380953a8031ea.tar.bz2
xv6-labs-fa2e2e3c81b2686229acc204ece380953a8031ea.zip
uservec before userret in trampoline, to match book and kernelvec
Diffstat (limited to 'kernel/trap.c')
-rw-r--r--kernel/trap.c5
1 files changed, 3 insertions, 2 deletions
diff --git a/kernel/trap.c b/kernel/trap.c
index ad2d0f8..ce7a65a 100644
--- a/kernel/trap.c
+++ b/kernel/trap.c
@@ -9,7 +9,7 @@
struct spinlock tickslock;
uint ticks;
-extern char trampoline[], uservec[];
+extern char trampoline[], uservec[], userret[];
// in kernelvec.S, calls kerneltrap().
void kernelvec();
@@ -123,7 +123,8 @@ usertrapret(void)
// jump to trampoline.S at the top of memory, which
// switches to the user page table, restores user registers,
// and switches to user mode with sret.
- ((void (*)(uint64,uint64))TRAMPOLINE)(TRAPFRAME, satp);
+ uint64 fn = TRAMPOLINE + (userret - trampoline);
+ ((void (*)(uint64,uint64))fn)(TRAPFRAME, satp);
}
// interrupts and exceptions from kernel code go here via kernelvec,