home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume22 / u386mon / part03 < prev    next >
Text File  |  1991-08-13  |  50KB  |  1,843 lines

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