diff -c +recursive orig/ps-0.98/ps.c ps-0.98/ps.c *** orig/ps-0.98/ps.c Tue Oct 20 13:38:26 1992 --- ps-0.98/ps.c Wed Nov 4 20:44:49 1992 *************** *** 178,184 **** show_procs() { struct task_struct *taskp; ! union task_union task_buf; int tty, i, uid; off_t _task = k_addr("_task"); --- 178,185 ---- show_procs() { struct task_struct *taskp; ! struct task_struct task_buf; ! char stack_buf[PAGE_SIZE]; int tty, i, uid; off_t _task = k_addr("_task"); *************** *** 192,218 **** if (taskp) { kmemread(&task_buf, taskp, sizeof(task_buf)); /* check if valid, proc may have exited */ ! if ((unsigned) task_buf.task.state > 4 || ! task_buf.task.pid <= 0 && i != 0) continue; if (pid >= 0) { ! if (task_buf.task.pid != pid) continue; } else if (ctty) { ! if (task_buf.task.tty != tty) continue; } else ! if (!all && task_buf.task.uid != uid || ! !no_ctty && task_buf.task.tty == -1 || ! run_only && task_buf.task.state != TASK_RUNNING && ! task_buf.task.state != TASK_UNINTERRUPTIBLE) continue; ! (fmt_fnc[fmt])(&task_buf); if (fmt != PS_V && fmt != PS_M) ! show_time(&task_buf); ! printf("%s\n", cmd_args(&task_buf)); } } } --- 193,221 ---- if (taskp) { kmemread(&task_buf, taskp, sizeof(task_buf)); /* check if valid, proc may have exited */ ! if ((unsigned) task_buf.state > 4 || ! (task_buf.pid <= 0 && i != 0) || ! !task_buf.kernel_stack_page) continue; if (pid >= 0) { ! if (task_buf.pid != pid) continue; } else if (ctty) { ! if (task_buf.tty != tty) continue; } else ! if (!all && task_buf.uid != uid || ! !no_ctty && task_buf.tty == -1 || ! run_only && task_buf.state != TASK_RUNNING && ! task_buf.state != TASK_UNINTERRUPTIBLE) continue; ! kmemread(&stack_buf, task_buf.kernel_stack_page, PAGE_SIZE); ! (fmt_fnc[fmt])(&task_buf,&stack_buf); if (fmt != PS_V && fmt != PS_M) ! show_time(&task_buf, &stack_buf); ! printf("%s\n", cmd_args(&task_buf, &stack_buf)); } } } *************** *** 219,226 **** ! show_short(task) struct task_struct *task; { printf("%5d %s %s", task->pid, --- 222,230 ---- ! show_short(task, stack) struct task_struct *task; + reg_t * stack; { printf("%5d %s %s", task->pid, *************** *** 228,235 **** status(task)); } ! show_long(task) struct task_struct *task; { long ppid; --- 232,240 ---- status(task)); } ! show_long(task, stack) struct task_struct *task; + reg_t * stack; { long ppid; *************** *** 242,259 **** ppid, 2 * PZERO - task->counter, /* sort of priority */ PZERO - task->priority, /* nice value */ ! VSIZE(task), task->rss * 4, (task->state == TASK_INTERRUPTIBLE || task->state == TASK_UNINTERRUPTIBLE || Debug > 1 && task->state == TASK_STOPPED ? ! wchan(task->tss.ebp, task) : ""), status(task), dev_to_tty(task->tty)); } ! show_jobs(task) struct task_struct *task; { long ppid, tpgid; struct tty_struct *tt; --- 247,265 ---- ppid, 2 * PZERO - task->counter, /* sort of priority */ PZERO - task->priority, /* nice value */ ! VSIZE(task,stack), task->rss * 4, (task->state == TASK_INTERRUPTIBLE || task->state == TASK_UNINTERRUPTIBLE || Debug > 1 && task->state == TASK_STOPPED ? ! wchan(task->tss.ebp, stack) : ""), status(task), dev_to_tty(task->tty)); } ! show_jobs(task, stack) struct task_struct *task; + reg_t * stack; { long ppid, tpgid; struct tty_struct *tt; *************** *** 284,291 **** task->euid); } ! show_user(task) struct task_struct *task; { time_t start; int pcpu, pmem; --- 290,298 ---- task->euid); } ! show_user(task, stack) struct task_struct *task; + reg_t * stack; { time_t start; int pcpu, pmem; *************** *** 309,315 **** task->pid, pcpu / 10, pcpu % 10, pmem / 10, pmem % 10, ! VSIZE(task), task->rss * 4, dev_to_tty(task->tty), status(task), --- 316,322 ---- task->pid, pcpu / 10, pcpu % 10, pmem / 10, pmem % 10, ! VSIZE(task,stack), task->rss * 4, dev_to_tty(task->tty), status(task), *************** *** 316,323 **** ctime(&start) + (time_now - start > 3600*24 ? 4 : 10)); } ! show_sig(task) struct task_struct *task; { unsigned long sigignore=0, sigcatch=0, bit=1; int i; --- 323,331 ---- ctime(&start) + (time_now - start > 3600*24 ? 4 : 10)); } ! show_sig(task, stack) struct task_struct *task; + reg_t * stack; { unsigned long sigignore=0, sigcatch=0, bit=1; int i; *************** *** 341,348 **** dev_to_tty(task->tty)); } ! show_vm(task) struct task_struct *task; { int pmem; --- 349,357 ---- dev_to_tty(task->tty)); } ! show_vm(task, stack) struct task_struct *task; + reg_t * stack; { int pmem; *************** *** 354,360 **** printf(" %6d %4d %4d %4d ", task->maj_flt + (Sum ? task->cmaj_flt : 0), task->end_code / 1024, ! SIZE(task), task->rss*4); if (task->rlim[RLIMIT_RSS].rlim_cur == RLIM_INFINITY) printf(" xx "); else --- 363,369 ---- printf(" %6d %4d %4d %4d ", task->maj_flt + (Sum ? task->cmaj_flt : 0), task->end_code / 1024, ! SIZE(task, stack), task->rss*4); if (task->rlim[RLIMIT_RSS].rlim_cur == RLIM_INFINITY) printf(" xx "); else *************** *** 364,371 **** } ! show_m(task) struct task_struct *task; { int i; unsigned long pagedir[0x300]; --- 373,381 ---- } ! show_m(task, stack) struct task_struct *task; + reg_t * stack; { int i; unsigned long pagedir[0x300]; *************** *** 431,438 **** dt << pg_shift); } ! show_regs(task) struct task_struct *task; { printf("%2d %5d %8x %8x %8x ", task->start_code >> 26, --- 441,449 ---- dt << pg_shift); } ! show_regs(task, stack) struct task_struct *task; + reg_t * stack; { printf("%2d %5d %8x %8x %8x ", task->start_code >> 26, *************** *** 441,448 **** task->start_code >> 16, **/ task->start_stack, ! KSTK_ESP(task), ! KSTK_EIP(task)); prtime(task->timeout, jiffies); prtime(task->it_real_value, 0); --- 452,459 ---- task->start_code >> 16, **/ task->start_stack, ! KSTK_ESP(stack), ! KSTK_EIP(stack)); prtime(task->timeout, jiffies); prtime(task->it_real_value, 0); *************** *** 487,494 **** }; ! show_time(task) struct task_struct *task; { unsigned t; --- 498,506 ---- }; ! show_time(task, stack) struct task_struct *task; + reg_t * stack; { unsigned t; *************** *** 500,507 **** } char * ! status(task) struct task_struct *task; { static char buf[5] = " "; --- 512,520 ---- } char * ! status(task, stack) struct task_struct *task; + reg_t * stack; { static char buf[5] = " "; diff -c +recursive orig/ps-0.98/ps.h ps-0.98/ps.h *** orig/ps-0.98/ps.h Tue Sep 22 22:06:56 1992 --- ps-0.98/ps.h Wed Nov 4 20:44:49 1992 *************** *** 21,42 **** #define PAGE_MASK 0xfff ! #define KSTK_EIP(task) (*((unsigned long *)(task)+1019)) ! #define KSTK_ESP(task) (*((unsigned long *)(task)+1022)) ! #define _SSIZE(task) (TASK_SIZE - KSTK_ESP(task)) ! #define SSIZE(task) (KSTK_ESP(task) ? _SSIZE(task) : 0) ! #define VSIZE(task) (((task)->brk + 1023 + SSIZE(task)) / 1024) ! #define SIZE(task) (((task)->brk - (task)->end_code + 1023 + \ ! SSIZE(task)) / 1024) ! typedef unsigned reg_t; ! ! union task_union { ! struct task_struct task; ! reg_t stack[PAGE_SIZE/4]; ! }; char *find_func(); unsigned long k_addr(); --- 21,37 ---- #define PAGE_MASK 0xfff ! #define KSTK_EIP(stack) ((stack)[1019]) ! #define KSTK_ESP(stack) ((stack)[1022]) ! #define _SSIZE(stack) (TASK_SIZE - KSTK_ESP(stack)) ! #define SSIZE(stack) (KSTK_ESP(stack) ? _SSIZE(stack) : 0) ! #define VSIZE(task,stack) (((task)->brk + 1023 + SSIZE(stack)) / 1024) ! #define SIZE(task,stack) (((task)->brk - (task)->end_code + 1023 + \ ! SSIZE(stack)) / 1024) + typedef unsigned reg_t; char *find_func(); unsigned long k_addr(); diff -c +recursive orig/ps-0.98/top.c ps-0.98/top.c *** orig/ps-0.98/top.c Fri Oct 16 19:55:57 1992 --- ps-0.98/top.c Thu Nov 5 22:04:24 1992 *************** *** 54,60 **** char hdr[200]; char *title="TOP by Roger Binns Ps (c) 1992 Branko Lankester"; ! void do_it(struct task_struct *task, int num); void do_key(char c); char *cm, *clrtobot, *cl, *so, *se, *clrtoeol, *mb, *md, *us, *ue; char *outp; --- 54,60 ---- char hdr[200]; char *title="TOP by Roger Binns Ps (c) 1992 Branko Lankester"; ! void do_it(struct task_struct *task, reg_t *stack, int num); void do_key(char c); char *cm, *clrtobot, *cl, *so, *se, *clrtoeol, *mb, *md, *us, *ue; char *outp; *************** *** 424,430 **** show_procs() { struct task_struct *taskp; ! union task_union task_buf; int tty, i, uid; off_t _task = k_addr("_task"); --- 424,431 ---- show_procs() { struct task_struct *taskp; ! struct task_struct task_buf; ! char stack_buf[PAGE_SIZE]; int tty, i, uid; off_t _task = k_addr("_task"); *************** *** 436,450 **** if (taskp) { kmemread(&task_buf, taskp, sizeof(task_buf)); /* check if valid, proc may have exited */ ! if ((unsigned) task_buf.task.state > 4 || ! task_buf.task.pid <= 0 && i != 0) continue; ! do_it((struct task_struct *)&task_buf, i); } } } ! void do_it(struct task_struct *task, int num) { unsigned t, i; time_t now, start; --- 437,453 ---- if (taskp) { kmemread(&task_buf, taskp, sizeof(task_buf)); /* check if valid, proc may have exited */ ! if ((unsigned) task_buf.state > 4 || ! task_buf.pid <= 0 && i != 0 || ! !task_buf.kernel_stack_page) continue; ! kmemread(&stack_buf, task_buf.kernel_stack_page, PAGE_SIZE); ! do_it(&task_buf, (reg_t *) &stack_buf, i); } } } ! void do_it(struct task_struct *task, reg_t *stack, int num) { unsigned t, i; time_t now, start; *************** *** 495,502 **** case P_NICE: sprintf(tmp, "%3d ", PZERO-task->priority); break; case P_PAGEIN: sprintf(tmp, "%6d ", task->maj_flt+(Sum ? task->cmaj_flt : 0)); break; case P_TSIZ: sprintf(tmp, "%5d ", task->end_code/1024); break; ! case P_DSIZ: sprintf(tmp, "%5d ", SIZE(task)); break; ! case P_SIZE: sprintf(tmp, "%5d ", VSIZE(task)); break; case P_TRS: sprintf(tmp, "%4d ", TRS); break; case P_SWAP: sprintf(tmp, "%4d ", SWAP); break; case P_SHARE: sprintf(tmp, "%5d ", SHARE); break; --- 498,505 ---- case P_NICE: sprintf(tmp, "%3d ", PZERO-task->priority); break; case P_PAGEIN: sprintf(tmp, "%6d ", task->maj_flt+(Sum ? task->cmaj_flt : 0)); break; case P_TSIZ: sprintf(tmp, "%5d ", task->end_code/1024); break; ! case P_DSIZ: sprintf(tmp, "%5d ", SIZE(task,stack)); break; ! case P_SIZE: sprintf(tmp, "%5d ", VSIZE(task,stack)); break; case P_TRS: sprintf(tmp, "%4d ", TRS); break; case P_SWAP: sprintf(tmp, "%4d ", SWAP); break; case P_SHARE: sprintf(tmp, "%5d ", SHARE); break; *************** *** 507,513 **** case P_WCHAN: sprintf(tmp, "%-9.9s ", (task->state == TASK_INTERRUPTIBLE || task->state == TASK_UNINTERRUPTIBLE ? ! wchan(task->tss.ebp, task) : "")); break; case P_STAT: sprintf(tmp, "%-4.4s ", status(task)); break; case P_TIME: sprintf(tmp, "%3d:%02d ", t/60, t%60); break; case P_COMMAND: strcpy(tmp, cmd_args(task)); break; --- 510,516 ---- case P_WCHAN: sprintf(tmp, "%-9.9s ", (task->state == TASK_INTERRUPTIBLE || task->state == TASK_UNINTERRUPTIBLE ? ! wchan(task->tss.ebp, stack) : "")); break; case P_STAT: sprintf(tmp, "%-4.4s ", status(task)); break; case P_TIME: sprintf(tmp, "%3d:%02d ", t/60, t%60); break; case P_COMMAND: strcpy(tmp, cmd_args(task)); break;