Add the 'current_kthread' helper
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 8 Jun 2018 16:01:33 +0000 (12:01 -0400)
committerBarret Rhoden <brho@cs.berkeley.edu>
Fri, 8 Jun 2018 16:01:33 +0000 (12:01 -0400)
Similar to current and current_ctx.  Those remain unchanged functionally,
but they now use the pcpui accessors.

Signed-off-by: Barret Rhoden <brho@cs.berkeley.edu>
kern/include/smp.h
kern/src/kthread.c

index 4df8fc8..5a04a9a 100644 (file)
@@ -74,15 +74,6 @@ struct per_cpu_info {
        void *profiling;
 }__attribute__((aligned(ARCH_CL_SIZE)));
 
-/* Allows the kernel to figure out what process is running on this core.  Can be
- * used just like a pointer to a struct proc. */
-#define current per_cpu_info[core_id()].cur_proc
-/* Allows the kernel to figure out what *user* ctx is on this core's stack.  Can
- * be used just like a pointer to a struct user_context.  Note the distinction
- * between kernel and user contexts.  The kernel always returns to its nested,
- * interrupted contexts via iret/etc.  We never do that for user contexts. */
-#define current_ctx per_cpu_info[core_id()].cur_ctx
-
 typedef struct per_cpu_info  per_cpu_info_t;
 extern per_cpu_info_t per_cpu_info[MAX_NUM_CORES];
 
@@ -93,6 +84,17 @@ extern per_cpu_info_t per_cpu_info[MAX_NUM_CORES];
 #define this_pcpui_ptr() pcpui_ptr(core_id())
 #define this_pcpui_var(var) pcpui_var(core_id(), var)
 
+/* Allows the kernel to figure out what process is running on this core.  Can be
+ * used just like a pointer to a struct proc. */
+#define current this_pcpui_var(cur_proc)
+/* Allows the kernel to figure out what *user* ctx is on this core's stack.  Can
+ * be used just like a pointer to a struct user_context.  Note the distinction
+ * between kernel and user contexts.  The kernel always returns to its nested,
+ * interrupted contexts via iret/etc.  We never do that for user contexts. */
+#define current_ctx this_pcpui_var(cur_ctx)
+
+#define current_kthread this_pcpui_var(cur_kthread)
+
 /* SMP bootup functions */
 void smp_boot(void);
 void smp_idle(void) __attribute__((noreturn));
index 51bd038..e1010ca 100644 (file)
@@ -126,7 +126,7 @@ void restart_kthread(struct kthread *kthread)
 {
        struct per_cpu_info *pcpui = &per_cpu_info[core_id()];
        uintptr_t current_stacktop;
-       struct kthread *current_kthread;
+       struct kthread *cur_kth;
        /* Avoid messy complications.  The kthread will enable_irqsave() when it
         * comes back up. */
        disable_irq();
@@ -138,11 +138,11 @@ void restart_kthread(struct kthread *kthread)
                put_kstack(pcpui->spare->stacktop);
                kmem_cache_free(kthread_kcache, pcpui->spare);
        }
-       current_kthread = pcpui->cur_kthread;
-       current_stacktop = current_kthread->stacktop;
-       assert(!current_kthread->sysc); /* catch bugs, prev user should clear */
+       cur_kth = pcpui->cur_kthread;
+       current_stacktop = cur_kth->stacktop;
+       assert(!cur_kth->sysc); /* catch bugs, prev user should clear */
        /* Set the spare stuff (current kthread, which includes its stacktop) */
-       pcpui->spare = current_kthread;
+       pcpui->spare = cur_kth;
        /* When a kthread runs, its stack is the default kernel stack */
        set_stack_top(kthread->stacktop);
        pcpui->cur_kthread = kthread;