diff --git a/executer/include/uprotocol.h b/executer/include/uprotocol.h index 6140df8b..9430d5a4 100644 --- a/executer/include/uprotocol.h +++ b/executer/include/uprotocol.h @@ -255,7 +255,11 @@ struct release_user_space_desc { struct terminate_thread_desc { int pid; int tid; - long sig; + + long code; + /* 32------32 31--16 15--------8 7----0 + exit_group exit-status signal */ + unsigned long tsk; /* struct task_struct * */ }; diff --git a/executer/kernel/mcctrl/control.c b/executer/kernel/mcctrl/control.c index ac2710f4..5f085bac 100644 --- a/executer/kernel/mcctrl/control.c +++ b/executer/kernel/mcctrl/control.c @@ -2509,14 +2509,14 @@ mcexec_sig_thread(ihk_os_t os, unsigned long arg, struct file *file) return ret; } -static long mcexec_terminate_thread_unsafe(ihk_os_t os, int pid, int tid, long sig, struct task_struct *tsk) +static long mcexec_terminate_thread_unsafe(ihk_os_t os, int pid, int tid, long code, struct task_struct *tsk) { struct ikc_scd_packet *packet; struct mcctrl_usrdata *usrdata = ihk_host_os_get_usrdata(os); struct mcctrl_per_proc_data *ppd; struct mcctrl_per_thread_data *ptd; - dprintk("%s: target pid=%d,tid=%d,sig=%lx,task=%p\n", __FUNCTION__, pid, tid, sig, tsk); + dprintk("%s: target pid=%d,tid=%d,code=%lx,task=%p\n", __FUNCTION__, pid, tid, code, tsk); ppd = mcctrl_get_per_proc_data(usrdata, pid); if (!ppd) { @@ -2542,7 +2542,7 @@ static long mcexec_terminate_thread_unsafe(ihk_os_t os, int pid, int tid, long s __FUNCTION__, tid); goto no_ptd; } - __return_syscall(usrdata->os, packet, sig, tid); + __return_syscall(usrdata->os, packet, code, tid); ihk_ikc_release_packet((struct ihk_ikc_free_packet *)packet, (usrdata->ikc2linux[smp_processor_id()] ? usrdata->ikc2linux[smp_processor_id()] : @@ -2606,7 +2606,7 @@ mcexec_terminate_thread(ihk_os_t os, struct terminate_thread_desc * __user arg) write_unlock_irqrestore(&host_thread_lock, flags); - rc = mcexec_terminate_thread_unsafe(os, desc.pid, desc.tid, desc.sig, (struct task_struct *)desc.tsk); + rc = mcexec_terminate_thread_unsafe(os, desc.pid, desc.tid, desc.code, (struct task_struct *)desc.tsk); out: return rc; diff --git a/executer/user/syscall_intercept.c b/executer/user/syscall_intercept.c index e97cdf6e..de8efad5 100644 --- a/executer/user/syscall_intercept.c +++ b/executer/user/syscall_intercept.c @@ -23,7 +23,7 @@ hook(long syscall_number, //return 1; /* debug */ int tid = uti_syscall0(__NR_gettid); struct terminate_thread_desc term_desc; - unsigned long sig; + unsigned long code; if (!uti_desc.start_syscall_intercept) { return 1; /* System call isn't taken over */ @@ -79,15 +79,15 @@ hook(long syscall_number, } break; case __NR_exit_group: - sig = 0x100000000; + code = 0x100000000; goto make_remote_thread_exit; case __NR_exit: - sig = 0; + code = 0; make_remote_thread_exit: /* Make migrated-to-Linux thread on the McKernel side call do_exit() or terminate() */ term_desc.pid = uti_desc.pid; term_desc.tid = uti_desc.tid; /* tid of mcexec */ - term_desc.sig = sig | (arg0 << 8); + term_desc.code = code | ((arg0 & 255) << 8); term_desc.tsk = uti_desc.key; uti_syscall3(__NR_ioctl, uti_desc.fd, MCEXEC_UP_TERMINATE_THREAD, (long)&term_desc);