Allows apps to implement vcore_entry() (XCC)
authorBarret Rhoden <brho@cs.berkeley.edu>
Fri, 4 Mar 2011 01:54:43 +0000 (17:54 -0800)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:59 +0000 (17:35 -0700)
By default, vcore_entry() calls uthread_vcore_entry(), which is the
standard way to work with user-threads / 2LSs.  An app can write a
vcore_entry(), but you'll miss out lots of things.

Rebuild your cross compiler.

tests/eth_audio.c
tests/manycore_test.c
tests/mhello.c
tests/mproctests.c
tests/msr_cycling_vcores.c
tests/msr_dumb_while.c
tests/msr_get_cores.c
tests/msr_get_singlecore.c
tests/syscall.c
tools/compilers/gcc-glibc/glibc-2.11.1-ros/sysdeps/ros/start.c
user/parlib/uthread.c

index 8186aab..b290d9e 100644 (file)
 void *core0_tls = 0;
 void *in_buf, *out_buf;
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
 /* Test program for the audio device.  mmap()s the stuff, sets up a notif
  * handler, and switches to multi_mode.
  *
@@ -106,7 +94,7 @@ void process_packet(void)
        //printf("contents of out_buf %s\n", out_buf);
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
        static bool first_time = TRUE;
index d3edb4b..9724512 100644 (file)
@@ -7,19 +7,6 @@
 
 mcs_barrier_t b;
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 void do_work_son(int vcoreid)
 {
        int cpuid = sys_getcpuid();
@@ -28,7 +15,7 @@ void do_work_son(int vcoreid)
        mcs_barrier_wait(&b,vcoreid);
 }
 
-void ghetto_vcore_entry()
+void vcore_entry()
 {
        assert(vcore_id() > 0);
        do_work_son(vcore_id());
index d4481b9..7eee416 100644 (file)
@@ -33,14 +33,8 @@ struct uthread *ghetto_init(void)
 }
 
 struct schedule_ops ghetto_sched_ops = {
-       ghetto_init,
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
+       .sched_init = ghetto_init,
+       .sched_entry = ghetto_vcore_entry,
 };
 struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
index cf4b810..3ccc429 100644 (file)
@@ -28,19 +28,6 @@ int test = TEST_SWITCH_TO_RUNNABLE_S;
 
 static void global_tests(uint32_t vcoreid);
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 int main(int argc, char** argv)
 {
        uint32_t vcoreid;
@@ -112,7 +99,7 @@ int main(int argc, char** argv)
        return 0;
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        uint32_t vcoreid;
        static int first_time = 1; // used by vcore2
index 6fd37d2..38ddd69 100644 (file)
 mcs_barrier_t b;
 uint64_t begin = 0, end = 0;
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 int main(int argc, char** argv)
 {
 
@@ -51,7 +38,7 @@ int main(int argc, char** argv)
        return -1;
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
 
index b27ba67..c556371 100644 (file)
@@ -9,19 +9,6 @@
 #include <event.h>
 #include <uthread.h>
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 int main(int argc, char** argv)
 {
 
@@ -39,7 +26,7 @@ int main(int argc, char** argv)
        return -1;
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        struct preempt_data *vcpd = &__procdata.vcore_preempt_data[0];
        vcpd->notif_enabled = TRUE;
index 845b9d2..085c610 100644 (file)
@@ -33,19 +33,6 @@ mcs_barrier_t b;
 void *core0_tls = 0;
 uint64_t begin = 0, end = 0;
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 int main(int argc, char** argv)
 {
        uint32_t vcoreid = vcore_id();
@@ -102,7 +89,7 @@ int main(int argc, char** argv)
        return 0;
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
 
index 4696f28..7e4864d 100644 (file)
@@ -26,19 +26,6 @@ void *core0_tls = 0;
 uint64_t begin = 0, end = 0;
 volatile bool core1_up = FALSE;
 
-void ghetto_vcore_entry(void);
-struct schedule_ops ghetto_sched_ops = {
-       0, /* init, */
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
-};
-struct schedule_ops *sched_ops = &ghetto_sched_ops;
-
 int main(int argc, char** argv)
 {
        uint32_t vcoreid = vcore_id();
@@ -103,7 +90,7 @@ int main(int argc, char** argv)
        return 0;
 }
 
-void ghetto_vcore_entry(void)
+void vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
 
index 8e99f05..7e89c19 100644 (file)
@@ -20,14 +20,8 @@ struct uthread *ghetto_init(void)
 }
 
 struct schedule_ops ghetto_sched_ops = {
-       ghetto_init,
-       ghetto_vcore_entry,
-       0, /* thread_create, */
-       0, /* thread_runnable, */
-       0, /* thread_yield, */
-       0, /* thread_exit, */
-       0, /* preempt_pending, */
-       0, /* spawn_thread, */
+       .sched_init = ghetto_init,
+       .sched_entry = ghetto_vcore_entry,
 };
 struct schedule_ops *sched_ops = &ghetto_sched_ops;
 
index d8ef182..6ede374 100644 (file)
@@ -13,13 +13,18 @@ weak_alias(__vcore_thread_control_blocks,vcore_thread_control_blocks)
 __thread int __vcoreid = 0;
 __thread bool __vcore_context = FALSE;
 
-void
-__vcore_entry(void)
+void __uthread_vcore_entry(void)
 {
-       fputs("define a vcore_entry() function, foo!",stderr);
+       fputs("Define a uthread_vcore_entry() or a vcore_entry(), foo!\n", stderr);
        abort();
 }
-weak_alias(__vcore_entry,vcore_entry)
+weak_alias(__uthread_vcore_entry, uthread_vcore_entry)
+
+void __vcore_entry(void)
+{
+       uthread_vcore_entry();
+}
+weak_alias(__vcore_entry, vcore_entry)
 
 #define failmsg(str) write(2,str"\n",sizeof(str"\n")-1)
 
index 20d9685..ccebe66 100644 (file)
@@ -44,8 +44,8 @@ static int uthread_init(void)
        return 0;
 }
 
-/* 2LSs shouldn't call vcore_entry() directly */
-void __attribute__((noreturn)) vcore_entry()
+/* 2LSs shouldn't call uthread_vcore_entry directly */
+void __attribute__((noreturn)) uthread_vcore_entry(void)
 {
        uint32_t vcoreid = vcore_id();
 
@@ -164,7 +164,7 @@ __uthread_yield(struct uthread *uthread)
        current_uthread = NULL; // this might be okay, even with a migration
        /* Go back to the entry point, where we can handle notifications or
         * reschedule someone. */
-       vcore_entry();
+       uthread_vcore_entry();
 }
 
 /* Calling thread yields.  TODO: combine similar code with uthread_exit() (done
@@ -226,7 +226,7 @@ __uthread_exit(struct uthread *uthread)
        current_uthread = NULL;
        /* Go back to the entry point, where we can handle notifications or
         * reschedule someone. */
-       vcore_entry();
+       uthread_vcore_entry();
 }
 
 /* Exits from the uthread */