From 4695b332e2dd67b7c1962d84c95306db0132a189 Mon Sep 17 00:00:00 2001 From: NAKAMURA Gou Date: Tue, 18 Jun 2013 15:03:47 +0900 Subject: [PATCH] move syscall_table[] to the architecture-depended part --- arch/x86/kernel/include/syscall_list.h | 69 +++++++++++++ arch/x86/kernel/syscall.c | 47 +++++++++ kernel/include/syscall.h | 46 +++++++++ kernel/syscall.c | 132 +------------------------ 4 files changed, 163 insertions(+), 131 deletions(-) create mode 100644 arch/x86/kernel/include/syscall_list.h create mode 100644 arch/x86/kernel/syscall.c diff --git a/arch/x86/kernel/include/syscall_list.h b/arch/x86/kernel/include/syscall_list.h new file mode 100644 index 00000000..ba02600b --- /dev/null +++ b/arch/x86/kernel/include/syscall_list.h @@ -0,0 +1,69 @@ +/* + * [x86] syscall_list.h + */ + +/* + * SYSCALL_HANDLED(number, name) + * defines the system call that handled by McKernel. + * handler is defined with SYSCALL_DECLARE. + * + * SYSCALL_DELEGATED(number, name) + * defines the system call that is just delegated to the host. + * syscall_name[] only, no handler exists. + */ + +SYSCALL_DELEGATED(0, read) +SYSCALL_DELEGATED(1, write) +SYSCALL_HANDLED(2, open) +SYSCALL_DELEGATED(3, close) +SYSCALL_DELEGATED(4, stat) +SYSCALL_DELEGATED(5, fstat) +SYSCALL_DELEGATED(8, lseek) +SYSCALL_HANDLED(9, mmap) +SYSCALL_HANDLED(10, mprotect) +SYSCALL_HANDLED(11, munmap) +SYSCALL_HANDLED(12, brk) +SYSCALL_HANDLED(13, rt_sigaction) +SYSCALL_HANDLED(14, rt_sigprocmask) +SYSCALL_DELEGATED(16, ioctl) +SYSCALL_DELEGATED(17, pread) +SYSCALL_DELEGATED(18, pwrite) +SYSCALL_DELEGATED(20, writev) +SYSCALL_DELEGATED(21, access) +SYSCALL_HANDLED(24, sched_yield) +SYSCALL_HANDLED(28, madvise) +SYSCALL_HANDLED(39, getpid) +SYSCALL_HANDLED(56, clone) +SYSCALL_HANDLED(60, exit) +SYSCALL_DELEGATED(63, uname) +SYSCALL_DELEGATED(72, fcntl) +SYSCALL_DELEGATED(79, getcwd) +SYSCALL_DELEGATED(89, readlink) +SYSCALL_DELEGATED(96, gettimeofday) +SYSCALL_HANDLED(97, getrlimit) +SYSCALL_DELEGATED(102, getuid) +SYSCALL_DELEGATED(104, getgid) +SYSCALL_DELEGATED(107, geteuid) +SYSCALL_DELEGATED(108, getegid) +SYSCALL_DELEGATED(110, getpgid) +SYSCALL_DELEGATED(111, getppid) +SYSCALL_HANDLED(158, arch_prctl) +SYSCALL_DELEGATED(201, time) +SYSCALL_HANDLED(202, futex) +SYSCALL_HANDLED(203, sched_setaffinity) +SYSCALL_HANDLED(204, sched_getaffinity) +SYSCALL_DELEGATED(217, getdents64) +SYSCALL_HANDLED(218, set_tid_address) +SYSCALL_HANDLED(231, exit_group) +SYSCALL_HANDLED(234, tgkill) +SYSCALL_HANDLED(273, set_robust_list) +#ifdef DCFA_KMOD +SYSCALL_HANDLED(303, mod_call) +#endif +SYSCALL_HANDLED(502, process_data_section) +SYSCALL_HANDLED(601, pmc_init) +SYSCALL_HANDLED(602, pmc_start) +SYSCALL_HANDLED(603, pmc_stop) +SYSCALL_HANDLED(604, pmc_reset) + +/**** End of File ****/ diff --git a/arch/x86/kernel/syscall.c b/arch/x86/kernel/syscall.c new file mode 100644 index 00000000..0a5232d1 --- /dev/null +++ b/arch/x86/kernel/syscall.c @@ -0,0 +1,47 @@ +/* + * [x86] syscall.c + */ + +#include +#include +#include + +//#define DEBUG_PRINT_SC + +#ifdef DEBUG_PRINT_SC +#define dkprintf kprintf +#else +#define dkprintf(...) +#endif + +/* generate system call handler's prototypes */ +#define SYSCALL_HANDLED(number,name) extern long sys_##name(int n, ihk_mc_user_context_t *ctx); +#define SYSCALL_DELEGATED(number,name) +#include +#undef SYSCALL_HANDLED +#undef SYSCALL_DELEGATED + +/* generate syscall_table[] */ +long (*syscall_table[])(int, ihk_mc_user_context_t *) = { +#define SYSCALL_HANDLED(number,name) [number] = &sys_##name, +#define SYSCALL_DELEGATED(number,name) +#include +#undef SYSCALL_HANDLED +#undef SYSCALL_DELEGATED +}; + +/* # of elements of syscall_table[] */ +long syscall_table_elems = sizeof(syscall_table) / sizeof(syscall_table[0]); + +/* generate syscall_name[] */ +char *syscall_name[] = { +#define DECLARATOR(number,name) [number] = #name, +#define SYSCALL_HANDLED(number,name) DECLARATOR(number,sys_##name) +#define SYSCALL_DELEGATED(number,name) DECLARATOR(number,sys_##name) +#include +#undef DECLARATOR +#undef SYSCALL_HANDLED +#undef SYSCALL_DELEGATED +}; + +/* archtecture-depended syscall handlers */ diff --git a/kernel/include/syscall.h b/kernel/include/syscall.h index 5622af0e..272605c8 100644 --- a/kernel/include/syscall.h +++ b/kernel/include/syscall.h @@ -144,4 +144,50 @@ struct syscall_params { struct syscall_post post_buf IHK_DMA_ALIGN; }; +#define SYSCALL_DECLARE(name) long sys_##name(int n, ihk_mc_user_context_t *ctx) +#define SYSCALL_HEADER struct syscall_request request IHK_DMA_ALIGN; \ + request.number = n +#define SYSCALL_ARG_D(n) request.args[n] = ihk_mc_syscall_arg##n(ctx) +#define SYSCALL_ARG_MO(n) \ + do { \ + unsigned long __phys; \ + if (ihk_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table, \ + (void *)ihk_mc_syscall_arg##n(ctx),\ + &__phys)) { \ + return -EFAULT; \ + }\ + request.args[n] = __phys; \ + } while(0) +#define SYSCALL_ARG_MI(n) \ + do { \ + unsigned long __phys; \ + if (ihk_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table, \ + (void *)ihk_mc_syscall_arg##n(ctx),\ + &__phys)) { \ + return -EFAULT; \ + }\ + request.args[n] = __phys; \ + } while(0) + + +#define SYSCALL_ARGS_1(a0) SYSCALL_ARG_##a0(0) +#define SYSCALL_ARGS_2(a0, a1) SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1) +#define SYSCALL_ARGS_3(a0, a1, a2) SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ + SYSCALL_ARG_##a2(2) +#define SYSCALL_ARGS_4(a0, a1, a2, a3) \ + SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ + SYSCALL_ARG_##a2(2); SYSCALL_ARG_##a3(3) +#define SYSCALL_ARGS_6(a0, a1, a2, a3, a4, a5) \ + SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ + SYSCALL_ARG_##a2(2); SYSCALL_ARG_##a3(3); \ + SYSCALL_ARG_##a4(4); SYSCALL_ARG_##a5(5); + +#define SYSCALL_FOOTER return do_syscall(&request, ctx) + +extern long (*syscall_table[])(int n, ihk_mc_user_context_t *ctx); +extern char *syscall_name[]; +extern long syscall_table_elems; + +extern int do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx); + #endif diff --git a/kernel/syscall.c b/kernel/syscall.c index dddec12c..4c6cb134 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -97,46 +97,6 @@ int do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx) return res->ret; } -#define SYSCALL_DECLARE(name) long sys_##name(int n, ihk_mc_user_context_t *ctx) -#define SYSCALL_HEADER struct syscall_request request IHK_DMA_ALIGN; \ - request.number = n -#define SYSCALL_ARG_D(n) request.args[n] = ihk_mc_syscall_arg##n(ctx) -#define SYSCALL_ARG_MO(n) \ - do { \ - unsigned long __phys; \ - if (ihk_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table, \ - (void *)ihk_mc_syscall_arg##n(ctx),\ - &__phys)) { \ - return -EFAULT; \ - }\ - request.args[n] = __phys; \ - } while(0) -#define SYSCALL_ARG_MI(n) \ - do { \ - unsigned long __phys; \ - if (ihk_mc_pt_virt_to_phys(cpu_local_var(current)->vm->page_table, \ - (void *)ihk_mc_syscall_arg##n(ctx),\ - &__phys)) { \ - return -EFAULT; \ - }\ - request.args[n] = __phys; \ - } while(0) - - -#define SYSCALL_ARGS_1(a0) SYSCALL_ARG_##a0(0) -#define SYSCALL_ARGS_2(a0, a1) SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1) -#define SYSCALL_ARGS_3(a0, a1, a2) SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ - SYSCALL_ARG_##a2(2) -#define SYSCALL_ARGS_4(a0, a1, a2, a3) \ - SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ - SYSCALL_ARG_##a2(2); SYSCALL_ARG_##a3(3) -#define SYSCALL_ARGS_6(a0, a1, a2, a3, a4, a5) \ - SYSCALL_ARG_##a0(0); SYSCALL_ARG_##a1(1); \ - SYSCALL_ARG_##a2(2); SYSCALL_ARG_##a3(3); \ - SYSCALL_ARG_##a4(4); SYSCALL_ARG_##a5(5); - -#define SYSCALL_FOOTER return do_syscall(&request, ctx) - SYSCALL_DECLARE(open) { @@ -872,96 +832,6 @@ SYSCALL_DECLARE(pmc_reset) return ihk_mc_perfctr_reset(counter); } -static long (*syscall_table[])(int, ihk_mc_user_context_t *) = { - [2] = sys_open, - [9] = sys_mmap, - [10] = sys_mprotect, - [11] = sys_munmap, - [12] = sys_brk, - [13] = sys_rt_sigaction, - [14] = sys_rt_sigprocmask, - [24] = sys_sched_yield, - [28] = sys_madvise, - [39] = sys_getpid, - [56] = sys_clone, - [60] = sys_exit, - [97] = sys_getrlimit, - [158] = sys_arch_prctl, - [202] = sys_futex, - [203] = sys_sched_setaffinity, - [204] = sys_sched_getaffinity, - [218] = sys_set_tid_address, - [231] = sys_exit_group, - [234] = sys_tgkill, - [273] = sys_set_robust_list, - [288] = NULL, -#ifdef DCFA_KMOD - [303] = sys_mod_call, -#endif - [502] = sys_process_data_section, - [601] = sys_pmc_init, - [602] = sys_pmc_start, - [603] = sys_pmc_stop, - [604] = sys_pmc_reset, -}; - -static char *syscall_name[] __attribute__ ((unused)) = { - [0] = "sys_read", - [1] = "sys_write", - [2] = "sys_open", - [3] = "sys_close", - [4] = "sys_stat", - [5] = "sys_fstat", - [8] = "sys_lseek", - [9] = "sys_mmap", - [10] = "sys_mprotect", - [11] = "sys_munmap", - [12] = "sys_brk", - [13] = "sys_rt_sigaction", - [14] = "sys_rt_sigprocmask", - [16] = "sys_ioctl", - [17] = "sys_pread", - [18] = "sys_pwrite", - [20] = "sys_writev", - [24] = "sys_sched_yield", - [21] = "sys_access", - [28] = "sys_madvise", - [39] = "sys_getpid", - [56] = "sys_clone", - [60] = "sys_exit", - [63] = "sys_uname", - [72] = "sys_fcntl", - [79] = "sys_getcwd", - [89] = "sys_readlink", - [96] = "sys_gettimeofday", - [97] = "sys_getrlimit", - [102] = "sys_getuid", - [104] = "sys_getgid", - [107] = "sys_geteuid", - [108] = "sys_getegid", - [110] = "sys_getpgid", - [111] = "sys_getppid", - [158] = "sys_arch_prctl", - [201] = "sys_time", - [202] = "sys_futex", - [203] = "sys_sched_setaffinity", - [204] = "sys_sched_getaffinity", - [217] = "sys_getdents64", - [218] = "sys_set_tid_address", - [231] = "sys_exit_group", - [234] = "sys_tgkill", - [273] = "sys_set_robust_list", - [288] = "NULL", -#ifdef DCFA_KMOD - [303] = "sys_mod_call", -#endif - [502] = "process_data_section", - [601] = "sys_pmc_init", - [602] = "sys_pmc_start", - [603] = "sys_pmc_stop", - [604] = "sys_pmc_reset", -}; - long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx) { SYSCALL_HEADER; @@ -1003,7 +873,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx) dkprintf("\n"); - if ((0 <= num) && (num < sizeof(syscall_table)/sizeof(syscall_table[0])) + if ((0 <= num) && (num < syscall_table_elems) && (syscall_table[num] != NULL)) { l = syscall_table[num](num, ctx);