diff options
Diffstat (limited to 'tools/dmidecode/dmidecode.c')
| -rw-r--r-- | tools/dmidecode/dmidecode.c | 856 | 
1 files changed, 0 insertions, 856 deletions
| diff --git a/tools/dmidecode/dmidecode.c b/tools/dmidecode/dmidecode.c deleted file mode 100644 index 576fd4fc1..000000000 --- a/tools/dmidecode/dmidecode.c +++ /dev/null @@ -1,856 +0,0 @@ -/* - *	DMI decode rev 1.2 - * - *	(C) 2000,2001 Alan Cox <alan@redhat.com> - *       - *      2-July-2001 Matt Domsch <Matt_Domsch@dell.com> - *      Additional structures displayed per SMBIOS 2.3.1 spec - * - *	Licensed under the GNU Public license. If you want to use it in with - *	another license just ask. - */ - -#include <stdio.h> -#include <unistd.h> -#include <fcntl.h> -#include <string.h> -#include <stdlib.h> - -typedef unsigned char u8; -typedef unsigned short u16; -typedef unsigned int u32; - -static void -dump_raw_data(void *data, unsigned int length) -{ -	unsigned char buffer1[80], buffer2[80], *b1, *b2, c; -	unsigned char *p = data; -	unsigned long column=0; -	unsigned int length_printed = 0; -	const unsigned char maxcolumn = 16; -	while (length_printed < length) { -		b1 = buffer1; -		b2 = buffer2; -		for (column = 0; -		     column < maxcolumn && length_printed < length;  -		     column ++) { -			b1 += sprintf(b1, "%02x ",(unsigned int) *p); -			if (*p < 32 || *p > 126) c = '.'; -			else c = *p; -			b2 += sprintf(b2, "%c", c); -			p++; -			length_printed++; -		} -		/* pad out the line */ -		for (; column < maxcolumn; column++) -		{ -			b1 += sprintf(b1, "   "); -			b2 += sprintf(b2, " "); -		} -		 -		printf("%s\t%s\n", buffer1, buffer2); -	} -} - - - -struct dmi_header -{ -	u8	type; -	u8	length; -	u16	handle; -}; - -static char *dmi_string(struct dmi_header *dm, u8 s) -{ -	u8 *bp=(u8 *)dm; -	if (!s) return ""; -	 -	bp+=dm->length; -	while(s>1) -	{ -		bp+=strlen(bp); -		bp++; -		s--; -	} -	return bp; -} - -static void dmi_decode_ram(u16 data) -{ -	if(data&(1<<0)) -		printf("OTHER "); -	if(data&(1<<1)) -		printf("UNKNOWN "); -	if(data&(1<<2)) -		printf("STANDARD "); -	if(data&(1<<3)) -		printf("FPM "); -	if(data&(1<<4)) -		printf("EDO "); -	if(data&(1<<5)) -		printf("PARITY "); -	if(data&(1<<6)) -		printf("ECC "); -	if(data&(1<<7)) -		printf("SIMM "); -	if(data&(1<<8)) -		printf("DIMM "); -	if(data&(1<<9)) -		printf("Burst EDO "); -	if(data&(1<<10)) -		printf("SDRAM "); -} - -static void dmi_cache_size(u16 n) -{ -	if(n&(1<<15)) -		printf("%dK\n", (n&0x7FFF)*64); -	else -		printf("%dK\n", n&0x7FFF); -} - -static void dmi_decode_cache(u16 c) -{ -	if(c&(1<<0)) -		printf("Other "); -	if(c&(1<<1)) -		printf("Unknown "); -	if(c&(1<<2)) -		printf("Non-burst "); -	if(c&(1<<3)) -		printf("Burst "); -	if(c&(1<<4)) -		printf("Pipeline burst "); -	if(c&(1<<5)) -		printf("Synchronous "); -	if(c&(1<<6)) -		printf("Asynchronous "); -} - -static char *dmi_bus_name(u8 num) -{ -	static char *bus[]={ -		"", -		"", -		"", -		"ISA ", -		"MCA ", -		"EISA ", -		"PCI ", -		"PCMCIA " -		"VLB ", -		"Proprietary ", -		"CPU Slot ", -		"Proprietary RAM ", -		"I/O Riser ", -		"NUBUS ", -		"PCI-66 ", -		"AGP ", -		"AGP 2x ", -		"AGP 4x " -	}; -	static char *jpbus[]={ -		"PC98/C20", -		"PC98/C24", -		"PC98/E", -		"PC98/LocalBus", -		"PC98/Card" -	}; -	 -	if(num<=0x12) -		return bus[num]; -	if(num>=0xA0 && num<0xA5) -		return jpbus[num]; -	return ""; -} - -static char *dmi_bus_width(u8 code) -{ -	static char *width[]={ -		"", -		"", -		"", -		"8bit ", -		"16bit ", -		"32bit ", -		"64bit ", -		"128bit " -	}; -	if(code>7) -		return ""; -	return width[code]; -} - -static char *dmi_card_size(u8 v) -{ -	if(v==2) -		return("Short "); -	if(v==3) -		return("Long "); -	return ""; -} - -static void dmi_card_props(u8 v) -{ -	printf("\t\tSlot Features: "); -	if(v&(1<<1)) -		printf("5v "); -	if(v&(1<<2)) -		printf("3.3v "); -	if(v&(1<<3)) -		printf("Shared "); -	if(v&(1<<4)) -		printf("PCCard16 "); -	if(v&(1<<5)) -		printf("CardBus "); -	if(v&(1<<6)) -		printf("Zoom-Video "); -	if(v&(1<<7)) -		printf("ModemRingResume "); -	printf("\n"); -}		 - -static char *dmi_chassis_type(u8 code) -{ -	static char *chassis_type[]={ -		"", -		"Other", -		"Unknown", -		"Desktop", -		"Low Profile Desktop", -		"Pizza Box", -		"Mini Tower", -		"Tower", -		"Portable", -		"Laptop", -		"Notebook", -		"Hand Held", -		"Docking Station", -		"All in One", -		"Sub Notebook", -		"Space-saving", -		"Lunch Box", -		"Main Server Chassis", -		"Expansion Chassis", -		"SubChassis", -		"Bus Expansion Chassis", -		"Peripheral Chassis", -		"RAID Chassis", -		"Rack Mount Chassis", -		"Sealed-case PC", -	}; -	code &= ~0x80; -	 -	if(code>0x18) -		return ""; -	return chassis_type[code]; -	 -} - -static char *dmi_port_connector_type(u8 code) -{ -	static char *connector_type[]={ -		"None", -		"Centronics", -		"Mini Centronics", -		"Proprietary", -		"DB-25 pin male", -		"DB-25 pin female", -		"DB-15 pin male", -		"DB-15 pin female", -		"DB-9 pin male", -		"DB-9 pin female", -		"RJ-11",  -		"RJ-45", -		"50 Pin MiniSCSI", -		"Mini-DIN", -		"Micro-DIN", -		"PS/2", -		"Infrared", -		"HP-HIL", -		"Access Bus (USB)", -		"SSA SCSI", -		"Circular DIN-8 male", -		"Circular DIN-8 female", -		"On Board IDE", -		"On Board Floppy", -		"9 Pin Dual Inline (pin 10 cut)", -		"25 Pin Dual Inline (pin 26 cut)", -		"50 Pin Dual Inline", -		"68 Pin Dual Inline", -		"On Board Sound Input from CD-ROM", -		"Mini-Centronics Type-14", -		"Mini-Centronics Type-26", -		"Mini-jack (headphones)", -		"BNC", -		"1394", -		"PC-98", -		"PC-98Hireso", -		"PC-H98", -		"PC-98Note", -		"PC98Full", -	}; -	 -	if(code == 0xFF) -		return "Other"; -	 -	if (code > 0xA4) -		return ""; -	return connector_type[code]; -	 -} - -static char *dmi_port_type(u8 code) -{ -	static char *port_type[]={ -		"None", -		"Parallel Port XT/AT Compatible", -		"Parallel Port PS/2", -		"Parallel Port ECP", -		"Parallel Port EPP", -		"Parallel Port ECP/EPP", -		"Serial Port XT/AT Compatible", -		"Serial Port 16450 Compatible", -		"Serial Port 16650 Compatible", -		"Serial Port 16650A Compatible", -		"SCSI Port", -		"MIDI Port", -		"Joy Stick Port", -		"Keyboard Port", -		"Mouse Port", -		"SSA SCSI", -		"USB", -		"FireWire (IEEE P1394)", -		"PCMCIA Type I", -		"PCMCIA Type II", -		"PCMCIA Type III", -		"Cardbus", -		"Access Bus Port", -		"SCSI II", -		"SCSI Wide", -		"PC-98", -		"PC-98-Hireso", -		"PC-H98", -		"Video Port", -		"Audio Port", -		"Modem Port", -		"Network Port", -		"8251 Compatible", -		"8251 FIFO Compatible", -	}; -	 -	if(code == 0xFF) -		return "Other"; -	 -	if (code > 0xA1) -		return ""; -	return port_type[code]; -	 -} - -static char *dmi_processor_type(u8 code) -{ -	static char *processor_type[]={ -		"", -		"Other", -		"Unknown", -		"Central Processor", -		"Math Processor", -		"DSP Processor", -		"Video Processor" -	}; -	 -	if(code == 0xFF) -		return "Other"; -	 -	if (code > 0xA1) -		return ""; -	return processor_type[code]; -} - -static char *dmi_processor_family(u8 code) -{ -	static char *processor_family[]={ -		"", -		"Other", -		"Unknown", -		"8086", -		"80286", -		"Intel386 processor", -		"Intel486 processor", -		"8087", -		"80287", -		"80387", -		"80487", -		"Pentium processor Family", -		"Pentium Pro processor", -		"Pentium II processor", -		"Pentium processor with MMX technology", -		"Celeron processor", -		"Pentium II Xeon processor", -		"Pentium III processor", -		"M1 Family", -		"M1","M1","M1","M1","M1","M1", /* 13h - 18h */ -		"K5 Family", -		"K5","K5","K5","K5","K5","K5", /* 1Ah - 1Fh */ -		"Power PC Family", -		"Power PC 601", -		"Power PC 603", -		"Power PC 603+", -		"Power PC 604", -	}; -	 -	if(code == 0xFF) -		return "Other"; -	 -	if (code > 0x24) -		return ""; -	return processor_family[code]; -} - -static char *dmi_onboard_type(u8 code) -{ -	static char *onboard_type[]={ -		"", -		"Other", -		"Unknown", -		"Video", -		"SCSI Controller", -		"Ethernet", -		"Token Ring", -		"Sound", -	}; -	code &= 0x80; -	if (code > 7) -		return ""; -	return onboard_type[code]; -} - - -static void dmi_table(int fd, u32 base, int len, int num) -{ -	char *buf=malloc(len); -	struct dmi_header *dm; -	u8 *data; -	int i=0; -	 -	if(lseek(fd, (long)base, 0)==-1) -	{ -		perror("dmi: lseek"); -		return; -	} -	if(read(fd, buf, len)!=len) -	{ -		perror("dmi: read"); -		return; -	} -	data = buf; -	while(i<num) -	{ -		u32 u; -		u32 u2; -		dm=(struct dmi_header *)data; -		printf("Handle 0x%04X\n\tDMI type %d, %d bytes.\n", -		       dm->handle, -		       dm->type, dm->length); -		 -		switch(dm->type) -		{ -		case  0: -			printf("\tBIOS Information Block\n"); -			printf("\t\tVendor: %s\n",  -			       dmi_string(dm, data[4])); -			printf("\t\tVersion: %s\n",  -			       dmi_string(dm, data[5])); -			printf("\t\tRelease: %s\n", -			       dmi_string(dm, data[8])); -			printf("\t\tBIOS base: 0x%04X0\n", -			       data[7]<<8|data[6]); -			printf("\t\tROM size: %dK\n", -			       64*data[9]); -			printf("\t\tCapabilities:\n"); -			u=data[13]<<24|data[12]<<16|data[11]<<8|data[10];		 -			u2=data[17]<<24|data[16]<<16|data[15]<<8|data[14]; -			printf("\t\t\tFlags: 0x%08X%08X\n", -			       u2,u); -			break; -			 -		case 1: -			printf("\tSystem Information Block\n"); -			printf("\t\tVendor: %s\n", -			       dmi_string(dm, data[4])); -			printf("\t\tProduct: %s\n", -			       dmi_string(dm, data[5])); -			printf("\t\tVersion: %s\n", -			       dmi_string(dm, data[6])); -			printf("\t\tSerial Number: %s\n", -			       dmi_string(dm, data[7])); -			break; -			 -		case 2: -			printf("\tBoard Information Block\n"); -			printf("\t\tVendor: %s\n", -			       dmi_string(dm, data[4])); -			printf("\t\tProduct: %s\n", -			       dmi_string(dm, data[5])); -			printf("\t\tVersion: %s\n", -			       dmi_string(dm, data[6])); -			printf("\t\tSerial Number: %s\n", -			       dmi_string(dm, data[7])); -			break; -			 -		case 3: -			printf("\tChassis Information Block\n"); -			printf("\t\tVendor: %s\n", -			       dmi_string(dm, data[4])); -			printf("\t\tChassis Type: %s\n", -			       dmi_chassis_type(data[5])); -			if (data[5] & 0x80) -				printf("\t\t\tLock present\n"); -			printf("\t\tVersion: %s\n", -			       dmi_string(dm, data[6])); -			printf("\t\tSerial Number: %s\n", -			       dmi_string(dm, data[7])); -			printf("\t\tAsset Tag: %s\n", -			       dmi_string(dm, data[8])); -			break; -			 -		case 4: -			printf("\tProcessor\n"); -			printf("\t\tSocket Designation: %s\n", -			       dmi_string(dm, data[4])); -			printf("\t\tProcessor Type: %s\n", -			       dmi_processor_type(data[5])); -			printf("\t\tProcessor Family: %s\n", -			       dmi_processor_family(data[6])); -			printf("\t\tProcessor Manufacturer: %s\n", -			       dmi_string(dm, data[7])); -			printf("\t\tProcessor Version: %s\n", -			       dmi_string(dm, data[0x10])); -			if (dm->length <= 0x20) break; -			printf("\t\tSerial Number: %s\n", -			       dmi_string(dm, data[0x20])); -			printf("\t\tAsset Tag: %s\n", -			       dmi_string(dm, data[0x21])); -			printf("\t\tVendor Part Number: %s\n", -			       dmi_string(dm, data[0x22])); -			break; -			 -		case 5: -			printf("\tMemory Controller\n"); -			break; -			 -		case 6: -			printf("\tMemory Bank\n"); -			printf("\t\tSocket: %s\n", dmi_string(dm, data[4])); -			if(data[5]!=0xFF) -			{ -				printf("\t\tBanks: "); -				if((data[5]&0xF0)!=0xF0) -					printf("%d ", -					       data[5]>>4); -				if((data[5]&0x0F)!=0x0F) -					printf("%d", -					       data[5]&0x0F); -				printf("\n"); -			} -			if(data[6]) -				printf("\t\tSpeed: %dnS\n", data[6]); -			printf("\t\tType: "); -			dmi_decode_ram(data[8]<<8|data[7]); -			printf("\n"); -			printf("\t\tInstalled Size: "); -			switch(data[9]&0x7F) -			{ -			case 0x7D: -				printf("Unknown");break; -			case 0x7E: -				printf("Disabled");break; -			case 0x7F: -				printf("Not Installed");break; -			default: -				printf("%dMbyte", -				       (1<<(data[9]&0x7F))); -			} -			if(data[9]&0x80) -				printf(" (Double sided)"); -			printf("\n"); -			printf("\t\tEnabled Size: "); -			switch(data[10]&0x7F) -			{ -			case 0x7D: -				printf("Unknown");break; -			case 0x7E: -				printf("Disabled");break; -			case 0x7F: -				printf("Not Installed");break; -			default: -				printf("%dMbyte", -				       (1<<(data[10]&0x7F))); -			} -			if(data[10]&0x80) -				printf(" (Double sided)"); -			printf("\n"); -			if((data[11]&4)==0) -			{ -				if(data[11]&(1<<0)) -					printf("\t\t*** BANK HAS UNCORRECTABLE ERRORS (BIOS DISABLED)\n"); -				if(data[11]&(1<<1)) -					printf("\t\t*** BANK LOGGED CORRECTABLE ERRORS AT BOOT\n"); -			} -			break; -		case 7: -		{ -			static char *types[4]={ -				"Internal ", "External ", -				"", ""}; -			static char *modes[4]={ -				"write-through", -				"write-back", -				"",""}; -			 -			printf("\tCache\n"); -			printf("\t\tSocket: %s\n", -			       dmi_string(dm, data[4])); -			u=data[6]<<8|data[5]; -			printf("\t\tL%d %s%sCache: ", -			       1+(u&7), (u&(1<<3))?"socketed ":"", -			       types[(u>>5)&3]); -			if(u&(1<<7)) -				printf("%s\n", -				       modes[(u>>8)&3]); -			else -				printf("disabled\n"); -			printf("\t\tL%d Cache Size: ", 1+(u&7)); -			dmi_cache_size(data[7]|data[8]<<8); -			printf("\t\tL%d Cache Maximum: ", 1+(u&7)); -			dmi_cache_size(data[9]|data[10]<<8); -			printf("\t\tL%d Cache Type: ", 1+(u&7)); -			dmi_decode_cache(data[13]); -			printf("\n"); -		} -		break; -		 -		case 8: -			printf("\tPort Connector\n"); -			printf("\t\tInternal Designator: %s\n", -			       dmi_string(dm, data[4])); -			printf("\t\tInternal Connector Type: %s\n", -			       dmi_port_connector_type(data[5])); -			printf("\t\tExternal Designator: %s\n", -			       dmi_string(dm, data[6])); -			printf("\t\tExternal Connector Type: %s\n", -			       dmi_port_connector_type(data[7])); -			printf("\t\tPort Type: %s\n", -			       dmi_port_type(data[8])); -			break; -			 -			 -			 -		case 9: -			printf("\tCard Slot\n"); -			printf("\t\tSlot: %s\n",  -			       dmi_string(dm, data[4])); -			printf("\t\tType: %s%s%s\n", -			       dmi_bus_width(data[6]), -			       dmi_card_size(data[8]), -			       dmi_bus_name(data[5])); -			if(data[7]==3) -				printf("\t\tStatus: Available.\n"); -			if(data[7]==4) -				printf("\t\tStatus: In use.\n"); -			if(data[11]&0xFE) -				dmi_card_props(data[11]); -			break; -			 -		case 10: -			printf("\tOn Board Devices Information\n"); -			for (u=0; u<((dm->length - 4)/2); u++) { -				printf("\t\tDescription: %s : %s\n", -				       dmi_string(dm, data[5+(2*u)]), -				       (data[4+(2*u)]) & 0x80 ? -				       "Enabled" : "Disabled"); -				printf("\t\tType: %s\n", -				       dmi_onboard_type(data[4+(2*u)])); - -			} - -			break; -			 -			 -		case 11: -			printf("\tOEM Data\n"); -			for(u=1;u<=data[4];u++) -				printf("\t\t%s\n", dmi_string(dm,u)); -			break; -		case 12: -			printf("\tConfiguration Information\n"); -			for(u=1;u<=data[4];u++) -				printf("\t\t%s\n", dmi_string(dm,u)); -			break; -			 -		case 13: -			printf("\tBIOS Language Information\n"); -			break; -			 -		case 14: -			printf("\tGroup Associations\n"); -			for (u=0; u<(dm->length - 5)/3 ; u++) { -				printf("\t\tGroup Name: %s\n", -				       dmi_string(dm,data[4])); -				printf("\t\t\tType: 0x%02x\n", *(data+5+(u*3))); -				printf("\t\t\tHandle: 0x%04x\n", -				       *(u16*)(data+6+(u*3))); -			} -			break; -			 -			 -		case 15: -			printf("\tEvent Log\n"); -			printf("\t\tLog Area: %d bytes.\n", -			       data[5]<<8|data[4]); -			printf("\t\tLog Header At: %d.\n", -			       data[7]<<8|data[6]); -			printf("\t\tLog Data At: %d.\n", -			       data[9]<<8|data[8]); -			printf("\t\tLog Type: %d.\n", -			       data[10]); -			if(data[11]&(1<<0)) -				printf("\t\tLog Valid: Yes.\n"); -			if(data[11]&(1<<1)) -				printf("\t\t**Log Is Full**.\n"); -			break; -			 -		case 16: -			printf("\tPhysical Memory Array\n"); -			break; -		case 17: -			printf("\tMemory Device\n"); -			break; -		case 18: -			printf("\t32-bit Memory Error Information\n"); -			break; -		case 19: -			printf("\tMemory Array Mapped Address\n"); -			break; -		case 20: -			printf("\tMemory Device Mapped Address\n"); -			break; -		case 24: -			printf("\tHardware Security\n"); -			break; -		case 25: -			printf("\tSystem Power Controls\n"); -			break; -		case 32: -			printf("\tSystem Boot Information\n"); -			break; -		case 126: -			printf("\tInactive\n"); -			break; -			 -		case 127: -			printf("\tEnd-of-Table\n"); -			break; -			 -		default: -			if (dm->length > 4)  -				dump_raw_data(data+4, dm->length-4); -			break; -			 -			 -			 -		} -		data+=dm->length; -		while(*data || data[1]) -			data++; -		data+=2; -		i++; -	} -	free(buf); -} - - -char key[8]={'R','S','D',' ','P','T','R',' '}; - -char zot[16]; - -int main(int argc, char *argv[]) -{ -	unsigned char buf[20]; -	int fd=open("/dev/mem", O_RDONLY); -	long fp=0xE0000L; -	if(fd==-1) -	{ -		perror("/dev/mem"); -		exit(1); -	} -	if(lseek(fd,fp,0)==-1) -	{ -		perror("seek"); -		exit(1); -	} -	 -	 -	fp -= 16; -	 -	while( fp < 0xFFFFF) -	{ -		fp+=16; -		if(read(fd, buf, 16)!=16) -			perror("read"); -//		if(memcmp(buf, zot, 16)==0) -//			printf("*"); -		if(memcmp(buf, "_SM_", 4)==0) { -			printf("SMBIOS %d.%d present.\n", buf[6], buf[7]); -		} -		 -		if(memcmp(buf, "_SYSID_", 7)==0) -			printf("SYSID present.\n"); -		if(memcmp(buf, "_DMI_", 5)==0) -		{ -			u16 num=buf[13]<<8|buf[12]; -			u16 len=buf[7]<<8|buf[6]; -			u32 base=buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8]; -			 -			printf("DMI %d.%d present.\n", -			       buf[14]>>4, buf[14]&0x0F); -			printf("%d structures occupying %d bytes.\n", -			       buf[13]<<8|buf[12], -			       buf[7]<<8|buf[6]); -			printf("DMI table at 0x%08X.\n", -			       buf[11]<<24|buf[10]<<16|buf[9]<<8|buf[8]); -			dmi_table(fd, base,len, num); -		} -		if(memcmp(buf, "$PnP", 4)==0) -			printf("PNP BIOS present.\n"); -		if(memcmp(buf, key, 8)==0) -		{ -			int a; -			unsigned char sum=0; -			unsigned int i=0, checksum=0; -			printf("RSD PTR found at 0x%lX\n", fp); -			for (i=0; i<20; i++) checksum += buf[i]; -			if (checksum != 0) { -				printf("checksum failed.\n"); -			} - -			if(buf[15]!=0) -			{ -				printf("Reserved check failed.\n"); -			} -			printf("OEM "); -			fwrite(buf+9, 6, 1, stdout); -			printf("\n"); -			read(fd,buf+16,4); -			lseek(fd, -4, 1); -			for(a=0;a<20;a++) -				sum+=buf[a]; -			if(sum!=0) -				printf("Bad checksum.\n"); -		} -	} -	close(fd); -	return 0; -} | 
