lwip: Enable thread support
authorEric W. Biederman <ebiederm@xmission.com>
Fri, 8 Apr 2011 22:57:11 +0000 (15:57 -0700)
committerEric W. Biederman <ebiederm@xmission.com>
Sun, 10 Apr 2011 01:27:07 +0000 (18:27 -0700)
Now that all of the syslinux support code has been built for
threads enable using that support in lwip.

Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
core/lwip/src/arch/sys_arch.c [new file with mode: 0644]
core/lwip/src/include/arch/sys_arch.h
core/lwip/src/include/lwipopts.h

diff --git a/core/lwip/src/arch/sys_arch.c b/core/lwip/src/arch/sys_arch.c
new file mode 100644 (file)
index 0000000..b0bc0b6
--- /dev/null
@@ -0,0 +1,85 @@
+#include "arch/sys_arch.h"
+#include "lwip/sys.h"
+#include "lwip/mem.h"
+#include <stdlib.h>
+#include <thread.h>
+
+void sys_init(void)
+{
+}
+
+sys_sem_t sys_sem_new(u8_t count)
+{
+    sys_sem_t sem = malloc(sizeof(struct semaphore));
+    if (!sem)
+       return NULL;
+
+    sem_init(sem, count);
+    return sem;
+}
+
+void sys_sem_free(sys_sem_t sem)
+{
+    free(sem);
+}
+
+u32_t sys_arch_sem_wait(sys_sem_t sem, u32_t timeout)
+{
+    mstime_t rv;
+
+    rv = sem_down(sem, timeout);
+    if (rv == (mstime_t)-1)
+       return SYS_ARCH_TIMEOUT;
+    else
+       return rv;
+}
+
+sys_mbox_t sys_mbox_new(int size)
+{
+    struct mailbox *mbox;
+
+    mbox = malloc(sizeof(struct mailbox) + size*sizeof(void *));
+    if (!mbox)
+       return NULL;
+
+    mbox_init(mbox, size);
+    return mbox;
+}
+
+void sys_mbox_free(sys_mbox_t mbox)
+{
+    free(mbox);
+}
+
+void sys_mbox_post(sys_mbox_t mbox, void *msg)
+{
+    mbox_post(mbox, msg, 0);
+}
+
+err_t sys_mbox_trypost(sys_mbox_t mbox, void *msg)
+{
+    return mbox_post(mbox, msg, -1);
+}
+
+u32_t sys_arch_mbox_fetch(sys_mbox_t mbox, void **msg, u32_t timeout)
+{
+    mstime_t rv;
+
+    rv = mbox_fetch(mbox, msg, timeout);
+    if (rv == (mstime_t)-1)
+       return SYS_ARCH_TIMEOUT;
+    else
+       return rv;
+}
+
+u32_t sys_arch_mbox_tryfetch(sys_mbox_t mbox, void **msg)
+{
+    return mbox_fetch(mbox, msg, -1);
+}
+
+sys_thread_t sys_thread_new(char *name, void (*thread)(void *),
+                            void *arg, int stacksize, int prio)
+{
+    return start_thread(name, stacksize, prio, thread, arg);
+}
+
index f5ab07e..7bae904 100644 (file)
@@ -3,5 +3,77 @@
 
 #include <stddef.h>
 #include "arch/cc.h"
+#include <thread.h>
+#include <mbox.h>
+
+typedef struct semaphore *sys_sem_t;
+typedef struct mailbox   *sys_mbox_t;
+typedef struct thread    *sys_thread_t;
+
+#define sys_sem_signal(x) sem_up(x)
+
+#define SYS_MBOX_NULL  NULL
+#define SYS_SEM_NULL   NULL
+
+extern void __compile_time_error(void);
+
+#define SYS_ARCH_OP(var, val, inc, add)                                        \
+do {                                                                   \
+    if (__builtin_constant_p(val) && (val) == 1) {                     \
+       switch (sizeof(var)) {                                          \
+       case 1:                                                         \
+           asm volatile(inc "b %0" : "+m" (var));                      \
+           break;                                                      \
+       case 2:                                                         \
+           asm volatile(inc "w %0" : "+m" (var));                      \
+           break;                                                      \
+       case 4:                                                         \
+           asm volatile(inc "l %0" : "+m" (var));                      \
+           break;                                                      \
+       default:                                                        \
+           __compile_time_error();                                     \
+           break;                                                      \
+       }                                                               \
+    } else {                                                           \
+       switch (sizeof(var)) {                                          \
+       case 1:                                                         \
+           asm volatile(add "b %1,%0" : "+m" (var) : "ri" (val));      \
+           break;                                                      \
+       case 2:                                                         \
+           asm volatile(add "w %1,%0" : "+m" (var) : "ri" (val));      \
+           break;                                                      \
+       case 4:                                                         \
+           asm volatile(add "l %1,%0" : "+m" (var) : "ri" (val));      \
+           break;                                                      \
+       default:                                                        \
+           __compile_time_error();                                     \
+           break;                                                      \
+       }                                                               \
+    }                                                                  \
+} while (0)
+
+static inline struct sys_timeouts *sys_arch_timeouts(void)
+{
+    return (struct sys_timeouts *)&current()->pvt;
+}
+
+#define SYS_ARCH_INC(var, val) SYS_ARCH_OP(var, val, "inc", "add")
+#define SYS_ARCH_DEC(var, val) SYS_ARCH_OP(var, val, "dec", "sub")
+
+#define SYS_ARCH_GET(var, ret)                                 \
+    do {                                                       \
+        volatile __typeof__(var) * const __varp = &(var);      \
+       ret = *__varp;                                          \
+    } while (0)
+
+#define SYS_ARCH_SET(var, val)                                 \
+    do {                                                       \
+        volatile __typeof__(var) * const __varp = &(var);      \
+       *__varp = val;                                          \
+    } while (0)
+
+#define SYS_ARCH_DECL_PROTECT(VAR) irq_state_t VAR
+#define SYS_ARCH_PROTECT(VAR) VAR = irq_save()
+#define SYS_ARCH_UNPROTECT(VAR) irq_restore(VAR)
 
 #endif /* __LWIP_ARCH_SYS_ARCH_H__ */
index 656c45f..0c67968 100644 (file)
@@ -1,9 +1,6 @@
 #ifndef __LWIPOPTS_H__
 #define __LWIPOPTS_H__
 
-/* Disable most things so I can get lwip to build */
-#define NO_SYS 1
-#define LWIP_NETCONN 0
-#define LWIP_SOCKET 0
+#define SYS_LIGHTWEIGHT_PROT   1
 
 #endif /* __LWIPOPTS_H__ */