Fixed a current_tf setting bug and added checks
authorAndrew Waterman <waterman@s143.Millennium.Berkeley.EDU>
Wed, 5 May 2010 07:58:42 +0000 (00:58 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:47 +0000 (17:35 -0700)
Never call proc_restartcore without previously calling set_current_tf.
In all situations, the tf passed to restartcore should be the same
as current_tf (as far as I know), so the parameter should actually
be removed and current_tf should be used instead.

kern/arch/sparc/trap.c
kern/include/process.h
kern/src/process.c

index d97d519..1b364ca 100644 (file)
@@ -387,11 +387,14 @@ fp_disabled(trapframe_t* state)
 void
 handle_pop_tf(trapframe_t* state)
 {
+       set_current_tf(state);
+
        trapframe_t tf;
        if(memcpy_from_user(current,&tf,(void*)state->gpr[8],sizeof(tf)))
                proc_destroy(current);
 
        proc_secure_trapframe(&tf);
+       set_current_tf(&tf);
        proc_restartcore(current,&tf);
 }
 
@@ -416,13 +419,7 @@ handle_syscall(trapframe_t* state)
        advance_pc(state);
        enable_irq();
 
-       /* Note we are not preemptively saving the TF in the env_tf.  We do maintain
-        * a reference to it in current_tf (a per-cpu pointer).
-        * In general, only save the tf and any silly state once you know it
-        * is necessary (blocking).  And only save it in env_tf when you know you
-        * are single core (PROC_RUNNING_S) */
-       if (!in_kernel(state))
-               set_current_tf(state);
+       set_current_tf(state);
 
        // syscall code wants an edible reference for current
        proc_incref(current, 1);
index e8e0b85..389153d 100644 (file)
@@ -148,7 +148,8 @@ void proc_decref(struct proc *SAFE p, size_t count);
  * interrupted contexts via iret/etc.  We don't always do that for user
  * contexts. */
 #define current_tf per_cpu_info[core_id()].cur_tf
-#define set_current_tf(tf) per_cpu_info[core_id()].cur_tf = (tf)
+#define set_current_tf(tf) ({ assert(!in_kernel(tf)); \
+                              per_cpu_info[core_id()].cur_tf = (tf); })
 
 void abandon_core(void);
 /* Hold the proc_lock, since it'll use the vcoremapping to send an unmapping
index d176b65..8c8921e 100644 (file)
@@ -668,6 +668,10 @@ static void __proc_startcore(struct proc *p, trapframe_t *tf)
  * returning from local traps and such. */
 void proc_restartcore(struct proc *p, trapframe_t *tf)
 {
+       // TODO: proc_restartcore shouldn't ever be called with tf != current_tf,
+       // so the parameter should probably be removed outright.
+       assert(current_tf == tf);
+
        /* Need ints disabled when we return from processing (race) */
        disable_irq();
        process_routine_kmsg();