]> git.sur5r.net Git - u-boot/blobdiff - examples/sched.c
MPC8544DS: Removes the unknown flash message information
[u-boot] / examples / sched.c
index 4f6f98e78f0914336a7fe0b1390a89aa5fa3c413..ae01e0b05d24695217f5fa981b4084842dadca9e 100644 (file)
@@ -3,12 +3,12 @@
  * modify it under the terms of the GNU General Public License as
  * published by the Free Software Foundation; either version 2 of
  * the License, or (at your option) any later version.
- * 
+ *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU General Public License for more details.
- * 
+ *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston,
@@ -16,8 +16,7 @@
  */
 
 #include <common.h>
-#include <syscall.h>
-#include <setjmp.h>
+#include <exports.h>
 
 /*
  * Author: Arun Dharankar <ADharankar@ATTBI.Com>
 #define RC_FAILURE     (-1)
 #define        RC_SUCCESS      (0)
 
+typedef        vu_char *jmp_ctx;
+unsigned long setctxsp (vu_char *sp);
+int ppc_setjmp(jmp_ctx env);
+void ppc_longjmp(jmp_ctx env, int val);
+#define setjmp ppc_setjmp
+#define longjmp        ppc_longjmp
+
 struct lthread {
        int state;
        int retval;
@@ -68,13 +74,13 @@ static volatile int current_tid = MASTER_THREAD;
 
 static uchar dbg = 0;
 
-#define DEBUG(fmt, args...)     {                                                                                              \
-               if(dbg != 0) {                                                                                                          \
-                       mon_printf("[%s %d %s]: ", __FILE__, __LINE__, __FUNCTION__);   \
-                       mon_printf(fmt, ##args);                                                                                \
-                       mon_printf("\n");                                                                                               \
-               }                                                                                                                                       \
-       }
+#define PDEBUG(fmt, args...)    {                                      \
+       if(dbg != 0) {                                                  \
+               printf("[%s %d %s]: ",__FILE__,__LINE__,__FUNCTION__);\
+               printf(fmt, ##args);                            \
+               printf("\n");                                   \
+       }                                                               \
+}
 
 static int testthread (void *);
 static void sched_init (void);
@@ -83,50 +89,51 @@ static int thread_start (int id);
 static void thread_yield (void);
 static int thread_delete (int id);
 static int thread_join (int *ret);
-#if 0 /* not used yet */
+
+#if 0                                                  /* not used yet */
 static int thread_stop (int id);
-#endif /* not used yet */
+#endif                                                 /* not used yet */
 
 /* An example of schedular test */
 
 #define NUMTHREADS 7
-int sched (bd_t *bd, int ac, char *av[])
+int sched (int ac, char *av[])
 {
        int i, j;
        int tid[NUMTHREADS];
        int names[NUMTHREADS];
 
+       app_startup(av);
+
        sched_init ();
 
        for (i = 0; i < NUMTHREADS; i++) {
                names[i] = i;
                j = thread_create (testthread, (void *) &names[i]);
                if (j == RC_FAILURE)
-                       mon_printf ("schedtest: Failed to create thread %d\n",
-                       i);
+                       printf ("schedtest: Failed to create thread %d\n", i);
                if (j > 0) {
-                       mon_printf ("schedtest: Created thread with id %d, name %d\n",
-                               j, i);
+                       printf ("schedtest: Created thread with id %d, name %d\n",
+                                               j, i);
                        tid[i] = j;
                }
        }
-       mon_printf ("schedtest: Threads created\n");
+       printf ("schedtest: Threads created\n");
 
-       mon_printf ("sched_test: function=0x%08x\n", testthread);
+       printf ("sched_test: function=0x%08x\n", (unsigned)testthread);
        for (i = 0; i < NUMTHREADS; i++) {
-               mon_printf ("schedtest: Setting thread %d runnable\n", tid[i]);
+               printf ("schedtest: Setting thread %d runnable\n", tid[i]);
                thread_start (tid[i]);
                thread_yield ();
        }
-       mon_printf ("schedtest: Started %d threads\n", NUMTHREADS);
+       printf ("schedtest: Started %d threads\n", NUMTHREADS);
 
        while (1) {
-               mon_printf ("schedtest: Waiting for threads to complete\n");
-               if (mon_tstc () && mon_getc () == 0x3) {
-                       mon_printf ("schedtest: Aborting threads...\n");
+               printf ("schedtest: Waiting for threads to complete\n");
+               if (tstc () && getc () == 0x3) {
+                       printf ("schedtest: Aborting threads...\n");
                        for (i = 0; i < NUMTHREADS; i++) {
-                               mon_printf ("schedtest: Deleting thread %d\n",
-                                       tid[i]);
+                               printf ("schedtest: Deleting thread %d\n", tid[i]);
                                thread_delete (tid[i]);
                        }
                        return RC_SUCCESS;
@@ -134,12 +141,11 @@ int sched (bd_t *bd, int ac, char *av[])
                j = -1;
                i = thread_join (&j);
                if (i == RC_FAILURE) {
-                       mon_printf ("schedtest: No threads pending, "
-                               "exiting schedular test\n");
+                       printf ("schedtest: No threads pending, "
+                                               "exiting schedular test\n");
                        return RC_SUCCESS;
                }
-               mon_printf ("schedtest: thread is %d returned %d\n", i,
-                                       j);
+               printf ("schedtest: thread is %d returned %d\n", i, j);
                thread_yield ();
        }
 
@@ -150,15 +156,15 @@ static int testthread (void *name)
 {
        int i;
 
-       mon_printf ("testthread: Begin executing thread, myname %d, &i=0x%08x\n",
-                *(int *) name, &i);
+       printf ("testthread: Begin executing thread, myname %d, &i=0x%08x\n",
+               *(int *) name, (unsigned)&i);
 
-       mon_printf ("Thread %02d, i=%d\n", *(int *) name);
+       printf ("Thread %02d, i=%d\n", *(int *) name, i);
 
        for (i = 0; i < 0xffff * (*(int *) name + 1); i++) {
-               if (mon_tstc () && mon_getc () == 0x3) {
-                       mon_printf ("testthread: myname %d terminating.\n",
-                               *(int *) name);
+               if (tstc () && getc () == 0x3) {
+                       printf ("testthread: myname %d terminating.\n",
+                                               *(int *) name);
                        return *(int *) name + 1;
                }
 
@@ -166,8 +172,8 @@ static int testthread (void *name)
                        thread_yield ();
        }
 
-       mon_printf ("testthread: returning %d, i=0x%x\n",
-               *(int *) name + 1, i);
+       printf ("testthread: returning %d, i=0x%x\n",
+                               *(int *) name + 1, i);
 
        return *(int *) name + 1;
 }
@@ -182,8 +188,8 @@ static void sched_init (void)
 
        current_tid = MASTER_THREAD;
        lthreads[current_tid].state = STATE_RUNNABLE;
-       DEBUG ("sched_init: master context = 0x%08x",
-               lthreads[current_tid].context);
+       PDEBUG ("sched_init: master context = 0x%08x",
+               (unsigned)lthreads[current_tid].context);
        return;
 }
 
@@ -191,19 +197,20 @@ static void thread_yield (void)
 {
        static int i;
 
-       DEBUG ("thread_yield: current tid=%d", current_tid);
+       PDEBUG ("thread_yield: current tid=%d", current_tid);
 
 #define SWITCH(new)                                                    \
        if(lthreads[new].state == STATE_RUNNABLE) {                     \
-               DEBUG("thread_yield: %d match, ctx=0x%08x",             \
-                       new, lthreads[current_tid].context);            \
+               PDEBUG("thread_yield: %d match, ctx=0x%08x",            \
+                       new,                                            \
+                       (unsigned)lthreads[current_tid].context);       \
                if(setjmp(lthreads[current_tid].context) == 0) {        \
                        current_tid = new;                              \
-                       DEBUG("thread_yield: tid %d returns 0",         \
+                       PDEBUG("thread_yield: tid %d returns 0",        \
                                new);                                   \
                        longjmp(lthreads[new].context, 1);              \
                } else {                                                \
-                       DEBUG("thread_yield: tid %d returns 1",         \
+                       PDEBUG("thread_yield: tid %d returns 1",        \
                                new);                                   \
                        return;                                         \
                }                                                       \
@@ -219,7 +226,7 @@ static void thread_yield (void)
                }
        }
 
-       DEBUG ("thread_yield: returning from thread_yield");
+       PDEBUG ("thread_yield: returning from thread_yield");
        return;
 }
 
@@ -232,12 +239,12 @@ static int thread_create (int (*func) (void *), void *arg)
                        lthreads[i].state = STATE_STOPPED;
                        lthreads[i].func = func;
                        lthreads[i].arg = arg;
-                       DEBUG ("thread_create: returns new tid %d", i);
+                       PDEBUG ("thread_create: returns new tid %d", i);
                        return i;
                }
        }
 
-       DEBUG ("thread_create: returns failure");
+       PDEBUG ("thread_create: returns failure");
        return RC_FAILURE;
 }
 
@@ -255,24 +262,24 @@ static int thread_delete (int id)
 
 static void thread_launcher (void)
 {
-       DEBUG ("thread_launcher: invoking func=0x%08x",
-                  lthreads[current_tid].func);
+       PDEBUG ("thread_launcher: invoking func=0x%08x",
+                  (unsigned)lthreads[current_tid].func);
 
        lthreads[current_tid].retval =
-                       lthreads[current_tid].func(lthreads[current_tid].arg);
+                       lthreads[current_tid].func (lthreads[current_tid].arg);
 
-       DEBUG ("thread_launcher: tid %d terminated", current_tid);
+       PDEBUG ("thread_launcher: tid %d terminated", current_tid);
 
        lthreads[current_tid].state = STATE_TERMINATED;
        thread_yield ();
-       mon_printf ("thread_launcher: should NEVER get here!\n");
+       printf ("thread_launcher: should NEVER get here!\n");
 
        return;
 }
 
 static int thread_start (int id)
 {
-       DEBUG ("thread_start: id=%d", id);
+       PDEBUG ("thread_start: id=%d", id);
        if (id <= MASTER_THREAD || id > MAX_THREADS) {
                return RC_FAILURE;
        }
@@ -283,12 +290,13 @@ static int thread_start (int id)
        if (setjmp (lthreads[current_tid].context) == 0) {
                lthreads[id].state = STATE_RUNNABLE;
                current_tid = id;
-               DEBUG ("thread_start: to be stack=0%08x", lthreads[id].stack);
-               setctxsp (&lthreads[id].stack[STK_SIZE]);
+               PDEBUG ("thread_start: to be stack=0%08x",
+                       (unsigned)lthreads[id].stack);
+               setctxsp ((vu_char *)&lthreads[id].stack[STK_SIZE]);
                thread_launcher ();
        }
 
-       DEBUG ("thread_start: Thread id=%d started, parent returns", id);
+       PDEBUG ("thread_start: Thread id=%d started, parent returns", id);
 
        return RC_SUCCESS;
 }
@@ -305,46 +313,46 @@ static int thread_stop (int id)
        lthreads[id].state = STATE_STOPPED;
        return RC_SUCCESS;
 }
-#endif /* not used so far */
+#endif /* not used so far */
 
 static int thread_join (int *ret)
 {
        int i, j = 0;
 
-       DEBUG ("thread_join: *ret = %d", *ret);
+       PDEBUG ("thread_join: *ret = %d", *ret);
 
        if (!(*ret == -1 || *ret > MASTER_THREAD || *ret < MAX_THREADS)) {
-               DEBUG ("thread_join: invalid tid %d", *ret);
+               PDEBUG ("thread_join: invalid tid %d", *ret);
                return RC_FAILURE;
        }
 
        if (*ret == -1) {
-               DEBUG ("Checking for tid = -1");
+               PDEBUG ("Checking for tid = -1");
                while (1) {
-                       /* DEBUG("thread_join: start while-loopn"); */
+                       /* PDEBUG("thread_join: start while-loopn"); */
                        j = 0;
                        for (i = MASTER_THREAD + 1; i < MAX_THREADS; i++) {
                                if (lthreads[i].state == STATE_TERMINATED) {
                                        *ret = lthreads[i].retval;
                                        lthreads[i].state = STATE_EMPTY;
-                                       /* DEBUG("thread_join: returning retval %d of tid %d",
-                                               ret, i); */
+                                       /* PDEBUG("thread_join: returning retval %d of tid %d",
+                                          ret, i); */
                                        return RC_SUCCESS;
                                }
 
                                if (lthreads[i].state != STATE_EMPTY) {
-                                       DEBUG ("thread_join: %d used slots tid %d state=%d",
-                                               j, i, lthreads[i].state);
+                                       PDEBUG ("thread_join: %d used slots tid %d state=%d",
+                                                  j, i, lthreads[i].state);
                                        j++;
                                }
                        }
                        if (j == 0) {
-                               DEBUG ("thread_join: all slots empty!");
+                               PDEBUG ("thread_join: all slots empty!");
                                return RC_FAILURE;
                        }
-                       /*  DEBUG("thread_join: yielding"); */
+                       /*  PDEBUG("thread_join: yielding"); */
                        thread_yield ();
-                       /*  DEBUG("thread_join: back from yield"); */
+                       /*  PDEBUG("thread_join: back from yield"); */
                }
        }
 
@@ -352,10 +360,10 @@ static int thread_join (int *ret)
                i = *ret;
                *ret = lthreads[*ret].retval;
                lthreads[*ret].state = STATE_EMPTY;
-               DEBUG ("thread_join: returing %d for tid %d", *ret, i);
+               PDEBUG ("thread_join: returing %d for tid %d", *ret, i);
                return RC_SUCCESS;
        }
 
-       DEBUG ("thread_join: thread %d is not terminated!", *ret);
+       PDEBUG ("thread_join: thread %d is not terminated!", *ret);
        return RC_FAILURE;
 }