Ultrix-3.1/src/cmd/el/cda_k.c
/**********************************************************************
* Copyright (c) Digital Equipment Corporation 1984, 1985, 1986. *
* All Rights Reserved. *
* Reference "/usr/src/COPYRIGHT" for applicable restrictions. *
**********************************************************************/
/*
* Cda -k option
*
* Chung-Wu Lee 2/11/85
*
*/
#include <sys/param.h> /* Don't matter which one */
#include <sys/errlog.h>
#include <sys/tk_info.h>
#include <a.out.h>
#include "cda.h"
static char Sccsid[] = "@(#)cda_k.c 3.0 4/21/86";
extern int mem;
extern int flags;
extern struct nlist nl[];
struct tk_softc *tksc;
struct tk *tkp;
struct tk_drv *drvp;
char tk_ctid[MAXTK];
int tk_csr[MAXTK];
int ubmaps; /* unibus map: 1 == yes ; 0 == no */
int ntk;
char *ubm_off; /* offset for mapped kernel data structures */
kcmd(arg) /* unit + 1, 0 means all drives */
int arg;
{
int i, unit;
if(!(flags & TKINFO))
tkinfo();
if (ntk <= 0) {
printf("\ncda: kernel not configured for TMSCP magtapes !\n");
exit(1);
}
if(arg > ntk) {
printf("\ncda: Unit %d does not exist!\n",(arg - 1));
printf(" will print data for all unit\n");
unit = 0;
} else
unit = arg;
if(unit) {
unit--;
if(tk_csr[unit] == 0)
printf("\ncda: Unit %d is not configured!\n", unit);
else
tkprnt(unit);
} else
for(i = 0; i < ntk; i++)
tkprnt(i);
}
/*
* get tmscp magtape info
*/
tkinfo()
{
int i;
if(flags & TKINFO)
return;
flags |= TKINFO;
if (nl[28].n_value == 0) {
ntk = 0;
return;
}
lseek(mem, (long)nl[28].n_value, 0);
if(read(mem, &ntk, sizeof(ntk)) == -1)
tk_re();
if (ntk <= 0)
return;
lseek(mem, (long)nl[36].n_value, 0);
if(read(mem, &tk_csr, sizeof(tk_csr)) == -1)
tk_re();
tksc = calloc(ntk, sizeof(struct tk_softc));
if(tksc == NULL)
tk_me();
lseek(mem, (long)nl[29].n_value, 0);
i = sizeof(struct tk_softc) * ntk;
if(read(mem, (char *)tksc, i) == -1)
tk_re();
tkp = calloc(ntk, sizeof(struct tk));
if(tkp == NULL)
tk_me();
lseek(mem, (long)nl[30].n_value, 0);
i = sizeof(struct tk) * ntk;
if(read(mem, (char *)tkp, i) == -1)
tk_re();
drvp = calloc(ntk, sizeof(struct tk_drv));
if(drvp == NULL)
tk_me();
lseek(mem, (long)nl[31].n_value, 0);
i = sizeof(struct tk_drv) * ntk;
if(read(mem, (char *)drvp, i) == -1)
tk_re();
lseek(mem, (long)nl[32].n_value, 0);
if(read(mem, &tk_ctid, sizeof(tk_ctid)) == -1)
tk_re();
lseek(mem, (long)nl[27].n_value, 0);
if(read(mem, &ubmaps, sizeof(ubmaps)) == -1)
tk_re();
if(ubmaps == 1)
ubm_off = nl[25].n_value;
else
ubm_off = 0;
}
tk_me()
{
printf("cda: read error, exiting...\n");
exit(1);
}
tk_re()
{
printf("cda: read error, exiting...\n");
exit(1);
}
tkprnt(unit)
{
int j, k;
int *ip;
struct tk_softc *sp;
struct tk *kp;
struct tk_drv *vp;
union {
long big;
struct {
int lit1;
int lit2;
} little
} muck;
if (tk_csr[unit] == 0)
return;
printf("\n\nUnit number %d:", unit);
printf("\ttype = ");
switch((tk_ctid[unit] >> 4) & 017) {
case TK50:
printf("TK50\n");
break;
case TU81:
printf("TU81\n");
break;
default:
printf("unknown\n");
break;
}
sp = tksc + unit;
kp = tkp + unit;
vp = drvp + unit;
printf("\nstate = %d credits = %d tcmax = %d ",sp->sc_state,sp->sc_credits,sp->sc_tcmax);
printf("lastcmd = %d lastrsp = %d\n",sp->sc_lastcmd,sp->sc_lastrsp);
printf("command queue transition interrupt flag = %d\n",kp->tk_ca.ca_cmdint);
printf("response queue transition interrupt flag = %d\n",kp->tk_ca.ca_rspint);
printf("\n********* command descriptors: \n\n");
if(ubmaps == 1) { /* unibus map machines */
printf("%16s %13s %11s\n","","virtual","physical");
printf("%16s %13s %11s\n","TK_INT TK_OWN","address","address");
printf("------------------------------------------------------\n");
for(j = 0; j < NCMD; j++) {
if(kp->tk_ca.ca_cmddsc[j].ch & TK_INT)
printf(" 1 ");
else
printf(" 0 ");
if(kp->tk_ca.ca_cmddsc[j].ch & TK_OWN)
printf(" 1 ");
else
printf(" 0 ");
muck.little.lit1 = (kp->tk_ca.ca_cmddsc[j].ch & ~0140000);
muck.little.lit2 = kp->tk_ca.ca_cmddsc[j].cl;
printf("%011O\t", muck.big);
muck.little.lit1 = (kp->tk_ca.ca_cmddsc[j].ch & ~0140000);
muck.little.lit2 = (kp->tk_ca.ca_cmddsc[j].cl + ubm_off);
printf("%011O\n", muck.big);
}
} else { /* non - unibus map machines */
printf("%16s %13s\n","TK_INT TK_OWN","address");
printf("---------------------------------------------\n");
for(j = 0; j < NCMD; j++) {
if(kp->tk_ca.ca_cmddsc[j].ch & TK_INT)
printf(" 1 ");
else
printf(" 0 ");
if(kp->tk_ca.ca_cmddsc[j].ch & TK_OWN)
printf(" 1 ");
else
printf(" 0 ");
muck.little.lit1 = (kp->tk_ca.ca_cmddsc[j].ch & ~0140000);
muck.little.lit2 = kp->tk_ca.ca_cmddsc[j].cl;
printf("%011O\n", muck.big);
}
}
printf("\n********* response descriptors: \n\n");
if(ubmaps == 1) { /* unibus map machines */
printf("%16s %13s %11s\n","","virtual","physical");
printf("%16s %13s %11s\n","TK_INT TK_OWN","address","address");
printf("------------------------------------------------------\n");
for(j = 0; j < NRSP; j++) {
if(kp->tk_ca.ca_rspdsc[j].rh & TK_INT)
printf(" 1 ");
else
printf(" 0 ");
if(kp->tk_ca.ca_rspdsc[j].rh & TK_OWN)
printf(" 1 ");
else
printf(" 0 ");
muck.little.lit1 = (kp->tk_ca.ca_rspdsc[j].rh & ~0140000);
muck.little.lit2 = kp->tk_ca.ca_rspdsc[j].rl;
printf("%011O\t", muck.big);
muck.little.lit1 = (kp->tk_ca.ca_rspdsc[j].rh & ~0140000);
muck.little.lit2 = (kp->tk_ca.ca_rspdsc[j].rl + ubm_off);
printf("%011O\n", muck.big);
}
} else { /* non - unibus map machines */
printf("%16s %13s\n","TK_INT TK_OWN","address");
printf("---------------------------------------------\n");
for(j = 0; j < NRSP; j++) {
if(kp->tk_ca.ca_rspdsc[j].rh & TK_INT)
printf(" 1 ");
else
printf(" 0 ");
if(kp->tk_ca.ca_rspdsc[j].rh & TK_OWN)
printf(" 1 ");
else
printf(" 0 ");
muck.little.lit1 = (kp->tk_ca.ca_rspdsc[j].rh & ~0140000);
muck.little.lit2 = kp->tk_ca.ca_rspdsc[j].rl;
printf("%011O\n", muck.big);
}
}
printf("\n********** Command packets:\n");
for(j = 0; j < NCMD; j++) {
printf("\nPacket #%d:\n",(j+1));
ip = &kp->tk_cmd[j];
for(k = 0; k < 6; k++,ip += 8) {
printf("%06o %06o %06o %06o ",*(ip),*(ip+1),*(ip+2),*(ip+3));
printf("%06o %06o %06o %06o \n",*(ip+4),*(ip+5),*(ip+6),*(ip+7));
}
printf("%06o %06o %06o %06o ",*(ip),*(ip+1),*(ip+2),*(ip+3));
printf("%06o %06o %06o \n",*(ip+4),*(ip+5),*(ip+6));
}
printf("\n********** Response packets:\n");
for(j = 0; j < NRSP; j++) {
printf("\nPacket #%d:\n",(j+1));
ip = &kp->tk_rsp[j];
for(k = 0; k < 6; k++,ip += 8) {
printf("%06o %06o %06o %06o ",*(ip),*(ip+1),*(ip+2),*(ip+3));
printf("%06o %06o %06o %06o \n",*(ip+4),*(ip+5),*(ip+6),*(ip+7));
}
printf("%06o %06o %06o %06o ",*(ip),*(ip+1),*(ip+2),*(ip+3));
printf("%06o %06o %06o \n",*(ip+4),*(ip+5),*(ip+6));
}
/*
* print tk_drv structures
*/
printf("\n********* drive information\n\n");
printf("drive type = ");
switch((tk_ctid[unit] >> 4) & 017) {
case TK50:
printf("TK50");
break;
case TU81:
printf("TU81");
break;
default:
printf("unknown");
break;
}
printf("\tstatus = ");
if(vp->tk_online)
printf("online");
else
printf("offline");
printf("\n\n");
}