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;
 }
_______________________________________________
[email protected] mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "[email protected]"

Reply via email to