diff options
Diffstat (limited to 'perl-install/c/smp-dmi.c')
| -rw-r--r-- | perl-install/c/smp-dmi.c | 302 | 
1 files changed, 0 insertions, 302 deletions
| diff --git a/perl-install/c/smp-dmi.c b/perl-install/c/smp-dmi.c deleted file mode 100644 index 241d8f464..000000000 --- a/perl-install/c/smp-dmi.c +++ /dev/null @@ -1,302 +0,0 @@ -/* - *	CPU detetion based on DMI decode rev 1.2 - * - *	(C) 2003 Nicolas Planel <nplanel@mandrakesoft.com> - *       - *	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 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]; -} - -typedef int (*dmi_decode)(u8 * data); - -static int decode_handle(int fd, u32 base, int len, int num, dmi_decode decode) -{ -	u8 *buf = malloc(len); -	struct dmi_header *dm; -	u8 *data; -	int i = 0; -	int ret = 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 && data+sizeof(struct dmi_header)<=buf+len) -	{ -		u8 *next; -		struct dmi_header *dm = (struct dmi_header *)data; - -		/* look for the next handle */ -		next=data+dm->length; -		while(next-buf+1<len && (next[0]!=0 || next[1]!=0)) -			next++; -		next+=2; -		if(next-buf<=len) -			ret += decode(data); -		else { -			ret = 0; /* TRUNCATED */ -			break; -		} -		data=next; -		i++; -	} -	free(buf); -	return ret; -} - -static int dmi_detect(dmi_decode decode) { -  	unsigned char buf[20]; -	int fd = open("/dev/mem", O_RDONLY); -	long fp = 0xE0000L; -	int ret = 0; - -	if (fd == -1) { -		perror("/dev/mem"); -		exit(1); -	} -	if (lseek(fd, fp, 0) == -1) { -		perror("seek"); -		exit(1); -	} -	 -	while (fp < 0xFFFFF) -	{ -		if (read(fd, buf, 16) != 16) -			perror("read"); -		 -		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]; -			 -			ret = decode_handle(fd, base, len, num, decode); -			break; -		} -		fp += 16; -	} -	close(fd); -	return ret; -} - -static int processor(u8 *data) { -	struct dmi_header *dm = (struct dmi_header *)data; - -	if((dm->type == 4) && /*"Central Processor"*/(data[5] == 3)) { -		if(/*Processor Manufacturer*/data[7] != 0)  -			return 1; -	} -	return 0; -} - -static int memory_in_MB_type6(u8 *data) -{ -	struct dmi_header *dm; -	 -	int dmi_memory_module_size(u8 code) { -		/* 3.3.7.2 */ -		switch(code&0x7F) { -		case 0x7D: /* Not Determinable */ -		case 0x7E: /* Disabled */ -		case 0x7F: /* Not Installed */ -			break; -		default: -			return 1<<(code&0x7F); -		} -		return 0; -	} - -	dm = (struct dmi_header *)data; -		 -	if ((dm->type == 6) && (dm->length >= 0xC)) -		return dmi_memory_module_size(data[0x0A]); /* Enabled Size */ -	 -	return 0; -} - -static int memory_in_MB_type17(u8 *data) -{ -	struct dmi_header *dm; -	 -	int form_factor_check(u8 code) { -		/* 3.3.18.1 */ -		static const char form_factor[]={ -			0, /* "Other", */ /* 0x01 */ -			0, /* "Unknown", */ -			1, /* "SIMM", */ -			1, /* "SIP", */ -			0, /* "Chip", */ -			1, /* "DIP", */ -			0, /* "ZIP", */ -			0, /* "Proprietary Card", */ -			1, /* "DIMM", */ -			0, /* "TSOP", */ -			0, /* "Row Of Chips", */ -			1, /* "RIMM", */ -			1, /* "SODIMM", */ -			1, /* "SRIMM" *//* 0x0E */ -		}; - -		if(code>=0x01 && code<=0x0E) -			return form_factor[code-0x01]; -		return 0; /* out of spec */ -	} -	int dmi_memory_device_size(u16 code) { -		int mult = 1; - -		if (code == 0 || code == 0xFFFF) -			return 0; -		if (code & 0x8000) /* code is in KB */ -			mult = 1024; -		return (code & 0x7FFF) * mult; -	} - -	dm = (struct dmi_header *)data; -		 -	if ((dm->type == 17) && (dm->length >= 0x15)) { -		if (form_factor_check(data[0x0E])) -			return dmi_memory_device_size((data[0x0D] << 8) + data[0x0C]); -	} -	 -	return 0; -} - -int intelDetectSMP(void) { -	return dmi_detect(processor) > 1; -} - -int dmiDetectMemory(void) { -	int s1 = dmi_detect(memory_in_MB_type6); -	int s2 = dmi_detect(memory_in_MB_type17); -	return s1 > s2 ? s1 : s2; -} | 
