[syslinux:lwip] lwip: Enable thread support

syslinux-bot for Eric W. Biederman ebiederm at xmission.com
Fri Apr 22 20:05:11 PDT 2011


Commit-ID:  6e7fa271784a1fe3cf8d3350c605d56fb6ba5c54
Gitweb:     http://syslinux.zytor.com/commit/6e7fa271784a1fe3cf8d3350c605d56fb6ba5c54
Author:     Eric W. Biederman <ebiederm at xmission.com>
AuthorDate: Fri, 8 Apr 2011 15:57:11 -0700
Committer:  Eric W. Biederman <ebiederm at xmission.com>
CommitDate: Sat, 9 Apr 2011 18:27:07 -0700

lwip:  Enable thread support

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 at xmission.com>


---
 core/lwip/src/arch/sys_arch.c         |   85 +++++++++++++++++++++++++++++++++
 core/lwip/src/include/arch/sys_arch.h |   72 ++++++++++++++++++++++++++++
 core/lwip/src/include/lwipopts.h      |    5 +--
 3 files changed, 158 insertions(+), 4 deletions(-)

diff --git a/core/lwip/src/arch/sys_arch.c b/core/lwip/src/arch/sys_arch.c
new file mode 100644
index 0000000..b0bc0b6
--- /dev/null
+++ b/core/lwip/src/arch/sys_arch.c
@@ -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);
+}
+
diff --git a/core/lwip/src/include/arch/sys_arch.h b/core/lwip/src/include/arch/sys_arch.h
index f5ab07e..7bae904 100644
--- a/core/lwip/src/include/arch/sys_arch.h
+++ b/core/lwip/src/include/arch/sys_arch.h
@@ -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__ */
diff --git a/core/lwip/src/include/lwipopts.h b/core/lwip/src/include/lwipopts.h
index 656c45f..0c67968 100644
--- a/core/lwip/src/include/lwipopts.h
+++ b/core/lwip/src/include/lwipopts.h
@@ -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__ */



More information about the Syslinux-commits mailing list