home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #27 / NN_1992_27.iso / spool / comp / sources / misc / 4117 < prev    next >
Encoding:
Text File  |  1992-11-21  |  50.6 KB  |  1,911 lines

  1. Newsgroups: comp.sources.misc
  2. Path: sparky!kent
  3. From: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  4. Subject:  v33i112:  u386mon - SVR3 performance/status monitor v2.60, Part03/09
  5. Message-ID: <1992Nov22.020019.24090@sparky.imd.sterling.com>
  6. Followup-To: comp.sources.d
  7. X-Md4-Signature: 4354a39d956d61a1640565f0cf3be39a
  8. Sender: kent@sparky.imd.sterling.com (Kent Landfield)
  9. Organization: Sterling Software
  10. References: <csm-v33i110=u386mon.195754@sparky.IMD.Sterling.COM>
  11. Date: Sun, 22 Nov 1992 02:00:19 GMT
  12. Approved: kent@sparky.imd.sterling.com
  13. Lines: 1896
  14.  
  15. Submitted-by: Warren Tucker <wht@n4hgf.Mt-Park.GA.US>
  16. Posting-number: Volume 33, Issue 112
  17. Archive-name: u386mon/part03
  18. Environment: SYSVR3
  19. Supersedes: u386mon: Volume 22, Issue 3-9
  20.  
  21. #!/bin/sh
  22. # This is part 03 of u386mon.2.60
  23. # ============= u386mon.c ==============
  24. if test -f 'u386mon.c' -a X"$1" != X"-c"; then
  25.     echo 'x - skipping u386mon.c (File already exists)'
  26. else
  27. echo 'x - extracting u386mon.c (Text)'
  28. sed 's/^X//' << 'SHAR_EOF' > 'u386mon.c' &&
  29. X/* CHK=0x0C21 */
  30. Xchar *revision = "2.6";
  31. X/*+-------------------------------------------------------------------------
  32. X    u386mon.c - UNIX 386 (and other) system monitor
  33. X    wht@n4hgf.Mt-Park.GA.US and many others
  34. X
  35. X  Defined functions:
  36. X    adb_trap()
  37. X    calc_cpu_avg(per_state)
  38. X    calc_wait_avg(per_state)
  39. X    caught_signal(sig)
  40. X    draw_cpuscale_literals(win,y,x)
  41. X    draw_per_sec_literals(win,y,x)
  42. X    draw_waitscale_literals(win,y,x)
  43. X    extra_info_stuff()
  44. X    extra_static_stuff()
  45. X    get_cpu_avg(cpu_ticks,period)
  46. X    get_elapsed_time(elapsed_seconds)
  47. X    get_wait_avg(wait_ticks,period)
  48. X    leave(exit_code)
  49. X    leave_text(text,exit_code)
  50. X    leaving(exit_code)
  51. X    main(argc,argv,envp)
  52. X    update_cpuscale(win,y,x,width,per_state)
  53. X    update_waitscale(win,y,x,width,per_state,total_ticks)
  54. X
  55. X00000000001111111111222222222233333333334444444444555555555566666666667777777777
  56. X01234567890123456789012345678901234567890123456789012345678901234567890123456789
  57. X u386mon xxx.xxx                       PLOCK     INVALID      hh:mm:ss wht@n4hgf
  58. X
  59. X---- CPU --- tot usr ker brk ---------------------------------------------------
  60. X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  61. X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  62. X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  63. X---- Wait -- tot  io pio swp ---------------------------------------------------
  64. X Instant %   ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  65. X 5 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  66. X10 Sec Avg % ### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  67. X
  68. X--------------------------------------------------------------------------*/
  69. X/*+:EDITS:*/
  70. X/*:07-15-1992-14:34-wht@n4hgf-2.60 release - u386mon+siotools merge */
  71. X/*:03-09-1992-11:54-wht@n4hgf-bump version number for p_sid addition */
  72. X/*:08-20-1991-12:44-root@n4hgf-nba@sysware.dk S5R31 and config reorg */
  73. X/*:08-14-1991-13:04-wht@n4hgf-STREAMS and table works for ISC 2.2 */
  74. X/*:08-11-1991-14:05-root@n4hgf-use PATCHLEVEL */
  75. X/*:08-01-1991-23:35-wht@n4hgf-release 2.40 source control point */
  76. X/*:05-15-1991-17:22-wht@n4hgf-2.3 patches for SVR31 from nba@sysware.dk */
  77. X/*:05-14-1991-06:11-root@n4hgf-evidently a fast cpu gets 0 cpu sometimes :-) */
  78. X/*:05-09-1991-03:57-wht@n4hgf-fix HZ problem reported by ir@crosfield.co.uk */
  79. X/*:05-09-1991-03:35-wht@n4hgf-gcc gives good warning */
  80. X/*:05-09-1991-02:24-wht@n4hgf-HZ environment variable might be non-zero */
  81. X/*:04-16-1991-02:25-martin@hppcmart additions for SCO 3.2.2 */
  82. X/*:03-16-1991-14:22-wht@n4hgf-widen sysinfo column 4 */
  83. X/*:08-14-1990-19:08-root@n4hgf-fix **argv bug */
  84. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  85. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  86. X/*:08-02-1990-15:36-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  87. X/*:08-01-1990-19:24-jdc@dell.com-add DELL config */
  88. X/*:08-01-1990-17:25-wht@n4hgf-fix sysi86 swap calculations */
  89. X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  90. X/*:07-28-1990-15:05-wht@n4hgf-make CYCLEmsec variable */
  91. X/*:07-11-1990-03:45-root@n4hgf-faster proc table manipulation */
  92. X/*:07-10-1990-19:06-root@n4hgf-redesign attributes/color pairs */
  93. X/*:07-10-1990-18:33-root@n4hgf-move pio wait to medium alert */
  94. X/*:07-10-1990-18:01-root@n4hgf-"improvement" didnt do much, but leave for now */
  95. X/*:07-10-1990-13:54-root@n4hgf-improve nap heuristics and catch signals */
  96. X/*:07-08-1990-20:31-root@n4hgf-make room for phread/phwrite */
  97. X/*:07-03-1990-02:48-root@n4hgf-more accurate timing using ftime calculations */
  98. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  99. X/*:06-27-1990-01:07-wht@n4hgf-add ^R and ^L refresh */
  100. X/*:06-25-1990-17:34-wht@n4hgf-add detail extra for 25 line tubes */
  101. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  102. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  103. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  104. X/*:06-15-1990-18:32-wht@n4hgf-creation */
  105. X
  106. X#include "config.h"
  107. X#include "patchlevel.h"
  108. X
  109. X#include <curses.h>
  110. X#include <sys/types.h>
  111. X#undef timeout /* conflict in curses.h and bootinfo.h per trb@ima.ima.isc.com */
  112. X#undef reg     /* per nba@sysware.dk */
  113. X#include "libpanel.h"
  114. X#include <signal.h>
  115. X#include <string.h>
  116. X#include <fcntl.h>
  117. X#include <nlist.h>
  118. X#include <errno.h>
  119. X#include <time.h>
  120. X#if defined(HAS_TIMEB)
  121. X# include <sys/timeb.h>
  122. X#endif
  123. X#include <sys/lock.h>
  124. X#include <sys/utsname.h>
  125. X#include <sys/stat.h>
  126. X#if defined(HAS_ASCII)
  127. X# include <sys/ascii.h>
  128. X#else
  129. X#define A_ESC    '\033'
  130. X#endif
  131. X#undef NGROUPS_MAX
  132. X#undef NULL
  133. X#include <sys/param.h>
  134. X#if defined(HAS_BOOTINFO)
  135. X# include <sys/bootinfo.h>
  136. X#endif
  137. X#include <sys/tuneable.h>
  138. X#include <sys/sysinfo.h>
  139. X#include <sys/sysmacros.h>
  140. X#include <sys/immu.h>
  141. X#include <sys/region.h>
  142. X#if defined(mips)
  143. X# include <sys/sbd.h>
  144. X#endif
  145. X#include <sys/proc.h>
  146. X#include <sys/var.h>
  147. X#if defined(i386) || defined(i486)
  148. X# include <sys/sysi86.h>
  149. X#endif
  150. X#if defined(mips)
  151. X# include <sys/sysmips.h>
  152. X#endif
  153. X#include <sys/swap.h>
  154. X#if !defined(mips)
  155. X# include <sys/trap.h>
  156. X#endif
  157. X
  158. X#include "nlsym.h"
  159. X#include "libkmem.h"
  160. X#include "libmem.h"
  161. X#include "libswap.h"
  162. X#include "libnlsym.h"
  163. X#include "u386mon.h"
  164. X
  165. Xlong nap();
  166. XPANEL *mkpanel();
  167. X
  168. X#if defined(HAS_TIMEB)
  169. X#define delta_msec(t,t0) ((( t.time * 1000L) +  t.millitm) - \
  170. X                          ((t0.time * 1000L) + t0.millitm))
  171. X#endif
  172. X
  173. X#define INEXACT_STATE    2
  174. X#define INVALID_STATE    5
  175. X
  176. X#if defined(mips)
  177. X#define CYCLEmsecDef 5000L
  178. X#define CYCLEmsecMax 9000L
  179. X#else
  180. X#define CYCLEmsecDef 2000L
  181. X#define CYCLEmsecMax 4000L
  182. X#endif
  183. X
  184. Xlong CYCLEmsec = CYCLEmsecDef;
  185. X
  186. Xstruct sysinfo sysinfo;
  187. Xstruct sysinfo sysinfo_last;
  188. X#define sysidelta(x) (sysinfo.x - sysinfo_last.x)
  189. X
  190. Xstruct minfo minfo;
  191. Xstruct minfo minfo_last;
  192. X#define midelta(x) (minfo.x - minfo_last.x)
  193. X
  194. X#if defined(HAS_BOOTINFO)
  195. Xstruct bootinfo bootinfo;
  196. X#endif
  197. X
  198. Xswpt_t swaptab [MSFILES];
  199. Xswpi_t swapint = {SI_LIST, (char *)swaptab};
  200. Xstruct tune tune;
  201. Xstruct utsname utsname;
  202. Xstruct var v;
  203. X
  204. X#if defined(HAS_TIMEB)
  205. Xstruct timeb timeb_cycle_start;
  206. Xstruct timeb timeb_cycle_end;
  207. Xstruct timeb timeb_info_read;
  208. Xstruct timeb timeb_last_info_read;
  209. X#endif
  210. X
  211. Xint hz;
  212. Xint nswap;    /* seems to be in units of NBPSCTR bytes */
  213. Xint maxmem;
  214. Xint freemem;
  215. Xdaddr_t myreadlen = 0L;
  216. Xint myreadcnt = 0;
  217. Xint stat_period_msec_y = -1;
  218. Xint stat_period_msec_x = -1;
  219. Xint color_avail = 0;
  220. Xint invalidity = 0;
  221. X
  222. XPANEL *pscr;
  223. XWINDOW *wscr;
  224. Xextern WINDOW *wdet;
  225. X
  226. X#define CPU_AVG_MAX        10
  227. Xint cpu_avg_init = 0;
  228. Xtime_t *cpu_avg[CPU_AVG_MAX];
  229. Xtime_t cpu_ticks[5];
  230. X
  231. X#define WAIT_AVG_MAX    10
  232. Xint wait_avg_init = 0;
  233. Xtime_t *wait_avg[WAIT_AVG_MAX];
  234. Xtime_t wait_ticks[5];
  235. X
  236. X/*+-------------------------------------------------------------------------
  237. X    basename(fullname) - strip directory name from filename
  238. X
  239. Xreturns address of static string
  240. X--------------------------------------------------------------------------*/
  241. Xchar *
  242. Xbasename(fullname)
  243. Xchar *fullname;
  244. X{
  245. X    register char *start;
  246. X    static char outstr[256];
  247. X    char *strrchr();
  248. X
  249. X    start = strrchr(fullname,'/'); /* find last slash */
  250. X    if(!start)
  251. X        return(fullname);
  252. X    start++;
  253. X    strcpy(outstr,start);
  254. X    return(outstr);
  255. X}    /* end of basename */
  256. X
  257. X/*+-------------------------------------------------------------------------
  258. X    leaving() - perform leave() basic processing and return
  259. X--------------------------------------------------------------------------*/
  260. Xvoid
  261. Xleaving()
  262. X{
  263. X    wmove(wscr,CMD_TLY,0);
  264. X    use_cp(wscr,cpLIT);
  265. X    wclrtoeol(wscr);
  266. X    pflush();
  267. X    endwin();
  268. X}    /* end of leaving */
  269. X
  270. X/*+-------------------------------------------------------------------------
  271. X    leave(exit_code) - leave program with exit code
  272. X--------------------------------------------------------------------------*/
  273. Xvoid
  274. Xleave(exit_code)
  275. Xint exit_code;
  276. X{
  277. X    leaving();
  278. X    exit(exit_code);
  279. X}    /* end of leave */
  280. X
  281. X/*+-------------------------------------------------------------------------
  282. X    leave_text(text,exit_code) - leave program with message and exit code
  283. XIf exit_code == 255, do wperror
  284. X--------------------------------------------------------------------------*/
  285. Xvoid
  286. Xleave_text(text,exit_code)
  287. Xchar *text;
  288. Xint exit_code;
  289. X{
  290. X    if(exit_code == 255)
  291. X    {
  292. X        int y;
  293. X        register x;
  294. X        extern int errno;
  295. X        extern int sys_nerr;
  296. X        extern char *sys_errlist[];
  297. X
  298. X        top_panel(pscr);
  299. X        wmove(wscr,MSG_TLY - 2,0);
  300. X        use_cp(wscr,cpHIGH);
  301. X        x = 0;
  302. X        while(x++ < COLS)
  303. X            waddch(wscr,(chtype)' ');
  304. X        wmove(wscr,MSG_TLY - 1,0);
  305. X        wprintw(wscr,"errno %d",errno);
  306. X        if(errno < sys_nerr)
  307. X            wprintw(wscr,": %s",sys_errlist[errno]);
  308. X        getyx(wscr,y,x);
  309. X        while(x++ < COLS)
  310. X            waddch(wscr,(chtype)' ');
  311. X    }
  312. X    if (text && *text)
  313. X        disp_msg(cpHIGH,text);
  314. X    else
  315. X    {
  316. X        wmove(stdscr,LINES - 1,0);
  317. X        wclrtoeol(stdscr);
  318. X    }
  319. X    leave(exit_code);
  320. X}    /* end of leave_text */
  321. X
  322. X/*+-------------------------------------------------------------------------
  323. X    adb_trap() - convenient trap for catching abort
  324. X
  325. X  Get a look at stack before abort() botches it
  326. X--------------------------------------------------------------------------*/
  327. X#if defined(ADB_DEBUG)
  328. Xvoid
  329. Xadb_trap()
  330. X{
  331. X    printf("too bad .... goodbye\n");
  332. X}    /* end of adb_trap */
  333. X#endif
  334. X
  335. X/*+-------------------------------------------------------------------------
  336. X    caught_signal(sig) - SIGHUP thru SIGSYS: leave with possible abort
  337. X--------------------------------------------------------------------------*/
  338. Xvoid
  339. Xcaught_signal(sig)
  340. Xint sig;
  341. X{
  342. X    leaving();
  343. X    switch(sig)
  344. X    {
  345. X        case SIGQUIT:
  346. X        case SIGILL:
  347. X        case SIGTRAP:
  348. X        case SIGIOT:
  349. X        case SIGEMT:
  350. X        case SIGFPE:
  351. X        case SIGBUS:
  352. X        case SIGSEGV:
  353. X        case SIGSYS:
  354. X#if defined(ADB_DEBUG)
  355. X            adb_trap();    /* if debugging, stop at convenient breakpoint */
  356. X#endif
  357. X            abort();
  358. X    }
  359. X    exit(200);
  360. X}    /* end of caught_signal */
  361. X
  362. X/*+-----------------------------------------------------------------------
  363. X    char *get_elapsed_time(elapsed_seconds) - "ddd+hh:mm:ss" returned
  364. X  static string address is returned
  365. X------------------------------------------------------------------------*/
  366. Xchar *
  367. Xget_elapsed_time(elapsed_seconds)
  368. Xtime_t elapsed_seconds;
  369. X{
  370. X    static char elapsed_time_str[32];
  371. X    time_t dd,hh,mm,ss;
  372. X
  373. X    dd = 0;
  374. X    hh = elapsed_seconds / 3600;
  375. X    if(hh > 24)
  376. X    {
  377. X        dd = hh / 24;
  378. X        elapsed_seconds -= dd * 3600 * 24;
  379. X        hh %= 24;
  380. X    }
  381. X    elapsed_seconds -= hh * 3600;
  382. X    mm = elapsed_seconds / 60L;
  383. X    elapsed_seconds -= mm * 60L;
  384. X    ss = elapsed_seconds;
  385. X
  386. X    if(dd)
  387. X        (void)sprintf(elapsed_time_str,"%3ld+%02ld:%02ld:%02ld",dd,hh,mm,ss);
  388. X    else
  389. X        (void)sprintf(elapsed_time_str,"    %2ld:%02ld:%02ld",hh,mm,ss);
  390. X    return(elapsed_time_str);
  391. X}    /* end of get_elapsed_time */
  392. X
  393. X/*+-------------------------------------------------------------------------
  394. X    draw_cpuscale_literals(win)
  395. X--------------------------------------------------------------------------*/
  396. Xvoid
  397. Xdraw_cpuscale_literals(win,y,x)
  398. XWINDOW *win;
  399. Xint y;
  400. Xint x;
  401. X{
  402. X    int x2 = x;
  403. X
  404. X    wmove(win,y,x);
  405. X    use_cp(wscr,cpBANNER);
  406. X    waddstr(win,"---- CPU --- tot usr ker brk ");
  407. X    getyx(win,y,x2);
  408. X    while(x2 < COLS)
  409. X        waddch(win,(chtype)'-'),x2++;
  410. X    use_cp(wscr,cpLIT);
  411. X    wmove(win,y + 1,x);
  412. X    if(CYCLEmsec == 1000L)
  413. X        waddstr(win," Instant %  ");
  414. X    else
  415. X        wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec / 1000L));
  416. X    wmove(win,y + 2,x);
  417. X      wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec * 5 / 1000L));
  418. X    wmove(win,y + 3,x);
  419. X      wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec * 10 / 1000L));
  420. X
  421. X}    /* end of draw_cpuscale_literals */
  422. X
  423. X/*+-------------------------------------------------------------------------
  424. X    update_cpuscale(win,y,width,per_state)
  425. X
  426. X000000000011111111112222222222333333333344444444445555555555666666
  427. X012345678901234567890123456789012345678901234567890123456789012345
  428. Xtot usr ker misc 
  429. X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  430. X--------------------------------------------------------------------------*/
  431. X#define _CPUSCALE_TX    0
  432. X#define _CPUSCALE_UX    4
  433. X#define _CPUSCALE_KX    8
  434. X#define _CPUSCALE_BX    12
  435. X#define _CPUSCALE_SX    16
  436. X
  437. Xtime_t
  438. Xupdate_cpuscale(win,y,x,width,per_state)
  439. XWINDOW *win;
  440. Xint y;
  441. Xint x;
  442. Xregister width;
  443. Xtime_t *per_state;
  444. X{
  445. X    register itmp;
  446. X    int accum = 0;
  447. X    time_t idle = per_state[CPU_IDLE] + per_state[CPU_WAIT];
  448. X    time_t cpu_ticks_total = idle + per_state[CPU_SXBRK] + 
  449. X                             per_state[CPU_KERNEL] + per_state[CPU_USER];
  450. X    time_t percent_user    = 0;
  451. X    time_t percent_kernel  = 0;
  452. X    time_t percent_break   = 0;
  453. X    time_t percent_busy    = 0;
  454. X
  455. X    if(cpu_ticks_total)
  456. X    {
  457. X        percent_user    = (per_state[CPU_USER]   * 100) / cpu_ticks_total;
  458. X        percent_kernel  = (per_state[CPU_KERNEL] * 100) / cpu_ticks_total;
  459. X        percent_break   = (per_state[CPU_SXBRK]  * 100) / cpu_ticks_total;
  460. X        percent_busy    = percent_user + percent_kernel + percent_break;
  461. X    }
  462. X
  463. X    if(!idle)            /* take care of integer div truncation */
  464. X        percent_busy = 100;
  465. X
  466. X    wmove(win,y, x + _CPUSCALE_TX);
  467. X    if(percent_busy < 70)
  468. X        use_cp(wscr,cpLOW);
  469. X    else if(percent_busy < 90)
  470. X        use_cp(wscr,cpMED);
  471. X    else
  472. X        use_cp(wscr,cpHIGH);
  473. X    wprintw(win,"%3ld",percent_busy);
  474. X
  475. X    wmove(win,y, x + _CPUSCALE_UX);
  476. X    use_cp(wscr,cpINFO);
  477. X    wprintw(win,"%3ld",percent_user);
  478. X    
  479. X    wmove(win,y, x + _CPUSCALE_KX);
  480. X    wprintw(win,"%3ld",percent_kernel);
  481. X    
  482. X    wmove(win,y, x + _CPUSCALE_BX);
  483. X    wprintw(win,"%3ld",percent_break);
  484. X    
  485. X    wmove(win,y, x + _CPUSCALE_SX);
  486. X    use_cp(wscr,cpLOW);
  487. X    itmp = (width * percent_user) / 100;
  488. X    accum += itmp;
  489. X    while(itmp--)
  490. X        waddch(win,(chtype)'u');
  491. X
  492. X    use_cp(wscr,cpMED);
  493. X    itmp = (width * percent_kernel) / 100;
  494. X    accum += itmp;
  495. X    while(itmp--)
  496. X        waddch(win,(chtype)'k');
  497. X
  498. X    use_cp(wscr,cpHIGH);
  499. X    itmp = (width * percent_break) / 100;
  500. X    accum += itmp;
  501. X    while(itmp--)
  502. X        waddch(win,(chtype)'b');
  503. X
  504. X    if((percent_busy > 98) && ((width - accum) > 0))
  505. X    {
  506. X        waddch(win,(chtype)'*');
  507. X        accum++;
  508. X    }
  509. X
  510. X    use_cp(wscr,cpLIT);
  511. X    if((itmp = (width - accum)) > 0)
  512. X    {
  513. X        while(itmp--)
  514. X            waddch(win,(chtype)' ');
  515. X    }
  516. X    return(cpu_ticks_total);
  517. X}    /* end of update_cpuscale */
  518. X
  519. X/*+-------------------------------------------------------------------------
  520. X    calc_cpu_avg(per_state) - add per_state array to avg array
  521. X--------------------------------------------------------------------------*/
  522. Xvoid
  523. Xcalc_cpu_avg(per_state)
  524. Xtime_t per_state[];
  525. X{
  526. X    register itmp;
  527. X
  528. X    if(!cpu_avg_init)
  529. X    {
  530. X        for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
  531. X            (void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
  532. X        cpu_avg_init = 1;
  533. X    }
  534. X    else
  535. X    {
  536. X        for(itmp = 0; itmp < CPU_AVG_MAX - 1; itmp++)
  537. X            (void)memcpy(cpu_avg[itmp],cpu_avg[itmp + 1],sizeof(time_t) * 5);
  538. X        (void)memcpy(cpu_avg[itmp],per_state,sizeof(time_t) * 5);
  539. X    }
  540. X
  541. X}    /* end of calc_cpu_avg */
  542. X
  543. X/*+-------------------------------------------------------------------------
  544. X    get_cpu_avg(cpu_ticks,period)
  545. X--------------------------------------------------------------------------*/
  546. Xget_cpu_avg(cpu_ticks,period)
  547. Xtime_t cpu_ticks[];
  548. Xint period;
  549. X{
  550. X    register iperiod = CPU_AVG_MAX;
  551. X    register istate;
  552. X    register count = period;
  553. X
  554. X    for(istate = 0; istate < 5; istate++)
  555. X        cpu_ticks[istate] = 0;
  556. X
  557. X    while(count--)
  558. X    {
  559. X        iperiod--;
  560. X        for(istate = 0; istate < 5; istate++)
  561. X        {
  562. X            cpu_ticks[istate] += (cpu_avg[iperiod])[istate];
  563. X        }
  564. X    }
  565. X
  566. X    for(istate = 0; istate < 5; istate++)
  567. X        cpu_ticks[istate] /= period;
  568. X
  569. X}    /* end of get_cpu_avg */
  570. X
  571. X/*+-------------------------------------------------------------------------
  572. X    draw_waitscale_literals(win)
  573. X--------------------------------------------------------------------------*/
  574. Xvoid
  575. Xdraw_waitscale_literals(win,y,x)
  576. XWINDOW *win;
  577. Xint y;
  578. Xint x;
  579. X{
  580. X    int x2 = x;
  581. X
  582. X    wmove(win,y,x);
  583. X    use_cp(wscr,cpBANNER);
  584. X    waddstr(win,"---- Wait -- tot  io pio swp -- (% of real time) ");
  585. X    getyx(win,y,x2);
  586. X    while(x2 < COLS)
  587. X        waddch(win,(chtype)'-'),x2++;
  588. X    use_cp(wscr,cpLIT);
  589. X    wmove(win,y + 1,x);
  590. X    if(CYCLEmsec == 1000L)
  591. X        waddstr(win," Instant %  ");
  592. X    else
  593. X        wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec / 1000L));
  594. X    wmove(win,y + 2,x);
  595. X      wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec * 5 / 1000L));
  596. X    wmove(win,y + 3,x);
  597. X      wprintw(win,"%2d Sec Avg %%",(int)(CYCLEmsec * 10 / 1000L));
  598. X
  599. X}    /* end of draw_waitscale_literals */
  600. X
  601. X/*+-------------------------------------------------------------------------
  602. X    draw_per_sec_literals(win)
  603. X--------------------------------------------------------------------------*/
  604. Xvoid
  605. Xdraw_per_sec_literals(win,y,x)
  606. XWINDOW *win;
  607. Xint y;
  608. Xint x;
  609. X{
  610. X
  611. X    wmove(win,y,x);
  612. X    use_cp(wscr,cpBANNER);
  613. X    waddstr(win,"---- Sysinfo/Minfo --- (last ");
  614. X    getyx(win,stat_period_msec_y,stat_period_msec_x);
  615. X     wprintw(win," %4ld msec activity) ",CYCLEmsec);
  616. X    getyx(win,y,x);
  617. X    while(x < getmaxx(win))
  618. X        waddch(win,(chtype)'-'),x++;
  619. X
  620. X}    /* end of draw_per_sec_literals */
  621. X
  622. X/*+-------------------------------------------------------------------------
  623. X    update_waitscale(win,y,width,per_state)
  624. X
  625. X000000000011111111112222222222333333333344444444445555555555666666
  626. X012345678901234567890123456789012345678901234567890123456789012345
  627. Xtot  io pio swp  
  628. X### ### ### ### xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
  629. X--------------------------------------------------------------------------*/
  630. X#define _WAITSCALE_TX    0
  631. X#define _WAITSCALE_IX    4
  632. X#define _WAITSCALE_PX    8
  633. X#define _WAITSCALE_WX    12
  634. X#define _WAITSCALE_SX    16
  635. X
  636. Xtime_t
  637. Xupdate_waitscale(win,y,x,width,per_state,total_ticks)
  638. XWINDOW *win;
  639. Xint y;
  640. Xint x;
  641. Xregister width;
  642. Xtime_t *per_state;
  643. Xtime_t total_ticks;
  644. X{
  645. X    register itmp;
  646. X    int accum = 0;
  647. X    time_t percent_io = 0L;
  648. X    time_t percent_swap = 0L;
  649. X    time_t percent_pio = 0L;
  650. X    time_t percent_total_wait;
  651. X    time_t total_wait;
  652. X
  653. X/* crock: because of latency, total_ticks < all wait ticks sometimes */
  654. X    total_wait = per_state[W_IO] + per_state[W_SWAP] + per_state[W_PIO];
  655. X    if(total_ticks < total_wait)
  656. X        total_ticks = total_wait;
  657. X
  658. X    if(total_ticks)
  659. X    {
  660. X        percent_io    = (per_state[W_IO]   * 100) / total_ticks;
  661. X        percent_pio   = (per_state[W_PIO]  * 100) / total_ticks;
  662. X        percent_swap  = (per_state[W_SWAP] * 100) / total_ticks;
  663. X    }
  664. X
  665. X    wmove(win,y, x + _WAITSCALE_TX);
  666. X    percent_total_wait = percent_io + percent_swap + percent_pio;
  667. X    if(percent_total_wait < 30)
  668. X        use_cp(wscr,cpLOW);
  669. X    else if(percent_total_wait < 50)
  670. X        use_cp(wscr,cpMED);
  671. X    else
  672. X        use_cp(wscr,cpHIGH);
  673. X    wprintw(win,"%3ld",percent_total_wait);
  674. X
  675. X    use_cp(wscr,cpINFO);
  676. X    wmove(win,y, x + _WAITSCALE_IX);
  677. X    wprintw(win,"%3ld",percent_io);
  678. X    
  679. X    wmove(win,y, x + _WAITSCALE_PX);
  680. X    wprintw(win,"%3ld",percent_pio);
  681. X    
  682. X    wmove(win,y, x + _WAITSCALE_WX);
  683. X    wprintw(win,"%3ld",percent_swap);
  684. X    
  685. X    wmove(win,y, x + _WAITSCALE_SX);
  686. X    use_cp(wscr,cpLOW);
  687. X    itmp = (width * percent_io) / 100;
  688. X    accum += itmp;
  689. X    while(itmp--)
  690. X        waddch(win,(chtype)'i');
  691. X
  692. X    use_cp(wscr,cpMED);
  693. X    itmp = (width * percent_pio) / 100;
  694. X    accum += itmp;
  695. X    while(itmp--)
  696. X        waddch(win,(chtype)'p');
  697. X
  698. X    use_cp(wscr,cpHIGH);
  699. X    itmp = (width * percent_swap) / 100;
  700. X    accum += itmp;
  701. X    while(itmp--)
  702. X        waddch(win,(chtype)'s');
  703. X
  704. X    use_cp(wscr,cpLIT);
  705. X    if((itmp = (width - accum)) > 0)
  706. X    {
  707. X        while(itmp--)
  708. X            waddch(win,(chtype)' ');
  709. X    }
  710. X
  711. X}    /* end of update_waitscale */
  712. X
  713. X/*+-------------------------------------------------------------------------
  714. X    calc_wait_avg(per_state) - add per_state array to avg array
  715. X--------------------------------------------------------------------------*/
  716. Xvoid
  717. Xcalc_wait_avg(per_state)
  718. Xtime_t per_state[];
  719. X{
  720. X    register itmp;
  721. X
  722. X    if(!wait_avg_init)
  723. X    {
  724. X        for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
  725. X            (void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
  726. X        wait_avg_init = 1;
  727. X    }
  728. X    else
  729. X    {
  730. X        for(itmp = 0; itmp < WAIT_AVG_MAX - 1; itmp++)
  731. X            (void)memcpy(wait_avg[itmp],wait_avg[itmp + 1],sizeof(time_t) * 3);
  732. X        (void)memcpy(wait_avg[itmp],per_state,sizeof(time_t) * 3);
  733. X    }
  734. X
  735. X}    /* end of calc_wait_avg */
  736. X
  737. X/*+-------------------------------------------------------------------------
  738. X    get_wait_avg(wait_ticks,period)
  739. X--------------------------------------------------------------------------*/
  740. Xget_wait_avg(wait_ticks,period)
  741. Xtime_t wait_ticks[];
  742. Xint period;
  743. X{
  744. X    register iperiod = WAIT_AVG_MAX;
  745. X    register istate;
  746. X    register count = period;
  747. X
  748. X    for(istate = 0; istate < 3; istate++)
  749. X        wait_ticks[istate] = 0;
  750. X
  751. X    while(count--)
  752. X    {
  753. X        iperiod--;
  754. X        for(istate = 0; istate < 3; istate++)
  755. X        {
  756. X            wait_ticks[istate] += (wait_avg[iperiod])[istate];
  757. X        }
  758. X    }
  759. X
  760. X    for(istate = 0; istate < 3; istate++)
  761. X        wait_ticks[istate] /= period;
  762. X
  763. X}    /* end of get_wait_avg */
  764. X
  765. X/*+-------------------------------------------------------------------------
  766. X    extra_static_stuff()/extra_info_stuff() - for 43 line display
  767. X--------------------------------------------------------------------------*/
  768. Xvoid
  769. Xextra_static_stuff()
  770. X{
  771. X    display_var(wscr,EXTRA_TLY,EXTRA1_TLX);
  772. X#if defined(HAS_BOOTINFO)
  773. X    display_bootinfo(wscr,EXTRA_TLY,EXTRA2_TLX);
  774. X#endif
  775. X    display_tune(wscr,EXTRA_TLY,EXTRA3_TLX);
  776. X}    /* end of extra_static_stuff */
  777. X
  778. Xvoid
  779. Xextra_info_stuff()
  780. X{
  781. X    display_proc(wscr,EXTRA_TLY,EXTRA4_TLX);
  782. X}    /* end of extra_info_stuff */
  783. X
  784. X/*+-------------------------------------------------------------------------
  785. X    read_sysinfo_and_minfo()
  786. X--------------------------------------------------------------------------*/
  787. Xvoid
  788. Xread_sysinfo_and_minfo()
  789. X{
  790. X#if defined(HAS_TIMEB)
  791. X    timeb_last_info_read = timeb_info_read;
  792. X    (void)ftime(&timeb_info_read);
  793. X#endif
  794. X    kread((caddr_t)&sysinfo,sysinfoaddr,sizeof(sysinfo));
  795. X    kread((caddr_t)&minfo,minfoaddr,sizeof(minfo));
  796. X}    /* end of read_sysinfo_and_minfo */
  797. X
  798. X/*+-------------------------------------------------------------------------
  799. X    main(argc,argv,envp)
  800. X--------------------------------------------------------------------------*/
  801. X/*ARGSUSED*/
  802. Xmain(argc,argv,envp)
  803. Xint argc;
  804. Xchar **argv;
  805. Xchar **envp;
  806. X{
  807. X    register itmp;
  808. X    register char *cptr;
  809. X    register chtype cmd;
  810. X    register chtype initial_cmd = 0;
  811. X    int errflg = 0;
  812. X    int plock_indicator = 0;
  813. X    time_t total_ticks;
  814. X    long stat_period_msec;
  815. X    long nap_msec;
  816. X    long nap_msec_remaining;
  817. X    int y,x;
  818. X    int banner_free_x;
  819. X    long ltmp, now;
  820. X#if !defined(HAS_TIMEB)
  821. X    long then;
  822. X#endif /* HAS_TIMEB */
  823. X    struct tm *lt;
  824. X    static char stdoutbuf[2048];
  825. X    char s80[80];
  826. X    extern int optind;
  827. X
  828. X/*
  829. X * curses works better if standard output is fully buffered
  830. X */
  831. X    (void)setvbuf(stdout,stdoutbuf,_IOFBF,sizeof(stdoutbuf));
  832. X
  833. X/*
  834. X * check out command line
  835. X */
  836. X    while((itmp = getopt(argc,argv,"lPnpstw")) != -1)
  837. X    {
  838. X        switch(itmp)
  839. X        {
  840. X            case 'P':
  841. X            case 'p':
  842. X#if defined(DPT_STREAMS)
  843. X            case 'n':
  844. X#endif
  845. X#if defined(DPT_TABLE)
  846. X            case 't':
  847. X#endif
  848. X#if defined(DPT_SIO)
  849. X            case 's':
  850. X#endif
  851. X#if defined(DPT_WD)
  852. X            case 'w':
  853. X#endif
  854. X                initial_cmd = (chtype) itmp;
  855. X                break;
  856. X            case 'l':
  857. X                plock_indicator = 1;
  858. X                break;
  859. X            case '?':
  860. X                errflg++;
  861. X        }
  862. X    }
  863. X    if(errflg || (optind != argc))
  864. X    {
  865. X        static char *usage_str[]=
  866. X        {
  867. X            "-l lock process into memory (if root)",
  868. X            "-p begin with short ps display",
  869. X            "-P begin with long ps display (if 43 line screen)",
  870. X            (char *)0
  871. X        };
  872. X        char **cpptr = usage_str;
  873. X        fprintf(stderr,"usage: %s [-l] [-p | -P]\n",basename(*argv));
  874. X        while(*cpptr)
  875. X            (void)fprintf(stderr,"%s\n",*(cpptr++));
  876. X        exit(1);
  877. X    }
  878. X
  879. X/*
  880. X * if man wants to plock() try it; fail silently if non-root
  881. X */
  882. X    if(plock_indicator && plock(PROCLOCK))
  883. X    {
  884. X        nice(-5);
  885. X        plock_indicator = 0;
  886. X    }
  887. X
  888. X/*
  889. X * Real(tm) performance monitor users will have done a kernel link
  890. X * and won't need to rely on /etc/systemid
  891. X */
  892. X    if(uname(&utsname))
  893. X    {
  894. X        leave_text("uname failed",255);
  895. X        exit(1);
  896. X    }
  897. X
  898. X/*
  899. X * allocate memory for cpu time array averaging buckets
  900. X */
  901. X    for(itmp = 0; itmp < CPU_AVG_MAX; itmp++)
  902. X    {
  903. X        if(!(cpu_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 5)))
  904. X            leave_text("cannot alloc memory for cpu avg arrays",1);
  905. X    }
  906. X
  907. X/*
  908. X * allocate memory for wait time array averaging buckets
  909. X */
  910. X    for(itmp = 0; itmp < WAIT_AVG_MAX; itmp++)
  911. X    {
  912. X        if(!(wait_avg[itmp] = (time_t *)malloc(sizeof(time_t) * 3)))
  913. X            leave_text("cannot alloc memory for wait avg arrays",1);
  914. X    }
  915. X
  916. X/*
  917. X * initialize curses environment
  918. X */
  919. X    if(!initscr())
  920. X    {
  921. X        (void)printf("curses init failed\n");
  922. X        exit(1);
  923. X    }
  924. X#if defined(COLOR_PAIR)
  925. X    has_colors_kludge();
  926. X#endif
  927. X    clear();
  928. X    refresh();
  929. X
  930. X    if((LINES < 24) || (COLS < 80))
  931. X    {
  932. X        waddstr(stdscr,"\n\n\nNeed at least 80x24 screen\n\n");
  933. X        refresh();
  934. X        endwin();
  935. X        exit(1);
  936. X    }
  937. X
  938. X    noecho();
  939. X    keypad(stdscr,TRUE);
  940. X    typeahead(-1);
  941. X#if !defined(HAS_RDCHK)
  942. X    cbreak ();
  943. X#endif
  944. X
  945. X/*
  946. X * see u386mon.h cXXX definitons for A_BOLD requirements for bright colors
  947. X */
  948. X#if defined(COLOR_PAIR)
  949. X    if(color_avail)
  950. X    {
  951. X        start_color();
  952. X        init_pair(cpLIT,cBLU,cBLK);
  953. X        init_pair(cpINFO,cGRN,cBLK);
  954. X        init_pair(cpLOW,cLTG,cBLK);
  955. X        init_pair(cpMED,cYEL,cBLK);
  956. X        init_pair(cpHIGH,cRED,cBLK);
  957. X        init_pair(cpBANNER,cBLK,cWHT);
  958. X        init_pair(cpREVERSE,cRED,cWHT);
  959. X        init_pair(cpBANWARN,cBLU,cWHT);
  960. X    }
  961. X#endif
  962. X
  963. X#if (defined(i386) || defined(i486)) && defined(HI_BIT_CAN_BE_SET)
  964. X    /* a hack for now -- assuming AT char set */
  965. X    /* This does NOT work with SCO ... rumours are it does work somewhere */
  966. X    acs_map['l'] = A_ALTCHARSET | sTL;    
  967. X    acs_map['m'] = A_ALTCHARSET | sTR;    
  968. X    acs_map['j'] = A_ALTCHARSET | sBL;    
  969. X    acs_map['k'] = A_ALTCHARSET | sBR;    
  970. X    acs_map['x'] = A_ALTCHARSET | sVR;        /* vertical rule */
  971. X    acs_map['q'] = A_ALTCHARSET | sHR;        /* horizontal rule */
  972. X    acs_map['t'] = A_ALTCHARSET | sLT;        /* left hand T */
  973. X    acs_map['u'] = A_ALTCHARSET | sRT;        /* right hand T */
  974. X#endif
  975. X
  976. X    if(!(pscr = mkpanel(LINES - 1,COLS,0,0,"main")))
  977. X    {
  978. X        addstr("cannot make screen panel");
  979. X        refresh();
  980. X        endwin();
  981. X        exit(1);
  982. X    }
  983. X    wscr = panel_window(pscr);
  984. X    top_panel(pscr);
  985. X#if !defined(HAS_RDCHK)
  986. X    nodelay (wscr, TRUE);
  987. X#endif
  988. X
  989. X/*
  990. X * catch signals that can leave our tty in disarray
  991. X */
  992. X    for(itmp = SIGHUP; itmp < SIGSYS; itmp++)
  993. X        signal(itmp,caught_signal);
  994. X
  995. X/*
  996. X * read nlist symbols, open /dev/kmem, /dev/mem, /dev/swap,
  997. X * initialize detail environment
  998. X * (all of these must occur after curses init)
  999. X * drop euid and egid (after opening privileged mem/devices)
  1000. X * initialize process status uid->name hasher
  1001. X */
  1002. X    nlsym_read();
  1003. X    kinit(0);    /* /dev/kmem, read access only */
  1004. X    minit(0);    /* /dev/mem,  read access only */
  1005. X    sinit();    /* /dev/swap, only read access available */
  1006. X    (void)setuid(getuid());    /* some people run us setuid, so clen that up */
  1007. X    (void)setgid(getgid());    /* now that we have the fds open, drop egid */
  1008. X    kread((caddr_t)&v,vaddr,sizeof(v));
  1009. X    detail_init();
  1010. X
  1011. X/*
  1012. X * start fireworks
  1013. X */
  1014. X    wmove(wscr,0,0);
  1015. X    use_cp(wscr,cpBANNER);
  1016. X    waddch(wscr,(chtype)' ');
  1017. X    waddstr(wscr,basename(*argv));
  1018. X    waddch(wscr,(chtype)' ');
  1019. X    waddstr(wscr,revision);
  1020. X    wprintw(wscr,"%d",PATCHLEVEL);    /* good for nine patches */
  1021. X
  1022. X#if defined(mips)
  1023. X    waddstr(wscr,"/Tandem");
  1024. X#else
  1025. X#if defined(M_UNIX)
  1026. X    waddstr(wscr,"/SCO");
  1027. X#else
  1028. X#if defined(ISC)
  1029. X#if defined(DELL)
  1030. X    waddstr(wscr,"/Dell");
  1031. X#else
  1032. X    waddstr(wscr,"/ISC");
  1033. X#endif
  1034. X#endif
  1035. X#endif
  1036. X#endif
  1037. X    
  1038. X#if defined(DELL)
  1039. X    wprintw(wscr," Rel %s Ver %s - Node %s ",
  1040. X        utsname.release,utsname.version,utsname.nodename);
  1041. X#else
  1042. X#if defined(m68k)
  1043. X    wprintw(wscr," %s %s - %s ",
  1044. X        utsname.release,utsname.version,utsname.nodename);
  1045. X#else
  1046. X    /* utsname.release and utsname.version are practcally redundant here */
  1047. X    wprintw(wscr," %s - %s ",utsname.release,utsname.nodename);
  1048. X#endif
  1049. X#endif
  1050. X    getyx(wscr,y,x);
  1051. X    banner_free_x = x+2;
  1052. X    while(x < getmaxx(wscr))
  1053. X        waddch(wscr,(chtype)' '),x++;
  1054. X    wmove(wscr,0,COLS - 9);
  1055. X    waddstr(wscr,"wht@n4hgf");
  1056. X    if(plock_indicator)
  1057. X    {
  1058. X        wmove(wscr,0,banner_free_x);
  1059. X        use_cp(wscr,cpMED);
  1060. X        waddstr(wscr," PLOCK ");
  1061. X        use_cp(wscr,cpBANNER);
  1062. X    }
  1063. X    wmove(wscr,3,0);
  1064. X    use_cp(wscr,cpMED);
  1065. X    waddstr(wscr,"WAIT");
  1066. X    pflush();
  1067. X
  1068. X    wmove(stdscr,CMD_TLY,0);
  1069. X    use_cp(stdscr,cpBANNER);
  1070. X    if(LINES >= 43)
  1071. X        waddstr(stdscr,"ESC=quit P,p=ps m=main ");
  1072. X    else
  1073. X        waddstr(stdscr,"ESC=quit p=ps e=extra m=main ");
  1074. X#if defined(DPT_SIO)
  1075. X    waddstr(stdscr,"s=sio ");
  1076. X#endif
  1077. X#if defined(DPT_TABLE)
  1078. X    waddstr(stdscr,"t=table ");
  1079. X#endif
  1080. X#if defined(DPT_STREAMS)
  1081. X    waddstr(stdscr,"n=net ");
  1082. X#endif
  1083. X#if defined(DPT_WD)
  1084. X    waddstr(stdscr,"w=disk ");
  1085. X#endif
  1086. X
  1087. X    if(getuid() == 0)    /* root can launch fireworks very predictably */
  1088. X        waddstr(stdscr,"l/u=lock ");
  1089. X    waddstr(stdscr,"+/-=rate");
  1090. X    getyx(stdscr,y,x);
  1091. X    while(x < getmaxx(stdscr))
  1092. X        waddch(stdscr,(chtype)' '),x++;
  1093. X    use_cp(stdscr,cpLIT);
  1094. X    use_cp(wscr,cpLIT);
  1095. X
  1096. X/*
  1097. X * make initial kmem readings
  1098. X */
  1099. X    hz = (cptr = getenv("HZ")) ? atoi(cptr) : HZ;
  1100. X    if(!hz)        /* avoid problem reported by Ian Reid <ir@crosfield.co.uk> */
  1101. X        hz = HZ;
  1102. X    kread((caddr_t)&maxmem,maxmemaddr,sizeof(maxmem));
  1103. X    kread((caddr_t)&tune,tuneaddr,sizeof(tune));
  1104. X    kread((caddr_t)&v,vaddr,sizeof(v));
  1105. X
  1106. X    kread((caddr_t)&nswap,nswapaddr,sizeof(nswap));
  1107. X    itmp = -1;
  1108. X#if defined(S3BSWPI)    /* 68000 handled here, not AT&T 3B */
  1109. X    itmp = _sysm68k (S3BSWPI,&swapint);    /* per nba@sysware.dk */
  1110. X#endif
  1111. X#if defined(SI86SWPI)
  1112. X    itmp = sysi86(SI86SWPI,&swapint);
  1113. X#endif
  1114. X#if defined(SMIPSSWPI)
  1115. X    itmp = sysmips(SMIPSSWPI,&swapint);
  1116. X#endif
  1117. X    if(!itmp)
  1118. X    {
  1119. X        nswap = 0;
  1120. X        for (itmp = 0; itmp < MSFILES; itmp++)
  1121. X            nswap += swaptab[itmp].st_npgs * NBPP / NBPSCTR;
  1122. X    }
  1123. X
  1124. X#if defined(HAS_BOOTINFO)
  1125. X    kread((caddr_t)&bootinfo,bootinfoaddr,sizeof(bootinfo));
  1126. X#endif
  1127. X
  1128. X    read_sysinfo_and_minfo();
  1129. X    sysinfo_last = sysinfo;
  1130. X    minfo_last = minfo;
  1131. X
  1132. X#if defined(HAS_TIMEB)
  1133. X    timeb_last_info_read = timeb_info_read;
  1134. X#else
  1135. X    (void)time (&now);
  1136. X#endif
  1137. X
  1138. X/*
  1139. X * initialize static display (literals)
  1140. X */
  1141. X    draw_cpuscale_literals(wscr,CPUSCALE_TLY,0);
  1142. X    draw_waitscale_literals(wscr,WAITSCALE_TLY,0);
  1143. X    draw_per_sec_literals(wscr,PER_SEC_TLY,0);
  1144. X
  1145. X    if(LINES >= 43)
  1146. X        extra_static_stuff();
  1147. X
  1148. X/*
  1149. X * while(user_not_bored) entertain_and_inform_user();
  1150. X */
  1151. X#ifdef HAS_NAP
  1152. X    nap(CYCLEmsec);
  1153. X#else
  1154. X    napms(CYCLEmsec);
  1155. X#endif
  1156. X    while(1)
  1157. X    {
  1158. X
  1159. X#if defined(HAS_RDCHK)
  1160. X        if(rdchk(0))
  1161. X            goto RDCHK;
  1162. X#endif
  1163. X
  1164. X#if defined(HAS_TIMEB)
  1165. X        ftime(&timeb_cycle_start);
  1166. X        stat_period_msec = delta_msec(timeb_info_read,timeb_last_info_read);
  1167. X        (void)time(&now);
  1168. X#else
  1169. X        then = now;
  1170. X        (void)time(&now);
  1171. X        stat_period_msec = (now - then) * 1000L;
  1172. X#endif
  1173. X
  1174. X        lt = localtime(&now);
  1175. X        wmove(wscr,0,COLS - 18);
  1176. X        use_cp(wscr,cpBANNER);
  1177. X        wprintw(wscr,"%02d:%02d:%02d",lt->tm_hour,lt->tm_min,lt->tm_sec);
  1178. X
  1179. X        kread((caddr_t)&freemem,freememaddr,sizeof(freemem));
  1180. X        read_sysinfo_and_minfo();
  1181. X
  1182. X        /* heuristic validity determination */
  1183. X        wmove(wscr,0,banner_free_x + 8);
  1184. X        if((itmp = stat_period_msec > (CYCLEmsec + 3000L)) ||
  1185. X            (invalidity > INVALID_STATE))
  1186. X        {
  1187. X            use_cp(wscr,cpHIGH);
  1188. X            waddstr(wscr," INVALID ");
  1189. X            if(itmp)
  1190. X            {    /* gack - a hack */
  1191. X                itmp = (stat_period_msec - CYCLEmsec) / 1000;
  1192. X                if(itmp > 4)
  1193. X                    itmp = 4;
  1194. X                invalidity += INVALID_STATE + itmp;
  1195. X            }
  1196. X        }
  1197. X        else if((itmp = (stat_period_msec > (CYCLEmsec + 1500L))) ||
  1198. X                (invalidity > INEXACT_STATE))
  1199. X        {
  1200. X            use_cp(wscr,cpMED);
  1201. X            waddstr(wscr," INEXACT ");
  1202. X            if(itmp)
  1203. X                invalidity += INEXACT_STATE;
  1204. X        }
  1205. X        if(invalidity && !(--invalidity))
  1206. X        {
  1207. X            use_cp(wscr,cpBANNER);
  1208. X            waddstr(wscr,"         ");
  1209. X        }
  1210. X        if(stat_period_msec > (CYCLEmsec + 1000L))
  1211. X            use_cp(wscr,cpREVERSE);
  1212. X        else if(stat_period_msec > (CYCLEmsec + 500L))
  1213. X            use_cp(wscr,cpBANWARN);
  1214. X        else
  1215. X            use_cp(wscr,cpBANNER);
  1216. X        wmove(wscr,stat_period_msec_y,stat_period_msec_x);
  1217. X        wprintw(wscr,"%5ld",stat_period_msec);
  1218. X
  1219. X
  1220. X#if defined(FIRST_TRY)
  1221. X        /* going this way seems to get cpu+wait ticks > real time */
  1222. X        for (itmp = 0; itmp < 5; itmp++)
  1223. X            cpu_ticks[itmp] = sysidelta(cpu[itmp]);
  1224. X        for (itmp = 0; itmp < 3; itmp++)
  1225. X            wait_ticks[itmp] = sysidelta(wait[itmp]);
  1226. X#else
  1227. X        for (itmp = 0; itmp < 5; itmp++)
  1228. X        {
  1229. X            if(itmp != CPU_WAIT)
  1230. X                cpu_ticks[itmp] = sysidelta(cpu[itmp]);
  1231. X        }
  1232. X        cpu_ticks[CPU_WAIT] = 0;
  1233. X        for (itmp = 0; itmp < 3; itmp++)
  1234. X            cpu_ticks[CPU_WAIT] += (wait_ticks[itmp] = sysidelta(wait[itmp]));
  1235. X#endif
  1236. X
  1237. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 1,CPUSCALE_SX,
  1238. X            CPUSCALE_WIDTH,cpu_ticks);
  1239. X
  1240. X        update_waitscale(wscr,WAITSCALE_TLY + 1,WAITSCALE_SX,
  1241. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1242. X
  1243. X        calc_cpu_avg(cpu_ticks);
  1244. X        calc_wait_avg(wait_ticks);
  1245. X
  1246. X        get_cpu_avg(cpu_ticks,5);
  1247. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 2,CPUSCALE_SX,
  1248. X            CPUSCALE_WIDTH,cpu_ticks);
  1249. X
  1250. X        get_wait_avg(wait_ticks,5);
  1251. X        update_waitscale(wscr,WAITSCALE_TLY + 2,WAITSCALE_SX,
  1252. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1253. X
  1254. X        get_cpu_avg(cpu_ticks,10);
  1255. X        total_ticks = update_cpuscale(wscr,CPUSCALE_TLY + 3,CPUSCALE_SX,
  1256. X            CPUSCALE_WIDTH,cpu_ticks);
  1257. X
  1258. X        get_wait_avg(wait_ticks,10);
  1259. X        update_waitscale(wscr,WAITSCALE_TLY + 3,WAITSCALE_SX,
  1260. X            WAITSCALE_WIDTH,wait_ticks,total_ticks);
  1261. X
  1262. X        use_cp(wscr,cpINFO);
  1263. X        y = PER_SEC_TLY + 1;
  1264. X        wmove(wscr,y++,PER_SEC1_TLX);
  1265. X        disp_info_long(wscr,"bread    ","%7ld",sysidelta(bread));
  1266. X        wmove(wscr,y++,PER_SEC1_TLX);
  1267. X        disp_info_long(wscr,"bwrite   ","%7ld",sysidelta(bwrite));
  1268. X        wmove(wscr,y++,PER_SEC1_TLX);
  1269. X        if((ltmp = sysidelta(lread) - myreadcnt) < 0)
  1270. X            ltmp = 0;
  1271. X        disp_info_long(wscr,"lread    ","%7ld",ltmp);
  1272. X        myreadcnt = 0;    /* reset /dev/{mem,kmem,swap} read count */
  1273. X        wmove(wscr,y++,PER_SEC1_TLX);
  1274. X        disp_info_long(wscr,"lwrite   ","%7ld",sysidelta(lwrite));
  1275. X        wmove(wscr,y++,PER_SEC1_TLX);
  1276. X        disp_info_long(wscr,"phread   ","%7ld",sysidelta(phread));
  1277. X        wmove(wscr,y++,PER_SEC1_TLX);
  1278. X        disp_info_long(wscr,"phwrite  ","%7ld",sysidelta(phwrite));
  1279. X        wmove(wscr,y++,PER_SEC1_TLX);
  1280. X        disp_info_long(wscr,"swapin   ","%7ld",sysidelta(swapin));
  1281. X        wmove(wscr,y++,PER_SEC1_TLX);
  1282. X        disp_info_long(wscr,"swapout  ","%7ld",sysidelta(swapout));
  1283. X        wmove(wscr,y++,PER_SEC1_TLX);
  1284. X        disp_info_long(wscr,"bswapin  ","%7ld",sysidelta(bswapin));
  1285. X        wmove(wscr,y++,PER_SEC1_TLX);
  1286. X        disp_info_long(wscr,"bswapout ","%7ld",sysidelta(bswapout));
  1287. X        wmove(wscr,y++,PER_SEC1_TLX);
  1288. X        disp_info_long(wscr,"iget     ","%7ld",sysidelta(iget));
  1289. X        wmove(wscr,y++,PER_SEC1_TLX);
  1290. X        disp_info_long(wscr,"namei    ","%7ld",sysidelta(namei));
  1291. X        wmove(wscr,y++,PER_SEC1_TLX);
  1292. X        disp_info_long(wscr,"dirblk   ","%7ld",sysidelta(dirblk));
  1293. X
  1294. X        y = PER_SEC_TLY + 1;
  1295. X        wmove(wscr,y++,PER_SEC2_TLX);
  1296. X        if((ltmp = sysidelta(readch) - myreadlen) < 0)
  1297. X            ltmp = 0;
  1298. X        disp_info_long(wscr,"readch  ","%7ld",ltmp);
  1299. X        myreadlen = 0;    /* reset /dev/{mem,kmem,swap} read count */
  1300. X
  1301. X        wmove(wscr,y++,PER_SEC2_TLX);
  1302. X        disp_info_long(wscr,"writch  ","%7ld",sysidelta(writech));
  1303. X
  1304. X        wmove(wscr,y++,PER_SEC2_TLX);
  1305. X        disp_info_long(wscr,"rawch   ","%7ld",sysidelta(rawch));
  1306. X        wmove(wscr,y++,PER_SEC2_TLX);
  1307. X        disp_info_long(wscr,"canch   ","%7ld",sysidelta(canch));
  1308. X        wmove(wscr,y++,PER_SEC2_TLX);
  1309. X        disp_info_long(wscr,"outch   ","%7ld",sysidelta(outch));
  1310. X
  1311. X        wmove(wscr,y++,PER_SEC2_TLX);
  1312. X        disp_info_long(wscr,"msg     ","%7ld",sysidelta(msg));
  1313. X        wmove(wscr,y++,PER_SEC2_TLX);
  1314. X        disp_info_long(wscr,"sema    ","%7ld",sysidelta(sema));
  1315. X
  1316. X        wmove(wscr,y++,PER_SEC2_TLX);
  1317. X        disp_static_long(wscr, "maxmem  ","%6ldk",(long)maxmem * NBPP / 1024);
  1318. X        wmove(wscr,y++,PER_SEC2_TLX);
  1319. X        disp_info_long(wscr,   "frmem   ","%6ldk",(long)freemem * NBPP / 1024);
  1320. X        wmove(wscr,y++,PER_SEC2_TLX);
  1321. X        disp_info_int (wscr,   "mem used","%6d%%",
  1322. X            100 - (int)((freemem * 100) / maxmem));
  1323. X
  1324. X        wmove(wscr,y++,PER_SEC2_TLX);
  1325. X        disp_static_int(wscr, "nswap   ","%6ldk",nswap * NBPSCTR / 1024);
  1326. X        wmove(wscr,y++,PER_SEC2_TLX);
  1327. X        disp_info_long(wscr,  "frswp   ","%6ldk",minfo.freeswap* NBPSCTR/1024);
  1328. X        wmove(wscr,y++,PER_SEC2_TLX);
  1329. X        disp_info_int(wscr,   "swp used","%6d%%",
  1330. X            100 - (int)((minfo.freeswap * 100) / nswap));
  1331. X
  1332. X        y = PER_SEC_TLY + 1;
  1333. X        wmove(wscr,y++,PER_SEC3_TLX);
  1334. X        disp_info_long(wscr,"pswitch ","%5ld",sysidelta(pswitch));
  1335. X        wmove(wscr,y++,PER_SEC3_TLX);
  1336. X        disp_info_long(wscr,"syscall ","%5ld",sysidelta(syscall));
  1337. X        wmove(wscr,y++,PER_SEC3_TLX);
  1338. X        disp_info_long(wscr,"sysread ","%5ld",sysidelta(sysread));
  1339. X        wmove(wscr,y++,PER_SEC3_TLX);
  1340. X        disp_info_long(wscr,"syswrit ","%5ld",sysidelta(syswrite));
  1341. X        wmove(wscr,y++,PER_SEC3_TLX);
  1342. X        disp_info_long(wscr,"sysfork ","%5ld",sysidelta(sysfork));
  1343. X        wmove(wscr,y++,PER_SEC3_TLX);
  1344. X        disp_info_long(wscr,"sysexec ","%5ld",sysidelta(sysexec));
  1345. X
  1346. X        y++;
  1347. X        wmove(wscr,y++,PER_SEC3_TLX);
  1348. X        disp_info_long(wscr,"runque  ","%5ld",sysidelta(runque));
  1349. X        wmove(wscr,y++,PER_SEC3_TLX);
  1350. X        disp_info_long(wscr,"runocc  ","%5ld",sysidelta(runocc));
  1351. X        wmove(wscr,y++,PER_SEC3_TLX);
  1352. X        disp_info_long(wscr,"swpque  ","%5ld",sysidelta(swpque));
  1353. X        wmove(wscr,y++,PER_SEC3_TLX);
  1354. X        disp_info_long(wscr,"swpocc  ","%5ld",sysidelta(swpocc));
  1355. X
  1356. X        y = PER_SEC_TLY + 1;
  1357. X        wmove(wscr,y++,PER_SEC4_TLX);
  1358. X        disp_info_long(wscr,"vfault  ","%4ld",midelta(vfault));
  1359. X        wmove(wscr,y++,PER_SEC4_TLX);
  1360. X        disp_info_long(wscr,"demand  ","%4ld",midelta(demand));
  1361. X        wmove(wscr,y++,PER_SEC4_TLX);
  1362. X        disp_info_long(wscr,"pfault  ","%4ld",midelta(pfault));
  1363. X        wmove(wscr,y++,PER_SEC4_TLX);
  1364. X        disp_info_long(wscr,"cw      ","%4ld",midelta(cw));
  1365. X        wmove(wscr,y++,PER_SEC4_TLX);
  1366. X        disp_info_long(wscr,"steal   ","%4ld",midelta(steal));
  1367. X        wmove(wscr,y++,PER_SEC4_TLX);
  1368. X        disp_info_long(wscr,"frdpgs  ","%4ld",midelta(freedpgs));
  1369. X#if defined(SVR32)
  1370. X        wmove(wscr,y++,PER_SEC4_TLX);
  1371. X        disp_info_long(wscr,"vfpg    ","%4ld",midelta(vfpg));
  1372. X        wmove(wscr,y++,PER_SEC4_TLX);
  1373. X        disp_info_long(wscr,"sfpg    ","%4ld",midelta(sfpg));
  1374. X        wmove(wscr,y++,PER_SEC4_TLX);
  1375. X        disp_info_long(wscr,"vspg    ","%4ld",midelta(vspg));
  1376. X        wmove(wscr,y++,PER_SEC4_TLX);
  1377. X        disp_info_long(wscr,"sspg    ","%4ld",midelta(sspg));
  1378. X        wmove(wscr,y++,PER_SEC4_TLX);
  1379. X        disp_info_long(wscr,"pnpfault","%4ld",sysidelta(pnpfault));
  1380. X        wmove(wscr,y++,PER_SEC4_TLX);
  1381. X        disp_info_long(wscr,"wrtfault","%4ld",sysidelta(wrtfault));
  1382. X#endif
  1383. X
  1384. X        y = PER_SEC_TLY + 1;
  1385. X        wmove(wscr,y++,PER_SEC5_TLX);
  1386. X        disp_info_long(wscr,"unmodsw ","%3ld",midelta(unmodsw));
  1387. X        wmove(wscr,y++,PER_SEC5_TLX);
  1388. X        disp_info_long(wscr,"unmodfl ","%3ld",midelta(unmodfl));
  1389. X#if defined(SVR32)
  1390. X        wmove(wscr,y++,PER_SEC5_TLX);
  1391. X        disp_info_long(wscr,"psoutok ","%3ld",midelta(psoutok));
  1392. X        wmove(wscr,y++,PER_SEC5_TLX);
  1393. X        disp_info_long(wscr,"psinfai ","%3ld",midelta(psinfail));
  1394. X        wmove(wscr,y++,PER_SEC5_TLX);
  1395. X        disp_info_long(wscr,"psinok  ","%3ld",midelta(psinok));
  1396. X        wmove(wscr,y++,PER_SEC5_TLX);
  1397. X        disp_info_long(wscr,"rsout   ","%3ld",midelta(rsout));
  1398. X        wmove(wscr,y++,PER_SEC5_TLX);
  1399. X        disp_info_long(wscr,"rsin    ","%3ld",midelta(rsin));
  1400. X#endif
  1401. X
  1402. X        y++;
  1403. X        wmove(wscr,y++,PER_SEC5_TLX);
  1404. X        use_cp(wscr,cpLIT);
  1405. X        waddstr(wscr,"pages on   ");
  1406. X        wmove(wscr,y++,PER_SEC5_TLX);
  1407. X        disp_info_long(wscr,"swap  ","%5ld",midelta(swap));
  1408. X        wmove(wscr,y++,PER_SEC5_TLX);
  1409. X        disp_info_long(wscr,"cache ","%5ld",midelta(cache));
  1410. X        wmove(wscr,y++,PER_SEC5_TLX);
  1411. X        disp_info_long(wscr,"file  ","%5ld",midelta(file));
  1412. X
  1413. X        if(LINES >= 43)
  1414. X            extra_info_stuff();
  1415. X
  1416. X        detail_panel_update();
  1417. X
  1418. X        if(initial_cmd)
  1419. X        {
  1420. X            detail_panel_cmd(initial_cmd);
  1421. X            initial_cmd = 0;
  1422. X        }
  1423. X
  1424. X        pflush();
  1425. X
  1426. X        cmd = 0;
  1427. X#if defined(HAS_RDCHK)
  1428. XRDCHK:
  1429. X        while(rdchk(0))
  1430. X#endif
  1431. X        {
  1432. X            switch(cmd = wgetch(wscr))
  1433. X            {
  1434. X                case 'L' & 0x1F:        /* ^L */
  1435. X                case 'R' & 0x1F:        /* ^R */
  1436. X                    clearok (wscr, TRUE);
  1437. X                    touchwin(wscr);
  1438. X                    wrefresh(wscr);
  1439. X                    if(wdet)
  1440. X                    {
  1441. X                        touchwin(wdet);
  1442. X                        wrefresh(wscr);
  1443. X                    }
  1444. X                    break;
  1445. X
  1446. X                case 'q':
  1447. X                case A_ESC:
  1448. X                    goto GOOD_BYE;
  1449. X#if defined(HAS_BOOTINFO)
  1450. X                case 'b':
  1451. X                    if(bootinfo.bootstrlen > 79)
  1452. X                        itmp = 79;
  1453. X                    else
  1454. X                        itmp = bootinfo.bootstrlen;
  1455. X                    kread(s80,bootinfoaddr +
  1456. X                        (bootinfo.bootstr - (caddr_t)&bootinfo),itmp);
  1457. X                    s80[itmp] = 0;
  1458. X                    disp_msg(cpMED,s80);
  1459. X                    break;
  1460. X#endif
  1461. X                case 'e':
  1462. X                case 'P':
  1463. X                case 'p':
  1464. X                case 'm':
  1465. X#if defined(DPT_TABLE)
  1466. X                case 't':
  1467. X#endif
  1468. X#if defined(DPT_STREAMS)
  1469. X                case 'n':
  1470. X#endif
  1471. X#if defined(DPT_SIO)
  1472. X                case 's':
  1473. X#endif
  1474. X#if defined(DPT_WD)
  1475. X                case 'w':
  1476. X#endif
  1477. X                    detail_panel_cmd(cmd);
  1478. X                    break;
  1479. X                case 'l':
  1480. X                    if(!plock_indicator)
  1481. X                    {
  1482. X                        if(!plock(PROCLOCK))
  1483. X                        {
  1484. X                            plock_indicator = 1;
  1485. X                            wmove(wscr,0,banner_free_x);
  1486. X                            use_cp(wscr,cpMED);
  1487. X                            waddstr(wscr," PLOCK ");
  1488. X                            nice(-5);
  1489. X                        }
  1490. X                    }
  1491. X                    break;
  1492. X                case 'u':
  1493. X                    if(plock_indicator)
  1494. X                    {
  1495. X                        if(!plock(UNLOCK))
  1496. X                        {
  1497. X                            plock_indicator = 0;
  1498. X                            wmove(wscr,0,banner_free_x);
  1499. X                            use_cp(wscr,cpBANNER);
  1500. X                            waddstr(wscr,"       ");
  1501. X                            nice(5);
  1502. X                        }
  1503. X                    }
  1504. X                    break;
  1505. X                case '+':
  1506. X                    if(CYCLEmsec < CYCLEmsecMax)
  1507. X                    {
  1508. X                        invalidity += (INEXACT_STATE * (CYCLEmsec + 1000L)) /
  1509. X                                            CYCLEmsec;
  1510. X                        CYCLEmsec += 1000L;
  1511. X                        draw_cpuscale_literals(wscr,CPUSCALE_TLY,0);
  1512. X                        draw_waitscale_literals(wscr,WAITSCALE_TLY,0);
  1513. X                    }
  1514. X                    else beep();
  1515. X                    break;
  1516. X                case '-':
  1517. X                    if(CYCLEmsec > 1000L)
  1518. X                    {
  1519. X                        CYCLEmsec -= 1000L;
  1520. X                        draw_cpuscale_literals(wscr,CPUSCALE_TLY,0);
  1521. X                        draw_waitscale_literals(wscr,WAITSCALE_TLY,0);
  1522. X                    }
  1523. X                    else beep();
  1524. X                    break;
  1525. X                case 0:
  1526. X                case (chtype)-1:
  1527. X                    break;
  1528. X                default:
  1529. X                    beep();
  1530. X                    break;
  1531. X            }
  1532. X        }
  1533. X
  1534. X        /* remember previous statistics for next delta */
  1535. X        sysinfo_last = sysinfo;
  1536. X        minfo_last = minfo;
  1537. X
  1538. X        /* ex-lax: all in the name of regularity */
  1539. X#if defined(HAS_TIMEB)
  1540. X        ftime(&timeb_cycle_end);
  1541. X        nap_msec = CYCLEmsec - delta_msec(timeb_cycle_end,timeb_cycle_start);
  1542. X        if(nap_msec < (CYCLEmsec - 300L))
  1543. X            nap_msec = (CYCLEmsec - 300L);
  1544. X#else
  1545. X        nap_msec = (CYCLEmsec - 300L);
  1546. X#endif
  1547. X
  1548. X        nap_msec_remaining = nap_msec;
  1549. X
  1550. X#if defined(HAS_RDCHK)
  1551. X        while(nap_msec_remaining > 0)
  1552. X        {
  1553. X#ifdef HAS_NAP
  1554. X            nap(250L);
  1555. X#else
  1556. X            napms(250);    /* curses call: alas most round UP to nearest second */
  1557. X#endif
  1558. X            nap_msec_remaining -= 250;
  1559. X            if(rdchk(0))
  1560. X                break;
  1561. X        }
  1562. X#else /* do not have rdchk() */
  1563. X#ifdef HAS_NAP
  1564. X            nap(nap_msec_remaining);
  1565. X#else
  1566. X            napms(nap_msec_remaining);
  1567. X#endif
  1568. X#endif /* HAS_NAP */
  1569. X            
  1570. X    }
  1571. X
  1572. XGOOD_BYE:
  1573. X    leave_text("",0);
  1574. X    /*NOTREACHED*/
  1575. X}    /* end of main */
  1576. X
  1577. X/* vi: set tabstop=4 shiftwidth=4: */
  1578. X/* end of u386mon.c */
  1579. SHAR_EOF
  1580. chmod 0644 u386mon.c ||
  1581. echo 'restore of u386mon.c failed'
  1582. Wc_c="`wc -c < 'u386mon.c'`"
  1583. test 40718 -eq "$Wc_c" ||
  1584.     echo 'u386mon.c: original size 40718, current size' "$Wc_c"
  1585. fi
  1586. # ============= bootinfo.c ==============
  1587. if test -f 'bootinfo.c' -a X"$1" != X"-c"; then
  1588.     echo 'x - skipping bootinfo.c (File already exists)'
  1589. else
  1590. echo 'x - extracting bootinfo.c (Text)'
  1591. sed 's/^X//' << 'SHAR_EOF' > 'bootinfo.c' &&
  1592. X/* CHK=0xA59C */
  1593. X/*+-------------------------------------------------------------------------
  1594. X    bootinfo.c - u386mon bootinfo struct display
  1595. X
  1596. X  Defined functions:
  1597. X    bmemf_text(flags)
  1598. X    display_bootinfo(win,y,x)
  1599. X
  1600. XWe try to be dynamic with memory block counts, but if the sum of
  1601. Xmemavailcnt and memusedcnt ever exceeds 7, we will lose in 24 line
  1602. Xsessions (8 in 25 line, 9 in 43 line)
  1603. X
  1604. X
  1605. X--------------------------------------------------------------------------*/
  1606. X/*+:EDITS:*/
  1607. X/*:07-15-1992-14:31-wht@n4hgf-2.60 release - u386mon+siotools merge */
  1608. X/*:06-21-1992-00:34-root@n4hgf-needed extern for 3.2v4 */
  1609. X/*:06-20-1992-20:19-root@n4hgf-dont let info fall off bottom */
  1610. X/*:08-20-1991-12:44-root@n4hgf-nba@sysware.dk S5R31 and config reorg */
  1611. X/*:08-01-1991-23:34-wht@n4hgf-release 2.40 source control point */
  1612. X/*:08-10-1990-14:12-jmd@p1so/wht@n4hgf-2.20-add Tandem Integrity S2 */
  1613. X/*:08-07-1990-14:24-wht@n4hgf-nba@sysware.dk SVR31 updates */
  1614. X/*:08-02-1990-15:35-wht@n4hgf-2.12-old curses hacks+minor 3.2 formalizations */
  1615. X/*:07-28-1990-18:06-wht@n4hgf-2.10 release */
  1616. X/*:07-11-1990-17:19-root@n4hgf-more input from trb@ima.ima.isc.com */
  1617. X/*:07-04-1990-01:28-root@n4hgf-alan@cms2.lonestar.org reported missing M_ */
  1618. X/*:06-27-1990-01:57-wht@n4hgf-1.10-incorporate suggestions from alpha testers */
  1619. X/*:06-25-1990-04:14-wht@n4hgf-1.02-better error handling */
  1620. X/*:06-25-1990-03:18-wht@n4hgf-ODT/3.2.1 has B_MEM_CANTDMA not B_MEM_NODMA */
  1621. X/*:06-24-1990-20:53-wht@n4hgf-v1.01-add ISC support thanks to peter@radig.de */
  1622. X/*:06-21-1990-14:26-r@n4hgf-version x0.12 seems bug free */
  1623. X/*:06-17-1990-14:59-wht-creation */
  1624. X
  1625. X#include "config.h"
  1626. X
  1627. X#if defined(HAS_BOOTINFO)
  1628. X
  1629. X#include <curses.h>
  1630. X#undef timeout /* conflict in curses.h and bootinfo.h per trb@ima.ima.isc.com */
  1631. X#undef reg     /* per nba@sysware.dk */
  1632. X#include "libpanel.h"
  1633. X#include <sys/types.h>
  1634. X#include <sys/bootinfo.h>
  1635. X#include "u386mon.h"
  1636. X
  1637. Xextern struct bootinfo bootinfo;
  1638. X
  1639. X/*+-------------------------------------------------------------------------
  1640. X    bmemf_text(flags)
  1641. X--------------------------------------------------------------------------*/
  1642. Xchar *
  1643. Xbmemf_text(flags)
  1644. Xulong flags;
  1645. X{
  1646. X    static char hex_errant[16];
  1647. X    ulong orig_flags = flags;
  1648. X
  1649. X#if defined(B_MEM_DOWN)        /* SCO only */
  1650. X    flags &= ~B_MEM_DOWN;
  1651. X#endif
  1652. X#if defined(B_MEM_BASE)        /* ISC only (or is it SVR3.2.2?) */
  1653. X    flags &= ~B_MEM_BASE;
  1654. X#endif
  1655. X#if defined(B_MEM_EXPANS)    /* ISC */
  1656. X    flags &= ~B_MEM_EXPANS;
  1657. X#endif
  1658. X#if defined(B_MEM_SHADOW)    /* ISC */
  1659. X    flags &= ~B_MEM_SHADOW;
  1660. X#endif
  1661. X#if defined(B_MEM_TREV)        /* ISC */
  1662. X    flags &= ~B_MEM_TREV;
  1663. X#endif
  1664. X
  1665. X    if(!flags)
  1666. X        return("    ");
  1667. X    switch(flags)
  1668. X    {
  1669. X#if defined(B_MEM_RSRVD)
  1670. X        case B_MEM_RSRVD: return("RSVD");
  1671. X#endif
  1672. X#if defined(B_MEM_KBSS)
  1673. X        case B_MEM_KBSS:  return("KBSS");
  1674. X#endif
  1675. X#if defined(B_MEM_KTEXT)
  1676. X        case B_MEM_KTEXT: return("KTXT");
  1677. X#endif
  1678. X#if defined(B_MEM_KDATA)
  1679. X        case B_MEM_KDATA: return("KDTA");
  1680. X#endif
  1681. X#if defined(B_MEM_NODMA)
  1682. X        case B_MEM_NODMA: return("NODM");
  1683. X#endif
  1684. X#if defined(B_MEM_CANTDMA)
  1685. X        case B_MEM_CANTDMA: return("NODM");
  1686. X#endif
  1687. X    }
  1688. X    sprintf(hex_errant,"%04x",(ushort)orig_flags);
  1689. X    return(hex_errant);
  1690. X}    /* end of bmemf_text */
  1691. X
  1692. X/*+-------------------------------------------------------------------------
  1693. X    ISC_machinetype_text(machine)
  1694. X--------------------------------------------------------------------------*/
  1695. X#if defined(ME_COMPAQVGA)    /* ISC machdep.h */
  1696. Xchar *
  1697. XISC_machinetype_text(machine)
  1698. Xunsigned char machine;
  1699. X{
  1700. X    switch(machine)
  1701. X    {
  1702. X#if defined(M_UNKNOWN)    /* some ISC bootinfo.h do not have these */
  1703. X        case M_UNKNOWN:
  1704. X            return("");
  1705. X            break;
  1706. X#endif
  1707. X#if defined(M_COMPAQ)
  1708. X        case M_COMPAQ:
  1709. X            return("Compaq");
  1710. X            break;
  1711. X#endif
  1712. X#if defined(M_PS2)
  1713. X        case M_PS2:
  1714. X            return("PS/2");
  1715. X            break;
  1716. X#endif
  1717. X#if defined(M_AT)
  1718. X        case M_AT:
  1719. X            return("Generic 386");
  1720. X            break;
  1721. X#endif
  1722. X#if defined(M_ATT)
  1723. X        case M_ATT:
  1724. X            return("AT&T 6386");
  1725. X            break;
  1726. X#endif
  1727. X#if defined(M_ATT5)
  1728. X        case M_ATT5:
  1729. X            return("AT&T 6386");
  1730. X            break;
  1731. X#endif
  1732. X#if defined(M_M380)
  1733. X        case M_M380:
  1734. X            return("Olivetti M380");
  1735. X            break;
  1736. X#endif
  1737. X#if defined(M_DELL)
  1738. X        case M_DELL:
  1739. X            return("Dell 386");
  1740. X            break;
  1741. X#endif
  1742. X#if defined(M_D325)
  1743. X        case M_D325:
  1744. X            return("Dell 325");
  1745. X            break;
  1746. X#endif
  1747. X#if defined(M_ALR)
  1748. X        case M_ALR:
  1749. X            return("Adv Logic Res");
  1750. X            break;
  1751. X#endif
  1752. X#if defined(M_ZDS)
  1753. X        case M_ZDS:
  1754. X            return("Zenith Data");
  1755. X            break;
  1756. X#endif
  1757. X    }
  1758. X    return("i386");
  1759. X}    /* end of ISC_machinetype_text */
  1760. X#endif
  1761. X
  1762. X/*+-------------------------------------------------------------------------
  1763. X    ISC_displaytype_text(adapter)
  1764. X--------------------------------------------------------------------------*/
  1765. X#if defined(ME_COMPAQVGA)    /* ISC machdep.h */
  1766. Xchar *
  1767. XISC_displaytype_text(adapter)
  1768. Xunsigned char adapter;
  1769. X{
  1770. X
  1771. X    switch(adapter)
  1772. X    {
  1773. X        case ME_UNKNOWN:
  1774. X            return("unknown to sys");
  1775. X            break;
  1776. X        case ME_EGA:
  1777. X            return("EGA");
  1778. X            break;
  1779. X        case ME_CGA80:
  1780. X            return("CGA");
  1781. X            break;
  1782. X        case ME_MONO:
  1783. X            return("MONO");
  1784. X            break;
  1785. X        case ME_COMPAQHR:
  1786. X            return("Compaq mono");
  1787. X            break;
  1788. X        case ME_Z449:
  1789. X            return("Zenith Z449");
  1790. X            break;
  1791. X        case ME_T5100:
  1792. X            return("Toshiba T5100");
  1793. X            break;
  1794. X        case ME_COMPAQVGA:
  1795. X            return("Compaq VGA");
  1796. X            break;
  1797. X        case ME_OTHERVGA:
  1798. X            return("VGA");
  1799. X            break;
  1800. X#if defined(ME_PVGA1)
  1801. X        case ME_PVGA1:
  1802. X            return("Paradise VGA1");
  1803. X            break;
  1804. X#endif /*ME_PVGA1*/
  1805. X#if defined(ME_V7VGA)
  1806. X        case ME_V7VGA:
  1807. X            return("Video 7 VGA");
  1808. X            break;
  1809. X#endif /*ME_V7VGA*/
  1810. X    }
  1811. X    return("???");
  1812. X}    /* end of ISC_displaytype_text */
  1813. X#endif
  1814. X
  1815. X/*+-------------------------------------------------------------------------
  1816. X    display_bootinfo(win,y,x)
  1817. X--------------------------------------------------------------------------*/
  1818. Xvoid
  1819. Xdisplay_bootinfo(win,y,x)
  1820. XWINDOW *win;
  1821. Xint y;
  1822. Xint x;
  1823. X{
  1824. X    register itmp;
  1825. X    register struct bootmem *bmem;
  1826. X    int maxy = getmaxy(win);
  1827. X
  1828. X    use_cp(win,cpBANNER);
  1829. X    wmove(win,y++,x);
  1830. X    waddstr(win,"-- Bootinfo ----------");
  1831. X#if defined(M_UNIX)    /* ISC doesn't have this in struct */
  1832. X    wmove(win,y++,x);
  1833. X    disp_static_long(win,"basemem  ","%7ldk     ",bootinfo.basemem / 1024);
  1834. X    wmove(win,y++,x);
  1835. X    disp_static_long(win,"extmem   ","%7ldk     ",bootinfo.extmem / 1024);
  1836. X#endif
  1837. X#if defined(ME_COMPAQVGA)    /* ISC machdep.h */
  1838. X    wmove(win,y++,x);
  1839. X    wprintw(win,"machine %14.14s",
  1840. X        ISC_machinetype_text(bootinfo.machenv.machine));
  1841. X    wmove(win,y++,x);
  1842. X    wprintw(win,"disp %17.17s",
  1843. X        ISC_displaytype_text(bootinfo.machenv.adapter));
  1844. X#endif
  1845. X    wmove(win,y++,x);
  1846. X    disp_static_long(win,"bflags   ","%08lx     ",bootinfo.bootflags);
  1847. X
  1848. X    wmove(win,y++,x); waddstr(win,"memory available      ");
  1849. X    for(itmp = 0; itmp < bootinfo.memavailcnt; itmp++)
  1850. X    {
  1851. X        bmem = &bootinfo.memavail[itmp];
  1852. X#if defined(B_MEM_DOWN)
  1853. X        if(bmem->flags & B_MEM_DOWN)
  1854. X        {
  1855. X            bmem->base -= bmem->extent;
  1856. X            bmem->flags &= ~B_MEM_DOWN;
  1857. X        }
  1858. X#endif
  1859. X        if(y == (maxy - 2))
  1860. X            goto NO_ROOM;
  1861. X        wmove(win,y++,x);
  1862. X        wprintw(win,"%08lx %08lx %s",bmem->base,bmem->extent,
  1863. X            bmemf_text(bmem->flags));
  1864. X    }
  1865. X
  1866. X    if(y == (maxy - 2))
  1867. X        goto NO_ROOM;
  1868. X    wmove(win,y++,x);
  1869. X    waddstr(win,"memory used           ");
  1870. X    for(itmp = 0; itmp < bootinfo.memusedcnt; itmp++)
  1871. X    {
  1872. X        bmem = &bootinfo.memused[itmp];
  1873. X#if defined(B_MEM_DOWN)
  1874. X        if(bmem->flags & B_MEM_DOWN)
  1875. X        {
  1876. X            bmem->base -= bmem->extent;
  1877. X            bmem->flags &= ~B_MEM_DOWN;
  1878. X        }
  1879. X#endif
  1880. X        if(y == (maxy - 2))
  1881. X            goto NO_ROOM;
  1882. X        wmove(win,y++,x);
  1883. X        wprintw(win,"%08lx %08lx %s",bmem->base,bmem->extent,
  1884. X            bmemf_text(bmem->flags));
  1885. X    }
  1886. X
  1887. X
  1888. X    return;
  1889. X
  1890. XNO_ROOM:
  1891. X    wmove(win,maxy - 2,x);
  1892. X    waddstr(win,"insufficient display rows for complete information");
  1893. X
  1894. X}    /* end of display_bootinfo */
  1895. X
  1896. X#endif /* HAS_BOOTINFO */
  1897. X/* vi: set tabstop=4 shiftwidth=4: */
  1898. X/* end of bootinfo.c */
  1899. SHAR_EOF
  1900. chmod 0644 bootinfo.c ||
  1901. echo 'restore of bootinfo.c failed'
  1902. Wc_c="`wc -c < 'bootinfo.c'`"
  1903. test 7500 -eq "$Wc_c" ||
  1904.     echo 'bootinfo.c: original size 7500, current size' "$Wc_c"
  1905. fi
  1906. true || echo 'restore of detail.c failed'
  1907. echo End of part 3, continue with part 4
  1908. exit 0
  1909.  
  1910. exit 0 # Just in case...
  1911.