svn commit: r295697 - head/sys/riscv/riscv
Ruslan Bukin
br at FreeBSD.org
Wed Feb 17 13:43:44 UTC 2016
Author: br
Date: Wed Feb 17 13:43:43 2016
New Revision: 295697
URL: https://svnweb.freebsd.org/changeset/base/295697
Log:
Use callee-saved registers to pass args through fork_trampoline().
Modified:
head/sys/riscv/riscv/swtch.S
head/sys/riscv/riscv/vm_machdep.c
Modified: head/sys/riscv/riscv/swtch.S
==============================================================================
--- head/sys/riscv/riscv/swtch.S Wed Feb 17 13:29:17 2016 (r295696)
+++ head/sys/riscv/riscv/swtch.S Wed Feb 17 13:43:43 2016 (r295697)
@@ -109,14 +109,10 @@ ENTRY(cpu_switch)
/* Save the old context. */
ld x13, TD_PCB(a0)
- /* Store the callee-saved registers */
+ /* Store ra, sp and the callee-saved registers */
sd ra, (PCB_RA)(x13)
sd sp, (PCB_SP)(x13)
- /* We use these in fork_trampoline */
- sd t0, (PCB_T + 0 * 8)(x13)
- sd t1, (PCB_T + 1 * 8)(x13)
-
/* s[0-11] */
sd s0, (PCB_S + 0 * 8)(x13)
sd s1, (PCB_S + 1 * 8)(x13)
@@ -167,10 +163,6 @@ ENTRY(cpu_switch)
ld ra, (PCB_RA)(x13)
ld sp, (PCB_SP)(x13)
- /* We use these in fork_trampoline */
- ld t0, (PCB_T + 0 * 8)(x13)
- ld t1, (PCB_T + 1 * 8)(x13)
-
/* s[0-11] */
ld s0, (PCB_S + 0 * 8)(x13)
ld s1, (PCB_S + 1 * 8)(x13)
@@ -195,8 +187,8 @@ END(cpu_switch)
*/
ENTRY(fork_trampoline)
- mv a0, x5
- mv a1, x6
+ mv a0, s0
+ mv a1, s1
mv a2, sp
call _C_LABEL(fork_exit)
Modified: head/sys/riscv/riscv/vm_machdep.c
==============================================================================
--- head/sys/riscv/riscv/vm_machdep.c Wed Feb 17 13:29:17 2016 (r295696)
+++ head/sys/riscv/riscv/vm_machdep.c Wed Feb 17 13:43:43 2016 (r295697)
@@ -97,8 +97,8 @@ cpu_fork(struct thread *td1, struct proc
td2->td_frame = tf;
/* Set the return value registers for fork() */
- td2->td_pcb->pcb_t[0] = (uintptr_t)fork_return;
- td2->td_pcb->pcb_t[1] = (uintptr_t)td2;
+ td2->td_pcb->pcb_s[0] = (uintptr_t)fork_return;
+ td2->td_pcb->pcb_s[1] = (uintptr_t)td2;
td2->td_pcb->pcb_ra = (uintptr_t)fork_trampoline;
td2->td_pcb->pcb_sp = (uintptr_t)td2->td_frame;
@@ -165,8 +165,8 @@ cpu_set_upcall(struct thread *td, struct
bcopy(td0->td_frame, td->td_frame, sizeof(struct trapframe));
bcopy(td0->td_pcb, td->td_pcb, sizeof(struct pcb));
- td->td_pcb->pcb_t[0] = (uintptr_t)fork_return;
- td->td_pcb->pcb_t[1] = (uintptr_t)td;
+ td->td_pcb->pcb_s[0] = (uintptr_t)fork_return;
+ td->td_pcb->pcb_s[1] = (uintptr_t)td;
td->td_pcb->pcb_ra = (uintptr_t)fork_trampoline;
td->td_pcb->pcb_sp = (uintptr_t)td->td_frame;
@@ -240,8 +240,8 @@ void
cpu_set_fork_handler(struct thread *td, void (*func)(void *), void *arg)
{
- td->td_pcb->pcb_t[0] = (uintptr_t)func;
- td->td_pcb->pcb_t[1] = (uintptr_t)arg;
+ td->td_pcb->pcb_s[0] = (uintptr_t)func;
+ td->td_pcb->pcb_s[1] = (uintptr_t)arg;
td->td_pcb->pcb_ra = (uintptr_t)fork_trampoline;
td->td_pcb->pcb_sp = (uintptr_t)td->td_frame;
}
More information about the svn-src-all
mailing list