Adds a Makelocal option for resetting the stack
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 19 Nov 2010 19:56:38 +0000 (11:56 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:57 +0000 (17:35 -0700)
This is so that cycles involving smp_idle() never grow without bound.
It's not much of a big deal anyway, since whenever you pop to user
space, it would reset.

If you enable this option, you won't be able to backtrace beyond
smp_idle().

Makeconfig
Makelocal.template
kern/arch/i686/cpuinfo.c
kern/src/smp.c

index 49dce18..943f950 100644 (file)
@@ -28,6 +28,7 @@ CONFIG_MONITOR_ON_INT:=            -D__CONFIG_MONITOR_ON_INT__
 CONFIG_DISABLE_SMT:=               -D__CONFIG_DISABLE_SMT__
 CONFIG_BOXBORO:=                   -D__CONFIG_BOXBORO__
 CONFIG_ARSC_SERVER:=               -D__CONFIG_ARSC_SERVER__
+CONFIG_RESET_STACKS:=              -D__CONFIG_RESET_STACKS__
 
 # Userspace configuration parameters
 # By default, each of these options will be turned off
index 01937e0..ed46ccf 100644 (file)
@@ -24,6 +24,8 @@
 #KERN_CFLAGS += $(CONFIG_BOXBORO)
 # Enable this to set up ARSC server
 #KERN_CFLAGS += $(CONFIG_ARSC_SERVER)
+# Resets stacks in smp_idle(), at the expense of backtrace
+#KERN_CFLAGS += $(CONFIG_RESET_STACKS)
 
 #KERN_CFLAGS += -DDEVELOPER_NAME=waterman
 #KERN_CFLAGS += -DDEVELOPER_NAME=brho
index a9fcef3..e3b791f 100644 (file)
@@ -180,6 +180,10 @@ void backtrace(void)
                cprintf("\n");
                eip = *(ebp + 1) - 1;
                ebp = (uint32_t*)(*ebp);
+               #ifdef __CONFIG_RESET_STACKS__
+               if (!strncmp("__smp_idle", debuginfo.eip_fn_name, 10))
+                       break;
+               #endif /* __CONFIG_RESET_STACKS__ */
        }
 }
 
index 517a738..a2c0a38 100644 (file)
@@ -31,14 +31,11 @@ atomic_t outstanding_calls = 0;
  * - Management cores (core 0 for now) call manager, which should never return.
  * - Worker cores halt and wake up when interrupted, do any work on their work
  *   queue, then halt again.
- *
- * TODO: think about resetting the stack pointer at the beginning for worker
- * cores. (keeps the stack from growing if we never go back to userspace).
  * TODO: think about unifying the manager into a workqueue function, so we don't
  * need to check mgmt_core in here.  it gets a little ugly, since there are
  * other places where we check for mgmt and might not smp_idle / call manager.
  */
-void smp_idle(void)
+static void __smp_idle(void)
 {
        int8_t state = 0;
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
@@ -72,3 +69,12 @@ void smp_idle(void)
        }
        assert(0);
 }
+
+void smp_idle(void)
+{
+       #ifdef __CONFIG_RESET_STACKS__
+       set_stack_pointer(get_stack_top());
+       #endif /* __CONFIG_RESET_STACKS__ */
+       __smp_idle();
+       assert(0);
+}