move syscall_table[] to the architecture-depended part
This commit is contained in:
69
arch/x86/kernel/include/syscall_list.h
Normal file
69
arch/x86/kernel/include/syscall_list.h
Normal 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
47
arch/x86/kernel/syscall.c
Normal 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 */
|
||||||
@ -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
|
||||||
|
|||||||
132
kernel/syscall.c
132
kernel/syscall.c
@ -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);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user