[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 *)¤t()->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