summaryrefslogtreecommitdiffstats
path: root/perl-install/c
diff options
context:
space:
mode:
Diffstat (limited to 'perl-install/c')
-rw-r--r--perl-install/c/Makefile9
-rw-r--r--perl-install/c/Makefile.PL4
-rw-r--r--perl-install/c/smp-dmi.c175
-rw-r--r--perl-install/c/smp.c65
-rw-r--r--perl-install/c/stuff.xs.pl15
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
';