/* 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"); }