summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorPascal Rigaux <pixel@mandriva.com>2006-01-10 14:52:39 +0000
committerPascal Rigaux <pixel@mandriva.com>2006-01-10 14:52:39 +0000
commitfbdcdd6c198149aebccb5cd7068ec5bf74c4012d (patch)
tree6f2540e155ec39ce377a9479b5d2f7e22dd305db
parent889b45e9b47c6b3f68774ad73debc5baf1b7087f (diff)
downloaddrakx-fbdcdd6c198149aebccb5cd7068ec5bf74c4012d.tar
drakx-fbdcdd6c198149aebccb5cd7068ec5bf74c4012d.tar.gz
drakx-fbdcdd6c198149aebccb5cd7068ec5bf74c4012d.tar.bz2
drakx-fbdcdd6c198149aebccb5cd7068ec5bf74c4012d.tar.xz
drakx-fbdcdd6c198149aebccb5cd7068ec5bf74c4012d.zip
look for "NR_CPUS limit of 1 reached" instead of looking MP tables by hand, or using DMI info (often broken)
-rw-r--r--perl-install/c/Makefile.PL2
-rw-r--r--perl-install/c/README2
-rw-r--r--perl-install/c/smp-dmi.c325
-rw-r--r--perl-install/c/smp-test.c6
-rw-r--r--perl-install/c/smp.c516
-rw-r--r--perl-install/c/smp.h6
-rw-r--r--perl-install/c/stuff.xs.pl3
-rw-r--r--perl-install/detect_devices.pm3
8 files changed, 3 insertions, 860 deletions
diff --git a/perl-install/c/Makefile.PL b/perl-install/c/Makefile.PL
index 0b7b349a1..988c8ca2c 100644
--- a/perl-install/c/Makefile.PL
+++ b/perl-install/c/Makefile.PL
@@ -16,7 +16,7 @@ WriteMakefile(
'NAME' => 'stuff',
'OPTIMIZE' => '-Os',
'MAKEFILE' => 'Makefile_c',
- 'OBJECT' => "stuff.o smp.o sbus.o silo.o smp-dmi.o" . ($pcmcia_dir && " probe.o"),
+ 'OBJECT' => "stuff.o sbus.o silo.o " . ($pcmcia_dir && " probe.o"),
'VERSION_FROM' => 'stuff.pm', # finds $VERSION
'LIBS' => [$libs], # e.g., '-lm'
'DEFINE' => '', # e.g., '-DHAVE_SOMETHING'
diff --git a/perl-install/c/README b/perl-install/c/README
index b5ad1224f..2453a5121 100644
--- a/perl-install/c/README
+++ b/perl-install/c/README
@@ -1,3 +1 @@
md5.c, md5_crypt.c and md5.h are taken from pam (dir modules/pam_pwdb)
-
-smp.c is taken from RedHat's install
diff --git a/perl-install/c/smp-dmi.c b/perl-install/c/smp-dmi.c
deleted file mode 100644
index 60a92b9d6..000000000
--- a/perl-install/c/smp-dmi.c
+++ /dev/null
@@ -1,325 +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>
-#include <sys/mman.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);
- }
-}
-
-
-#define DEFAULT_MEM_DEV "/dev/mem"
-
-void *mem_chunk(u32 base, u32 len, const char *devmem)
-{
- void *p;
- int fd;
- off_t mmoffset;
- void *mmp;
-
- if ((fd = open(devmem, O_RDONLY)) < 0)
- return NULL;
-
- if ((p = malloc(len)) == NULL)
- return NULL;
-
- mmoffset = base % getpagesize();
- mmp = mmap(0, mmoffset + len, PROT_READ, MAP_SHARED, fd, base - mmoffset);
- if (mmp == MAP_FAILED) {
- free(p);
- return NULL;
- }
-
- memcpy(p, (u8 *)mmp + mmoffset, len);
- munmap(mmp, mmoffset + len);
- close(fd);
- return p;
-}
-
-
-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(u32 base, int len, int num, dmi_decode decode)
-{
- u8 *buf;
- u8 *data;
- int i = 0;
- int ret = 0;
-
- if ((buf = mem_chunk(base, len, DEFAULT_MEM_DEV)) == NULL)
- return 0;
-
- 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) {
- u8 *buf;
- long fp;
- int ret;
-
- if ((buf = mem_chunk(0xf0000, 0x10000, DEFAULT_MEM_DEV)) == NULL) {
- perror("dmi_detect");
- exit(1);
- }
-
- for (fp = 0; fp <= 0xfff0; fp += 16) {
- if (memcmp(buf + fp, "_DMI_", 5) == 0) {
- u8 *p = buf + fp;
- u16 num = p[13]<<8|p[12];
- u16 len = p[7]<<8|p[6];
- u32 base = p[11]<<24|p[10]<<16|p[9]<<8|p[8];
-
- ret = decode_handle(base, len, num, decode);
- break;
- }
- }
-
- free(buf);
- 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;
-}
-
-#ifdef TEST
-int main(void)
-{
- printf("Memory Size: %d MB\n", dmiDetectMemory());
-}
-#endif
diff --git a/perl-install/c/smp-test.c b/perl-install/c/smp-test.c
deleted file mode 100644
index f644449b8..000000000
--- a/perl-install/c/smp-test.c
+++ /dev/null
@@ -1,6 +0,0 @@
-main() {
- if (detectSMP())
- printf("has smp\n");
- else
- printf("no smp\n");
-}
diff --git a/perl-install/c/smp.c b/perl-install/c/smp.c
deleted file mode 100644
index 886321e06..000000000
--- a/perl-install/c/smp.c
+++ /dev/null
@@ -1,516 +0,0 @@
-/*
-[_Anarchy_(alan@lightning.swansea.uk.linux.org)] you should do one check
- though - if the board seems to be SMP and the CPU in /proc/cpuinfo is non
- intel dont install an SMP kernel - thats a dual pentium board with a cyrix
- or similar single cpu in it
-*/
-
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <sys/mman.h>
-#include <string.h>
-#include <errno.h>
-
-#ifdef __alpha__
-int alphaDetectSMP(void)
-{
- int issmp = 0;
- FILE *f;
-
- f = fopen("/proc/cpuinfo", "r");
- if (f) {
- char buff[1024];
-
- while (fgets (buff, 1024, f) != NULL) {
- if (!strncmp (buff, "cpus detected\t\t: ", 17)) {
- if (strtoul (buff + 17, NULL, 0) > 1)
- issmp = 1;
- break;
- }
- }
- fclose(f);
- } else
- return -1;
-
- return issmp;
-}
-#endif /* __alpha__ */
-
-#ifdef __sparc__
-int sparcDetectSMP(void)
-{
- int issmp = 0;
- FILE *f;
-
- f = fopen("/proc/cpuinfo", "r");
- if (f) {
- char buff[1024];
-
- while (fgets (buff, 1024, f) != NULL) {
- if (!strncmp (buff, "ncpus probed\t: ", 15)) {
- if (strtoul (buff + 15, NULL, 0) > 1)
- issmp = 1;
- break;
- }
- }
- fclose(f);
- } else
- return -1;
-
- return issmp;
-}
-#endif /* __sparc__ */
-
-/* just a placeholder for now - don't have an SMP machine
- need something in place to build - s.benedict */
-
-#ifdef __powerpc__
-int ppcDetectSMP(void)
-{
- int issmp = 0;
- FILE *f;
-
- f = fopen("/proc/cpuinfo", "r");
- if (f) {
- char buff[1024];
-
- while (fgets (buff, 1024, f) != NULL) {
- if (!strncmp (buff, "ncpus active\t: ", 15)) {
- if (strtoul (buff + 15, NULL, 0) > 1)
- issmp = 1;
- break;
- }
- }
- fclose(f);
- } else
- return -1;
-
- return issmp;
-}
-#endif /* __powerpc__ */
-
-#if defined(__i386__) || defined(__x86_64__)
-/*
- * Copyright (c) 1996, by Steve Passe
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions
- * are met:
- * 1. Redistributions of source code must retain the above copyright
- * notice, this list of conditions and the following disclaimer.
- * 2. The name of the developer may NOT be used to endorse or promote products
- * derived from this software without specific prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
- * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
- * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
- * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
- * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
- * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
- * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
- * SUCH DAMAGE.
- *
- * $Id$
- */
-
-/*
- * mptable.c
- */
-
-#define VMAJOR 2
-#define VMINOR 0
-#define VDELTA 12
-
-/*
- * this will cause the raw mp table to be dumped to /tmp/mpdump
- *
-#define RAW_DUMP
- */
-
-#define MP_SIG 0x5f504d5f /* _MP_ */
-#define EXTENDED_PROCESSING_READY
-#define OEM_PROCESSING_READY_NOT
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <fcntl.h>
-#include <unistd.h>
-#include <sys/types.h>
-
-#define LINUX 1
-#if LINUX
-typedef unsigned int vm_offset_t;
-#else
-#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 */
-
-/* CMOS 'top of mem' is @ 40:13 in real-mode terms */
-#define TOPOFMEM_POINTER 0x0413 /* BIOS: base memory size */
-
-#define DEFAULT_TOPOFMEM 0xa0000
-
-#define BIOS_BASE 0xf0000
-#define BIOS_BASE2 0xe0000
-#define BIOS_SIZE 0x10000
-#define ONE_KBYTE 1024
-
-#define GROPE_AREA1 0x80000
-#define GROPE_AREA2 0x90000
-#define GROPE_SIZE 0x10000
-
-/* MP Floating Pointer Structure */
-typedef struct MPFPS {
- char signature[ 4 ];
- 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 ];
- 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 {
- u8 type;
- u8 apicID;
- u8 apicVersion;
- u8 cpuFlags;
- u32 cpuSignature;
- u32 featureFlags;
- u32 reserved1;
- u32 reserved2;
-} ProcEntry;
-
-#define PROCENTRY_FLAG_EN 0x01
-
-static void seekEntry( vm_offset_t addr );
-static void apic_probe( vm_offset_t* paddr, int* where );
-static void readEntry( void* entry, int size );
-
-/* global data */
-static int pfd; /* physical /dev/mem fd */
-static int verbose = 0;
-static int grope = 0;
-
-static int
-readType()
-{
- u_char type;
-
- if ( read( pfd, &type, sizeof( u_char ) ) != sizeof( u_char ) ) {
- perror( "type read" );
- fprintf( stderr, "\npfd: %d", pfd );
- fflush( stderr );
- exit( 1 );
- }
-
- if ( lseek( pfd, -1, SEEK_CUR ) < 0 ) {
- perror( "type seek" );
- exit( 1 );
- }
-
- return (int)type;
-}
-
-extern int intelDetectSMP(void);
-
-// old detection
-static int intelDetectSMP_mptable(void)
-{
- vm_offset_t paddr;
- int where;
- mpfps_t mpfps;
- int rc = 0;
- int ncpus = 0;
-
- /* open physical memory for access to MP structures */
- if ( (pfd = open( "/dev/mem", O_RDONLY )) < 0 ) {
- return 0;
- }
-
- /* probe for MP structures */
- apic_probe( &paddr, &where );
- if ( where <= 0 )
- return 0;
-
- seekEntry( paddr );
- readEntry( &mpfps, sizeof( mpfps_t ) );
-
- if (mpfps.mpfb1)
- /* old style */
- rc = 1;
- else {
- /* go to the config table */
- mpcth_t cth;
- int count, i;
-
- paddr = mpfps.pap;
- seekEntry( paddr );
- readEntry( &cth, sizeof( cth ) );
- /* if we don't have any entries, the kernel sure
- won't be able to set up mp. Needs at least one entry
- for smp kernel */
- if (cth.entry_count <= 1) {
- close (pfd);
- return 0;
- }
- count = cth.entry_count;
- for (i = 0; i < count; i++) {
- if ( readType() == 0 ) {
- ProcEntry entry;
- readEntry( &entry, sizeof( entry ) );
- if (entry.cpuFlags & PROCENTRY_FLAG_EN)
- ncpus++;
- }
- }
- if (ncpus > 1)
- rc = 1;
- }
-
- close (pfd);
- return rc;
-}
-
-/*
- * set PHYSICAL address of MP floating pointer structure
- */
-#define NEXT(X) ((X) += 4)
-static void
-apic_probe( vm_offset_t* paddr, int* where )
-{
- /*
- * c rewrite of apic_probe() by Jack F. Vogel
- */
-
- int x;
- u_short segment;
- vm_offset_t target;
- u_int buffer[ BIOS_SIZE / sizeof( int ) ];
-
- if ( verbose )
- printf( "\n" );
-
- /* search Extended Bios Data Area, if present */
- if ( verbose )
- printf( " looking for EBDA pointer @ 0x%04x, ", EBDA_POINTER );
- seekEntry( (vm_offset_t)EBDA_POINTER );
- readEntry( &segment, 2 );
- if ( segment ) { /* search EBDA */
- target = (vm_offset_t)segment << 4;
- if ( verbose )
- printf( "found, searching EBDA @ 0x%08x\n", target );
- seekEntry( target );
- readEntry( buffer, ONE_KBYTE );
-
- for ( x = 0; x < ONE_KBYTE / sizeof ( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 1;
- *paddr = (x * sizeof( unsigned int )) + target;
- return;
- }
- }
- }
- else {
- if ( verbose )
- printf( "NOT found\n" );
- }
-
- /* read CMOS for real top of mem */
- seekEntry( (vm_offset_t)TOPOFMEM_POINTER );
- readEntry( &segment, 2 );
- --segment; /* less ONE_KBYTE */
- target = segment * 1024;
- if ( verbose )
- printf( " searching CMOS 'top of mem' @ 0x%08x (%dK)\n",
- target, segment );
- seekEntry( target );
- readEntry( buffer, ONE_KBYTE );
-
- for ( x = 0; x < ONE_KBYTE / sizeof ( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 2;
- *paddr = (x * sizeof( unsigned int )) + target;
- return;
- }
- }
-
- /* we don't necessarily believe CMOS, check base of the last 1K of 640K */
- if ( target != (DEFAULT_TOPOFMEM - 1024)) {
- target = (DEFAULT_TOPOFMEM - 1024);
- if ( verbose )
- printf( " searching default 'top of mem' @ 0x%08x (%dK)\n",
- target, (target / 1024) );
- seekEntry( target );
- readEntry( buffer, ONE_KBYTE );
-
- for ( x = 0; x < ONE_KBYTE / sizeof ( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 3;
- *paddr = (x * sizeof( unsigned int )) + target;
- return;
- }
- }
- }
-
- /* search the BIOS */
- if ( verbose )
- printf( " searching BIOS @ 0x%08x\n", BIOS_BASE );
- seekEntry( BIOS_BASE );
- readEntry( buffer, BIOS_SIZE );
-
- for ( x = 0; x < BIOS_SIZE / sizeof( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 4;
- *paddr = (x * sizeof( unsigned int )) + BIOS_BASE;
- return;
- }
- }
-
- /* search the extended BIOS */
- if ( verbose )
- printf( " searching extended BIOS @ 0x%08x\n", BIOS_BASE2 );
- seekEntry( BIOS_BASE2 );
- readEntry( buffer, BIOS_SIZE );
-
- for ( x = 0; x < BIOS_SIZE / sizeof( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 5;
- *paddr = (x * sizeof( unsigned int )) + BIOS_BASE2;
- return;
- }
- }
-
- if ( grope ) {
- /* search additional memory */
- target = GROPE_AREA1;
- if ( verbose )
- printf( " groping memory @ 0x%08x\n", target );
- seekEntry( target );
- readEntry( buffer, GROPE_SIZE );
-
- for ( x = 0; x < GROPE_SIZE / sizeof( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 6;
- *paddr = (x * sizeof( unsigned int )) + GROPE_AREA1;
- return;
- }
- }
-
- target = GROPE_AREA2;
- if ( verbose )
- printf( " groping memory @ 0x%08x\n", target );
- seekEntry( target );
- readEntry( buffer, GROPE_SIZE );
-
- for ( x = 0; x < GROPE_SIZE / sizeof( unsigned int ); NEXT(x) ) {
- if ( buffer[ x ] == MP_SIG ) {
- *where = 7;
- *paddr = (x * sizeof( unsigned int )) + GROPE_AREA2;
- return;
- }
- }
- }
-
- *where = 0;
- *paddr = (vm_offset_t)0;
-}
-
-
-/*
- *
- */
-static void
-seekEntry( vm_offset_t addr )
-{
- if ( lseek( pfd, (off_t)addr, SEEK_SET ) < 0 ) {
- return;
- perror( "/dev/mem seek" );
- exit( 1 );
- }
-}
-
-
-/*
- *
- */
-static void
-readEntry( void* entry, int size )
-{
- if ( read( pfd, entry, size ) != size ) {
- return;
- perror( "readEntry" );
- exit( 1 );
- }
-}
-
-
-#endif /* __i386__ */
-
-int detectSMP(void)
-{
- static int isSMP = -1;
-
- if (isSMP != -1)
- return isSMP;
-
-#ifdef __i386__
- return isSMP = intelDetectSMP() || intelDetectSMP_mptable();
-#elif __sparc__
- return isSMP = sparcDetectSMP();
-#elif __alpha__
- return isSMP = alphaDetectSMP();
-#elif __powerpc__
- return isSMP = ppcDetectSMP();
-#elif __ia64__
- /* TODO: Update to check against /proc/pal/cpuX */
- return isSMP = 1;
-#elif __x86_64__
- return isSMP = intelDetectSMP() || intelDetectSMP_mptable();
-#else
- #error unknown architecture
-#endif
-}
-
-#if TEST
-int main() {
- if (detectSMP())
- printf("has smp\n");
- else
- printf("no smp\n");
-}
-#endif
diff --git a/perl-install/c/smp.h b/perl-install/c/smp.h
deleted file mode 100644
index 3255cc489..000000000
--- a/perl-install/c/smp.h
+++ /dev/null
@@ -1,6 +0,0 @@
-#ifndef SMP_H
-#define SMP_H
-
-int detectSMP(void);
-
-#endif /* SMP_H */
diff --git a/perl-install/c/stuff.xs.pl b/perl-install/c/stuff.xs.pl
index 8ad3fd82d..31e37c748 100644
--- a/perl-install/c/stuff.xs.pl
+++ b/perl-install/c/stuff.xs.pl
@@ -284,9 +284,6 @@ usleep(microseconds)
unsigned long microseconds
int
-detectSMP()
-
-int
dmiDetectMemory()
void
diff --git a/perl-install/detect_devices.pm b/perl-install/detect_devices.pm
index c33fb80ac..15075b8a3 100644
--- a/perl-install/detect_devices.pm
+++ b/perl-install/detect_devices.pm
@@ -889,7 +889,8 @@ sub get_mac_generation() {
sub hasSMP() {
return if $::testing;
- c::detectSMP() || any { /\bProcessor #(\d+)\s+(\S*)/ && $1 > 0 && $2 ne 'invalid' } syslog();
+ any { /NR_CPUS limit of 1 reached/ } syslog() ||
+ any { /\bProcessor #(\d+)\s+(\S*)/ && $1 > 0 && $2 ne 'invalid' } syslog();
}
sub hasPCMCIA() { $::o->{pcmcia} } #- because /proc/pcmcia seems not to be present on 2.4 at least (or use /var/run/stab)