[3071] in Athena Bugs
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;
+ }