*** bsd/kernel.cc.orig	Fri Sep 25 02:21:30 1998
--- bsd/kernel.cc	Mon Nov 23 10:12:36 1998
***************
*** 32,37 ****
--- 32,41 ----
  #include <sys/disk.h>		/*  For disk statistics.  */
  #endif
  
+ #ifdef XOSVIEW_OPENBSD
+ #include "obsdintr.h"		/* XXX: got from 2.4 */
+ #endif
+ 
  #include <sys/socket.h>         /*  These two are needed for the  */
  #include <net/if.h>             /*    NetMeter helper functions.  */
  #if defined(XOSVIEW_FREEBSD) && (__FreeBSD_version >= 300000)
***************
*** 104,114 ****
--- 108,134 ----
  
  #endif /* XOSVIEW_FREEBSD */
  
+ #if defined(XOSVIEW_OPENBSD) && (defined(pc532) || defined(i386))
+ 
+ # ifdef i386
+ { "_intrhand" },
+ #define INTRHAND_SYM_INDEX	7
+ { "_intrstray" },
+ #define INTRSTRAY_SYM_INDEX	8
+ # else
+ { "_ivt" },
+ #define IVT_SYM_INDEX		7
+ # endif
+ 
+ #else /* XOSVIEW_OPENBSD && (pc532 || i386) */
+ 
  { "_intrcnt" },
  #define INTRCNT_SYM_INDEX 	7
  { "_eintrcnt" },
  #define EINTRCNT_SYM_INDEX 	8
  
+ #endif /* XOSVIEW_OPENBSD && (pc532 || i386) */
+ 
    {NULL}
  };
  
***************
*** 441,447 ****
--- 461,470 ----
  }
  
  /*  ---------------------- Interrupt Meter stuff  -----------------  */
+ #if !defined(XOSVIEW_OPENBSD) || !(defined(pc532) && defined(i386))
  static unsigned long kvm_intrcnt[128];// guess at space needed
+ #endif
+ 
  #ifdef XOSVIEW_FREEBSD
  static unsigned long kvm_intrptrs[NUM_INTR];
  #endif
***************
*** 449,457 ****
--- 472,487 ----
  int
  BSDIntrInit() {
      OpenKDIfNeeded(); 
+ #if defined(XOSVIEW_OPENBSD) && defined(i386)
+     return ValidSymbol(INTRHAND_SYM_INDEX) && ValidSymbol(INTRSTRAY_SYM_INDEX);
+ #elif defined (XOSVIEW_OPENBSD) && defined(pc532)
+     return ValidSymbol(IVP_SYM_INDEX);
+ #else
      return ValidSymbol(INTRCNT_SYM_INDEX) && ValidSymbol(EINTRCNT_SYM_INDEX);
+ #endif
  }
  
+ #if !defined(XOSVIEW_OPENBSD) || !(defined(pc532) || defined(i386))
  int BSDNumInts() {
    int nintr;
    OpenKDIfNeeded(); 
***************
*** 471,476 ****
--- 501,507 ----
  # endif
  #endif
  }
+ #endif /* XOSVIEW_OPENBSD */
  
  void
  BSDGetIntrStats (unsigned long intrCount[NUM_INTR])
***************
*** 496,507 ****
--- 527,574 ----
    //  counts.  We'll just use the intrcnt array here.  If anyone
    //  has problems, please mail me.  bgrayson
    {
+ #if defined(XOSVIEW_OPENBSD) && (defined(pc532) || defined(i386))
+ # ifdef i386
+   struct intrhand *intrhand[16], *ihp, ih;
+   int intrstray[16];
+ 
+   safe_kvm_read(nlst[INTRHAND_SYM_INDEX].n_value, intrhand,
+     sizeof(intrhand));
+   safe_kvm_read(nlst[INTRSTRAY_SYM_INDEX].n_value, intrstray,
+     sizeof(intrstray));
+ 
+   for (int i=0;i<16;i++) {
+     ihp = intrhand[i];
+     intrCount[i] = 0;
+     while (ihp) {
+       if (kvm_read(kd, (u_long)ihp, &ih, sizeof(ih)) != sizeof(ih)) {
+         fprintf(stderr, "Error: kvm_read(): %s\n", kvm_geterr(kd));
+         exit(1);
+       }
+       intrCount[i] = ih.ih_count;
+       ihp = ih.ih_next;
+     }
+   }
+ # endif /* i386 */
+ # ifdef pc532
+   struct iv ivt[32], *ivp = ivt;
+ 
+   safe_kvm_read(nlst[IVP_SYM_INDEX].n_value, ivp, sizeof(ivt));
+   for (int i=0;i<16;i++,ivp++) {
+     if (ivp->iv_vec && ivp->iv_use)
+       intrCount[i] = ivp->iv_cnt;
+     else
+       intrCount[i] = 0;
+   }
+ # endif /* pc532 */
+ #else /* XOSVIEW_OPENBSD && (pc532 || i386) */
      int nintr = BSDNumInts();
      safe_kvm_read(nlst[INTRCNT_SYM_INDEX].n_value, kvm_intrcnt,
        sizeof(long)*nintr);
      for (int i=0;i<nintr;i++) {
        intrCount[i] = kvm_intrcnt[i];
      }
+ #endif /* XOSVIEW_OPENBSD && (pc532 || i386) */
    }
    return;
  #endif
