Just FYI - still requires testing and more review - find a first
generator version below.

Jan


cobalt/posix/syscall: Generate cobalt_syscalls and cobalt_sysmodes

---
 .../arch/x86/include/asm/xenomai/syscall32.h       |  12 +-
 kernel/cobalt/posix/Makefile                       |  12 ++
 kernel/cobalt/posix/gen-syscall-entries.sh         |  24 +++
 kernel/cobalt/posix/syscall.c                      | 208 ++-------------------
 scripts/prepare-kernel.sh                          |   4 +-
 5 files changed, 57 insertions(+), 203 deletions(-)
 create mode 100755 kernel/cobalt/posix/gen-syscall-entries.sh

diff --git a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32.h 
b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32.h
index 8bd40d4..58b7336 100644
--- a/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32.h
+++ b/kernel/cobalt/arch/x86/include/asm/xenomai/syscall32.h
@@ -45,14 +45,14 @@
 #define __syshand32x__(__name) ((cobalt_syshand)(cobalt32x_ ## __name))
 
 #define __COBALT_CALL32x_INITHAND(__handler)   \
-  , [__COBALT_X32_BASE ... __COBALT_X32_BASE + __NR_COBALT_SYSCALLS-1] = 
__handler
+       [__COBALT_X32_BASE ... __COBALT_X32_BASE + __NR_COBALT_SYSCALLS-1] = 
__handler,
 
 #define __COBALT_CALL32x_INITMODE(__mode)      \
-  , [__COBALT_X32_BASE ... __COBALT_X32_BASE + __NR_COBALT_SYSCALLS-1] = __mode
+       [__COBALT_X32_BASE ... __COBALT_X32_BASE + __NR_COBALT_SYSCALLS-1] = 
__mode,
 
 /* x32 default entry (no thunk) */
 #define __COBALT_CALL32x_ENTRY(__name, __handler)              \
-       , [sc_cobalt_ ## __name + __COBALT_X32_BASE] = __handler
+       [sc_cobalt_ ## __name + __COBALT_X32_BASE] = __handler,
 
 /* x32 thunk installation */
 #define __COBALT_CALL32x_pure_THUNK(__name)    \
@@ -113,14 +113,14 @@
 #define __syshand32emu__(__name)       ((cobalt_syshand)(cobalt32emu_ ## 
__name))
 
 #define __COBALT_CALL32emu_INITHAND(__handler) \
-  , [__COBALT_IA32_BASE ... __COBALT_IA32_BASE + __NR_COBALT_SYSCALLS-1] = 
__handler
+       [__COBALT_IA32_BASE ... __COBALT_IA32_BASE + __NR_COBALT_SYSCALLS-1] = 
__handler,
 
 #define __COBALT_CALL32emu_INITMODE(__mode)    \
-  , [__COBALT_IA32_BASE ... __COBALT_IA32_BASE + __NR_COBALT_SYSCALLS-1] = 
__mode
+       [__COBALT_IA32_BASE ... __COBALT_IA32_BASE + __NR_COBALT_SYSCALLS-1] = 
__mode,
 
 /* ia32 default entry (no thunk) */
 #define __COBALT_CALL32emu_ENTRY(__name, __handler)            \
-       , [sc_cobalt_ ## __name + __COBALT_IA32_BASE] = __handler
+       [sc_cobalt_ ## __name + __COBALT_IA32_BASE] = __handler,
 
 /* ia32 thunk installation */
 #define __COBALT_CALL32emu_THUNK(__name)       \
diff --git a/kernel/cobalt/posix/Makefile b/kernel/cobalt/posix/Makefile
index 3049be4..2da764a 100644
--- a/kernel/cobalt/posix/Makefile
+++ b/kernel/cobalt/posix/Makefile
@@ -22,4 +22,16 @@ xenomai-y :=         \
        timer.o         \
        timerfd.o
 
+syscall_entries := $(srctree)/$(src)/gen-syscall-entries.sh
+
+quiet_cmd_syscall_entries = GEN     $@
+      cmd_syscall_entries = $(CONFIG_SHELL) '$(syscall_entries)' $^ > $@
+
+$(obj)/syscall_entries.h: $(syscall_entries) $(wildcard $(srctree)/$(src)/*.c)
+       $(call if_changed,syscall_entries)
+
+target += syscall_entries.h
+
+$(obj)/syscall.o: $(obj)/syscall_entries.h
+
 xenomai-$(CONFIG_XENO_ARCH_SYS3264) += compat.o syscall32.o
diff --git a/kernel/cobalt/posix/gen-syscall-entries.sh 
b/kernel/cobalt/posix/gen-syscall-entries.sh
new file mode 100755
index 0000000..36b1e69
--- /dev/null
+++ b/kernel/cobalt/posix/gen-syscall-entries.sh
@@ -0,0 +1,24 @@
+#! /bin/sh
+
+set -e
+
+shift
+
+echo "#ifdef COBALT_LIST_CALL_ENTRIES"
+awk '
+match($0, /COBALT_SYSCALL\([^,]*, [^,]*/)  {
+       str=substr($0, RSTART + 15, RLENGTH - 15)
+       match(str, /[^,]*/)
+       print "__COBALT_CALL_ENTRY(" substr(str, RSTART, RLENGTH) ")"
+}
+' $*
+echo "#endif"
+
+echo "#ifdef COBALT_LIST_MODES"
+awk '
+match($0, /COBALT_SYSCALL\([^,]*, [^,]*/)  {
+       str=substr($0, RSTART + 15, RLENGTH - 15)
+       print "__COBALT_MODE(" str ")"
+}
+' $*
+echo "#endif"
diff --git a/kernel/cobalt/posix/syscall.c b/kernel/cobalt/posix/syscall.c
index 36cfc3b..abe9fea 100644
--- a/kernel/cobalt/posix/syscall.c
+++ b/kernel/cobalt/posix/syscall.c
@@ -548,222 +548,40 @@ static int cobalt_ni(void)
 #define __COBALT_NI    __syshand__(ni)
 
 #define __COBALT_CALL_NI                               \
-       [0 ... __NR_COBALT_SYSCALLS-1] = __COBALT_NI    \
+       [0 ... __NR_COBALT_SYSCALLS-1] = __COBALT_NI,   \
        __COBALT_CALL32_INITHAND(__COBALT_NI)
 
 #define __COBALT_CALL_NFLAGS                           \
-       [0 ... __NR_COBALT_SYSCALLS-1] = 0              \
+       [0 ... __NR_COBALT_SYSCALLS-1] = 0,             \
        __COBALT_CALL32_INITMODE(0)
 
 #define __COBALT_CALL_ENTRY(__name)                            \
-       [sc_cobalt_ ## __name] = __syshand__(__name)            \
+       [sc_cobalt_ ## __name] = __syshand__(__name),           \
        __COBALT_CALL32_ENTRY(__name, __syshand__(__name))
 
 #define __COBALT_MODE(__name, __mode)  \
-       [sc_cobalt_ ## __name] = __xn_exec_##__mode
+       [sc_cobalt_ ## __name] = __xn_exec_##__mode,
 
 #ifdef CONFIG_XENO_ARCH_SYS3264
 #include "syscall32.h"
 #endif
 
 static const cobalt_syshand cobalt_syscalls[] = {
-       __COBALT_CALL_NI,
-       __COBALT_CALL_ENTRY(thread_create),
-       __COBALT_CALL_ENTRY(thread_getpid),
-       __COBALT_CALL_ENTRY(thread_setschedparam_ex),
-       __COBALT_CALL_ENTRY(thread_getschedparam_ex),
-       __COBALT_CALL_ENTRY(sched_weightprio),
-       __COBALT_CALL_ENTRY(sched_yield),
-       __COBALT_CALL_ENTRY(thread_setmode),
-       __COBALT_CALL_ENTRY(thread_setname),
-       __COBALT_CALL_ENTRY(thread_kill),
-       __COBALT_CALL_ENTRY(thread_getstat),
-       __COBALT_CALL_ENTRY(thread_join),
-       __COBALT_CALL_ENTRY(sem_init),
-       __COBALT_CALL_ENTRY(sem_destroy),
-       __COBALT_CALL_ENTRY(sem_post),
-       __COBALT_CALL_ENTRY(sem_wait),
-       __COBALT_CALL_ENTRY(sem_timedwait),
-       __COBALT_CALL_ENTRY(sem_trywait),
-       __COBALT_CALL_ENTRY(sem_getvalue),
-       __COBALT_CALL_ENTRY(sem_open),
-       __COBALT_CALL_ENTRY(sem_close),
-       __COBALT_CALL_ENTRY(sem_unlink),
-       __COBALT_CALL_ENTRY(sem_broadcast_np),
-       __COBALT_CALL_ENTRY(sem_inquire),
-       __COBALT_CALL_ENTRY(clock_getres),
-       __COBALT_CALL_ENTRY(clock_gettime),
-       __COBALT_CALL_ENTRY(clock_settime),
-       __COBALT_CALL_ENTRY(clock_nanosleep),
-       __COBALT_CALL_ENTRY(mutex_init),
-       __COBALT_CALL_ENTRY(mutex_check_init),
-       __COBALT_CALL_ENTRY(mutex_destroy),
-       __COBALT_CALL_ENTRY(mutex_lock),
-       __COBALT_CALL_ENTRY(mutex_timedlock),
-       __COBALT_CALL_ENTRY(mutex_trylock),
-       __COBALT_CALL_ENTRY(mutex_unlock),
-       __COBALT_CALL_ENTRY(cond_init),
-       __COBALT_CALL_ENTRY(cond_destroy),
-       __COBALT_CALL_ENTRY(cond_wait_prologue),
-       __COBALT_CALL_ENTRY(cond_wait_epilogue),
-       __COBALT_CALL_ENTRY(mq_open),
-       __COBALT_CALL_ENTRY(mq_close),
-       __COBALT_CALL_ENTRY(mq_unlink),
-       __COBALT_CALL_ENTRY(mq_getattr),
-       __COBALT_CALL_ENTRY(mq_timedsend),
-       __COBALT_CALL_ENTRY(mq_timedreceive),
-       __COBALT_CALL_ENTRY(mq_notify),
-       __COBALT_CALL_ENTRY(sigwait),
-       __COBALT_CALL_ENTRY(sigwaitinfo),
-       __COBALT_CALL_ENTRY(sigtimedwait),
-       __COBALT_CALL_ENTRY(sigpending),
-       __COBALT_CALL_ENTRY(kill),
-       __COBALT_CALL_ENTRY(sigqueue),
-       __COBALT_CALL_ENTRY(timer_create),
-       __COBALT_CALL_ENTRY(timer_delete),
-       __COBALT_CALL_ENTRY(timer_settime),
-       __COBALT_CALL_ENTRY(timer_gettime),
-       __COBALT_CALL_ENTRY(timer_getoverrun),
-       __COBALT_CALL_ENTRY(timerfd_create),
-       __COBALT_CALL_ENTRY(timerfd_gettime),
-       __COBALT_CALL_ENTRY(timerfd_settime),
-       __COBALT_CALL_ENTRY(select),
-       __COBALT_CALL_ENTRY(sched_minprio),
-       __COBALT_CALL_ENTRY(sched_maxprio),
-       __COBALT_CALL_ENTRY(monitor_init),
-       __COBALT_CALL_ENTRY(monitor_destroy),
-       __COBALT_CALL_ENTRY(monitor_enter),
-       __COBALT_CALL_ENTRY(monitor_wait),
-       __COBALT_CALL_ENTRY(monitor_sync),
-       __COBALT_CALL_ENTRY(monitor_exit),
-       __COBALT_CALL_ENTRY(event_init),
-       __COBALT_CALL_ENTRY(event_destroy),
-       __COBALT_CALL_ENTRY(event_wait),
-       __COBALT_CALL_ENTRY(event_sync),
-       __COBALT_CALL_ENTRY(event_inquire),
-       __COBALT_CALL_ENTRY(sched_setconfig_np),
-       __COBALT_CALL_ENTRY(sched_getconfig_np),
-       __COBALT_CALL_ENTRY(open),
-       __COBALT_CALL_ENTRY(socket),
-       __COBALT_CALL_ENTRY(close),
-       __COBALT_CALL_ENTRY(mmap),
-       __COBALT_CALL_ENTRY(ioctl),
-       __COBALT_CALL_ENTRY(read),
-       __COBALT_CALL_ENTRY(write),
-       __COBALT_CALL_ENTRY(recvmsg),
-       __COBALT_CALL_ENTRY(sendmsg),
-       __COBALT_CALL_ENTRY(migrate),
-       __COBALT_CALL_ENTRY(archcall),
-       __COBALT_CALL_ENTRY(bind),
-       __COBALT_CALL_ENTRY(extend),
-       __COBALT_CALL_ENTRY(trace),
-       __COBALT_CALL_ENTRY(get_current),
-       __COBALT_CALL_ENTRY(backtrace),
-       __COBALT_CALL_ENTRY(serialdbg),
-       __COBALT_CALL_ENTRY(corectl),
-       __COBALT_CALL_ENTRY(fcntl)
-       /* NO COMMA AT END */
+       __COBALT_CALL_NI
+#define COBALT_LIST_CALL_ENTRIES 1
+#include "syscall_entries.h"
+#undef COBALT_LIST_CALL_ENTRIES
+
 #ifdef CONFIG_XENO_ARCH_SYS3264
 #include <asm/xenomai/syscall32-table.h>
 #endif
 };
 
 static const int cobalt_sysmodes[] = {
-       __COBALT_CALL_NFLAGS,
-       __COBALT_MODE(thread_create, init),
-       __COBALT_MODE(thread_getpid, current),
-       __COBALT_MODE(thread_setschedparam_ex, conforming),
-       __COBALT_MODE(thread_getschedparam_ex, current),
-       __COBALT_MODE(sched_weightprio, current),
-       __COBALT_MODE(sched_yield, primary),
-       __COBALT_MODE(thread_setmode, primary),
-       __COBALT_MODE(thread_setname, current),
-       __COBALT_MODE(thread_kill, conforming),
-       __COBALT_MODE(thread_getstat, current),
-       __COBALT_MODE(thread_join, primary),
-       __COBALT_MODE(sem_init, current),
-       __COBALT_MODE(sem_destroy, current),
-       __COBALT_MODE(sem_post, current),
-       __COBALT_MODE(sem_wait, primary),
-       __COBALT_MODE(sem_timedwait, primary),
-       __COBALT_MODE(sem_trywait, primary),
-       __COBALT_MODE(sem_getvalue, current),
-       __COBALT_MODE(sem_open, lostage),
-       __COBALT_MODE(sem_close, lostage),
-       __COBALT_MODE(sem_unlink, lostage),
-       __COBALT_MODE(sem_broadcast_np, current),
-       __COBALT_MODE(sem_inquire, current),
-       __COBALT_MODE(clock_getres, current),
-       __COBALT_MODE(clock_gettime, current),
-       __COBALT_MODE(clock_settime, current),
-       __COBALT_MODE(clock_nanosleep, nonrestartable),
-       __COBALT_MODE(mutex_init, current),
-       __COBALT_MODE(mutex_check_init, current),
-       __COBALT_MODE(mutex_destroy, current),
-       __COBALT_MODE(mutex_lock, primary),
-       __COBALT_MODE(mutex_timedlock, primary),
-       __COBALT_MODE(mutex_trylock, primary),
-       __COBALT_MODE(mutex_unlock, nonrestartable),
-       __COBALT_MODE(cond_init, current),
-       __COBALT_MODE(cond_destroy, current),
-       __COBALT_MODE(cond_wait_prologue, nonrestartable),
-       __COBALT_MODE(cond_wait_epilogue, primary),
-       __COBALT_MODE(mq_open, lostage),
-       __COBALT_MODE(mq_close, lostage),
-       __COBALT_MODE(mq_unlink, lostage),
-       __COBALT_MODE(mq_getattr, current),
-       __COBALT_MODE(mq_timedsend, primary),
-       __COBALT_MODE(mq_timedreceive, primary),
-       __COBALT_MODE(mq_notify, primary),
-       __COBALT_MODE(sigwait, primary),
-       __COBALT_MODE(sigwaitinfo, nonrestartable),
-       __COBALT_MODE(sigtimedwait, nonrestartable),
-       __COBALT_MODE(sigpending, primary),
-       __COBALT_MODE(kill, conforming),
-       __COBALT_MODE(sigqueue, conforming),
-       __COBALT_MODE(timer_create, current),
-       __COBALT_MODE(timer_delete, current),
-       __COBALT_MODE(timer_settime, primary),
-       __COBALT_MODE(timer_gettime, current),
-       __COBALT_MODE(timer_getoverrun, current),
-       __COBALT_MODE(timerfd_create, lostage),
-       __COBALT_MODE(timerfd_gettime, current),
-       __COBALT_MODE(timerfd_settime, primary),
-       __COBALT_MODE(select, nonrestartable),
-       __COBALT_MODE(sched_minprio, current),
-       __COBALT_MODE(sched_maxprio, current),
-       __COBALT_MODE(monitor_init, current),
-       __COBALT_MODE(monitor_destroy, primary),
-       __COBALT_MODE(monitor_enter, primary),
-       __COBALT_MODE(monitor_wait, nonrestartable),
-       __COBALT_MODE(monitor_sync, nonrestartable),
-       __COBALT_MODE(monitor_exit, primary),
-       __COBALT_MODE(event_init, current),
-       __COBALT_MODE(event_destroy, current),
-       __COBALT_MODE(event_wait, primary),
-       __COBALT_MODE(event_sync, current),
-       __COBALT_MODE(event_inquire, current),
-       __COBALT_MODE(sched_setconfig_np, conforming),
-       __COBALT_MODE(sched_getconfig_np, conforming),
-       __COBALT_MODE(open, lostage),
-       __COBALT_MODE(socket, lostage),
-       __COBALT_MODE(close, lostage),
-       __COBALT_MODE(mmap, lostage),
-       __COBALT_MODE(ioctl, probing),
-       __COBALT_MODE(read, probing),
-       __COBALT_MODE(write, probing),
-       __COBALT_MODE(recvmsg, probing),
-       __COBALT_MODE(sendmsg, probing),
-       __COBALT_MODE(migrate, current),
-       __COBALT_MODE(archcall, current),
-       __COBALT_MODE(bind, lostage),
-       __COBALT_MODE(extend, lostage),
-       __COBALT_MODE(trace, current),
-       __COBALT_MODE(get_current, current),
-       __COBALT_MODE(backtrace, lostage),
-       __COBALT_MODE(serialdbg, current),
-       __COBALT_MODE(corectl, probing),
-       __COBALT_MODE(fcntl, current),
+       __COBALT_CALL_NFLAGS
+#define COBALT_LIST_MODES 1
+#include "syscall_entries.h"
+#undef COBALT_LIST_MODES
 };
 
 static inline int allowed_syscall(struct cobalt_process *process,
diff --git a/scripts/prepare-kernel.sh b/scripts/prepare-kernel.sh
index dbc5d24..8e960e8 100755
--- a/scripts/prepare-kernel.sh
+++ b/scripts/prepare-kernel.sh
@@ -100,8 +100,8 @@ patch_link() {
               recursive_opt="-maxdepth 1"
               dir_opt=""
            fi
-          find_clean_opt="$recursive_opt \( $dir_opt $link_makefiles_opt -name 
Kconfig -o -name '*.[chS]' \)"
-          find_link_opt="$recursive_opt \( $link_makefiles_opt -name Kconfig 
-o -name '*.[chS]' \)"
+          find_clean_opt="$recursive_opt \( $dir_opt $link_makefiles_opt -name 
Kconfig -o -name '*.[chS]' -o -name '*.sh' \)"
+          find_link_opt="$recursive_opt \( $link_makefiles_opt -name Kconfig 
-o -name '*.[chS]' -o -name '*.sh' \)"
        fi
 
         if test "x$output_patch" = "x" -a -e $linux_tree/$link_dir; then
-- 
2.1.4

_______________________________________________
Xenomai mailing list
[email protected]
http://xenomai.org/mailman/listinfo/xenomai

Reply via email to