--- /dev/null
+#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);
+}
+
#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__ */