[3071] in Athena Bugs

home help back first fref pref prev next nref lref last post

More machtype changes

daemon@ATHENA.MIT.EDU (John Carr)
Sat Sep 2 00:07:13 1989

To: bugs@ATHENA.MIT.EDU
Cc: jtkohl@ATHENA.MIT.EDU
Date: Sat, 02 Sep 89 00:06:40 EDT
From: John Carr <jfc@ATHENA.MIT.EDU>

Included:
	Changes to make machtype work on a pmax.
	Changes to make machtype understand scsi drives on pvax and pmax
	Changes to make machtype print the memory on a workstation
		[see my last message to bugs]

The format of the output is (on a pmax):

% machtype -r
Drive 3: DEC     RZ23     (C) DEC       (rev lvl 0618)
% machtype -c
R2000a KN01 rev 1
% machtype
mipsel

The format of the "-r" output is non-negotiable, as it is read directly
from the kernel.

Note: <machine/scsivar.h> and <machine/scsireg.h> are not in the release
for the vax.  I built by copying these from pvaxdev.  

*** /paris/source/4.3/bin.athena/machtype.c	Sat Aug  5 20:38:56 1989
--- machtype.c	Fri Sep  1 23:38:11 1989
***************
*** 6,15 ****
--- 6,25 ----
   *	$Locker:  $
   */
  
+ #if defined(vax) || (defined(MIPSEL) && defined(ultrix))
+ #define DO_SCSI
+ #endif
+ 
  #include <stdio.h>
  #include <nlist.h>
  #include <sys/types.h>
  #include <machine/cpu.h>
+ #if defined(MIPSEL)
+ #include <machine/hwconf.h>
+ #include <machine/param.h>
+ #else
+ #include <machine/machparam.h>
+ #endif
  #include <ctype.h>
  
  #if defined(ibm032)
***************
*** 41,46 ****
--- 51,62 ----
  	{ "_udadinfo"},
  #define X_udatypes 9
  	{ "_udatypes"},
+ #define X_maxmem 10
+ 	{ "_maxmem" },
+ #define X_physmem 11
+ 	{ "_physmem" },
+ #define X_scsi 12
+ 	{ "_sz_softc" },
  #else
  #if defined(ibm032)
  #define X_cpu_model 0
***************
*** 51,58 ****
--- 67,89 ----
  	{ "_screen_sw" },
  #define X_NSCREEN 3
  	{ "_NSCREEN" },
+ #define X_maxmem 4
+ 	{ "_maxmem" },
+ #define X_physmem 5
+ 	{ "_physmem" },
+ #else
+ #if defined(MIPSEL)
+ #define X_cpu 0
+ 	{ "_cpu_systype" },
+ #define X_maxmem 1
+ 	{ "_maxmem" },
+ #define X_physmem 2
+ 	{ "_physmem" },
+ #define X_scsi 3
+ 	{ "_siisc" },
  #endif
  #endif
+ #endif
  	{ "" },
  };
  
***************
*** 62,68 ****
  char	**argv;
  {
      int i;
!     int cpuflg = 0, dpyflg = 0, raflg = 0;
      char *kernel = KERNEL,  *memory = MEMORY;
  
      for (i = 1; i < argc; i++) {
--- 93,99 ----
  char	**argv;
  {
      int i;
!     int cpuflg = 0, dpyflg = 0, raflg = 0, memflg = 0;
      char *kernel = KERNEL,  *memory = MEMORY;
  
      for (i = 1; i < argc; i++) {
***************
*** 79,84 ****
--- 110,118 ----
  	case 'r':
  	    raflg++;
  	    break;
+ 	case 'M':
+ 	    memflg++;
+ 	    break;
  	case 'k':
  	    kernel = argv[i+1];
  	    i++;
***************
*** 98,103 ****
--- 132,139 ----
        do_dpy(kernel, memory);
      else if (raflg)
        do_disk(kernel, memory);
+     else if (memflg)
+       do_memory(kernel, memory);
      else
  #if defined(vax)
        printf("vax\n");
***************
*** 105,113 ****
--- 141,153 ----
  #if defined(ibm032)
        printf("rt\n");
  #else
+ #if defined(MIPSEL)
+       printf("mipsel\n");
+ #else
        printf("???\n");
  #endif
  #endif
+ #endif
      exit(0);
  }
  
***************
*** 116,125 ****
  char *name;
  {
  #ifdef vax
!     fprintf(stderr, "usage: %s [-c] [-d] [-r] [-k kernel] [-m memory]\n",
  	    name);
  #else
!     fprintf(stderr, "usage: %s [-c] [-d] [-k kernel] [-m memory]\n",
  	    name);
  #endif
      exit(1);
--- 156,165 ----
  char *name;
  {
  #ifdef vax
!     fprintf(stderr, "usage: %s [-c] [-d] [-r] [-M] [-k kernel] [-m memory]\n",
  	    name);
  #else
!     fprintf(stderr, "usage: %s [-c] [-d] [-M] [-k kernel] [-m memory]\n",
  	    name);
  #endif
      exit(1);
***************
*** 206,216 ****
--- 246,268 ----
  	printf("IBM???\n");
      }
  #else
+ #if defined(MIPSEL)
+     if(GETCPUTYPE(cpu) == R2000aCPU) {
+ 	printf("R2000a ");       
+ 	if(GETSYSTYPE(cpu) == PMAX)
+ 	    printf("KN01 rev %d\n", GETHRDREV(cpu));
+ 	else
+ 	    printf("??? type %02x.%02x\n",GETSYSTYPE(cpu),GETHRDREV(cpu));
+     } else {
+ 	printf("MIPSEL??? type %d\n", GETCPUTYPE(cpu));
+     }
+ #else
      fprintf (stderr,
  	     "Don't know how to determine CPU type for this machine.\n");
      exit (1);
  #endif
  #endif
+ #endif
      exit(0);
  }
  
***************
*** 222,233 ****
--- 274,291 ----
  #ifdef vax
      caddr_t value;
  #else
+ #if defined(ibm032)
      int i, ns;
      long pos;
      char buf[32];
      struct screen_sw sw;
      char *index();
+ #else
+     fprintf (stderr,
+ 	     "Don't know how to determine display type for this machine.\n");
+     exit (1);
  #endif
+ #endif
  
      if (nlist(kernel, nl) < 0) {
  	fprintf(stderr, "can't get namelist\n");
***************
*** 372,378 ****
      char *c, disktype[32];
  
      if( nl[X_udadinfo].n_type == 0 && nl[X_udatypes].n_type == 0) 
!       return;
  
      for(i=0; i<4; i++) {
        lseek(mf, (long) nl[X_udadinfo].n_value + 4*i, 0);
--- 430,440 ----
      char *c, disktype[32];
  
      if( nl[X_udadinfo].n_type == 0 && nl[X_udatypes].n_type == 0) 
!       return
! #if defined(DO_SCSI)
! 	do_scsi_disk(kernel, memory, mf)
! #endif
! 	  ;
  
      for(i=0; i<4; i++) {
        lseek(mf, (long) nl[X_udadinfo].n_value + 4*i, 0);
***************
*** 396,404 ****
        putchar('\n');
  
      }
      return;
    }
! #else
  
  do_disk (kernel, memory) char *kernel, *memory; {
      fprintf (stderr, "Don't know how to read disk types for this machine.\n");
--- 458,485 ----
        putchar('\n');
  
      }
+ #if defined(DO_SCSI)
+     do_scsi_disk(kernel,memory, mf);
+ #endif
      return;
    }
! #else /* vax */
! #if defined (MIPSEL) && defined(ultrix) && defined(DO_SCSI)
! do_disk(kernel, memory)
! char *kernel, *memory;
! {
!   int mf;
!   if (nlist(kernel, nl) < 0) {
!       fprintf(stderr, "can't get namelist\n");
!       exit(1);
!   }
!   if ((mf = open(memory, 0)) < 0) {
!       fprintf(stderr, "can't open memory\n");
!       exit(2);
!   }
!   do_scsi_disk(kernel,memory, mf);
! }
! #else /* MIPS */
  
  do_disk (kernel, memory) char *kernel, *memory; {
      fprintf (stderr, "Don't know how to read disk types for this machine.\n");
***************
*** 405,408 ****
--- 486,571 ----
      exit (1);
  }
  
+ #endif /* MIPS */
+ #endif /* vax */
+ 
+ #if defined(DO_SCSI)
+ /* This function assumes there is only 1 scsi controller.  If there
+    are more, then repeat.  For pmax, increment the first read address
+    by 4 bytes.  For vax, increment the (only) read address by
+    sizeof (struct sz_softc). */
+ #include <sys/time.h>
+ #include <sys/devio.h>
+ #include <machine/scsivar.h>
+ #include <machine/scsireg.h>
+ 
+ do_scsi_disk(kernel, memory, mf)
+ char *kernel, *memory;
+ int mf;
+ {
+   int pos;
+   int i;
+   struct sz_softc sz;
+ 
+   pos = nl[X_scsi].n_value;
+ #if !defined(vax)	/* mips indirects through a pointer */
+   lseek(mf, pos, 0);
+   if(read(mf,&pos,sizeof(pos)) < 0) {
+       perror("read (kmem)");
+       exit(2);
+   }
  #endif
+   lseek(mf, pos, 0);
+   if(read(mf,&sz,sizeof(sz)) < 0) {
+       perror("read (kmem)");
+       exit(2);
+   }
+   for(i=0; i<NDPS; i++) 
+       if(sz.sc_devnam[i][0])
+ 	  if(sz.sc_revlvl[i][0])
+ 	      printf("Drive %d: %s\t(rev lvl %s)\n", i, sz.sc_devnam[i], sz.sc_revlvl[i]);
+ 	  else
+ 	    printf("Drive %d: %s\n", i, sz.sc_devnam[i]);
+ }
+ #endif
+ #define MEG (1024*1024)
+ do_memory (kernel, memory)
+ char *kernel, *memory;
+ 
+ {
+   int mf, pos, mem;
+   if (nlist(kernel, nl) < 0) {
+       fprintf(stderr, "can't get namelist\n");
+       exit(1);
+   }
+   if ((mf = open(memory, 0)) < 0) {
+       fprintf(stderr, "can't open memory\n");
+       exit(2);
+   }
+   pos = nl[X_maxmem].n_value;
+   if(pos == 0) {
+       fprintf(stderr, "can't find maxmem\n");
+       exit(3);
+   }
+   lseek(mf,pos,0);	/* Error checking ? */
+   if(read(mf,&mem,4) == -1) {
+       perror("read (kmem)");
+       exit(4);
+   } else {
+       printf("0x%06X user, ",mem * NBPG);
+   }
+   pos = nl[X_physmem].n_value;
+   if(pos == 0) {
+       fprintf(stderr, "can't find physmem\n");
+       exit(3);
+   }
+   lseek(mf,pos,0);
+   if(read(mf,&mem,4) == -1) {
+       perror("read (kmem)");
+       exit(4);
+   } else {
+       printf("0x%06X (%d M) total",mem * NBPG,(mem * NBPG + MEG/2)/MEG);
+   }
+   putchar('\n');
+   return; 
+ }

home help back first fref pref prev next nref lref last post