diff options
Diffstat (limited to 'perl-install/c')
| -rw-r--r-- | perl-install/c/Makefile | 9 | ||||
| -rw-r--r-- | perl-install/c/Makefile.PL | 4 | ||||
| -rw-r--r-- | perl-install/c/smp-dmi.c | 175 | ||||
| -rw-r--r-- | perl-install/c/smp.c | 65 | ||||
| -rw-r--r-- | perl-install/c/stuff.xs.pl | 15 |
5 files changed, 181 insertions, 87 deletions
diff --git a/perl-install/c/Makefile b/perl-install/c/Makefile index eba1a3cb0..0d09a8919 100644 --- a/perl-install/c/Makefile +++ b/perl-install/c/Makefile @@ -1,12 +1,9 @@ .PHONY: clean -C_RPM = 1 -C_DRAKX = 1 -MYENV = C_RPM=$(C_RPM) C_DRAKX=$(C_DRAKX) -MAKEIT = $(MYENV) $(MAKE) -f Makefile_c LD_RUN_PATH= +MAKEIT = $(MAKE) -f Makefile_c LD_RUN_PATH= stuff: %: %.xs - test -e Makefile_c || $(MYENV) perl Makefile.PL + test -e Makefile_c || perl Makefile.PL $(MAKEIT) || $(MAKEIT) rm -f ../auto/c ; ln -s ../c/blib/arch/auto ../auto/c @@ -16,5 +13,5 @@ clean: stuff.xs: %: %.pl rm -f $@ - C_RPM=$(C_RPM) C_DRAKX=$(C_DRAKX) perl $< > $@ + perl $< > $@ chmod a-w $@ diff --git a/perl-install/c/Makefile.PL b/perl-install/c/Makefile.PL index 18a775175..46960e36d 100644 --- a/perl-install/c/Makefile.PL +++ b/perl-install/c/Makefile.PL @@ -7,9 +7,9 @@ use Config; my $lib = arch() =~ /x86_64/ ? 'lib64' : 'lib'; my $libs = '-lldetect -lext2fs'; -$libs .= ' -lrpm -lrpmdb -lrpmio -lpopt -lz' if $ENV{C_RPM}; +$libs .= ' -lrpm -lrpmdb -lrpmio -lpopt -lz'; -my $pcmcia_dir = $ENV{C_DRAKX} && $Config{archname} =~ /i.86/ ? '../../mdk-stage1/pcmcia_' : ''; +my $pcmcia_dir = $Config{archname} =~ /i.86/ ? '../../mdk-stage1/pcmcia_' : ''; symlink "$pcmcia_dir/probe.c", "probe.c" if $pcmcia_dir; diff --git a/perl-install/c/smp-dmi.c b/perl-install/c/smp-dmi.c index 672bc2c35..241d8f464 100644 --- a/perl-install/c/smp-dmi.c +++ b/perl-install/c/smp-dmi.c @@ -133,81 +133,170 @@ static char *dmi_processor_family(u8 code) return processor_family[code]; } -static int dmi_table(int fd, u32 base, int len, int num) +typedef int (*dmi_decode)(u8 * data); + +static int decode_handle(int fd, u32 base, int len, int num, dmi_decode decode) { - char *buf=malloc(len); + u8 *buf = malloc(len); struct dmi_header *dm; u8 *data; - int i=0; - int processor=0; + int i = 0; + int ret = 0; - if(lseek(fd, (long)base, 0)==-1) - { + if (lseek(fd, (long)base, 0) == -1) { perror("dmi: lseek"); return; } - if(read(fd, buf, len)!=len) - { + if (read(fd, buf, len)!=len) { perror("dmi: read"); return; } data = buf; - while(i<num) + while(i<num && data+sizeof(struct dmi_header)<=buf+len) { - u32 u; - u32 u2; - dm=(struct dmi_header *)data; - - if((dm->type == 4) && /*"Central Processor"*/(data[5] == 3)) { - if(/*Processor Manufacturer*/data[7] != 0) - processor++; - } + u8 *next; + struct dmi_header *dm = (struct dmi_header *)data; - data+=dm->length; - while(*data || data[1]) - data++; - data+=2; + /* 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 processor; + return ret; } -int intelDetectSMP(void) { +static int dmi_detect(dmi_decode decode) { unsigned char buf[20]; - int fd=open("/dev/mem", O_RDONLY); - long fp=0xE0000L; - int processor=0; - if(fd==-1) - { + 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) - { + if (lseek(fd, fp, 0) == -1) { perror("seek"); exit(1); } - - fp -= 16; - - while( fp < 0xFFFFF) + while (fp < 0xFFFFF) { - fp+=16; - if(read(fd, buf, 16)!=16) + 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]; + 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]; - processor=dmi_table(fd, base,len, num); + ret = decode_handle(fd, base, len, num, decode); break; } + fp += 16; } close(fd); - return (processor > 1); + 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; } diff --git a/perl-install/c/smp.c b/perl-install/c/smp.c index 2438418bb..886321e06 100644 --- a/perl-install/c/smp.c +++ b/perl-install/c/smp.c @@ -152,6 +152,11 @@ typedef unsigned int vm_offset_t; #include <machine/types.h> #endif +typedef unsigned char u8; +typedef unsigned short u16; +typedef unsigned int u32; +typedef vm_offset_t addr_t; + /* EBDA is @ 40:0e in real-mode terms */ #define EBDA_POINTER 0x040e /* location of EBDA pointer */ @@ -172,43 +177,43 @@ typedef unsigned int vm_offset_t; /* MP Floating Pointer Structure */ typedef struct MPFPS { char signature[ 4 ]; - void* pap; - u_char length; - u_char spec_rev; - u_char checksum; - u_char mpfb1; - u_char mpfb2; - u_char mpfb3; - u_char mpfb4; - u_char mpfb5; + addr_t pap; + u8 length; + u8 spec_rev; + u8 checksum; + u8 mpfb1; + u8 mpfb2; + u8 mpfb3; + u8 mpfb4; + u8 mpfb5; } mpfps_t; /* MP Configuration Table Header */ typedef struct MPCTH { char signature[ 4 ]; - u_short base_table_length; - u_char spec_rev; - u_char checksum; - u_char oem_id[ 8 ]; - u_char product_id[ 12 ]; - void* oem_table_pointer; - u_short oem_table_size; - u_short entry_count; - void* apic_address; - u_short extended_table_length; - u_char extended_table_checksum; - u_char reserved; + u16 base_table_length; + u8 spec_rev; + u8 checksum; + u8 oem_id[ 8 ]; + u8 product_id[ 12 ]; + addr_t oem_table_pointer; + u16 oem_table_size; + u16 entry_count; + addr_t apic_address; + u16 extended_table_length; + u8 extended_table_checksum; + u8 reserved; } mpcth_t; typedef struct PROCENTRY { - u_char type; - u_char apicID; - u_char apicVersion; - u_char cpuFlags; - u_long cpuSignature; - u_long featureFlags; - u_long reserved1; - u_long reserved2; + u8 type; + u8 apicID; + u8 apicVersion; + u8 cpuFlags; + u32 cpuSignature; + u32 featureFlags; + u32 reserved1; + u32 reserved2; } ProcEntry; #define PROCENTRY_FLAG_EN 0x01 @@ -274,7 +279,7 @@ static int intelDetectSMP_mptable(void) mpcth_t cth; int count, i; - paddr = (vm_offset_t) mpfps.pap; + paddr = mpfps.pap; seekEntry( paddr ); readEntry( &cth, sizeof( cth ) ); /* if we don't have any entries, the kernel sure diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl index 8686497a0..889b29428 100644 --- a/perl-install/c/stuff.xs.pl +++ b/perl-install/c/stuff.xs.pl @@ -73,11 +73,11 @@ char *promRootName(); '; -$ENV{C_DRAKX} && $Config{archname} =~ /i.86/ and print ' +$Config{archname} =~ /i.86/ and print ' char *pcmcia_probe(void); '; -$ENV{C_RPM} and print ' +print ' #undef Fflush #undef Mkdir #undef Stat @@ -95,7 +95,7 @@ void rpmError_callback(void) { '; -$ENV{C_DRAKX} and print ' +print ' void log_message(const char * s, ...) { va_list args; @@ -158,7 +158,7 @@ MODULE = c::stuff PACKAGE = c::stuff '; -$ENV{C_DRAKX} && $Config{archname} =~ /i.86/ and print ' +$Config{archname} =~ /i.86/ and print ' char * pcmcia_probe() '; @@ -366,6 +366,9 @@ usleep(microseconds) int detectSMP() +int +dmiDetectMemory() + void pci_probe() PPCODE: @@ -720,7 +723,7 @@ get_iso_volume_ids(int fd) '; -$ENV{C_RPM} and print ' +print ' const char * rpmErrorString() @@ -770,6 +773,6 @@ END } print ' -PROTOTYPES: ENABLE +PROTOTYPES: DISABLE '; |
