Ausam/sys/sysd/source/proc2.c
/* user area decoding */
#include "proc.h"
udecode(ka6, size, pp)
int ka6, size;
int pp;
{
long ka6l;
ka6l = ka6; ka6l =<< 6;
if(uflg | sflg | iflg | fflg)
{
printf(U_PTAB, "User____ Per-process___ _______ Area____\n\n");
if (capfflg)
odump(ka6l, size * 64l);
}
DEBUG
printf("seek to u area ");
lseek(corefd, ka6l, 0);
DEBUG
printf("successfully and read it into u\n");
if (read(corefd, &u, sizeof u) < 0)
crash("cannot read user area");
if (u.u_procp != pp) {
printf(U_PTAB, "\"u_procp\" was %d (%o) and proc structure address is %d (%o)\n",
u.u_procp, u.u_procp, pp, pp);
warn("\"u_procp\" and pp do not agree");
}
if (uflg)
ustatic();
if (sflg || uflg)
u1(ka6);
if (iflg || uflg)
u2();
if (fflg || uflg)
u3();
/* the ever loving end of it */
}
/**************************/
ustatic()
{
/* static user area data, not decodeable */
long l1, l2;
register p;
register i;
printf(U_PTAB, "effective user id was %d (%o) - %s", u.u_uid, u.u_uid, getuser(u.u_uid));
printf("%55tReal user id was %d (%o) - %s\n\n", u.u_ruid, u.u_ruid, getuser(u.u_ruid));
#ifdef GROUP_ACCESS
/* groups are not used at UNSW */
printf(U_PTAB, "effective group id was %d (%o) - %s", u.u_gid, u.u_gid, getgroup(u.u_gid));
printf("%55tReal group id was %d (%o) - %s\n\n", u.u_rgid, u.u_rgid, getgroup(u.u_rgid));
#endif
/* all to do with times and things */
printf(U_PTAB, "User, system and time limit times\n\n");
#ifndef UNSW
l1.hiword = u.u_cutime[0];
l1.loword = u.u_cutime[1];
l2.hiword = u.u_cstime[0];
l2.loword = u.u_cstime[1];
#endif
#ifdef UNSW
l1 = u.u_cutime;
l2 = u.u_cstime;
#endif
#ifndef UNSW
printf(U_PTAB, "%20t\"u_utime\" = %u (%o) tix; %u sec.\n", u.u_utime, u.u_utime, u.u_utime/HZ);
printf(U_PTAB, "%20t\"u_stime\" = %u (%o) tix; %u sec.\n", u.u_stime, u.u_stime, u.u_stime/HZ);
#endif
#ifdef UNSW
printf(U_PTAB, "%20t\"u_utime\" = %D (%O) tix; %D sec.\n", u.u_utime, u.u_utime, u.u_utime/HZ);
printf(U_PTAB, "%20t\"u_stime\" = %D (%O) tix; %D sec.\n", u.u_stime, u.u_stime, u.u_stime/HZ);
#endif
printf(U_PTAB, "%20t\"u_cutime\" = %D (%O) tix; %D sec.\n", l1, l1, l1/HZ);
printf(U_PTAB, "%20t\"u_cstime\" = %D (%O) tix; %D sec.\n", l2, l2, l2/HZ);
#ifdef TIME_LIMITS
printf(U_PTAB, "%20t\"u_cpusec\" = %u sec.\n", u.u_cpusec);
printf(U_PTAB, "%20t\"u_tix\" = %u tix.\n\n", u.u_tix);
#endif
/* text data and stack sizes */
printf(U_PTAB, "Text, data and stack sizes, all *64 bytes.\n\n");
printf("%20t\"u_tsize\" = %d (%o)", u.u_tsize, u.u_tsize);
printf("%50t\"u_dsize\" = %d (%o)", u.u_dsize, u.u_dsize);
printf("%80t\"u_ssize\" = %d (%o)\n\n", u.u_ssize, u.u_ssize);
#ifdef _1145 | _1170
printf(U_PTAB, "I/D separation flag \"u_sep\" was %d (%o)\n\n", u.u_sep, u.u_sep);
#endif
#ifdef FPU
/* floating regs... not used much at UNSW since all 11/40s */
printf(U_PTAB, "Saved floating point registers\n\n");
printf(U_PTAB, "FP Status \"u_fsav[0]\" %6o\n\n",u.u_fsav[0]);
for (p = 1; p < 25 ; p = p + 4)
printf(U_PTAB, "\"u_fsav[%2d-%2d] %6o %6o %6o %6o\n",
p, p+3, u.u_fsav[p], u.u_fsav[p+1], u.u_fsav[p+2], u.u_fsav[p+3]);
printf("\n");
#endif
/* segmentation registers and descriptors */
printf(U_PTAB, "Segmentation addresses and associated descriptors\n\n");
printf(U_PTAB, "%8tSet number%30t\"u_uisa\"%49t\"u_uisd\"%70tSet number%92t\"u_uisa\"%111t\"u_uisd\"\n\n");
for(p = 0; p < 4; p++)
printf(U_PTAB, "%12t%2d%27t%6d (%6o)%46t%6d (%6o)%74t%2d%89t%6d (%6o)%108t%6d (%6o)\n",
p, u.u_uisa[p], u.u_uisa[p], u.u_uisd[p], u.u_uisd[p],
p+4, u.u_uisa[p+4], u.u_uisa[p+4], u.u_uisd[p+4], u.u_uisd[p+4]);
printf("\n");
#ifdef _1145 | _1170
printf(U_PTAB, "%8tSet number%30t\"u_uisa\"%49t\"u_uisd\"%70tSet number%92t\"u_uisa\"%111t\"u_uisd\"\n\n");
for(p = 8; p < 12; p++)
printf(U_PTAB, "%12t%2d%27t%6d (%6o)%46t%6d (%6o)%74t%2d%89t%6d (%6o)%108t%6d (%6o)\n",
p, u.u_uisa[p], u.u_uisa[p], u.u_uisd[p], u.u_uisd[p],
p+4, u.u_uisa[p+4], u.u_uisa[p+4], u.u_uisd[p+4], u.u_uisd[p+4]);
printf("\n");
#endif
/* things to do with IO */
printf(U_PTAB, "\"u_segflg\" indicates IO was in ");
if (u.u_segflg == 0)
printf("user space\n");
else if (u.u_segflg == 1)
printf("kernel space\n");
else {
printf("a strange place %d (%o)\n", u.u_segflg, u.u_segflg);
WARNING
warn("funny value for u_segflg");
}
printf("\n");
printf(U_PTAB, "Base address for IO \"u_base\" was %d (%o)\n", u.u_base, u.u_base);
printf(U_PTAB, "Bytes remaining in IO \"u_count\" were %d (%o)\n", u.u_count, u.u_count);
printf(U_PTAB, "\"u_offset\" = %D (%O)\n\n", u.u_offset, u.u_offset);
/* system calls errors and saved r0 */
printf(U_PTAB, "Last error return code was ");
switch (u.u_error) {
case 0:
printf("null");
break;
case EFAULT:
printf("EFAULT");
break; /* EFAULT 106 */
case EPERM:
printf("EPERM");
break; /* EPERM 1 */
case ENOENT:
printf("ENOENT");
break; /* ENOENT 2 */
case ESRCH:
printf("ESRCH");
break; /* ESRCH 3 */
case EINTR:
printf("EINTR");
break; /* EINTR 4 */
case EIO:
printf("EIO");
break; /* EIO 5 */
case ENXIO:
printf("ENXIO");
break; /* ENXIO 6 */
case E2BIG:
printf("E2BIG");
break; /* E2BIG 7 */
case ENOEXEC:
printf("ENOEXEC");
break; /* ENOEXEC 8 */
case EBADF:
printf("EBADF");
break; /* EBADF 9 */
case ECHILD:
printf("ECHILD");
break; /* ECHILD 10 */
case EAGAIN:
printf("EAGAIN");
break; /* EAGAIN 11 */
case ENOMEM:
printf("ENOMEM");
break; /* ENOMEM 12 */
case EACCES:
printf("EACCES");
break; /* EACCES 13 */
case ENOTBLK:
printf("ENOTBLK");
break; /* ENOTBLK 15 */
case EBUSY:
printf("EBUSY");
break; /* EBUSY 16 */
case EEXIST:
printf("EEXIST");
break; /* EEXIST 17 */
case EXDEV:
printf("EXDEV");
break; /* EXDEV 18 */
case ENODEV:
printf("ENODEV");
break; /* ENODEV 19 */
case ENOTDIR:
printf("ENOTDIR");
break; /* ENOTDIR 20 */
case EISDIR:
printf("EISDIR");
break; /* EISDIR 21 */
case EINVAL:
printf("EINVAL");
break; /* EINVAL 22 */
case ENFILE:
printf("ENFILE");
break; /* ENFILE 23 */
case EMFILE:
printf("EMFILE");
break; /* EMFILE 24 */
case ENOTTY:
printf("ENOTTY");
break; /* ENOTTY 25 */
case ETXTBSY:
printf("ETXTBSY");
break; /* ETXTBSY 26 */
case EFBIG:
printf("EFBIG");
break; /* EFBIG 27 */
case ENOSPC:
printf("ENOSPC");
break; /* ENOSPC 28 */
case ESPIPE:
printf("ESPIPE");
break; /* ESPIPE 29 */
case EROFS:
printf("EROFS");
break; /* EROFS 30 */
case EMLINK:
printf("EMLINK");
break; /* EMLINK 31 */
case EPIPE:
printf("EPIPE");
break; /* EPIPE 32 */
#ifdef LARGE_FILE_REFERENCES
case ENREF:
printf("ENREF");
break; /* ENREF 33 */
#endif
default:
printf("unknown - %u (%o)\n", u.u_error, u.u_error);
WARNING
warn("unknown system error code");
break;
}
printf("\n");
printf(U_PTAB, "Arguments to system call\n\n");
#ifndef SHARED_DATA | EP_ADDRESS
for (p = 0; p < 5; p++)
#endif
#ifdef SHARED_DATA | EP_ADDRESS
for (p = 0; p < 8; p++)
#endif
printf("%25t\"u_arg[%d]\"%40t%6d (%6o)\n", p, u.u_arg[p], u.u_arg[p]);
printf("\n");
printf(U_PTAB, "Saved r0 \"u_ar0\" was at %d (%o)\n\n", u.u_ar0, u.u_ar0);
/* disposition of signals */
printf(U_PTAB, "Disposition of signals\n\n");
printf("%8tSignal type%40tNumber%49tDisposition%70tSignal type%102tNumber%111tDisposition\n\n");
for (p = 0; p < (NSIG + 1)/2; p++) {
printf("%8t%s%42t%2d", signals[p], p);
if (u.u_signal[p] & 01)
printf("%49tignored");
else if (u.u_signal[p] == 0)
printf("%49tdefault");
else
printf("%49t%d (%o)", u.u_signal[p], u.u_signal[p]);
i = p + (NSIG + 1)/2;
if (i < NSIG) {
printf("%70t%s%104t%2d", signals[i], i);
if (u.u_signal[i] & 01)
printf("%111tignored");
else if (u.u_signal[i] == 0)
printf("%111tdefault");
else
printf("%111t%d (%o)", u.u_signal[i], u.u_signal[i]);
}
printf("\n");
}
printf("\n");
/* finally value of flags */
#ifndef SHARED_DATA
printf(U_PTAB, "\"u_intflg\" was (%o)\n\n", u.u_intflg);
#endif
#ifdef SHARED_DATA
printf(U_PTAB, "\"u_flags\" was (%o)\n", u.u_flags);
if (u.u_flags & USHRDATA)
printf(U_PTAB, "\tthe (%o) bit indicates special r/w text segment\n", USHRDATA);
#endif
/* profiling */
printf(U_PTAB, "Profiling arguments\n\n");
for (p = 0; p < 2; p++)
printf("%20t\"u_prof[%d]\" = %d (%o)%60t\"u_prof[%d]\" = %d (%o)\n",
p, u.u_prof[p], u.u_prof[p], p+2, u.u_prof[p+2], u.u_prof[p+2]);
printf("\n");
/* qsav and ssav */
printf(U_PTAB, "Label variables\n\n");
printf(U_PTAB, "\"u_qsav[0]\" = %u (%o) and \"u_qsav[1]\" = %u (%o)\n",
u.u_qsav[0], u.u_qsav[0], u.u_qsav[1], u.u_qsav[1]);
printf(U_PTAB, "\"u_ssav[0]\" = %u (%o) and \"u_ssav[1]\" = %u (%o)\n\n",
u.u_ssav[0], u.u_ssav[0], u.u_ssav[1], u.u_ssav[1]);
}
/*********************************/
u1(ka6)
unsigned ka6;
{
/* stack trace and decode */
/* r5 and r6, and possible stack trace */
printf(U_PTAB, "Saved r6 \"u_rsav[0]\" was %d (%o)%55tSaved r5 \"u_rsav[1] was %d (%o)\n\n",
u.u_rsav[0], u.u_rsav[0], u.u_rsav[1], u.u_rsav[1]);
#ifdef BIG_UNIX
printf(U_PTAB, "Saved kpar5 \"u_ksave\" was %d (%o)\n\n", u.u_ksave, u.u_ksave);
#endif
if (sflg)
{
if (ka6 == regs.r_kisa6)
{
#ifndef BIG_UNIX
stackdecode(regs.r_reg[5], regs.r_reg[6], ka6);
#endif
#ifdef BIG_UNIX
stackdecode(regs.r_reg[5], regs.r_reg[6], u.u_ksave, ka6);
#endif
}
else
{
#ifndef BIG_UNIX
stackdecode(u.u_rsav[1], u.u_rsav[0], ka6);
#endif
#ifdef BIG_UNIX
stackdecode(u.u_rsav[1], u.u_rsav[0], u.u_ksave, ka6);
#endif
}
}
}
/*****************************/
u2()
{
/* inode decoding */
register p;
/* present directory, inodes and pthnames etc */
printf(U_PTAB, "Current directory i-node pointer \"u_cdir\" was %d (%o)\n\n", u.u_cdir, u.u_cdir);
if (iflg)
idecode(u.u_cdir);
printf(U_PTAB, "Current pathname component \"u_dbuf[0..%d]\" was =>", DIRSIZ-1);
for (p = 0; p < DIRSIZ; p++)
putc(u.u_dbuf[p]);
printf("<=\n\n");
printf(U_PTAB, TAB, "Last pathname scanning entries\n");
printf(U_PTAB, TAB, "current pointer to i-node \"u_dirp\" was %d (%o)\n", u.u_dirp, u.u_dirp);
printf(U_PTAB, TAB, TAB, "i-number \"u_ino\" %d (%o)\n", u.u_dent.u_ino, u.u_dent.u_ino);
printf(U_PTAB, TAB, TAB, "pathname \"u_name[0..%d]\" =>", DIRSIZ-1);
for (p = 0; p < DIRSIZ; p++)
putc(u.u_dent.u_name[p]);
printf("<=\n");
printf(U_PTAB, TAB, "parent directory inode pointer \"u_pdir\" was %d (%o)\n\n", u.u_pdir, u.u_pdir);
if (iflg)
idecode(u.u_pdir);
}
/********************************/
u3()
{
/* file structure decoding etc */
register p;
/* all open files and structures if requested */
printf(U_PTAB, "Pointers to file structures of open files\n\n");
for (p = 0; p < NOFILE; p++) {
printf(U_PTAB, TAB, "\"u_ofile[%2d]\" = %6d (%6o)\n", p, u.u_ofile[p], u.u_ofile[p]);
if (fflg)
filedecode(u.u_ofile[p]);
}
printf("\n");
}