home *** CD-ROM | disk | FTP | other *** search
/ Source Code 1992 March / Source_Code_CD-ROM_Walnut_Creek_March_1992.iso / usenet / altsrcs / 1 / 1507 < prev    next >
Internet Message Format  |  1990-12-28  |  51KB

  1. From: wht@n4hgf.uucp (Warren Tucker)
  2. Newsgroups: alt.sources
  3. Subject: u386mon 1.0, UNIX 386 system monitor, part 01/02
  4. Message-ID: <120@n4hgf.uucp>
  5. Date: 24 Jun 90 20:20:01 GMT
  6.  
  7. Submitted-by: wht@n4hgf
  8. Archive-name: u386mon.1.00/part02
  9.  
  10. #!/bin/sh
  11. # This is part 02 of u386mon.1.00
  12. if touch 2>&1 | fgrep 'mmdd' > /dev/null
  13.  then TOUCH=touch
  14.  else TOUCH=true
  15. fi
  16. # ============= libkmem.c ==============
  17. echo "x - extracting libkmem.c (Text)"
  18. sed 's/^X//' << 'SHAR_EOF' > libkmem.c &&
  19. X/*LINTLIBRARY*/
  20. X/*+-------------------------------------------------------------------------
  21. X    libkmem.c -- /dev/kmem routines for SCO UNIX/386 (maybe other *NIX)
  22. X    ...!emory!n4hgf!wht
  23. X
  24. X  Defined functions:
  25. X    kinit(write_needed)
  26. X    kread(caddr,kaddr,len)
  27. X    kwrite(kaddr,caddr,len)
  28. X
  29. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  30. X--------------------------------------------------------------------------*/
  31. X/*+:EDITS:*/
  32. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  33. X/*:12-07-1988-22:06-wht-put in test for initialized fdkmem */
  34. X/*:10-27-1988-22:44-wht-creation of file */
  35. X
  36. X#include <sys/types.h>
  37. X#include <fcntl.h>
  38. X#include "libkmem.h"
  39. X
  40. Xvoid leave_text();
  41. X
  42. Xextern int errno;
  43. X
  44. Xstatic int fdkmem = -2;
  45. Xdaddr_t lseek();
  46. X
  47. X/*+-------------------------------------------------------------------------
  48. X    kinit(write_needed)
  49. X--------------------------------------------------------------------------*/
  50. Xvoid
  51. Xkinit(write_needed)
  52. Xint write_needed;
  53. X{
  54. X    if(fdkmem >= 0)
  55. X        return;
  56. X    if((fdkmem=open("/dev/kmem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  57. X        leave_text("can't open /dev/kmem",1);
  58. X
  59. X}    /* end of kinit */
  60. X
  61. X/*+-------------------------------------------------------------------------
  62. X    kread(caddr,kaddr,len)
  63. X--------------------------------------------------------------------------*/
  64. Xvoid
  65. Xkread(caddr,kaddr,len)
  66. Xcaddr_t caddr;
  67. Xdaddr_t kaddr;
  68. Xint len;
  69. X{
  70. Xchar s80[80];
  71. Xextern daddr_t myreadcnt;
  72. X
  73. X#if defined(M_I286)
  74. X    kaddr &= 0xFFFFL;
  75. X#endif
  76. X
  77. X    if(fdkmem == -2)
  78. X        leave_text("kinit() not called",1);
  79. X
  80. X    if(lseek(fdkmem,kaddr,0) == -1L)
  81. X    {
  82. X        (void)sprintf(s80,"kmem seek err (%08lx)",kaddr);
  83. X        leave_text(s80,1);
  84. X    }
  85. X
  86. X    if(read(fdkmem,caddr,len) != len)
  87. X    {
  88. X        (void)sprintf(s80,
  89. X            "kmem read errno %d len %d addr %08lx",errno,len,kaddr);
  90. X        leave_text(s80,1);
  91. X    }
  92. X    myreadcnt += len;
  93. X}    /* end of kread */
  94. X
  95. X/*+-------------------------------------------------------------------------
  96. X    kwrite(kaddr,caddr,len)
  97. X--------------------------------------------------------------------------*/
  98. X#ifdef KWRITE_NEEDED
  99. Xvoid
  100. Xkwrite(kaddr,caddr,len)
  101. Xdaddr_t kaddr;
  102. Xcaddr_t caddr;
  103. Xint len;
  104. X{
  105. Xchar s80[80];
  106. X
  107. X#if defined(M_I286)
  108. X    kaddr &= 0xFFFFL;
  109. X#endif
  110. X
  111. X    if(fdkmem == -2)
  112. X        leave_text("kinit() not called",1);
  113. X
  114. X    if((lseek(fdkmem,kaddr,0) < 0L) || (write(fdkmem,caddr,len) != len))
  115. X    {
  116. X        (void)sprintf(s80,"/dev/kmem write addr %08lx len %08lx",kaddr,len);
  117. X        leave_text(s80,1);
  118. X    }
  119. X}    /* end of kwrite */
  120. X#endif
  121. X
  122. X/* vi: set tabstop=4 shiftwidth=4: */
  123. SHAR_EOF
  124. $TOUCH -am 0624151990 libkmem.c &&
  125. chmod 0644 libkmem.c ||
  126. echo "restore of libkmem.c failed"
  127. set `wc -c libkmem.c`;Wc_c=$1
  128. if test "$Wc_c" != "2441"; then
  129.     echo original size 2441, current size $Wc_c
  130. fi
  131. # ============= libmem.c ==============
  132. echo "x - extracting libmem.c (Text)"
  133. sed 's/^X//' << 'SHAR_EOF' > libmem.c &&
  134. X/*LINTLIBRARY*/
  135. X/*+-------------------------------------------------------------------------
  136. X    libmem.c -- /dev/mem routines for SCO UNIX/386 (maybe other *NIX)
  137. X    ...!emory!n4hgf!wht
  138. X
  139. X  Defined functions:
  140. X    minit(write_needed)
  141. X    mread(caddr,maddr,len)
  142. X    mwrite(maddr,caddr,len)
  143. X
  144. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  145. X--------------------------------------------------------------------------*/
  146. X/*+:EDITS:*/
  147. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  148. X/*:12-07-1988-22:06-wht-put in test for initialized fdmem */
  149. X/*:10-27-1988-22:44-wht-creation of file */
  150. X
  151. X#include <sys/types.h>
  152. X#include <fcntl.h>
  153. X#include "libmem.h"
  154. X
  155. Xvoid leave_text();
  156. X
  157. Xextern int errno;
  158. X
  159. Xstatic int fdmem = -2;
  160. Xdaddr_t lseek();
  161. X
  162. X/*+-------------------------------------------------------------------------
  163. X    minit(write_needed)
  164. X--------------------------------------------------------------------------*/
  165. Xvoid
  166. Xminit(write_needed)
  167. Xint write_needed;
  168. X{
  169. X    if(fdmem >= 0)
  170. X        return;
  171. X    if((fdmem=open("/dev/mem",(write_needed) ? O_RDWR : O_RDONLY,0)) < 0)
  172. X        leave_text("can't open /dev/mem",1);
  173. X
  174. X}    /* end of minit */
  175. X
  176. X/*+-------------------------------------------------------------------------
  177. X    mread(caddr,maddr,len)
  178. X--------------------------------------------------------------------------*/
  179. Xvoid
  180. Xmread(caddr,maddr,len)
  181. Xcaddr_t caddr;
  182. Xdaddr_t maddr;
  183. Xint len;
  184. X{
  185. Xchar s80[80];
  186. Xextern daddr_t myreadcnt;
  187. X
  188. X#if defined(M_I286)
  189. X    maddr &= 0xFFFFL;
  190. X#endif
  191. X
  192. X    if(fdmem == -2)
  193. X        leave_text("minit() not called",1);
  194. X
  195. X    if(lseek(fdmem,maddr,0) == -1L)
  196. X    {
  197. X        (void)sprintf(s80,"mem seek err (%08lx)",maddr);
  198. X        leave_text(s80,1);
  199. X    }
  200. X
  201. X    if(read(fdmem,caddr,len) != len)
  202. X    {
  203. X        (void)sprintf(s80,
  204. X            "mem read errno %d len %d addr %08lx",errno,len,maddr);
  205. X        leave_text(s80,1);
  206. X    }
  207. X    myreadcnt += len;
  208. X}    /* end of mread */
  209. X
  210. X/*+-------------------------------------------------------------------------
  211. X    mwrite(maddr,caddr,len)
  212. X--------------------------------------------------------------------------*/
  213. X#ifdef MWRITE_NEEDED
  214. Xvoid
  215. Xmwrite(maddr,caddr,len)
  216. Xdaddr_t maddr;
  217. Xcaddr_t caddr;
  218. Xint len;
  219. X{
  220. Xchar s80[80];
  221. X
  222. X#if defined(M_I286)
  223. X    maddr &= 0xFFFFL;
  224. X#endif
  225. X
  226. X    if(fdmem == -2)
  227. X        leave_text("minit() not called",1);
  228. X
  229. X    if((lseek(fdmem,maddr,0) < 0L) || (write(fdmem,caddr,len) != len))
  230. X    {
  231. X        (void)sprintf(s80,"/dev/mem write addr %08lx len %08lx",maddr,len);
  232. X        leave_text(s80,1);
  233. X    }
  234. X}    /* end of mwrite */
  235. X#endif /* MWRITE_NEEDED */
  236. X
  237. X/* vi: set tabstop=4 shiftwidth=4: */
  238. SHAR_EOF
  239. $TOUCH -am 0624151990 libmem.c &&
  240. chmod 0644 libmem.c ||
  241. echo "restore of libmem.c failed"
  242. set `wc -c libmem.c`;Wc_c=$1
  243. if test "$Wc_c" != "2443"; then
  244.     echo original size 2443, current size $Wc_c
  245. fi
  246. # ============= libswap.c ==============
  247. echo "x - extracting libswap.c (Text)"
  248. sed 's/^X//' << 'SHAR_EOF' > libswap.c &&
  249. X/*LINTLIBRARY*/
  250. X/*+-------------------------------------------------------------------------
  251. X    libswap.c -- /dev/swap routines for SCO UNIX/386 (maybe other *NIX)
  252. X    ...!emory!n4hgf!wht
  253. X
  254. X  Defined functions:
  255. X    sinit()
  256. X    sread(caddr,maddr,len)
  257. X
  258. X routines were originally written by Mike "Ford" Ditto: kudos!!!
  259. X--------------------------------------------------------------------------*/
  260. X/*+:EDITS:*/
  261. X/*:06-22-1990-02:00-root@n4hgf-creation from libmem */
  262. X
  263. X#include <sys/types.h>
  264. X#include <fcntl.h>
  265. X#include "libswap.h"
  266. X
  267. Xvoid leave_text();
  268. X
  269. Xextern int errno;
  270. X
  271. Xstatic int fdswap = -2;
  272. Xdaddr_t lseek();
  273. X
  274. X/*+-------------------------------------------------------------------------
  275. X    sinit()
  276. X--------------------------------------------------------------------------*/
  277. Xvoid
  278. Xsinit()
  279. X{
  280. X    if(fdswap >= 0)
  281. X        return;
  282. X    if((fdswap=open("/dev/swap",O_RDONLY)) < 0)
  283. X        leave_text("can't open /dev/swap (chgrp mem /dev/swap)",1);
  284. X
  285. X}    /* end of sinit */
  286. X
  287. X/*+-------------------------------------------------------------------------
  288. X    sread(caddr,maddr,len)
  289. X--------------------------------------------------------------------------*/
  290. Xvoid
  291. Xsread(caddr,maddr,len)
  292. Xcaddr_t caddr;
  293. Xdaddr_t maddr;
  294. Xint len;
  295. X{
  296. Xchar s80[80];
  297. Xextern daddr_t myreadcnt;
  298. X
  299. X#if defined(M_I286)
  300. X    maddr &= 0xFFFFL;
  301. X#endif
  302. X
  303. X    if(fdswap == -2)
  304. X        leave_text("sinit() not called",1);
  305. X
  306. X    if(lseek(fdswap,maddr,0) == -1L)
  307. X    {
  308. X        (void)sprintf(s80,"swap seek err (%08lx)",maddr);
  309. X        leave_text(s80,1);
  310. X    }
  311. X
  312. X    if(read(fdswap,caddr,len) != len)
  313. X    {
  314. X        (void)sprintf(s80,
  315. X            "swap read errno %d len %d addr %08lx",errno,len,maddr);
  316. X        leave_text(s80,1);
  317. X    }
  318. X    myreadcnt += len;
  319. X}    /* end of sread */
  320. X
  321. X/* vi: set tabstop=4 shiftwidth=4: */
  322. SHAR_EOF
  323. $TOUCH -am 0624151990 libswap.c &&
  324. chmod 0644 libswap.c ||
  325. echo "restore of libswap.c failed"
  326. set `wc -c libswap.c`;Wc_c=$1
  327. if test "$Wc_c" != "1658"; then
  328.     echo original size 1658, current size $Wc_c
  329. fi
  330. # ============= libnlsym.c ==============
  331. echo "x - extracting libnlsym.c (Text)"
  332. sed 's/^X//' << 'SHAR_EOF' > libnlsym.c &&
  333. X/*LINTLIBRARY*/
  334. X/*+-------------------------------------------------------------------------
  335. X    libnlsym.c -- common runtime for nlsym users
  336. X    ...!emory!n4hgf!wht
  337. X
  338. X  Defined functions:
  339. X    nlsym_error(text)
  340. X    nlsym_read()
  341. X
  342. X--------------------------------------------------------------------------*/
  343. X/*+:EDITS:*/
  344. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  345. X/*:10-27-1988-11:44-wht-creation */
  346. X
  347. X#include <stdio.h>
  348. X#include <sys/types.h>
  349. X#include <sys/stat.h>
  350. X#include <fcntl.h>
  351. X#include <nlist.h>
  352. X
  353. Xvoid leave_text();
  354. X
  355. X#define DEFINE_NLSYM
  356. X#include "nlsym.h"
  357. X#include "libnlsym.h"
  358. X
  359. Xextern int errno;
  360. Xextern char *sys_errlist[];
  361. X
  362. X/*+-------------------------------------------------------------------------
  363. X    nlsym_error(text)
  364. X--------------------------------------------------------------------------*/
  365. Xvoid
  366. Xnlsym_error(text)
  367. Xchar *text;
  368. X{
  369. Xchar s128[128];
  370. X
  371. X    (void)strcpy(s128,text);
  372. X    if(errno)
  373. X    {
  374. X        (void)strcat(s128," (");
  375. X        (void)strcat(s128,sys_errlist[errno]);
  376. X        (void)strcat(s128,")");
  377. X    }
  378. X    (void)strcat(s128," run nlsym");
  379. X    leave_text(s128,1);
  380. X}    /* end of nlsym_error */
  381. X
  382. X/*+-------------------------------------------------------------------------
  383. X    nlsym_read()
  384. X--------------------------------------------------------------------------*/
  385. Xvoid
  386. Xnlsym_read()
  387. X{
  388. Xchar s80[80];
  389. Xint itmp;
  390. Xint fdnlsym;
  391. Xstruct stat curstat;    /* current /unix status */
  392. Xstruct stat unixstat;        /* /unix status at nlsym run (void)time */
  393. Xlong unique;
  394. X
  395. X    if(stat(UNIX_KERNEL,&curstat) < 0)
  396. X    {
  397. X        (void)sprintf(s80,"cannot stat %s",UNIX_KERNEL);
  398. X        nlsym_error(s80);
  399. X    }
  400. X
  401. X    errno = 0;
  402. X    if((fdnlsym = open(UNIX_NLSYM,O_RDONLY,0)) < 0)
  403. X    {
  404. X        (void)sprintf(s80,"%s open error\n",UNIX_NLSYM);
  405. X        nlsym_error(s80);
  406. X    }
  407. X
  408. X    if(read(fdnlsym,&unixstat,sizeof(unixstat)) != sizeof(unixstat))
  409. X        nlsym_error("nlsym_read: /unix stat read error");
  410. X
  411. X    if(read(fdnlsym,nlsym,sizeof(nlsym)) != sizeof(nlsym))
  412. X        nlsym_error("nlsym_read: nlsym read error");
  413. X
  414. X    if(read(fdnlsym,&unique,sizeof(unique)) != sizeof(unique))
  415. X        nlsym_error("nlsym_read: `unique' read error");
  416. X
  417. X    (void)close(fdnlsym);
  418. X
  419. X    if( (unique != NLSYM_UNIQUE) ||
  420. X        (unixstat.st_ino != curstat.st_ino) ||
  421. X        (unixstat.st_mtime != curstat.st_mtime) ||
  422. X        (unixstat.st_size != curstat.st_size))
  423. X    {
  424. X        (void)sprintf(s80,"%s out of date\n",UNIX_NLSYM);
  425. X        nlsym_error(s80);
  426. X    }
  427. X
  428. X}    /* end of nlsym_read */
  429. SHAR_EOF
  430. $TOUCH -am 0624151990 libnlsym.c &&
  431. chmod 0644 libnlsym.c ||
  432. echo "restore of libnlsym.c failed"
  433. set `wc -c libnlsym.c`;Wc_c=$1
  434. if test "$Wc_c" != "2312"; then
  435.     echo original size 2312, current size $Wc_c
  436. fi
  437. # ============= nlsym.c ==============
  438. echo "x - extracting nlsym.c (Text)"
  439. sed 's/^X//' << 'SHAR_EOF' > nlsym.c &&
  440. X/*+-------------------------------------------------------------------------
  441. X    nlsym.c -- utility nlist - fast access to kernel /dev/kmem offsets
  442. X    ...!emory!n4hgf!wht
  443. X
  444. X  Defined functions:
  445. X    main(argc,argv,envp)
  446. X    nlsym_write_error(code)
  447. X
  448. X--------------------------------------------------------------------------*/
  449. X/*+:EDITS:*/
  450. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  451. X/*:05-12-1989-18:27-wht-fix endless loop error on cannot nlist */
  452. X/*:10-27-1988-10:58-wht-creation */
  453. X
  454. X#include <stdio.h>
  455. X#include <sys/types.h>
  456. X#include <sys/stat.h>
  457. X#include <fcntl.h>
  458. X#include <nlist.h>
  459. X
  460. X#define DEFINE_NLSYM
  461. X#include "nlsym.h"
  462. X
  463. X/*+-------------------------------------------------------------------------
  464. X    nlsym_write_error(code)
  465. X--------------------------------------------------------------------------*/
  466. Xvoid
  467. Xnlsym_write_error(code)
  468. Xint code;
  469. X{
  470. X    (void)fprintf(stderr,"code %d: ",code);
  471. X    perror(UNIX_NLSYM);
  472. X    exit(1);
  473. X}    /* end of nlsym_write_error */
  474. X
  475. X/*+-------------------------------------------------------------------------
  476. X    main(argc,argv,envp)
  477. X--------------------------------------------------------------------------*/
  478. X/*ARGSUSED*/
  479. Xmain(argc,argv,envp)
  480. Xint argc;
  481. Xchar **argv;
  482. Xchar **envp;
  483. X{
  484. Xregister int itmp;
  485. Xregister struct nlist *nn;
  486. Xstruct stat unixstat;        /* /unix status at nlsym run (void)time */
  487. Xint fdnlsym;
  488. Xint nlist_error = 0;
  489. Xlong unique;
  490. XFILE *kludge;
  491. X
  492. X    (void)nlist(UNIX_KERNEL,nlsym);
  493. X
  494. X    nn = nlsym;
  495. X    while(nn->n_name)
  496. X    {
  497. X        if(!nn->n_sclass)
  498. X        {
  499. X            (void)printf("%s: can't nlist\n", nn->n_name);
  500. X            nlist_error = 1;
  501. X            nn++;
  502. X            continue;
  503. X        }
  504. X        (void)printf("%-12.12s  storage class: %04x value: %08lx\n",
  505. X            nn->n_name,
  506. X            nn->n_sclass,
  507. X            nn->n_value);
  508. X        nn++;
  509. X    }
  510. X
  511. X    if(nlist_error)
  512. X    {
  513. X        (void)fprintf(stderr,"%s NOT produced\n",UNIX_NLSYM);
  514. X        exit(1);
  515. X    }
  516. X
  517. X    if((kludge = fopen(UNIX_NLSYM,"w")) == NULL)    /* scratch/create */
  518. X        nlsym_write_error(-1);
  519. X    (void)fclose(kludge);
  520. X
  521. X    if((fdnlsym = open(UNIX_NLSYM,O_WRONLY,0)) < 0)
  522. X        nlsym_write_error(fdnlsym);
  523. X
  524. X    if(stat(UNIX_KERNEL,&unixstat) < 0)
  525. X    {
  526. X        (void)fputs("cannot stat ",stderr);
  527. X        perror(UNIX_KERNEL);
  528. X        exit(1);
  529. X    }
  530. X
  531. X    if((itmp = write(fdnlsym,&unixstat,sizeof(unixstat))) != sizeof(unixstat))
  532. X        nlsym_write_error(itmp);
  533. X
  534. X    if((itmp = write(fdnlsym,nlsym,sizeof(nlsym))) != sizeof(nlsym))
  535. X        nlsym_write_error(itmp);
  536. X
  537. X    unique = NLSYM_UNIQUE;
  538. X    if((itmp = write(fdnlsym,&unique,sizeof(unique))) != sizeof(unique))
  539. X        nlsym_write_error(itmp);
  540. X
  541. X    (void)close(fdnlsym);
  542. X    exit(0);
  543. X    /*NOTREACHED*/
  544. X}    /* end of main */
  545. X
  546. X/* vi: set tabstop=4 shiftwidth=4: */
  547. SHAR_EOF
  548. $TOUCH -am 0624151990 nlsym.c &&
  549. chmod 0644 nlsym.c ||
  550. echo "restore of nlsym.c failed"
  551. set `wc -c nlsym.c`;Wc_c=$1
  552. if test "$Wc_c" != "2525"; then
  553.     echo original size 2525, current size $Wc_c
  554. fi
  555. # ============= proc.c ==============
  556. echo "x - extracting proc.c (Text)"
  557. sed 's/^X//' << 'SHAR_EOF' > proc.c &&
  558. X/*+-------------------------------------------------------------------------
  559. X    proc.c - u386mon proc table functions
  560. X
  561. X  Defined functions:
  562. X    display_proc(win,y,x)
  563. X    grok_proc()
  564. X    pstat_text(pstat)
  565. X
  566. X--------------------------------------------------------------------------*/
  567. X/*+:EDITS:*/
  568. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  569. X/*:06-17-1990-16:46-wht-creation */
  570. X
  571. X#define M_TERMINFO
  572. X
  573. X#include <curses.h>
  574. X#include <panel.h>
  575. X#include <sys/types.h>
  576. X#undef NGROUPS_MAX
  577. X#undef NULL
  578. X#include <sys/param.h>
  579. X#include <sys/immu.h>
  580. X#include <sys/region.h>
  581. X#include <sys/proc.h>
  582. X#include <sys/var.h>
  583. X#include <nlist.h>
  584. X#include "nlsym.h"
  585. X#include "libkmem.h"
  586. X#include "libnlsym.h"
  587. X#include "u386mon.h"
  588. X
  589. Xextern struct var v;
  590. X
  591. Xstruct proc *procs = (struct proc *)0;
  592. Xstruct proc *oldprocs = (struct proc *)0;
  593. X
  594. Xint procs_per_pstat[SXBRK + 1];
  595. Xint procs_in_core;
  596. Xint procs_alive;
  597. X
  598. X/*+-------------------------------------------------------------------------
  599. X    pstat_text(pstat)
  600. X--------------------------------------------------------------------------*/
  601. Xchar *
  602. Xpstat_text(pstat)
  603. Xchar pstat;
  604. X{
  605. Xstatic char errant[10];
  606. X
  607. X    switch(pstat)
  608. X    {
  609. X        case SSLEEP:   return("sleep ");
  610. X        case SRUN:     return("run   ");
  611. X        case SZOMB:    return("zombie");
  612. X        case SSTOP:    return("stop  ");
  613. X        case SIDL:     return("idle  ");
  614. X        case SONPROC:  return("onproc");
  615. X        case SXBRK:    return("xbrk  ");
  616. X    }
  617. X    (void)sprintf(errant,"%06u?",(unsigned char)pstat);
  618. X    return(errant);
  619. X
  620. X}    /* end of pstat_text */
  621. X
  622. X/*+-------------------------------------------------------------------------
  623. X    grok_proc() - read and examine kernel process table
  624. X--------------------------------------------------------------------------*/
  625. Xvoid
  626. Xgrok_proc()
  627. X{
  628. Xregister iproc;
  629. Xregister struct proc *pp;
  630. X
  631. X    if(!procs)
  632. X    {
  633. X        if(!(procs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
  634. X            leave_text("cannot alloc memory for proc table",1);
  635. X        if(!(oldprocs = (struct proc *)malloc(sizeof(struct proc) * v.v_proc)))
  636. X            leave_text("cannot alloc memory for proc table",1);
  637. X    }
  638. X    kread((caddr_t)procs,procaddr,sizeof(struct proc) * v.v_proc);
  639. X    for(iproc = 0; iproc < SXBRK + 1; iproc++)
  640. X        procs_per_pstat[iproc] = 0;
  641. X    procs_in_core = 0;
  642. X    procs_alive = 0;
  643. X
  644. X    for(iproc = 0; iproc < v.v_proc; iproc++)
  645. X    {
  646. X        pp = procs + iproc;
  647. X
  648. X        if(pp->p_stat)
  649. X            procs_alive++;
  650. X
  651. X        procs_per_pstat[pp->p_stat]++;    /* count # procs in each state */
  652. X
  653. X        if(pp->p_flag & SLOAD)            /* count # procs in memory */
  654. X            procs_in_core++;
  655. X    }
  656. X
  657. X}    /* end of grok_proc */
  658. X
  659. X/*+-------------------------------------------------------------------------
  660. X    display_proc(win,y,x)
  661. X--------------------------------------------------------------------------*/
  662. Xvoid
  663. Xdisplay_proc(win,y,x)
  664. XWINDOW *win;
  665. Xint y;
  666. Xint x;
  667. X{
  668. Xregister istat;
  669. X
  670. X    grok_proc();
  671. X
  672. X    use_cp(win,cpBANNER);
  673. X    wmove(win,y++,x);
  674. X    waddstr(win,"-- Proc ---");
  675. X    for(istat = SSLEEP; istat <= SXBRK; istat++)
  676. X    {
  677. X        wmove(win,y++,x);
  678. X        disp_info_int(win,pstat_text(istat),"  %3d",procs_per_pstat[istat]);
  679. X    }
  680. X    wmove(win,y++,x);
  681. X    disp_info_int(win,"total ","  %3d",procs_alive);
  682. X    wmove(win,y++,x);
  683. X    disp_info_int(win,"in mem","  %3d",procs_in_core);
  684. X}    /* end of display_proc */
  685. X
  686. X/* vi: set tabstop=4 shiftwidth=4: */
  687. X/* end of proc.c */
  688. SHAR_EOF
  689. $TOUCH -am 0624151990 proc.c &&
  690. chmod 0644 proc.c ||
  691. echo "restore of proc.c failed"
  692. set `wc -c proc.c`;Wc_c=$1
  693. if test "$Wc_c" != "3188"; then
  694.     echo original size 3188, current size $Wc_c
  695. fi
  696. # ============= tune.c ==============
  697. echo "x - extracting tune.c (Text)"
  698. sed 's/^X//' << 'SHAR_EOF' > tune.c &&
  699. X/*+-------------------------------------------------------------------------
  700. X    tune.c - u386mon tune struct display
  701. X
  702. X  Defined functions:
  703. X    display_tune(win,y,x)
  704. X
  705. X--------------------------------------------------------------------------*/
  706. X/*+:EDITS:*/
  707. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  708. X/*:06-17-1990-14:59-wht-creation */
  709. X
  710. X#define M_TERMINFO
  711. X
  712. X#include <curses.h>
  713. X#include <panel.h>
  714. X#include <sys/types.h>
  715. X#include <sys/tuneable.h>
  716. X#include "u386mon.h"
  717. X
  718. X/*+-------------------------------------------------------------------------
  719. X    display_tune(win,y,x)
  720. X--------------------------------------------------------------------------*/
  721. Xvoid
  722. Xdisplay_tune(win,y,x)
  723. XWINDOW *win;
  724. Xint y;
  725. Xint x;
  726. X{
  727. X
  728. X    use_cp(win,cpBANNER);
  729. X    wmove(win,y++,x);
  730. X    waddstr(win,"-- Tune ---------");
  731. X    wmove(win,y++,x);
  732. X    disp_static_int(win,"t_gpgslo    ","%5d",tune.t_gpgslo);
  733. X    wmove(win,y++,x);
  734. X    disp_static_int(win,"t_gpgshi    ","%5d",tune.t_gpgshi);
  735. X    wmove(win,y++,x);
  736. X    disp_static_int(win,"t_gpgsmsk   ","0x%03lx",tune.t_gpgsmsk);
  737. X    wmove(win,y++,x);
  738. X    disp_static_int(win,"t_ageintvl  ","%5d",tune.t_ageinterval);
  739. X    wmove(win,y++,x);
  740. X    disp_static_int(win,"t_maxsc     ","%5d",tune.t_maxsc);
  741. X    wmove(win,y++,x);
  742. X    disp_static_int(win,"t_maxfc     ","%5d",tune.t_maxfc);
  743. X    wmove(win,y++,x);
  744. X    disp_static_int(win,"t_maxumem   ","%5d",tune.t_maxumem);
  745. X    wmove(win,y++,x);
  746. X    disp_static_int(win,"t_bdflushr  ","%5d",tune.t_bdflushr);
  747. X    wmove(win,y++,x);
  748. X    disp_static_int(win,"t_minarmem  ","%5d",tune.t_minarmem);
  749. X    wmove(win,y++,x);
  750. X    disp_static_int(win,"t_minasmem  ","%5d",tune.t_minasmem);
  751. X
  752. X}    /* end of display_tune */
  753. X
  754. X/* vi: set tabstop=4 shiftwidth=4: */
  755. X/* end of tune.c */
  756. SHAR_EOF
  757. $TOUCH -am 0624151990 tune.c &&
  758. chmod 0644 tune.c ||
  759. echo "restore of tune.c failed"
  760. set `wc -c tune.c`;Wc_c=$1
  761. if test "$Wc_c" != "1662"; then
  762.     echo original size 1662, current size $Wc_c
  763. fi
  764. # ============= u386mon.c ==============
  765. echo "x - extracting u386mon.c (Text)"
  766. sed 's/^X//' << 'SHAR_EOF' > u386mon.c &&
  767. Xchar *revision = "1.00";
  768. X/*+-------------------------------------------------------------------------
  769. X    u386mon.c - UNIX 386 system monitor
  770. X
  771. X  Defined functions:
  772. X    calc_cpu_avg(cpu_ticks)
  773. X    calc_wait_avg(wait_ticks)
  774. X    draw_cpuscale_literals(win,y,x)
  775. X    draw_per_sec_literals(win,y,x)
  776. X    draw_waitscale_literals(win,y,x)
  777. X    extra_info_stuff()
  778. X    extra_static_stuff()
  779. X    get_cpu_avg(cpu_ticks,period)
  780. X    get_elapsed_time(elapsed_seconds)
  781. X    get_wait_avg(wait_ticks,period)
  782. X    leave(exit_code)
  783. X    leave_text(text,exit_code)
  784. X    main(argc,argv,envp)
  785. X    update_cpuscale(win,y,x,width,per_state)
  786. X    update_waitscale(win,y,x,width,per_state,total_ticks)
  787. X
  788. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  789. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  790. X u386mon xxx.xxx                                               mm/dd/yy hh:mm:ss
  791. X
  792. X---- CPU --- tot usr ker brk ---------------------------------------------------
  793. X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  794. X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  795. X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  796. X---- Wait -- tot  io swp pio ---------------------------------------------------
  797. X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  798. X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  799. X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  800. X
  801. X--------------------------------------------------------------------------*/
  802. X/*+:EDITS:*/
  803. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  804. X/*:06-15-1990-18:32-wht@n4hgf-creation */
  805. X
  806. X#define M_TERMINFO
  807. X
  808. X#include <curses.h>
  809. X#include <panel.h>
  810. X#include <signal.h>
  811. X#include <string.h>
  812. X#include <fcntl.h>
  813. X#include <nlist.h>
  814. X#include <errno.h>
  815. X#include <time.h>
  816. X#include <sys/types.h>
  817. X#include <sys/lock.h>
  818. X#include <sys/utsname.h>
  819. X#include <sys/stat.h>
  820. X#include <sys/ascii.h>
  821. X#undef NGROUPS_MAX
  822. X#undef NULL
  823. X#include <sys/param.h>
  824. X#include <sys/bootinfo.h>
  825. X#include <sys/tuneable.h>
  826. X#include <sys/sysinfo.h>
  827. X#include <sys/sysmacros.h>
  828. X#include <sys/immu.h>
  829. X#include <sys/region.h>
  830. X#include <sys/proc.h>
  831. X#include <sys/var.h>
  832. X#include "nlsym.h"
  833. X#include "libkmem.h"
  834. X#include "libmem.h"
  835. X#include "libswap.h"
  836. X#include "libnlsym.h"
  837. X#include "u386mon.h"
  838. X
  839. XPANEL *mkpanel();
  840. X
  841. Xstruct sysinfo sysinfo;
  842. Xstruct sysinfo sysinfo_last;
  843. X#define sysidelta(x) (sysinfo.x - sysinfo_last.x)
  844. X
  845. Xstruct minfo minfo;
  846. Xstruct minfo minfo_last;
  847. X#define midelta(x) (minfo.x - minfo_last.x)
  848. X
  849. Xstruct bootinfo bootinfo;
  850. Xstruct tune tune;
  851. Xstruct utsname utsname;
  852. Xstruct var v;
  853. Xtime_t now;
  854. Xtime_t then;
  855. Xint hz;
  856. Xint nswap;
  857. Xint maxmem;
  858. Xint freemem;
  859. Xdaddr_t myreadcnt = 0L;
  860. X
  861. XPANEL *pscr;
  862. XWINDOW *wscr;
  863. X
  864. X#define CPU_AVG_MAX        10
  865. Xint cpu_avg_init = 0;
  866. Xtime_t *cpu_avg[CPU_AVG_MAX];
  867. Xtime_t cpu_ticks[5];
  868. X
  869. X#define WAIT_AVG_MAX    10
  870. Xint wait_avg_init = 0;
  871. Xtime_t *wait_avg[WAIT_AVG_MAX];
  872. Xtime_t wait_ticks[5];
  873. X
  874. X/*+-------------------------------------------------------------------------
  875. X    leave(exit_code)
  876. X--------------------------------------------------------------------------*/
  877. Xvoid
  878. Xleave(exit_code)
  879. Xint exit_code;
  880. X{
  881. X    wmove(wscr,CMD_TLY,0);
  882. X    use_cp(wscr,cpLIT);
  883. X    wclrtoeol(wscr);
  884. X    pflush();
  885. X    endwin();
  886. X    exit(exit_code);
  887. X}    /* end of leave */
  888. X
  889. X/*+-------------------------------------------------------------------------
  890. X    leave_text(text,exit_code)
  891. X--------------------------------------------------------------------------*/
  892. Xvoid
  893. Xleave_text(text,exit_code)
  894. Xchar *text;
  895. Xint exit_code;
  896. X{
  897. X    disp_msg(cpHIGH,text);
  898. X    leave(exit_code);
  899. X}    /* end of leave */
  900. X
  901. X/*+-----------------------------------------------------------------------
  902. X    char *get_elapsed_time(elapsed_seconds) - "ddd+hh:mm:ss" returned
  903. X  static string address is returned
  904. X------------------------------------------------------------------------*/
  905. Xchar *
  906. Xget_elapsed_time(elapsed_seconds)
  907. Xtime_t elapsed_seconds;
  908. X{
  909. Xstatic char elapsed_time_str[32];
  910. Xtime_t dd,hh,mm,ss;
  911. X
  912. X    dd = 0;
  913. X    hh = elapsed_seconds / 3600;
  914. X    if(hh > 24)
  915. X    {
  916. X        dd = hh / 24;
  917. X        elapsed_seconds -= dd * 3600 * 24;
  918. X        hh %= 24;
  919. X    }
  920. X    elapsed_seconds -= hh * 3600;
  921. X    mm = elapsed_seconds / 60L;
  922. X    elapsed_seconds -= mm * 60L;
  923. X    ss = elapsed_seconds;
  924. X
  925. X    if(dd)
  926. X        (void)sprintf(elapsed_time_str,"%3ld+%02ld:%02ld:%02ld",dd,hh,mm,ss);
  927. X    else
  928. X        (void)sprintf(elapsed_time_str,"    %2ld:%02ld:%02ld",hh,mm,ss);
  929. X    return(elapsed_time_str);
  930. X}    /* end of get_elapsed_time */
  931. X
  932. X/*+-------------------------------------------------------------------------
  933. X    draw_cpuscale_literals(win)
  934. X--------------------------------------------------------------------------*/
  935. Xvoid
  936. Xdraw_cpuscale_literals(win,y,x)
  937. XWINDOW *win;
  938. Xint y;
  939. Xint x;
  940. X{
  941. Xint x2 = x;
  942. X
  943. X    wmove(win,y,x);
  944. X    use_cp(wscr,cpBANNER);
  945. X    waddstr(win,"---- CPU --- tot usr ker brk ");
  946. X    getyx(win,y,x2);
  947. X    while(x2 < COLS)
  948. X        waddch(win,(chtype)'-'),x2++;
  949. X    use_cp(wscr,cpLIT);
  950. X    wmove(win,y + 1,x);
  951. X      waddstr(win," Instant %  ");
  952. X    wmove(win,y + 2,x);
  953. X      waddstr(win," 5 Sec Avg %");
  954. X    wmove(win,y + 3,x);
  955. X    waddstr(win,"10 Sec Avg %");
  956. X
  957. X}    /* end of draw_cpuscale_literals */
  958. X
  959. X/*+-------------------------------------------------------------------------
  960. X    update_cpuscale(win,y,width,per_state)
  961. X
  962. X000000000011111111112222222222333333333344444444445555555555666666
  963. X012345678901234567890123456789012345678901234567890123456789012345
  964. Xtot usr ker misc 
  965. X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  966. X--------------------------------------------------------------------------*/
  967. X#define _CPUSCALE_TX    0
  968. X#define _CPUSCALE_UX    4
  969. X#define _CPUSCALE_KX    8
  970. X#define _CPUSCALE_BX    12
  971. X#define _CPUSCALE_SX    16
  972. X
  973. Xtime_t
  974. Xupdate_cpuscale(win,y,x,width,per_state)
  975. XWINDOW *win;
  976. Xint y;
  977. Xint x;
  978. Xregister width;
  979. Xtime_t *per_state;
  980. X{
  981. Xregister itmp;
  982. Xint accum = 0;
  983. Xtime_t idle = per_state[CPU_IDLE] + per_state[CPU_WAIT];
  984. Xtime_t cpu_ticks_total = idle + per_state[CPU_SXBRK] + 
  985. X    per_state[CPU_IDLE] + per_state[CPU_KERNEL] + per_state[CPU_USER];
  986. Xtime_t percent_user    = (per_state[CPU_USER]   * 100) / cpu_ticks_total;
  987. Xtime_t percent_kernel  = (per_state[CPU_KERNEL] * 100) / cpu_ticks_total;
  988. Xtime_t percent_break   = (per_state[CPU_SXBRK]  * 100) / cpu_ticks_total;
  989. Xtime_t percent_busy    = percent_user + percent_kernel + percent_break;
  990. X
  991. X    if(!idle)            /* take care of integer div truncation */
  992. X        percent_busy = 100;
  993. X
  994. X    wmove(win,y, x + _CPUSCALE_TX);
  995. X    if(percent_busy < 70)
  996. X        use_cp(wscr,cpLOW);
  997. X    else if(percent_busy < 90)
  998. X        use_cp(wscr,cpMED);
  999. X    else
  1000. X        use_cp(wscr,cpHIGH);
  1001. X    wprintw(win,"%3ld",percent_busy);
  1002. X
  1003. X    wmove(win,y, x + _CPUSCALE_UX);
  1004. X    use_cp(wscr,cpINFO);
  1005. X    wprintw(win,"%3ld",percent_user);
  1006. X    
  1007. X    wmove(win,y, x + _CPUSCALE_KX);
  1008. X    wprintw(win,"%3ld",percent_kernel);
  1009. X    
  1010. X    wmove(win,y, x + _CPUSCALE_BX);
  1011. X    wprintw(win,"%3ld",percent_break);
  1012. X    
  1013. X    wmove(win,y, x + _CPUSCALE_SX);
  1014. X
  1015. X    use_cp(wscr,cpLOW);
  1016. X    itmp = (width * percent_user) / 100;
  1017. X    accum += itmp;
  1018. X    while(itmp--)
  1019. X        waddch(win,(chtype)'u');
  1020. X
  1021. X    use_cp(wscr,cpMED);
  1022. X    itmp = (width * percent_kernel) / 100;
  1023. X    accum += itmp;
  1024. X    while(itmp--)
  1025. X        waddch(win,(chtype)'k');
  1026. X
  1027. X    use_cp(wscr,cpHIGH);
  1028. X    itmp = (width * percent_break) / 100;
  1029. X    accum += itmp;
  1030. X    while(itmp--)
  1031. X        waddch(win,(chtype)'b');
  1032. X
  1033. X    if((percent_busy > 98) && ((width - accum) > 0))
  1034. X    {
  1035. X        waddch(win,(chtype)'*');
  1036. X        accum++;
  1037. X    }
  1038. X
  1039. X    if((itmp = (width - accum)) > 0)
  1040. X    {
  1041. X        while(itmp--)
  1042. X            waddch(win,(chtype)' ');
  1043. X    }
  1044. X    return(cpu_ticks_total);
  1045. X}    /* end of update_cpuscale */
  1046. X
  1047. X/*+-------------------------------------------------------------------------
  1048. X    calc_cpu_avg(per_state) - add per_state array to avg array
  1049. X--------------------------------------------------------------------------*/
  1050. Xvoid
  1051. Xcalc_cpu_avg(per_state)
  1052. Xtime_t per_state[];
  1053. X{
  1054. Xregister itmp;
  1055. X
  1056. X    if(!cpu_avg_init)
  1057. X    {
  1058. X        for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
  1059. X            (void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
  1060. X        cpu_avg_init = 1;
  1061. X    }
  1062. X    else
  1063. X    {
  1064. X        for(itmp = 0; itmp < CPU_AVG_MAX - 1; itmp++)
  1065. X            (void)memcpy(cpu_avg[itmp],cpu_avg[itmp + 1],sizeof(time_t) * 5);
  1066. X        (void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
  1067. X    }
  1068. X
  1069. X}    /* end of calc_cpu_avg */
  1070. X
  1071. X/*+-------------------------------------------------------------------------
  1072. X    get_cpu_avg(cpu_ticks,period)
  1073. X--------------------------------------------------------------------------*/
  1074. Xget_cpu_avg(cpu_ticks,period)
  1075. Xtime_t cpu_ticks[];
  1076. Xint period;
  1077. X{
  1078. Xregister iperiod = CPU_AVG_MAX;
  1079. Xregister istate;
  1080. Xregister count = period;
  1081. X
  1082. X    for(istate = 0; istate < 5; istate++)
  1083. X        cpu_ticks[istate] = 0;
  1084. X
  1085. X    while(count--)
  1086. X    {
  1087. X        iperiod--;
  1088. X        for(istate = 0; istate < 5; istate++)
  1089. X        {
  1090. X            cpu_ticks[istate] += (cpu_avg[iperiod])[istate];
  1091. X        }
  1092. X    }
  1093. X
  1094. X    for(istate = 0; istate < 5; istate++)
  1095. X        cpu_ticks[istate] /= period;
  1096. X
  1097. X}    /* end of get_cpu_avg */
  1098. X
  1099. X/*+-------------------------------------------------------------------------
  1100. X    draw_waitscale_literals(win)
  1101. X--------------------------------------------------------------------------*/
  1102. Xvoid
  1103. Xdraw_waitscale_literals(win,y,x)
  1104. XWINDOW *win;
  1105. Xint y;
  1106. Xint x;
  1107. X{
  1108. Xint x2 = x;
  1109. X
  1110. X    wmove(win,y,x);
  1111. X    use_cp(wscr,cpBANNER);
  1112. X    waddstr(win,"---- Wait -- tot  io swp pio -- (% of real (void)time) ");
  1113. X    getyx(win,y,x2);
  1114. X    while(x2 < COLS)
  1115. X        waddch(win,(chtype)'-'),x2++;
  1116. X    use_cp(wscr,cpLIT);
  1117. X    wmove(win,y + 1,x);
  1118. X      waddstr(win," Instant %  ");
  1119. X    wmove(win,y + 2,x);
  1120. X      waddstr(win," 5 Sec Avg %");
  1121. X    wmove(win,y + 3,x);
  1122. X    waddstr(win,"10 Sec Avg %");
  1123. X
  1124. X}    /* end of draw_waitscale_literals */
  1125. X
  1126. X/*+-------------------------------------------------------------------------
  1127. X    draw_per_sec_literals(win)
  1128. X--------------------------------------------------------------------------*/
  1129. Xvoid
  1130. Xdraw_per_sec_literals(win,y,x)
  1131. XWINDOW *win;
  1132. Xint y;
  1133. Xint x;
  1134. X{
  1135. X
  1136. X    wmove(win,y,x);
  1137. X    use_cp(wscr,cpBANNER);
  1138. X    waddstr(win,"---- Sysinfo/Minfo --- (last 1 second activity) ");
  1139. X    getyx(win,y,x);
  1140. X    while(x < getmaxx(win))
  1141. X        waddch(win,(chtype)'-'),x++;
  1142. X
  1143. X}    /* end of draw_per_sec_literals */
  1144. X
  1145. X/*+-------------------------------------------------------------------------
  1146. X    update_waitscale(win,y,width,per_state)
  1147. X
  1148. X000000000011111111112222222222333333333344444444445555555555666666
  1149. X012345678901234567890123456789012345678901234567890123456789012345
  1150. Xtot  io swp pio 
  1151. X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  1152. X--------------------------------------------------------------------------*/
  1153. X#define _WAITSCALE_TX    0
  1154. X#define _WAITSCALE_IX    4
  1155. X#define _WAITSCALE_WX    8
  1156. X#define _WAITSCALE_PX    12
  1157. X#define _WAITSCALE_SX    16
  1158. X
  1159. Xtime_t
  1160. Xupdate_waitscale(win,y,x,width,per_state,total_ticks)
  1161. XWINDOW *win;
  1162. Xint y;
  1163. Xint x;
  1164. Xregister width;
  1165. Xtime_t *per_state;
  1166. Xtime_t total_ticks;
  1167. X{
  1168. Xregister itmp;
  1169. Xint accum = 0;
  1170. Xtime_t percent_io = 0L;
  1171. Xtime_t percent_swap = 0L;
  1172. Xtime_t percent_pio = 0L;
  1173. Xtime_t percent_total_wait;
  1174. Xtime_t total_wait;
  1175. X
  1176. X/* crock: because of latency, total_ticks < all wait ticks sometimes */
  1177. X    total_wait = per_state[W_IO] + per_state[W_SWAP] + per_state[W_PIO];
  1178. X    if(total_ticks < total_wait)
  1179. X        total_ticks = total_wait;
  1180. X
  1181. X    if(total_ticks)
  1182. X    {
  1183. X        percent_io    = (per_state[W_IO]   * 100) / total_ticks;
  1184. X        percent_swap  = (per_state[W_SWAP] * 100) / total_ticks;
  1185. X        percent_pio   = (per_state[W_PIO]  * 100) / total_ticks;
  1186. X    }
  1187. X
  1188. X    percent_total_wait = percent_io + percent_swap + percent_pio;
  1189. X    wmove(win,y, x + _WAITSCALE_TX);
  1190. X    if(percent_total_wait < 30)
  1191. X        use_cp(wscr,cpLOW);
  1192. X    else if(percent_total_wait < 50)
  1193. X        use_cp(wscr,cpMED);
  1194. X    else
  1195. X        use_cp(wscr,cpHIGH);
  1196. X    wprintw(win,"%3ld",percent_total_wait);
  1197. X
  1198. X    wmove(win,y, x + _WAITSCALE_IX);
  1199. X    use_cp(wscr,cpINFO);
  1200. X    wprintw(win,"%3ld",percent_io);
  1201. X    
  1202. X    wmove(win,y, x + _WAITSCALE_WX);
  1203. X    wprintw(win,"%3ld",percent_swap);
  1204. X    
  1205. X    wmove(win,y, x + _WAITSCALE_PX);
  1206. X    wprintw(win,"%3ld",percent_pio);
  1207. X    
  1208. X    wmove(win,y, x + _WAITSCALE_SX);
  1209. X
  1210. X    use_cp(wscr,cpLOW);
  1211. X    itmp = (width * percent_io) / 100;
  1212. X    accum += itmp;
  1213. X    while(itmp--)
  1214. X        waddch(win,(chtype)'i');
  1215. X
  1216. X    use_cp(wscr,cpMED);
  1217. X    itmp = (width * percent_swap) / 100;
  1218. X    accum += itmp;
  1219. X    while(itmp--)
  1220. X        waddch(win,(chtype)'s');
  1221. X
  1222. X    use_cp(wscr,cpHIGH);
  1223. X    itmp = (width * percent_pio) / 100;
  1224. X    accum += itmp;
  1225. X    while(itmp--)
  1226. X        waddch(win,(chtype)'p');
  1227. X
  1228. X    if((itmp = (width - accum)) > 0)
  1229. X    {
  1230. X        while(itmp--)
  1231. X            waddch(win,(chtype)' ');
  1232. X    }
  1233. X
  1234. X}    /* end of update_waitscale */
  1235. X
  1236. X/*+-------------------------------------------------------------------------
  1237. X    calc_wait_avg(per_state) - add per_state array to avg array
  1238. X--------------------------------------------------------------------------*/
  1239. Xvoid
  1240. Xcalc_wait_avg(per_state)
  1241. Xtime_t per_state[];
  1242. X{
  1243. Xregister itmp;
  1244. X
  1245. X    if(!wait_avg_init)
  1246. X    {
  1247. X        for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
  1248. X            (void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
  1249. X        wait_avg_init = 1;
  1250. X    }
  1251. X    else
  1252. X    {
  1253. X        for(itmp = 0; itmp < WAIT_AVG_MAX - 1; itmp++)
  1254. X            (void)memcpy(wait_avg[itmp],wait_avg[itmp + 1],sizeof(time_t) * 3);
  1255. X        (void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
  1256. X    }
  1257. X
  1258. X}    /* end of calc_wait_avg */
  1259. X
  1260. X/*+-------------------------------------------------------------------------
  1261. X    get_wait_avg(wait_ticks,period)
  1262. X--------------------------------------------------------------------------*/
  1263. Xget_wait_avg(wait_ticks,period)
  1264. Xtime_t wait_ticks[];
  1265. Xint period;
  1266. X{
  1267. Xregister iperiod = WAIT_AVG_MAX;
  1268. Xregister istate;
  1269. Xregister count = period;
  1270. X
  1271. X    for(istate = 0; istate < 3; istate++)
  1272. X        wait_ticks[istate] = 0;
  1273. X
  1274. X    while(count--)
  1275. X    {
  1276. X        iperiod--;
  1277. X        for(istate = 0; istate < 3; istate++)
  1278. X        {
  1279. X            wait_ticks[istate] += (wait_avg[iperiod])[istate];
  1280. X        }
  1281. X    }
  1282. X
  1283. X    for(istate = 0; istate < 3; istate++)
  1284. X        wait_ticks[istate] /= period;
  1285. X
  1286. X}    /* end of get_wait_avg */
  1287. X
  1288. X/*+-------------------------------------------------------------------------
  1289. X    extra_static_stuff()/extra_info_stuff() - for 43 line display
  1290. X--------------------------------------------------------------------------*/
  1291. Xvoid
  1292. Xextra_static_stuff()
  1293. X{
  1294. X    display_var(wscr,EXTRA_TLY,EXTRA1_TLX);
  1295. X    display_bootinfo(wscr,EXTRA_TLY,EXTRA2_TLX);
  1296. X    display_tune(wscr,EXTRA_TLY,EXTRA3_TLX);
  1297. X}    /* end of extra_static_stuff */
  1298. Xvoid
  1299. Xextra_info_stuff()
  1300. X{
  1301. X    display_proc(wscr,EXTRA_TLY,EXTRA4_TLX);
  1302. X}    /* end of extra_info_stuff */
  1303. X
  1304. X/*+-------------------------------------------------------------------------
  1305. X    main(argc,argv,envp)
  1306. X--------------------------------------------------------------------------*/
  1307. X/*ARGSUSED*/
  1308. Xmain(argc,argv,envp)
  1309. Xint argc;
  1310. Xchar **argv;
  1311. Xchar **envp;
  1312. X{
  1313. Xregister itmp;
  1314. Xregister char *cptr;
  1315. Xregister chtype cmd;
  1316. Xregister chtype initial_cmd = 0;
  1317. Xint errflg = 0;
  1318. Xint plock_indicator = 0;
  1319. Xtime_t total_ticks;
  1320. Xint y,x;
  1321. Xint invalidity = 0;
  1322. Xlong ltmp;
  1323. Xstruct tm *lt;
  1324. Xstatic char stdoutbuf[1024];
  1325. Xextern char *optarg;
  1326. Xextern int optind;
  1327. X
  1328. X    while((itmp = getopt(argc,argv,"lPp")) != -1)
  1329. X    {
  1330. X        switch(itmp)
  1331. X        {
  1332. X            case 'P':
  1333. X            case 'p':
  1334. X                initial_cmd = (chtype) itmp;
  1335. X                break;
  1336. X            case 'l':
  1337. X                plock_indicator = 1;
  1338. X                break;
  1339. X            case '?':
  1340. X                errflg++;
  1341. X        }
  1342. X    }
  1343. X    if(errflg || (optind != argc))
  1344. X    {
  1345. X        static char *usage_str[]=
  1346. X        {
  1347. X            "usage: u386mon [-l] [-p | -P]",
  1348. X            "-l lock process into memory (if root)",
  1349. X            "-p begin with short ps display",
  1350. X            "-P begin with long ps display (if 43 line screen)",
  1351. X            (char *)0
  1352. X        };
  1353. X        char **cpptr = usage_str;
  1354. X        while(*cpptr)
  1355. X            (void)fprintf(stderr,"%s\n",*(cpptr++));
  1356. X        exit(1);
  1357. X    }
  1358. X
  1359. X    if(plock_indicator && plock(PROCLOCK))
  1360. X        plock_indicator = 0;
  1361. X
  1362. X    (void)setvbuf(stdout,stdoutbuf,_IOFBF,sizeof(stdoutbuf));
  1363. X
  1364. X    if(uname(&utsname))
  1365. X    {
  1366. X        perror("uname");
  1367. X        exit(1);
  1368. X    }
  1369. X
  1370. X    for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
  1371. X    {
  1372. X        if(!(cpu_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 5)))
  1373. X        {
  1374. X            (void)fputs("cannot alloc memory!\n",stderr);
  1375. X            exit(1);
  1376. X        }
  1377. X    }
  1378. X
  1379. X    for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
  1380. X    {
  1381. X        if(!(wait_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 3)))
  1382. X        {
  1383. X            (void)fputs("cannot alloc memory!\n",stderr);
  1384. X            exit(1);
  1385. X        }
  1386. X    }
  1387. X
  1388. X    if(!initscr())
  1389. X    {
  1390. X        (void)printf("curses init failed\n");
  1391. X        exit(1);
  1392. X    }
  1393. X    clear();
  1394. X    refresh();
  1395. X
  1396. X    nlsym_read();
  1397. X    kinit(0);    /* read access only */
  1398. X    minit(0);    /* read access only */
  1399. X    sinit();
  1400. X    init_uid_name_hash();    /* see det_proc.c */
  1401. X    (void)setgid(getgid());
  1402. X
  1403. X    noecho();
  1404. X    keypad(stdscr,1);
  1405. X    typeahead(-1);
  1406. X
  1407. X    start_color();
  1408. X    init_pair(cpLIT,cBLU,cBLK);
  1409. X    init_pair(cpINFO,cGRN,cBLK);
  1410. X    init_pair(cpLOW,cLTG,cBLK);
  1411. X    init_pair(cpMED,cYEL,cBLK);
  1412. X    init_pair(cpHIGH,cRED,cBLK);
  1413. X    init_pair(cpBANNER,cBLK,cWHT);
  1414. X
  1415. X    /* a hack for now -- assuming AT char set */
  1416. X#ifdef HI_BIT_CAN_BE_SET
  1417. X    acs_map['l'] = A_ALTCHARSET | sTL;    
  1418. X    acs_map['m'] = A_ALTCHARSET | sTR;    
  1419. X    acs_map['j'] = A_ALTCHARSET | sBL;    
  1420. X    acs_map['k'] = A_ALTCHARSET | sBR;    
  1421. X    acs_map['x'] = A_ALTCHARSET | sVR;        /* vertical rule */
  1422. X    acs_map['q'] = A_ALTCHARSET | sHR;        /* horizontal rule */
  1423. X    acs_map['t'] = A_ALTCHARSET | sLT;        /* left hand T */
  1424. X    acs_map['u'] = A_ALTCHARSET | sRT;        /* right hand T */
  1425. X#endif
  1426. X
  1427. X    if(!(pscr = mkpanel(LINES,COLS,0,0)))
  1428. X    {
  1429. X        addstr("cannot make screen panel");
  1430. X        refresh();
  1431. X        endwin();
  1432. X        exit(1);
  1433. X    }
  1434. X    wscr = panel_window(pscr);
  1435. X
  1436. X    detail_init();
  1437. X    top_panel(pscr);
  1438. X
  1439. X    wmove(wscr,0,0);
  1440. X    use_cp(wscr,cpBANNER);
  1441. X    wprintw(wscr," u386mon %s  ",revision);
  1442. X    wprintw(wscr,"%s - %s %s ",utsname.nodename,
  1443. X        utsname.machine,utsname.release);
  1444. X    getyx(wscr,y,x);
  1445. X    while(x < getmaxx(wscr))
  1446. X        waddch(wscr,(chtype)' '),x++;
  1447. X    wmove(wscr,0,71);
  1448. X    waddstr(wscr,"wht@n4hgf");
  1449. X    if(plock_indicator)
  1450. X    {
  1451. X        wmove(wscr,0,38);
  1452. X        use_cp(wscr,cpMED);
  1453. X        waddstr(wscr," PLOCK ");
  1454. X        use_cp(wscr,cpBANNER);
  1455. X    }
  1456. X    wmove(wscr,CMD_TLY,0);
  1457. X    if(LINES >= 43)
  1458. X        waddstr(wscr," ESC=quit  P=long ps  p=short ps  m=main ");
  1459. X    else
  1460. X        waddstr(wscr," ESC=quit p=ps m=main ");
  1461. X    if(getuid() == 0)
  1462. X        waddstr(wscr," l=plock on  u=plock off ");
  1463. X    getyx(wscr,y,x);
  1464. X    while(x < getmaxx(wscr))
  1465. X        waddch(wscr,(chtype)' '),x++;
  1466. X    use_cp(wscr,cpLIT);
  1467. X
  1468. X    hz = (cptr = getenv("HZ")) ? atoi(cptr) : HZ;
  1469. X    kread((caddr_t)&maxmem,maxmemaddr,sizeof(maxmem));
  1470. X    kread((caddr_t)&nswap,nswapaddr,sizeof(nswap));
  1471. X    kread((caddr_t)&sysinfo_last,sysinfoaddr,sizeof(sysinfo_last));
  1472. X    kread((caddr_t)&minfo_last,minfoaddr,sizeof(minfo));
  1473. X    kread((caddr_t)&tune,tuneaddr,sizeof(tune));
  1474. X    kread((caddr_t)&v,vaddr,sizeof(v));
  1475. X    kread((caddr_t)&bootinfo,bootinfoaddr,sizeof(bootinfo));
  1476. X
  1477. X    draw_cpuscale_literals(wscr,CPUSCALE_TLY,0);
  1478. X    draw_waitscale_literals(wscr,WAITSCALE_TLY,0);
  1479. X    draw_per_sec_literals(wscr,PER_SEC_TLY,0);
  1480. X
  1481. X    if(LINES >= 43)
  1482. X        extra_static_stuff();
  1483. X
  1484. X    (void)time(&then);
  1485. X    while(1)
  1486. X    {
  1487. X        nap(1000L);
  1488. X        (void)time(&now);
  1489. X        wmove(wscr,0,62);
  1490. X        use_cp(wscr,cpBANNER);
  1491. X        lt = localtime(&now);
  1492. X        wprintw(wscr,"%02d:%02d:%02d",lt->tm_hour,lt->tm_min,lt->tm_sec);
  1493. X
  1494. X        /* heuristic validity determination */
  1495. X        wmove(wscr,0,48);
  1496. X        if((now - then) > 4)
  1497. X        {
  1498. X            use_cp(wscr,cpHIGH);
  1499. X            waddstr(wscr," INVALID ");
  1500. X            invalidity += 3;
  1501. X        }
  1502. X        else if((itmp = ((now - then) > 3)) || (invalidity > 2))
  1503. X        {
  1504. X            use_cp(wscr,cpMED);
  1505. X            waddstr(wscr," INEXACT ");
  1506. X            if(itmp)
  1507. X                invalidity += 2;
  1508. X        }
  1509. X        if(invalidity && !(--invalidity))
  1510. X        {
  1511. X            use_cp(wscr,cpBANNER);
  1512. X            waddstr(wscr,"         ");
  1513. X        }
  1514. X        (void)time(&then);
  1515. X
  1516. X        kread((caddr_t)&freemem,freememaddr,sizeof(freemem));
  1517. X        kread((caddr_t)&sysinfo,sysinfoaddr,sizeof(sysinfo));
  1518. X        kread((caddr_t)&minfo,minfoaddr,sizeof(minfo));
  1519. X
  1520. X#ifdef RIGHTEOUS
  1521. X        for (itmp = 0; itmp < 5; itmp++)
  1522. X            cpu_ticks[itmp] = sysidelta(cpu[itmp]);
  1523. X        for (itmp = 0; itmp < 3; itmp++)
  1524. X            wait_ticks[itmp] = sysidelta(wait[itmp]);
  1525. X#else
  1526. X        for (itmp = 0; itmp < 5; itmp++)
  1527. X        {
  1528. X            if(itmp != CPU_WAIT)
  1529. X                cpu_ticks[itmp] = sysidelta(cpu[itmp]);
  1530. X        }
  1531. X        cpu_ticks[CPU_WAIT] = 0;
  1532. X        for (itmp = 0; itmp < 3; itmp++)
  1533. X            cpu_ticks[CPU_WAIT] += (wait_ticks[itmp] = sysidelta(wait[itmp]));
  1534. X#endif
  1535. X
  1536. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 1,CPUSCALE_SX,
  1537. X            CPUSCALE_WIDTH,cpu_ticks);
  1538. X
  1539. X        update_waitscale(wscr,WAITSCALE_TLY + 1,WAITSCALE_SX,
  1540. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1541. X
  1542. X        calc_cpu_avg(cpu_ticks);
  1543. X        calc_wait_avg(wait_ticks);
  1544. X
  1545. X        get_cpu_avg(cpu_ticks,5);
  1546. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 2,CPUSCALE_SX,
  1547. X            CPUSCALE_WIDTH,cpu_ticks);
  1548. X
  1549. X        get_wait_avg(wait_ticks,5);
  1550. X        update_waitscale(wscr,WAITSCALE_TLY + 2,WAITSCALE_SX,
  1551. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1552. X
  1553. X        get_cpu_avg(cpu_ticks,10);
  1554. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 3,CPUSCALE_SX,
  1555. X            CPUSCALE_WIDTH,cpu_ticks);
  1556. X
  1557. X        get_wait_avg(wait_ticks,10);
  1558. X        update_waitscale(wscr,WAITSCALE_TLY + 3,WAITSCALE_SX,
  1559. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1560. X
  1561. X
  1562. X        use_cp(wscr,cpINFO);
  1563. X        y = PER_SEC_TLY + 1;
  1564. X        wmove(wscr,y++,PER_SEC1_TLX);
  1565. X        disp_info_long(wscr,"bread    ","%6ld",sysidelta(bread));
  1566. X        wmove(wscr,y++,PER_SEC1_TLX);
  1567. X        disp_info_long(wscr,"bwrite   ","%6ld",sysidelta(bwrite));
  1568. X        wmove(wscr,y++,PER_SEC1_TLX);
  1569. X        disp_info_long(wscr,"lread    ","%6ld",sysidelta(lread));
  1570. X        wmove(wscr,y++,PER_SEC1_TLX);
  1571. X        disp_info_long(wscr,"lwrite   ","%6ld",sysidelta(lwrite));
  1572. X        wmove(wscr,y++,PER_SEC1_TLX);
  1573. X        disp_info_long(wscr,"swapin   ","%6ld",sysidelta(swapin));
  1574. X        wmove(wscr,y++,PER_SEC1_TLX);
  1575. X        disp_info_long(wscr,"swapout  ","%6ld",sysidelta(swapout));
  1576. X        wmove(wscr,y++,PER_SEC1_TLX);
  1577. X        disp_info_long(wscr,"bswapin  ","%6ld",sysidelta(bswapin));
  1578. X        wmove(wscr,y++,PER_SEC1_TLX);
  1579. X        disp_info_long(wscr,"bswapout ","%6ld",sysidelta(bswapout));
  1580. X        wmove(wscr,y++,PER_SEC1_TLX);
  1581. X        disp_info_long(wscr,"iget     ","%6ld",sysidelta(iget));
  1582. X        wmove(wscr,y++,PER_SEC1_TLX);
  1583. X        disp_info_long(wscr,"namei    ","%6ld",sysidelta(namei));
  1584. X        wmove(wscr,y++,PER_SEC1_TLX);
  1585. X        disp_info_long(wscr,"dirblk   ","%6ld",sysidelta(dirblk));
  1586. X
  1587. X        wmove(wscr,y++,PER_SEC1_TLX);
  1588. X        if((ltmp = sysidelta(readch) - myreadcnt) < 0)
  1589. X            ltmp = 0;
  1590. X        disp_info_long(wscr,"readch   ","%6ld",ltmp);
  1591. X        myreadcnt = 0;    /* reset /dev/mem & /dev/kmem read count*/
  1592. X
  1593. X        wmove(wscr,y++,PER_SEC1_TLX);
  1594. X        disp_info_long(wscr,"writch   ","%6ld",sysidelta(writech));
  1595. X
  1596. X        y = PER_SEC_TLY + 1;
  1597. X/*
  1598. X        wmove(wscr,y++,PER_SEC2_TLX);
  1599. X        disp_info_long(wscr,"rcvint ","%5ld",sysidelta(rcvint));
  1600. X        wmove(wscr,y++,PER_SEC2_TLX);
  1601. X        disp_info_long(wscr,"xmtint ","%5ld",sysidelta(xmtint));
  1602. X        wmove(wscr,y++,PER_SEC2_TLX);
  1603. X        disp_info_long(wscr,"mdmint ","%5ld\n",sysidelta(mdmint));
  1604. X*/
  1605. X        wmove(wscr,y++,PER_SEC2_TLX);
  1606. X        disp_info_long(wscr,"rawch  ","%5ld\n",sysidelta(rawch));
  1607. X        wmove(wscr,y++,PER_SEC2_TLX);
  1608. X        disp_info_long(wscr,"canch  ","%5ld\n",sysidelta(canch));
  1609. X        wmove(wscr,y++,PER_SEC2_TLX);
  1610. X        disp_info_long(wscr,"outch  ","%5ld\n",sysidelta(outch));
  1611. X
  1612. X        y++;
  1613. X        wmove(wscr,y++,PER_SEC2_TLX);
  1614. X        disp_info_long(wscr,"msg    ","%5ld\n",sysidelta(msg));
  1615. X        wmove(wscr,y++,PER_SEC2_TLX);
  1616. X        disp_info_long(wscr,"sema   ","%5ld\n",sysidelta(sema));
  1617. X
  1618. X        y++;
  1619. X        wmove(wscr,y++,PER_SEC2_TLX);
  1620. X        disp_static_long(wscr, "maxmem  ","%6ldk",(long)maxmem * NBPP / 1024);
  1621. X        wmove(wscr,y++,PER_SEC2_TLX);
  1622. X        disp_info_long(wscr,   "frmem   ","%6ldk",(long)freemem * NBPP / 1024);
  1623. X        wmove(wscr,y++,PER_SEC2_TLX);
  1624. X        disp_info_int (wscr,   "mem used","%6d%%",
  1625. X            100 - (int)((freemem * 100) / maxmem));
  1626. X
  1627. X        wmove(wscr,y++,PER_SEC2_TLX);
  1628. X        disp_static_int(wscr, "nswap   ","%6ldk",nswap/2);
  1629. X        wmove(wscr,y++,PER_SEC2_TLX);
  1630. X        disp_info_long(wscr,  "frswp   ","%6ldk",minfo.freeswap/2);
  1631. X        wmove(wscr,y++,PER_SEC2_TLX);
  1632. X        disp_info_int(wscr,   "swp used","%6d%%",
  1633. X            100 - (int)((minfo.freeswap * 100) / nswap));
  1634. X
  1635. X        y = PER_SEC_TLY + 1;
  1636. X        wmove(wscr,y++,PER_SEC3_TLX);
  1637. X        disp_info_long(wscr,"pswitch ","%4ld",sysidelta(pswitch));
  1638. X        wmove(wscr,y++,PER_SEC3_TLX);
  1639. X        disp_info_long(wscr,"syscall ","%4ld",sysidelta(syscall));
  1640. X        wmove(wscr,y++,PER_SEC3_TLX);
  1641. X        disp_info_long(wscr,"sysread ","%4ld",sysidelta(sysread));
  1642. X        wmove(wscr,y++,PER_SEC3_TLX);
  1643. X        disp_info_long(wscr,"syswrit ","%4ld",sysidelta(syswrite));
  1644. X        wmove(wscr,y++,PER_SEC3_TLX);
  1645. X        disp_info_long(wscr,"sysfork ","%4ld",sysidelta(sysfork));
  1646. X        wmove(wscr,y++,PER_SEC3_TLX);
  1647. X        disp_info_long(wscr,"sysexec ","%4ld",sysidelta(sysexec));
  1648. X
  1649. X        y++;
  1650. X        wmove(wscr,y++,PER_SEC3_TLX);
  1651. X        disp_info_long(wscr,"runque  ","%4ld",sysidelta(runque));
  1652. X        wmove(wscr,y++,PER_SEC3_TLX);
  1653. X        disp_info_long(wscr,"runocc  ","%4ld",sysidelta(runocc));
  1654. X        wmove(wscr,y++,PER_SEC3_TLX);
  1655. X        disp_info_long(wscr,"swpque  ","%4ld",sysidelta(swpque));
  1656. X        wmove(wscr,y++,PER_SEC3_TLX);
  1657. X        disp_info_long(wscr,"swpocc  ","%4ld",sysidelta(swpocc));
  1658. X
  1659. X        y = PER_SEC_TLY + 1;
  1660. X        wmove(wscr,y++,PER_SEC4_TLX);
  1661. X        disp_info_long(wscr,"vfault  ","%3ld",midelta(vfault));
  1662. X        wmove(wscr,y++,PER_SEC4_TLX);
  1663. X        disp_info_long(wscr,"demand  ","%3ld",midelta(demand));
  1664. X        wmove(wscr,y++,PER_SEC4_TLX);
  1665. X        disp_info_long(wscr,"pfault  ","%3ld",midelta(pfault));
  1666. X        wmove(wscr,y++,PER_SEC4_TLX);
  1667. X        disp_info_long(wscr,"cw      ","%3ld",midelta(cw));
  1668. X        wmove(wscr,y++,PER_SEC4_TLX);
  1669. X        disp_info_long(wscr,"steal   ","%3ld",midelta(steal));
  1670. X        wmove(wscr,y++,PER_SEC4_TLX);
  1671. X        disp_info_long(wscr,"frdpgs  ","%3ld",midelta(freedpgs));
  1672. X        wmove(wscr,y++,PER_SEC4_TLX);
  1673. X        disp_info_long(wscr,"vfpg    ","%3ld",midelta(vfpg));
  1674. X        wmove(wscr,y++,PER_SEC4_TLX);
  1675. X        disp_info_long(wscr,"sfpg    ","%3ld",midelta(sfpg));
  1676. X        wmove(wscr,y++,PER_SEC4_TLX);
  1677. X        disp_info_long(wscr,"vspg    ","%3ld",midelta(vspg));
  1678. X        wmove(wscr,y++,PER_SEC4_TLX);
  1679. X        disp_info_long(wscr,"sspg    ","%3ld",midelta(sspg));
  1680. X        wmove(wscr,y++,PER_SEC4_TLX);
  1681. X        disp_info_long(wscr,"pnpfault","%3ld",sysidelta(pnpfault));
  1682. X        wmove(wscr,y++,PER_SEC4_TLX);
  1683. X        disp_info_long(wscr,"wrtfault","%3ld",sysidelta(wrtfault));
  1684. X
  1685. X        y = PER_SEC_TLY + 1;
  1686. X        wmove(wscr,y++,PER_SEC5_TLX);
  1687. X        disp_info_long(wscr,"unmodsw ","%3ld",midelta(unmodsw));
  1688. X        wmove(wscr,y++,PER_SEC5_TLX);
  1689. X        disp_info_long(wscr,"unmodfl ","%3ld",midelta(unmodfl));
  1690. X        wmove(wscr,y++,PER_SEC5_TLX);
  1691. X        disp_info_long(wscr,"psoutok ","%3ld",midelta(psoutok));
  1692. X        wmove(wscr,y++,PER_SEC5_TLX);
  1693. X        disp_info_long(wscr,"psinfai ","%3ld",midelta(psinfail));
  1694. X        wmove(wscr,y++,PER_SEC5_TLX);
  1695. X        disp_info_long(wscr,"psinok  ","%3ld",midelta(psinok));
  1696. X        wmove(wscr,y++,PER_SEC5_TLX);
  1697. X        disp_info_long(wscr,"rsout   ","%3ld",midelta(rsout));
  1698. X        wmove(wscr,y++,PER_SEC5_TLX);
  1699. X        disp_info_long(wscr,"rsin    ","%3ld",midelta(rsin));
  1700. X
  1701. X        y++;
  1702. X        wmove(wscr,y++,PER_SEC5_TLX);
  1703. X        use_cp(wscr,cpLIT);
  1704. X        waddstr(wscr,"pages on   ");
  1705. X        wmove(wscr,y++,PER_SEC5_TLX);
  1706. X        disp_info_long(wscr,"swap  ","%5ld",midelta(swap));
  1707. X        wmove(wscr,y++,PER_SEC5_TLX);
  1708. X        disp_info_long(wscr,"cache ","%5ld",midelta(cache));
  1709. X        wmove(wscr,y++,PER_SEC5_TLX);
  1710. X        disp_info_long(wscr,"file  ","%5ld",midelta(file));
  1711. X
  1712. X        if(LINES >= 43)
  1713. X            extra_info_stuff();
  1714. X
  1715. X        sysinfo_last = sysinfo;
  1716. X        minfo_last = minfo;
  1717. X
  1718. X        detail_panel_update();
  1719. X
  1720. X        if(initial_cmd)
  1721. X        {
  1722. X            detail_panel_cmd(initial_cmd);
  1723. X            initial_cmd = 0;
  1724. X        }
  1725. X
  1726. X        pflush();
  1727. X
  1728. X        if(rdchk(0))
  1729. X        {
  1730. X            switch(cmd = wgetch(wscr))
  1731. X            {
  1732. X                case 'q':
  1733. X                case A_ESC:
  1734. X                    goto GOOD_BYE;
  1735. X                case 'P':
  1736. X                case 'p':
  1737. X                case 'm':
  1738. X                    detail_panel_cmd(cmd);
  1739. X                    break;
  1740. X                case 'l':
  1741. X                    if(!plock_indicator)
  1742. X                    {
  1743. X                        if(!plock(PROCLOCK))
  1744. X                        {
  1745. X                            plock_indicator = 1;
  1746. X                            wmove(wscr,0,38);
  1747. X                            use_cp(wscr,cpMED);
  1748. X                            waddstr(wscr," PLOCK ");
  1749. X                        }
  1750. X                    }
  1751. X                    break;
  1752. X                case 'u':
  1753. X                    if(plock_indicator)
  1754. X                    {
  1755. X                        if(!plock(UNLOCK))
  1756. X                        {
  1757. X                            plock_indicator = 0;
  1758. X                            wmove(wscr,0,38);
  1759. X                            use_cp(wscr,cpBANNER);
  1760. X                            waddstr(wscr,"       ");
  1761. X                        }
  1762. X                    }
  1763. X                    break;
  1764. X            }
  1765. X        }
  1766. X    }
  1767. X
  1768. XGOOD_BYE:
  1769. X    leave_text("",0);
  1770. X    /*NOTREACHED*/
  1771. X}    /* end of main */
  1772. X
  1773. X/* vi: set tabstop=4 shiftwidth=4: */
  1774. X/* end of u386mon.c */
  1775. SHAR_EOF
  1776. $TOUCH -am 0624152590 u386mon.c &&
  1777. chmod 0644 u386mon.c ||
  1778. echo "restore of u386mon.c failed"
  1779. set `wc -c u386mon.c`;Wc_c=$1
  1780. if test "$Wc_c" != "26771"; then
  1781.     echo original size 26771, current size $Wc_c
  1782. fi
  1783. # ============= var.c ==============
  1784. echo "x - extracting var.c (Text)"
  1785. sed 's/^X//' << 'SHAR_EOF' > var.c &&
  1786. X/*+-------------------------------------------------------------------------
  1787. X    var.c - u386mon var struct display
  1788. X
  1789. X  Defined functions:
  1790. X    display_var(win,y,x)
  1791. X
  1792. X--------------------------------------------------------------------------*/
  1793. X/*+:EDITS:*/
  1794. X/*:06-21-1990-14:27-r@n4hgf-version x0.12 seems bug free */
  1795. X/*:06-17-1990-14:59-wht-creation */
  1796. X
  1797. X#define M_TERMINFO
  1798. X
  1799. X#include <curses.h>
  1800. X#include <panel.h>
  1801. X#include <sys/types.h>
  1802. X#include <sys/var.h>
  1803. X#include "u386mon.h"
  1804. X
  1805. X/*+-------------------------------------------------------------------------
  1806. X    display_var(win,y,x)
  1807. X--------------------------------------------------------------------------*/
  1808. Xvoid
  1809. Xdisplay_var(win,y,x)
  1810. XWINDOW *win;
  1811. Xint y;
  1812. Xint x;
  1813. X{
  1814. X    use_cp(win,cpBANNER);
  1815. X    wmove(win,y++,x);
  1816. X    waddstr(win,"-- Var ---------");
  1817. X    wmove(win,y++,x);
  1818. X    disp_static_int(win,"v_buf      ","%5d",v.v_buf);
  1819. X    wmove(win,y++,x);
  1820. X    disp_static_int(win,"v_inode    ","%5d",v.v_inode);
  1821. X    wmove(win,y++,x);
  1822. X    disp_static_int(win,"v_file     ","%5d",v.v_file);
  1823. X    wmove(win,y++,x);
  1824. X    disp_static_int(win,"v_mount    ","%5d",v.v_mount);
  1825. X    wmove(win,y++,x);
  1826. X    disp_static_int(win,"v_proc     ","%5d",v.v_proc);
  1827. X    wmove(win,y++,x);
  1828. X    disp_static_int(win,"v_clist    ","%5d",v.v_clist);
  1829. X    wmove(win,y++,x);
  1830. X    disp_static_int(win,"v_sptmap   ","%5d",v.v_sptmap);
  1831. X    wmove(win,y++,x);
  1832. X    disp_static_int(win,"v_vhndfrac ","%5d",v.v_vhndfrac);
  1833. X    wmove(win,y++,x);
  1834. X    disp_static_int(win,"v_maxpmem  ","%5d",v.v_maxpmem);
  1835. X
  1836. X}    /* end of display_var */
  1837. X
  1838. X/* vi: set tabstop=4 shiftwidth=4: */
  1839. X/* end of var.c */
  1840. SHAR_EOF
  1841. $TOUCH -am 0624151990 var.c &&
  1842. chmod 0644 var.c ||
  1843. echo "restore of var.c failed"
  1844. set `wc -c var.c`;Wc_c=$1
  1845. if test "$Wc_c" != "1513"; then
  1846.     echo original size 1513, current size $Wc_c
  1847. fi
  1848. # ============= libkmem.h ==============
  1849. echo "x - extracting libkmem.h (Text)"
  1850. sed 's/^X//' << 'SHAR_EOF' > libkmem.h &&
  1851. X/*+-----------------------------------------------------------------------
  1852. X    libkmem.h
  1853. X    ...!emory!n4hgf!wht
  1854. X------------------------------------------------------------------------*/
  1855. X/*+:EDITS:*/
  1856. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1857. X/*:10-28-1988-14:46-afterlint-creation */
  1858. X
  1859. X#ifndef BUILDING_LINT_ARGS
  1860. X#ifdef LINT_ARGS
  1861. X
  1862. X/* libkmem.c */
  1863. Xvoid kinit(int );
  1864. Xvoid kread(char  *,long ,int );
  1865. Xvoid kwrite(long ,char  *,int );
  1866. X
  1867. X#else        /* compiler doesn't know about prototyping */
  1868. X
  1869. X/* libkmem.c */
  1870. Xvoid kinit();
  1871. Xvoid kread();
  1872. Xvoid kwrite();
  1873. X
  1874. X#endif /* LINT_ARGS */
  1875. X#endif /* BUILDING_LINT_ARGS */
  1876. X
  1877. X/* end of libkmem.h */
  1878. SHAR_EOF
  1879. $TOUCH -am 0624151990 libkmem.h &&
  1880. chmod 0644 libkmem.h ||
  1881. echo "restore of libkmem.h failed"
  1882. set `wc -c libkmem.h`;Wc_c=$1
  1883. if test "$Wc_c" != "636"; then
  1884.     echo original size 636, current size $Wc_c
  1885. fi
  1886. echo "End of part 2, continue with part 3"
  1887. exit 0
  1888.  
  1889. ---------------------------------------------------------------------
  1890. Warren Tucker, TuckerWare    gatech!n4hgf!wht or wht%n4hgf@gatech.edu
  1891. Ker-au'-lo-phon.   An  8-foot  partial  flue-stop, having metal pipes
  1892. surmounted by adjustable rings, and with a hole bored near the top of
  1893. each pipe.  Tone soft and "reedy".
  1894.