Trampoline assembly documentation
This commit is contained in:
parent
530d8c0fe4
commit
80a3465ebd
1 changed files with 9 additions and 5 deletions
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue