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; -} |