move syscall_table[] to the architecture-depended part

This commit is contained in:
NAKAMURA Gou
2013-06-18 15:03:47 +09:00
parent 5369864551
commit 4695b332e2
4 changed files with 163 additions and 131 deletions

View File

@ -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 ****/

47
arch/x86/kernel/syscall.c Normal file
View File

@ -0,0 +1,47 @@
/*
* [x86] syscall.c
*/
#include <ihk/cpu.h>
#include <cls.h>
#include <syscall.h>
//#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 <syscall_list.h>
#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 <syscall_list.h>
#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 <syscall_list.h>
#undef DECLARATOR
#undef SYSCALL_HANDLED
#undef SYSCALL_DELEGATED
};
/* archtecture-depended syscall handlers */

View File

@ -144,4 +144,50 @@ struct syscall_params {
struct syscall_post post_buf IHK_DMA_ALIGN; 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 #endif

View File

@ -97,46 +97,6 @@ int do_syscall(struct syscall_request *req, ihk_mc_user_context_t *ctx)
return res->ret; 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) SYSCALL_DECLARE(open)
{ {
@ -872,96 +832,6 @@ SYSCALL_DECLARE(pmc_reset)
return ihk_mc_perfctr_reset(counter); 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) long syscall_generic_forwarding(int n, ihk_mc_user_context_t *ctx)
{ {
SYSCALL_HEADER; SYSCALL_HEADER;
@ -1003,7 +873,7 @@ long syscall(int num, ihk_mc_user_context_t *ctx)
dkprintf("\n"); dkprintf("\n");
if ((0 <= num) && (num < sizeof(syscall_table)/sizeof(syscall_table[0])) if ((0 <= num) && (num < syscall_table_elems)
&& (syscall_table[num] != NULL)) { && (syscall_table[num] != NULL)) {
l = syscall_table[num](num, ctx); l = syscall_table[num](num, ctx);