Palacios Public Git Repository

To checkout Palacios execute

  git clone http://v3vee.org/palacios/palacios.web/palacios.git
This will give you the master branch. You probably want the devel branch or one of the release branches. To switch to the devel branch, simply execute
  cd palacios
  git checkout --track -b devel origin/devel
The other branches are similar.


lwip/uip should not be dependent on any part of the VMM,
[palacios.git] / palacios / src / lwip / arch / sys_arch.c
index abcd0fe..289ed70 100644 (file)
 #include <unistd.h>
 #include <pthread.h>
 
+#include <geekos/synch.h>
+#include <geekos/kthread.h>
+#include <geekos/debug.h>
+#include <geekos/malloc.h>
+
 #include "lwip/sys.h"
 #include "lwip/opt.h"
 #include "lwip/stats.h"
@@ -60,7 +65,9 @@
 #define UMAX(a, b)      ((a) > (b) ? (a) : (b))
 
 static struct sys_thread *threads = NULL;
-static pthread_mutex_t threads_mutex = PTHREAD_MUTEX_INITIALIZER;
+
+//static pthread_mutex_t threads_mutex = PTHREAD_MUTEX_INITIALIZER;
+static struct Mutex threads_mutex; // !!!! need to be initiated, void Mutex_Init(struct Mutex* mutex);
 
 struct sys_mbox_msg {
   struct sys_mbox_msg *next;
@@ -79,108 +86,148 @@ struct sys_mbox {
 
 struct sys_sem {
   unsigned int c;
-  pthread_cond_t cond;
-  pthread_mutex_t mutex;
+  
+  //pthread_cond_t cond;
+  struct Condition cond;
+  
+  //pthread_mutex_t mutex;
+  struct Mutex mutex;
 };
 
 struct sys_thread {
   struct sys_thread *next;
   struct sys_timeouts timeouts;
-  pthread_t pthread;
+  
+ // pthread_t pthread;
+  struct Kernel_Thread *pthread;
 };
 
 
 static struct timeval starttime;
 
-static pthread_mutex_t lwprot_mutex = PTHREAD_MUTEX_INITIALIZER;
-static pthread_t lwprot_thread = (pthread_t) 0xDEAD;
+//static pthread_mutex_t lwprot_mutex = PTHREAD_MUTEX_INITIALIZER;
+static struct Mutex lwprot_mutex; // !!!! need to be initiated, void Mutex_Init(struct Mutex* mutex);
+
+//static pthread_t lwprot_thread = (pthread_t) 0xDEAD;
+static struct Kernel_Thread lwprot_thread = (struct Kernel_Thread) 0xDEAD;  //!!!!! how to set it to a NULL thread?
+
 static int lwprot_count = 0;
 
 static struct sys_sem *sys_sem_new_(u8_t count);
 static void sys_sem_free_(struct sys_sem *sem);
 
-static u32_t cond_wait(pthread_cond_t * cond, pthread_mutex_t * mutex,
-                       u32_t timeout);
+static u32_t cond_wait(struct Condition *cond, struct Mutex *mutex, u32_t timeout);
+
 
 /*-----------------------------------------------------------------------------------*/
 static struct sys_thread * 
-introduce_thread(pthread_t id)
+introduce_thread(struct Kernel_Thread *id /*pthread_t id*/)
 {
   struct sys_thread *thread;
   
-  thread = malloc(sizeof(struct sys_thread));
+  thread = (struct sys_thread *)Malloc(sizeof(struct sys_thread)); 
     
   if (thread != NULL) {
-    pthread_mutex_lock(&threads_mutex);
+    //pthread_mutex_lock(&threads_mutex);
+    Mutex_Lock(&threads_mutex);
+       
     thread->next = threads;
     thread->timeouts.next = NULL;
     thread->pthread = id;
     threads = thread;
-    pthread_mutex_unlock(&threads_mutex);
+
+    //pthread_mutex_unlock(&threads_mutex);
+    Mutex_Unlock(&threads_mutex);
   }
     
   return thread;
 }
+
+static int thread_equal(struct Kernel_Thread *kth1, struct Kernel_Thread *kth2){  //added
+
+       return (kth1->pid == kth2->pid);
+
+}
+
 /*-----------------------------------------------------------------------------------*/
 static struct sys_thread *
 current_thread(void)
 {
   struct sys_thread *st;
-  pthread_t pt;
-  pt = pthread_self();
-  pthread_mutex_lock(&threads_mutex);
+  
+  //pthread_t pt;
+  struct Kernel_Thread *pt;
+  
+  //pt = pthread_self();
+  //!!!!!!!!!!!Do these have the same means? Not sure
+  pt = Get_Current();
+  
+  //pthread_mutex_lock(&threads_mutex);
+  Mutex_Lock(&threads_mutex);
 
   for(st = threads; st != NULL; st = st->next) {    
-    if (pthread_equal(st->pthread, pt)) {
-      pthread_mutex_unlock(&threads_mutex);
-      
+    if (thread_equal(st->pthread, pt)) {
+      //pthread_mutex_unlock(&threads_mutex);
+      Mutex_Unlock(&threads_mutex);
+
       return st;
     }
   }
 
-  pthread_mutex_unlock(&threads_mutex);
+  //pthread_mutex_unlock(&threads_mutex);
+  Mutex_Unlock(&threads_mutex);
 
   st = introduce_thread(pt);
 
   if (!st) {
-    printf("current_thread???\n");
+    PrintBoth("lwIP error: In current_thread: Can not get current_thread\n");
     abort();
   }
 
   return st;
 }
+
+
+//!!!!!!!!!!!!backto this function later
 /*-----------------------------------------------------------------------------------*/
 sys_thread_t
 sys_thread_new(char *name, void (* function)(void *arg), void *arg, int stacksize, int prio)
 {
   int code;
-  pthread_t tmp;
+  //pthread_t tmp;
+  struct Kernel_Thread *tmp;
   struct sys_thread *st = NULL;
   
-  code = pthread_create(&tmp,
+  //tmp = (struct Kernel_Thread *)Malloc(sizeof(struct Kernel_Thread));
+  
+  /* code = pthread_create(&tmp,
                         NULL, 
                         (void *(*)(void *)) 
                         function, 
-                        arg);
+                        arg); */
+                       
+  tmp = Start_Kernel_Thread(function, arg, PRIORITY_NORMAL , false);  //did not consider the priority here
   
-  if (0 == code) {
+  if (tmp != NULL) {
     st = introduce_thread(tmp);
   }
   
   if (NULL == st) {
-    LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_new: pthread_create %d, st = 0x%x",
-                       code, (int)st));
+    LWIP_DEBUGF(SYS_DEBUG, ("sys_thread_new: pthread_create: 0x%x, st = 0x%x",
+                       (int)tmp, (int)st));
     abort();
   }
   return st;
 }
+
+
 /*-----------------------------------------------------------------------------------*/
 struct sys_mbox *
 sys_mbox_new(int size)
 {
   struct sys_mbox *mbox;
   
-  mbox = malloc(sizeof(struct sys_mbox));
+  mbox = (struct sys_mbox *)Malloc(sizeof(struct sys_mbox));
   if (mbox != NULL) {
     mbox->first = mbox->last = 0;
     mbox->mail = sys_sem_new_(0);
@@ -210,7 +257,8 @@ sys_mbox_free(struct sys_mbox *mbox)
     sys_sem_free_(mbox->mutex);
     mbox->mail = mbox->mutex = NULL;
     /*  LWIP_DEBUGF("sys_mbox_free: mbox 0x%lx\n", mbox); */
-    free(mbox);
+
+    Free(mbox); 
   }
 }
 /*-----------------------------------------------------------------------------------*/
@@ -373,29 +421,37 @@ sys_sem_new_(u8_t count)
 {
   struct sys_sem *sem;
   
-  sem = malloc(sizeof(struct sys_sem));
+  sem = (struct sys_sem *)Malloc(sizeof(struct sys_sem));
   if (sem != NULL) {
     sem->c = count;
-    pthread_cond_init(&(sem->cond), NULL);
-    pthread_mutex_init(&(sem->mutex), NULL);
+
+    //pthread_cond_init(&(sem->cond), NULL);
+    Cond_Init(&(sem->cond));
+    
+    //pthread_mutex_init(&(sem->mutex), NULL);
+    Mutex_Init(&(sem->mutex));
   }
   return sem;
 }
 
+
 /*-----------------------------------------------------------------------------------*/
 static u32_t
-cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex, u32_t timeout)
+cond_wait(struct Condition *cond, struct Mutex *mutex, u32_t timeout /* timeout is in miliseconds *//* pthread_cond_t *cond, pthread_mutex_t *mutex, u32_t timeout */)
 {
-  int tdiff;
-  unsigned long sec, usec;
+  ulong_t tdiff, msec;
+
+  /*
   struct timeval rtime1, rtime2;
   struct timespec ts;
   struct timezone tz;
+  */
   int retval;
-  
+
   if (timeout > 0) {
+
     /* Get a timestamp and add the timeout value. */
-    gettimeofday(&rtime1, &tz);
+    /*gettimeofday(&rtime1, &tz);
     sec = rtime1.tv_sec;
     usec = rtime1.tv_usec;
     usec += timeout % 1000 * 1000;
@@ -403,16 +459,27 @@ cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex, u32_t timeout)
     usec = usec % 1000000;
     ts.tv_nsec = usec * 1000;
     ts.tv_sec = sec;
-    
-    retval = pthread_cond_timedwait(cond, mutex, &ts);
+    */
+    msec = clock_time();
+  
+    if (Cond_Wait_Timeout(cond, mutex, timeout) == 1) //return due to timeout
+               retval = ETIMEDOUT;
+       
+    //retval = pthread_cond_timedwait(cond, mutex, &ts);
     
     if (retval == ETIMEDOUT) {
       return SYS_ARCH_TIMEOUT;
     } else {
       /* Calculate for how long we waited for the cond. */
+
+      /*
       gettimeofday(&rtime2, &tz);
       tdiff = (rtime2.tv_sec - rtime1.tv_sec) * 1000 +
         (rtime2.tv_usec - rtime1.tv_usec) / 1000;
+      */
+      tdiff = clock_time();
+
+      tdiff -= msec;
       
       if (tdiff <= 0) {
         return 0;
@@ -421,7 +488,9 @@ cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex, u32_t timeout)
       return tdiff;
     }
   } else {
-    pthread_cond_wait(cond, mutex);
+    //pthread_cond_wait(cond, mutex);
+    Cond_Wait(cond, mutex);
+       
     return SYS_ARCH_TIMEOUT;
   }
 }
@@ -431,38 +500,50 @@ sys_arch_sem_wait(struct sys_sem *sem, u32_t timeout)
 {
   u32_t time = 0;
   
-  pthread_mutex_lock(&(sem->mutex));
+  //pthread_mutex_lock(&(sem->mutex));
+  Mutex_Lock(&(sem->mutex));
+  
   while (sem->c <= 0) {
     if (timeout > 0) {
       time = cond_wait(&(sem->cond), &(sem->mutex), timeout);
       
       if (time == SYS_ARCH_TIMEOUT) {
-        pthread_mutex_unlock(&(sem->mutex));
+        //pthread_mutex_unlock(&(sem->mutex));
+        Mutex_Unlock(&(sem->mutex));
+       
         return SYS_ARCH_TIMEOUT;
       }
       /*      pthread_mutex_unlock(&(sem->mutex));
               return time; */
-    } else {
+    } else {  // if timeout = 0
       cond_wait(&(sem->cond), &(sem->mutex), 0);
     }
   }
   sem->c--;
-  pthread_mutex_unlock(&(sem->mutex));
+  //pthread_mutex_unlock(&(sem->mutex));
+  Mutex_Unlock(&(sem->mutex));
+  
   return time;
 }
 /*-----------------------------------------------------------------------------------*/
 void
 sys_sem_signal(struct sys_sem *sem)
 {
-  pthread_mutex_lock(&(sem->mutex));
+  //pthread_mutex_lock(&(sem->mutex));
+  Mutex_Lock(&(sem->mutex));
+  
   sem->c++;
 
   if (sem->c > 1) {
     sem->c = 1;
   }
 
-  pthread_cond_broadcast(&(sem->cond));
-  pthread_mutex_unlock(&(sem->mutex));
+  //pthread_cond_broadcast(&(sem->cond));
+  Cond_Broadcast(&(sem->cond));
+  
+  //pthread_mutex_unlock(&(sem->mutex));
+  Mutex_Unlock(&(sem->mutex));
+  
 }
 /*-----------------------------------------------------------------------------------*/
 void
@@ -480,10 +561,17 @@ sys_sem_free(struct sys_sem *sem)
 static void
 sys_sem_free_(struct sys_sem *sem)
 {
-  pthread_cond_destroy(&(sem->cond));
-  pthread_mutex_destroy(&(sem->mutex));
-  free(sem);
+  //pthread_cond_destroy(&(sem->cond));
+  Cond_Destroy(&(sem->cond));
+  
+  //pthread_mutex_destroy(&(sem->mutex));
+  Mutex_Destroy(&(sem->mutex));
+  
+  Free(sem);
 }
+
+#if 0
+//return time, we do not need this
 /*-----------------------------------------------------------------------------------*/
 unsigned long
 sys_unix_now()
@@ -500,12 +588,18 @@ sys_unix_now()
     
   return msec;
 }
+#endif
+
 /*-----------------------------------------------------------------------------------*/
 void
 sys_init()
 {
-  struct timezone tz;
-  gettimeofday(&starttime, &tz);
+  //struct timezone tz;
+  //gettimeofday(&starttime, &tz);
+
+  Mutex_Init(&threads_mutex);
+  Mutex_Init(&lwprot_mutex);
+  
 }
 /*-----------------------------------------------------------------------------------*/
 struct sys_timeouts *
@@ -537,12 +631,12 @@ sys_arch_protect(void)
     /* Note that for the UNIX port, we are using a lightweight mutex, and our
      * own counter (which is locked by the mutex). The return code is not actually
      * used. */
-    if (lwprot_thread != pthread_self())
+    if (lwprot_thread != current_thread() /*lwprot_thread != pthread_self()*/)
     {
         /* We are locking the mutex where it has not been locked before *
         * or is being locked by another thread */
-        pthread_mutex_lock(&lwprot_mutex);
-        lwprot_thread = pthread_self();
+        Mutex_Lock(&lwprot_mutex);
+        lwprot_thread = current_thread();
         lwprot_count = 1;
     }
     else
@@ -561,12 +655,12 @@ an operating system.
 void
 sys_arch_unprotect(sys_prot_t pval)
 {
-    if (lwprot_thread == pthread_self())
+    if (lwprot_thread == current_thread())
     {
         if (--lwprot_count == 0)
         {
-            lwprot_thread = (pthread_t) 0xDEAD;
-            pthread_mutex_unlock(&lwprot_mutex);
+            lwprot_thread = (Kernel_Thread) 0xDEAD;
+            Mutex_Unlock(&lwprot_mutex);
         }
     }
 }
@@ -599,7 +693,7 @@ sys_jiffies(void)
 
 #if PPP_DEBUG
 
-#include <stdarg.h>
+#include <geekos/serial.h>
 
 void ppp_trace(int level, const char *format, ...)
 {
@@ -607,7 +701,10 @@ void ppp_trace(int level, const char *format, ...)
 
     (void)level;
     va_start(args, format);
-    vprintf(format, args);
+       
+    //vprintf(format, args);
+    SerialPrintList(format, args);
+       
     va_end(args);
 }
 #endif