diff options
author | Robert Morris <[email protected]> | 2019-07-26 09:38:22 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2019-07-26 09:38:22 -0400 |
commit | fa2e2e3c81b2686229acc204ece380953a8031ea (patch) | |
tree | 67c055fc880e8d286124814fff649c170434ea3e /kernel/trap.c | |
parent | 8d30e21b59d2f6d48e593cd6c2399d0743971155 (diff) | |
download | xv6-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.c | 5 |
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, |