Author: jhb
Date: Tue Jan 14 18:00:04 2020
New Revision: 356737
URL: https://svnweb.freebsd.org/changeset/base/356737

Log:
  Preserve the inherited value of the status register in cpu_set_upcall().
  
  Instead of re-deriving the value of SR using logic similar to
  exec_set_regs(), just inherit the value from the existing thread
  similar to fork().
  
  Reviewed by:  brooks
  Obtained from:        CheriBSD
  Sponsored by: DARPA
  Differential Revision:        https://reviews.freebsd.org/D23059

Modified:
  head/sys/mips/mips/vm_machdep.c

Modified: head/sys/mips/mips/vm_machdep.c
==============================================================================
--- head/sys/mips/mips/vm_machdep.c     Tue Jan 14 17:56:54 2020        
(r356736)
+++ head/sys/mips/mips/vm_machdep.c     Tue Jan 14 18:00:04 2020        
(r356737)
@@ -414,7 +414,7 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
     stack_t *stack)
 {
        struct trapframe *tf;
-       register_t sp;
+       register_t sp, sr;
 
        sp = (((intptr_t)stack->ss_sp + stack->ss_size) & ~(STACK_ALIGN - 1)) -
            CALLFRAME_SIZ;
@@ -424,8 +424,10 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
         * function.
         */
        tf = td->td_frame;
+       sr = tf->sr;
        bzero(tf, sizeof(struct trapframe));
        tf->sp = sp;
+       tf->sr = sr;
        tf->pc = (register_t)(intptr_t)entry;
        /* 
         * MIPS ABI requires T9 to be the same as PC 
@@ -434,18 +436,6 @@ cpu_set_upcall(struct thread *td, void (*entry)(void *
        tf->t9 = (register_t)(intptr_t)entry; 
        tf->a0 = (register_t)(intptr_t)arg;
 
-       /*
-        * Keep interrupt mask
-        */
-       td->td_frame->sr = MIPS_SR_KSU_USER | MIPS_SR_EXL | MIPS_SR_INT_IE |
-           (mips_rd_status() & MIPS_SR_INT_MASK);
-#if defined(__mips_n32) 
-       td->td_frame->sr |= MIPS_SR_PX;
-#elif  defined(__mips_n64)
-       td->td_frame->sr |= MIPS_SR_PX | MIPS_SR_UX | MIPS_SR_KX;
-#endif
-/*     tf->sr |= (ALL_INT_MASK & idle_mask) | SR_INT_ENAB; */
-       /**XXX the above may now be wrong -- mips2 implements this as panic */
        /*
         * FREEBSD_DEVELOPERS_FIXME:
         * Setup any other CPU-Specific registers (Not MIPS Standard)
_______________________________________________
svn-src-head@freebsd.org mailing list
https://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to