⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dumpregs.c

📁 Atheros wifi driver source code
💻 C
字号:
/* * Copyright (c) 2002-2005 Sam Leffler, Errno Consulting * Copyright (c) 2002-2005 Atheros Communications, Inc. * All rights reserved. * * $Id: dumpregs.c,v 1.1.1.1 2006/09/12 03:45:22 steven Exp $ */#include "diag.h"#include "ah.h"#include "ah_devid.h"#include "ah_internal.h"#include "dumpregs.h"#include <getopt.h>struct	ath_diag atd;int	s;u_int32_t regdata[0xffff / sizeof(u_int32_t)];#undef OS_REG_READ#define	OS_REG_READ(ah, off)	regdata[(off) >> 2]extern	void ar5210SetupRegs(struct ath_diag *, int);extern	void ar5210DumpRegs(FILE *fd, int what);extern	void ar5211SetupRegs(struct ath_diag *, int);extern	void ar5211DumpRegs(FILE *fd, int what);extern	void ar5212SetupRegs(struct ath_diag *, int);extern	void ar5212DumpRegs(FILE *fd, int what);static voidusage(void){	fprintf(stderr, "usage: diag [-I interface] [-abkipx]\n");	exit(-1);}intmain(int argc, char *argv[]){	HAL_REVS revs;	u_int32_t *data;	u_int32_t *dp, *ep;	int what, c;	s = socket(AF_INET, SOCK_DGRAM, 0);	if (s < 0)		err(1, "socket");	strncpy(atd.ad_name, ATH_DEFAULT, sizeof (atd.ad_name));	what = 0;	while ((c = getopt(argc, argv, "I:abdkipqx")) != -1)		switch (c) {		case 'a':			what |= DUMP_ALL;			break;		case 'b':			what |= DUMP_BASEBAND;			break;		case 'd':			what |= DUMP_DCU;			break;		case 'k':			what |= DUMP_KEYCACHE;			break;		case 'i':			what |= DUMP_INTERRUPT;			break;		case 'I':			strncpy(atd.ad_name, optarg, sizeof (atd.ad_name));			break;		case 'p':			what |= DUMP_PUBLIC;			break;		case 'q':			what |= DUMP_QCU;			break;		case 'x':			what |= DUMP_XR;			break;		default:			usage();			/*NOTREACHED*/		}	argc -= optind;	argv += optind;	if (what == 0)		what = DUMP_BASIC;	atd.ad_id = HAL_DIAG_REVS;	atd.ad_out_data = (caddr_t) &revs;	atd.ad_out_size = sizeof(revs);	if (ioctl(s, SIOCGATHDIAG, &atd) < 0)		err(1, atd.ad_name);	switch (revs.ah_devid) {	case AR5210_PROD:	case AR5210_DEFAULT:		ar5210SetupRegs(&atd, what);		break;	case AR5211_DEVID:	case AR5311_DEVID:	case AR5211_DEFAULT:	case AR5211_FPGA11B:		ar5211SetupRegs(&atd, what);		break;	case AR5212_FPGA:	case AR5212_DEVID:	case AR5212_DEVID_IBM:	case AR5212_DEFAULT:	case AR5212_AR5312_REV2:	case AR5212_AR5312_REV7:	case AR5212_AR2313_REV8:	case AR5212_AR2315_REV6:	case AR5212_AR2315_REV7:	case AR5212_AR2317_REV1:		ar5212SetupRegs(&atd, what);		break;        default:		fprintf(stderr, "devid=0x%x not supported\n",revs.ah_devid);		break;	}	atd.ad_out_size = ath_hal_setupdiagregs((HAL_REGRANGE *) atd.ad_in_data,		atd.ad_in_size / sizeof(HAL_REGRANGE));	atd.ad_out_data = (caddr_t) malloc(atd.ad_out_size);	if (atd.ad_out_data == NULL) {		fprintf(stderr, "Cannot malloc output buffer, size %u\n",			atd.ad_out_size);		exit(-1);	}	atd.ad_id = HAL_DIAG_REGS | ATH_DIAG_IN | ATH_DIAG_DYN;	if (ioctl(s, SIOCGATHDIAG, &atd) < 0)		err(1, atd.ad_name);	/*	 * Expand register data into global space that can be	 * indexed directly by register offset.	 */	dp = (u_int32_t *)atd.ad_out_data;	ep = (u_int32_t *)(atd.ad_out_data + atd.ad_out_size);	while (dp < ep) {		u_int r = dp[0] >> 16;		/* start of range */		u_int e = dp[0] & 0xffff;	/* end of range */		dp++;		/* convert offsets to indices */		r >>= 2; e >>= 2;		do {			if (dp >= ep) {				fprintf(stderr, "Warning, botched return data;"					"register at offset 0x%x not present\n",					r << 2);				break;			}			regdata[r++] = *dp++;		} while (r <= e);	} 	switch (revs.ah_devid) {	case AR5210_PROD:	case AR5210_DEFAULT:		ar5210DumpRegs(stdout, what);		break;	case AR5211_DEVID:	case AR5311_DEVID:	case AR5211_DEFAULT:	case AR5211_FPGA11B:		ar5211DumpRegs(stdout, what);		break;	case AR5212_FPGA:	case AR5212_DEVID:	case AR5212_DEVID_IBM:	case AR5212_DEFAULT:	case AR5212_AR5312_REV2:	case AR5212_AR5312_REV7:	case AR5212_AR2313_REV8:	case AR5212_AR2315_REV6:	case AR5212_AR2315_REV7:	case AR5212_AR2317_REV1:		ar5212DumpRegs(stdout, what);		break;	}	return 0;}voidath_hal_dumprange(FILE *fd, u_int a, u_int b){	u_int r;	for (r = a; r+16 <= b; r += 5*4)		fprintf(fd,			"%04x %08x  %04x %08x  %04x %08x  %04x %08x  %04x %08x\n"			, r, OS_REG_READ(ah, r)			, r+4, OS_REG_READ(ah, r+4)			, r+8, OS_REG_READ(ah, r+8)			, r+12, OS_REG_READ(ah, r+12)			, r+16, OS_REG_READ(ah, r+16)		);	switch (b-r) {	case 16:		fprintf(fd			, "%04x %08x  %04x %08x  %04x %08x  %04x %08x\n"			, r, OS_REG_READ(ah, r)			, r+4, OS_REG_READ(ah, r+4)			, r+8, OS_REG_READ(ah, r+8)			, r+12, OS_REG_READ(ah, r+12)		);		break;	case 12:		fprintf(fd, "%04x %08x  %04x %08x  %04x %08x\n"			, r, OS_REG_READ(ah, r)			, r+4, OS_REG_READ(ah, r+4)			, r+8, OS_REG_READ(ah, r+8)		);		break;	case 8:		fprintf(fd, "%04x %08x  %04x %08x\n"			, r, OS_REG_READ(ah, r)			, r+4, OS_REG_READ(ah, r+4)		);		break;	case 4:		fprintf(fd, "%04x %08x\n"			, r, OS_REG_READ(ah, r)		);		break;	}}voidath_hal_dumpregs(FILE *fd, const HAL_REG regs[], u_int nregs){	int i;	for (i = 0; i+3 < nregs; i += 4)		fprintf(fd,			"%-8s %08x  %-8s %08x  %-8s %08x  %-8s %08x\n"			, regs[i+0].label, OS_REG_READ(ah, regs[i+0].reg)			, regs[i+1].label, OS_REG_READ(ah, regs[i+1].reg)			, regs[i+2].label, OS_REG_READ(ah, regs[i+2].reg)			, regs[i+3].label, OS_REG_READ(ah, regs[i+3].reg)		);	switch (nregs - i) {	case 3:		fprintf(fd, "%-8s %08x  %-8s %08x  %-8s %08x\n"			, regs[i+0].label, OS_REG_READ(ah, regs[i+0].reg)			, regs[i+1].label, OS_REG_READ(ah, regs[i+1].reg)			, regs[i+2].label, OS_REG_READ(ah, regs[i+2].reg)		);		break;	case 2:		fprintf(fd, "%-8s %08x  %-8s %08x\n"			, regs[i+0].label, OS_REG_READ(ah, regs[i+0].reg)			, regs[i+1].label, OS_REG_READ(ah, regs[i+1].reg)		);		break;	case 1:		fprintf(fd, "%-8s %08x\n"			, regs[i+0].label, OS_REG_READ(ah, regs[i+0].reg)		);		break;	}}u_intath_hal_setupdiagregs(const HAL_REGRANGE regs[], u_int nr){	u_int space;	int i;	space = 0;	for (i = 0; i < nr; i++) {		u_int n = 2 * sizeof(u_int32_t);	/* reg range + first */		if (regs[i].end) {			if (regs[i].end < regs[i].start) {				fprintf(stderr, "%s: bad register range, "					"end 0x%x < start 0x%x\n",					__func__, regs[i].end, regs[i].end);				exit(-1);			}			n += regs[i].end - regs[i].start;		}		space += n;	}	return space;}/* * Format an Ethernet MAC for printing. */const char*ether_sprintf(const u_int8_t *mac){	static char etherbuf[18];	snprintf(etherbuf, sizeof(etherbuf), "%02x:%02x:%02x:%02x:%02x:%02x",		mac[0], mac[1], mac[2], mac[3], mac[4], mac[5]);	return etherbuf;}/* XXX cheat, 5212 has a superset of the key table defs */#include "ar5212/ar5212reg.h"voidath_hal_dumpkeycache(FILE *fd, int nkeys, int micEnabled){	static const char *keytypenames[] = {		"WEP-40", 	/* AR_KEYTABLE_TYPE_40 */		"WEP-104",	/* AR_KEYTABLE_TYPE_104 */		"#2",		"WEP-128",	/* AR_KEYTABLE_TYPE_128 */		"TKIP",		/* AR_KEYTABLE_TYPE_TKIP */		"AES-OCB",	/* AR_KEYTABLE_TYPE_AES */		"AES-CCM",	/* AR_KEYTABLE_TYPE_CCM */		"CLR",		/* AR_KEYTABLE_TYPE_CLR */	};	u_int8_t mac[IEEE80211_ADDR_LEN];	u_int8_t ismic[128/NBBY];	int entry;	int first = 1;	memset(ismic, 0, sizeof(ismic));	for (entry = 0; entry < nkeys; entry++) {		u_int32_t macLo, macHi, type;		u_int32_t key0, key1, key2, key3, key4;		macHi = OS_REG_READ(ah, AR_KEYTABLE_MAC1(entry));		if ((macHi & AR_KEYTABLE_VALID) == 0 && isclr(ismic, entry))			continue;		macLo = OS_REG_READ(ah, AR_KEYTABLE_MAC0(entry));		macHi <<= 1;		if (macLo & (1<<31))			macHi |= 1;		macLo <<= 1;		mac[4] = macHi & 0xff;		mac[5] = macHi >> 8;		mac[0] = macLo & 0xff;		mac[1] = macLo >> 8;		mac[2] = macLo >> 16;		mac[3] = macLo >> 24;		type = OS_REG_READ(ah, AR_KEYTABLE_TYPE(entry));		if ((type & 7) == AR_KEYTABLE_TYPE_TKIP && micEnabled)			setbit(ismic, entry+64);		key0 = OS_REG_READ(ah, AR_KEYTABLE_KEY0(entry));		key1 = OS_REG_READ(ah, AR_KEYTABLE_KEY1(entry));		key2 = OS_REG_READ(ah, AR_KEYTABLE_KEY2(entry));		key3 = OS_REG_READ(ah, AR_KEYTABLE_KEY3(entry));		key4 = OS_REG_READ(ah, AR_KEYTABLE_KEY4(entry));		if (first) {			fprintf(fd, "\n");			first = 0;		}		fprintf(fd, "KEY[%03u] MAC %s %-7s %02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x\n"			, entry			, ether_sprintf(mac)			, isset(ismic, entry) ? "MIC" : keytypenames[type & 7]			, (key0 >>  0) & 0xff			, (key0 >>  8) & 0xff			, (key0 >> 16) & 0xff			, (key0 >> 24) & 0xff			, (key1 >>  0) & 0xff			, (key1 >>  8) & 0xff			, (key2 >>  0) & 0xff			, (key2 >>  8) & 0xff			, (key2 >> 16) & 0xff			, (key2 >> 24) & 0xff			, (key3 >>  0) & 0xff			, (key3 >>  8) & 0xff			, (key4 >>  0) & 0xff			, (key4 >>  8) & 0xff			, (key4 >> 16) & 0xff			, (key4 >> 24) & 0xff		);	}}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -