uti: Call terminate only when exit_group is called

Tracer tells McKernel side to call do_exit() in WIFSIGNALED case.

Change-Id: If85c6cbb4856036b406b11335f1384e57f26292d
This commit is contained in:
Masamichi Takagi
2018-08-31 19:26:37 +09:00
parent b7cdbd6c42
commit 4b3e58fd3d
2 changed files with 8 additions and 7 deletions

View File

@ -3027,8 +3027,9 @@ create_tracer()
term_param[1] = uti_desc->tid;
term_param[3] = uti_desc->key;
code = st;
if (exited == 2 || // exit_group
WIFSIGNALED(st)) {
/* exit_group case. Note that killing-signal kills mcexec and tracer in terminate(),
so this won't be reached. */
if (exited == 2) {
code |= 0x0000000100000000;
}
term_param[2] = code;

View File

@ -9123,13 +9123,13 @@ util_thread(struct uti_attr *arg)
kfree(uti_clv);
if (rc >= 0) {
if (rc & 0x10000007f) { // exit_group || signal
dkprintf("%s: exit_group || signal\n", __FUNCTION__);
if (rc & 0x100000000) { /* exit_group */
dkprintf("%s: exit_group, tid=%d,rc=%lx\n", __FUNCTION__, thread->tid, rc);
thread->proc->nohost = 1;
terminate((rc >> 8) & 255, rc & 255);
}
else {
dkprintf("%s: !exit_group && !signal\n", __FUNCTION__);
} else {
/* tracer has detected exit or killed by signal */
dkprintf("%s: exit, pid=%d,tid=%d,rc=%lx\n", __FUNCTION__, thread->proc->pid, thread->tid, rc);
request.number = __NR_sched_setaffinity;
request.args[0] = 1;
request.args[1] = free_address;