File:  [Power 6/32 Unix Tahoe 4.2BSD] / cci / usr / src / etc / nstat / enpbuf.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs
Sun Jul 28 12:24:30 2019 UTC (6 years, 11 months ago) by root
Branches: bsd, MAIN
CVS tags: v121, HEAD
Power 6/32 Unix version 1.21

/*								*/
/*	if_enp: ACC VERSAbus Ethernet controler (v/eiu)		*/
/*								*/

#include <stdio.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/errno.h>

#include <net/if.h>
#include <net/netisr.h>
#include <net/route.h>
#include <netinet/in.h>
#include <netinet/ip_var.h>
#include <netinet/if_ether.h>

#include <machine/mtpr.h>
#include <tahoeif/if_enp.h> 
#include <sys/buf.h>
#include <vba/vbavar.h>
#include <nlist.h>
#include "nstat.h"

struct	nlist	enpbufnl[] = {
#			define	N_RINGADDR	0	
	{ "_ring_addr"},
#			define	N_NUMENP	1
	{ "_numenp" },
	{ "" },
};

#define NENP		6
#define	NOFRINGS	4
RING32	ring[NOFRINGS];	/* 4 rings per enp */

extern	int	kmem;
extern	int	vmem;
extern	char	*system;

extern	char	*vmemf; 
int	vmem;

char	ringname[4][20] =
	{
		"toenp",
		"hostfree",
		"tohost",
		"enpfree",
	};

enpbuf(unit)
int unit;
{
	int	i, j, num;

	RING32			*rp;
	long			ring_addr[NENP]; /* addrs of stat areas */
	struct	sockaddr_in	*sin;

	off_t	numdev_memaddr;
	off_t	ring_memaddr;

	static	int	getvm = 0;

	if (!getvm) {
		nlist(system, enpbufnl);
		getvm = 1;
	}

	numdev_memaddr = enpbufnl[N_NUMENP].n_value;
	ring_memaddr = enpbufnl[N_RINGADDR].n_value; /* versa bus address */

	if (numdev_memaddr==0 || ring_memaddr == 0) {
		printf("enpbuf: symbol not in namelist\n");
		return(1);
	}

	klseek(kmem, numdev_memaddr, 0);
	read(kmem, (char *)&num, sizeof (num));

	if ((num < 0) || (num > NENP)) {  
		printf("enpbuf: invalid number of devices (num = %d)\n", num);
		return(1);
	}
	if (num == 0) {  
		printf("enpbuf: no enp (driver) installed.\n");
		return(1);
	}
	if (unit > num) {
			printf("enpbuf: invalid device no.(unit=%d)\n", unit);
			return;
	} else
		num = unit + 1;		/* print only once for dev-> unit */

	klseek(kmem, ring_memaddr, 0);
	read(kmem, (char *)ring_addr, sizeof(long)*num);

	vmem = open(vmemf, 0);
	if (vmem < 0) {
		printf("enpbuf: cannot open ");
		perror(vmemf);
		return(1);
	}
	lseek(vmem, (off_t)ring_addr[unit], 0);
	read(vmem, (char *)&ring[0], sizeof(RING32)*4);

	close(vmem);

	printf("%-20s %-10s %-10s\n", "ring name", "rdidx", "wrtidx");

	for (i = 0; i < NOFRINGS; i++) {
		register int slot, addr;

		printf("-------------------------------------\n");
		rp = (RING32 *)&ring[i];
		printf("%-20s %-10d %-10d\n", ringname[i],
			rp->r_rdidx, rp->r_wrtidx);
		printf("-------------------------------------\n");
		for (slot = 0; slot < 32; slot++) {
			addr = rp->r_slot[ slot ];
			printf("%x  ", addr );
		}
	}
}

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.