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
This commit is contained in:
Dominique Martinet
2018-08-24 11:31:06 +09:00
committed by Masamichi Takagi
parent ecc850dfef
commit b70d470e20
4 changed files with 43 additions and 5 deletions

View File

@@ -1107,7 +1107,7 @@ static const struct procfs_entry pid_entry_stuff[] = {
PROC_REG("mem", 0600, NULL), PROC_REG("mem", 0600, NULL),
PROC_REG("pagemap", 0444, NULL), PROC_REG("pagemap", 0444, NULL),
// PROC_REG("smaps", S_IRUGO, 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("statm", S_IRUGO, NULL),
PROC_REG("status", 0444, &mckernel_buff_io), PROC_REG("status", 0444, &mckernel_buff_io),
// PROC_REG("syscall", S_IRUGO, NULL), // PROC_REG("syscall", S_IRUGO, NULL),

View File

@@ -522,9 +522,10 @@ struct process {
int egid; int egid;
int sgid; int sgid;
int fsgid; int fsgid;
int execed; int execed:1;
int nohost; int nohost:1;
int nowait; int nowait:1;
int forwarding:1;
struct rlimit rlimit[MCK_RLIM_MAX]; struct rlimit rlimit[MCK_RLIM_MAX];
unsigned long saved_auxv[AUXV_LEN]; unsigned long saved_auxv[AUXV_LEN];
char *saved_cmdline; char *saved_cmdline;

View File

@@ -631,6 +631,41 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
*/ */
if (!strcmp(p, "stat")) { 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 * pid (comm) state ppid
@@ -657,7 +692,7 @@ int process_procfs_request(struct ikc_scd_packet *rpacket)
"%lu %lu %lu %lu " // sigignore... "%lu %lu %lu %lu " // sigignore...
"%lu %d %d %u " // cnswap... "%lu %d %d %u " // cnswap...
"%u %llu %lu %ld\n", // policy... "%u %llu %lu %ld\n", // policy...
0, "exe", 'R', 0, // pid... 0, comm, state, 0, // pid...
0, 0, 0, 0, // pgrp... 0, 0, 0, 0, // pgrp...
0, 0L, 0L, 0L, // flags... 0, 0L, 0L, 0L, // flags...
0L, 0L, 0L, 0L, // cmajflt... 0L, 0L, 0L, 0L, // cmajflt...

View File

@@ -237,6 +237,7 @@ long do_syscall(struct syscall_request *req, int cpu)
dkprintf("%s: syscall num: %d waiting for Linux.. \n", dkprintf("%s: syscall num: %d waiting for Linux.. \n",
__FUNCTION__, req->number); __FUNCTION__, req->number);
proc->forwarding = 1;
#define STATUS_IN_PROGRESS 0 #define STATUS_IN_PROGRESS 0
#define STATUS_COMPLETED 1 #define STATUS_COMPLETED 1
@@ -398,6 +399,7 @@ long do_syscall(struct syscall_request *req, int cpu)
send_syscall(&req2, cpu, &res); send_syscall(&req2, cpu, &res);
} }
} }
proc->forwarding = 0;
if (req->rtid == -1) { if (req->rtid == -1) {
preempt_enable(); preempt_enable();
} }