From fbdcdd6c198149aebccb5cd7068ec5bf74c4012d Mon Sep 17 00:00:00 2001 From: Pascal Rigaux Date: Tue, 10 Jan 2006 14:52:39 +0000 Subject: look for "NR_CPUS limit of 1 reached" instead of looking MP tables by hand, or using DMI info (often broken) --- perl-install/c/Makefile.PL | 2 +- perl-install/c/README | 2 - perl-install/c/smp-dmi.c | 325 ---------------------------- perl-install/c/smp-test.c | 6 - perl-install/c/smp.c | 516 --------------------------------------------- perl-install/c/smp.h | 6 - perl-install/c/stuff.xs.pl | 3 - 7 files changed, 1 insertion(+), 859 deletions(-) delete mode 100644 perl-install/c/smp-dmi.c delete mode 100644 perl-install/c/smp-test.c delete mode 100644 perl-install/c/smp.c delete mode 100644 perl-install/c/smp.h (limited to 'perl-install/c') 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 - * - * Licensed under the GNU Public license. If you want to use it in with - * another license just ask. - */ - -#include -#include -#include -#include -#include -#include - -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(ilength; - while(next-buf+1type == 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 -#include -#include -#include -#include -#include -#include - -#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 -#include -#include -#include -#include -#include - -#define LINUX 1 -#if LINUX -typedef unsigned int vm_offset_t; -#else -#include -#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 @@ -283,9 +283,6 @@ void usleep(microseconds) unsigned long microseconds -int -detectSMP() - int dmiDetectMemory() -- cgit v1.2.1