Instead of always returning 0, return actual starttime.
Signed-off-by: Cameron Esfahani <[email protected]>
---
linux-user/syscall.c | 28 ++++++++++++++++++++++++++++
1 file changed, 28 insertions(+)
diff --git a/linux-user/syscall.c b/linux-user/syscall.c
index 5950222a77..59265ab986 100644
--- a/linux-user/syscall.c
+++ b/linux-user/syscall.c
@@ -8107,6 +8107,34 @@ static int open_self_stat(void *cpu_env, int fd)
} else if (i == 3) {
/* ppid */
g_string_printf(buf, FMT_pid " ", getppid());
+ } else if (i == 21) {
+ /* starttime */
+ FILE *fp = NULL;
+ char *line = NULL;
+ char *skipped_comm = NULL;
+ size_t n = 0;
+ unsigned long long starttime = 0;
+
+ fp = fopen("/proc/self/stat", "r");
+ if (fp) {
+ if (getdelim(&line, &n, '\0', fp) != -1) {
+ /* Find end of comm field */
+ skipped_comm = strrchr(line, ')');
+ if (skipped_comm != NULL) {
+ /* Skip over parenthesis and space */
+ skipped_comm += 2;
+ /* Scan starttime (field 20 after pid and comm) */
+ (void) sscanf(skipped_comm, "%*c %*d %*d %*d %*d %*d "
+ "%*u %*u %*u %*u %*u %*u %*u %*d "
+ "%*d %*d %*d %*d %*d %llu",
+ &starttime);
+ }
+ free(line);
+ }
+ fclose(fp);
+ }
+
+ g_string_printf(buf, "%llu ", starttime);
} else if (i == 27) {
/* stack bottom */
g_string_printf(buf, TARGET_ABI_FMT_ld " ", ts->info->start_stack);
--
2.32.0 (Apple Git-131)