From b70d470e20e3249206938c3e17ef4b2b9cb6f260 Mon Sep 17 00:00:00 2001 From: Dominique Martinet Date: Fri, 24 Aug 2018 11:31:06 +0900 Subject: [PATCH] procfs: add '/proc/pid/stat' to mckernel side and fix its comm This lets ps show the proper executable name instead of mcexec's comm on linux side Change-Id: I62732037451f129fc2e905357ebdc351bf7f6d2d Refs: #1114 --- executer/kernel/mcctrl/procfs.c | 2 +- kernel/include/process.h | 7 ++++--- kernel/procfs.c | 37 ++++++++++++++++++++++++++++++++- kernel/syscall.c | 2 ++ 4 files changed, 43 insertions(+), 5 deletions(-) diff --git a/executer/kernel/mcctrl/procfs.c b/executer/kernel/mcctrl/procfs.c index 3feafc37..27244412 100644 --- a/executer/kernel/mcctrl/procfs.c +++ b/executer/kernel/mcctrl/procfs.c @@ -1107,7 +1107,7 @@ static const struct procfs_entry pid_entry_stuff[] = { PROC_REG("mem", 0600, NULL), PROC_REG("pagemap", 0444, NULL), // PROC_REG("smaps", S_IRUGO, NULL), -// PROC_REG("stat", 0444, &mckernel_buff_io), + PROC_REG("stat", 0444, &mckernel_buff_io), // PROC_REG("statm", S_IRUGO, NULL), PROC_REG("status", 0444, &mckernel_buff_io), // PROC_REG("syscall", S_IRUGO, NULL), diff --git a/kernel/include/process.h b/kernel/include/process.h index 4b0f6472..62c1adc8 100644 --- a/kernel/include/process.h +++ b/kernel/include/process.h @@ -522,9 +522,10 @@ struct process { int egid; int sgid; int fsgid; - int execed; - int nohost; - int nowait; + int execed:1; + int nohost:1; + int nowait:1; + int forwarding:1; struct rlimit rlimit[MCK_RLIM_MAX]; unsigned long saved_auxv[AUXV_LEN]; char *saved_cmdline; diff --git a/kernel/procfs.c b/kernel/procfs.c index 71ae751b..5f02370c 100644 --- a/kernel/procfs.c +++ b/kernel/procfs.c @@ -631,6 +631,41 @@ int process_procfs_request(struct ikc_scd_packet *rpacket) */ if (!strcmp(p, "stat")) { + const char *comm = "exe"; + char state; + + if (proc->saved_cmdline) { + comm = strrchr(proc->saved_cmdline, '/'); + if (comm) + comm++; + else + comm = proc->saved_cmdline; + } + switch (proc->status & (0x3f)) { + case PS_INTERRUPTIBLE: + state = 'S'; + break; + case PS_UNINTERRUPTIBLE: + state = 'D'; + break; + case PS_ZOMBIE: + state = 'Z'; + break; + case PS_EXITED: + state = 'X'; + break; + case PS_STOPPED: + state = 'T'; + break; + case PS_RUNNING: + default: + if (proc->forwarding) + state = 'S'; + else + state = 'R'; + break; + } + /* * pid (comm) state ppid @@ -657,7 +692,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket) "%lu %lu %lu %lu " // sigignore... "%lu %d %d %u " // cnswap... "%u %llu %lu %ld\n", // policy... - 0, "exe", 'R', 0, // pid... + 0, comm, state, 0, // pid... 0, 0, 0, 0, // pgrp... 0, 0L, 0L, 0L, // flags... 0L, 0L, 0L, 0L, // cmajflt... diff --git a/kernel/syscall.c b/kernel/syscall.c index e59c19bc..45f26b97 100644 --- a/kernel/syscall.c +++ b/kernel/syscall.c @@ -237,6 +237,7 @@ long do_syscall(struct syscall_request *req, int cpu) dkprintf("%s: syscall num: %d waiting for Linux.. \n", __FUNCTION__, req->number); + proc->forwarding = 1; #define STATUS_IN_PROGRESS 0 #define STATUS_COMPLETED 1 @@ -398,6 +399,7 @@ long do_syscall(struct syscall_request *req, int cpu) send_syscall(&req2, cpu, &res); } } + proc->forwarding = 0; if (req->rtid == -1) { preempt_enable(); }