Extern'd some harts functions
authorAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Mon, 30 Nov 2009 04:20:25 +0000 (20:20 -0800)
committerAndrew Waterman <waterman@r53.millennium.berkeley.edu>
Mon, 30 Nov 2009 04:20:25 +0000 (20:20 -0800)
kern/arch/i386/ros/hart.h
kern/arch/sparc/ros/hart.h
user/parlib/inc/hart.h
user/parlib/inc/pthread.h
user/parlib/src/hart.c
user/parlib/src/parlibmain.c
user/parlib/src/pthread.c

index 8bf3e45..7addcc8 100644 (file)
@@ -14,13 +14,13 @@ __hart_self()
 }
 
 static inline void
-hart_relax()
+__hart_relax()
 {
        asm volatile ("pause" : : : "memory");
 }
 
-static inline size_t
-hart_swap(size_t* addr, size_t val)
+static inline int
+__hart_swap(int* addr, int val)
 {
        asm volatile ("xchg %0, (%2)" : "=r"(val) : "0"(val),"r"(addr) : "memory");
        return val;
index 7df62f4..7fa04d8 100644 (file)
@@ -18,15 +18,15 @@ __hart_self()
 }
 
 static inline void
-hart_relax()
+__hart_relax()
 {
        // TODO: relax
 }
 
-static inline size_t
-hart_swap(size_t* addr, size_t val)
+static inline int
+__hart_swap(int* addr, int val)
 {
-       asm volatile ("swap [%2],%0" : "=r"(val) : "0"(val),"r"(addr) : "memory");
+       asm volatile ("swap [%2],%0" :"=r"(val) :"0"(val),"r"(addr) :"memory");
        return val;
 }
 
index 553e562..8c2d937 100644 (file)
@@ -55,6 +55,8 @@ void hart_lock_lock(hart_lock_t* l);
 
 // "int" rather than size_t because of a newlib compiling issue
 int hart_self();
+void hart_relax();
+int hart_swap(int* addr, int val);
 
 error_t hart_request(size_t k);
 void hart_yield();
index b0cabf3..f369049 100644 (file)
@@ -24,7 +24,7 @@ typedef struct
 typedef struct
 {
   const pthread_mutexattr_t* attr;
-  size_t lock;
+  int lock;
 } pthread_mutex_t;
 
 typedef struct
@@ -51,7 +51,7 @@ typedef struct pthread_wqt work_queue_t;
 typedef work_queue_t* pthread_t;
 typedef int pthread_attr_t;
 typedef int pthread_barrierattr_t;
-typedef size_t pthread_once_t;
+typedef int pthread_once_t;
 typedef void** pthread_key_t;
 
 #define PTHREAD_ONCE_INIT 0
index 9afb5c7..322726b 100644 (file)
@@ -15,12 +15,6 @@ static void hart_abort(const char* str)
        exit(-1);
 }
 
-#pragma weak hart_entry
-void hart_entry()
-{
-       hart_abort("You should write your own damn hart_entry()!\n");
-}
-
 static void _hart_init()
 {
        static int initialized = 0;
@@ -118,7 +112,7 @@ void hart_lock_init(hart_lock_t* lock)
 
 static inline hart_lock_qnode_t* hart_qnode_swap(hart_lock_qnode_t** addr, hart_lock_qnode_t* val)
 {
-       return (hart_lock_qnode_t*)hart_swap((size_t*)addr,(size_t)val);
+       return (hart_lock_qnode_t*)hart_swap((int*)addr,(int)val);
 }
 
 void hart_lock_lock(hart_lock_t* lock)
@@ -204,3 +198,16 @@ hart_self()
        // defined in ros/arch/hart.h
        return __hart_self();
 }
+
+int
+hart_swap(int* addr, int val)
+{
+       return __hart_swap(addr,val);
+}
+
+void
+hart_relax()
+{
+       __hart_relax();
+}
+
index 15afb5e..09e3165 100644 (file)
@@ -14,7 +14,7 @@ void parlib_dtors()
        int ndtor = ((unsigned int)(__DTOR_END__ - __DTOR_LIST__))/sizeof(void*);
 
        // make sure only one thread actually runs the dtors
-       static size_t already_done = 0;
+       static int already_done = 0;
        if(hart_swap(&already_done,1) == 1)
                return;
 
index 40fa669..8656f65 100644 (file)
@@ -31,6 +31,7 @@ pthread_t queue_remove(pthread_t* head, pthread_t* tail)
   return node;
 }
 
+#pragma weak hart_entry
 void hart_entry()
 {
   pthread_t node = NULL;