diff --git a/kernel/trampoline.S b/kernel/trampoline.S index 3f514dd..201cd4a 100644 --- a/kernel/trampoline.S +++ b/kernel/trampoline.S @@ -31,13 +31,16 @@ uservec: # save user a0 in sscratch so # a0 can be used to get at TRAPFRAME. - csrw sscratch, a0 + # CSRW = Control and Status Register Write + csrw sscratch, a0 # Save the userspace a0 in sscratch # each process has a separate p->trapframe memory area, # but it's mapped to the same virtual address # (TRAPFRAME) in every process's user page table. li a0, TRAPFRAME + # INFO: To see the layout of TRAPFRAME, see: proc.h + # save the user registers in TRAPFRAME sd ra, 40(a0) sd sp, 48(a0) @@ -48,6 +51,7 @@ uservec: sd t2, 88(a0) sd s0, 96(a0) sd s1, 104(a0) + // Note that we dont save a0 sd a1, 120(a0) sd a2, 128(a0) sd a3, 136(a0) @@ -71,8 +75,9 @@ uservec: sd t6, 280(a0) # save the user a0 in p->trapframe->a0 - csrr t0, sscratch - sd t0, 112(a0) + # CSRR = Control and Status Register Read + csrr t0, sscratch # Get the userspace a0 from where we stored it before + sd t0, 112(a0) # Store userspace a0 in p->trapframe->a0 # initialize kernel stack pointer, from p->trapframe->kernel_sp ld sp, 8(a0) @@ -83,7 +88,6 @@ uservec: # load the address of usertrap(), from p->trapframe->kernel_trap ld t0, 16(a0) - # fetch the kernel page table address, from p->trapframe->kernel_satp. ld t1, 0(a0) @@ -94,7 +98,7 @@ uservec: # install the kernel page table. csrw satp, t1 - # flush now-stale user entries from the TLB. + # flush now-stale user entries from the TLB (Translation Lookaside Buffer) sfence.vma zero, zero # jump to usertrap(), which does not return