diff options
Diffstat (limited to 'util')
-rw-r--r-- | util/mptable/mptable.c | 1878 |
1 files changed, 926 insertions, 952 deletions
diff --git a/util/mptable/mptable.c b/util/mptable/mptable.c index 3ce249388d..80d47421cf 100644 --- a/util/mptable/mptable.c +++ b/util/mptable/mptable.c @@ -57,10 +57,10 @@ "\n===============================================================================\n" /* EBDA is @ 40:0e in real-mode terms */ -#define EBDA_POINTER 0x040e /* location of EBDA pointer */ +#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 TOPOFMEM_POINTER 0x0413 /* BIOS: base memory size */ #define DEFAULT_TOPOFMEM 0xa0000 @@ -82,1173 +82,1147 @@ #define COREBOOT_MP_TABLE 0 enum busTypes { - CBUS = 1, - CBUSII = 2, - EISA = 3, - ISA = 6, - PCI = 13, - XPRESS = 18, - MAX_BUSTYPE = 18, - UNKNOWN_BUSTYPE = 0xff + CBUS = 1, + CBUSII = 2, + EISA = 3, + ISA = 6, + PCI = 13, + XPRESS = 18, + MAX_BUSTYPE = 18, + UNKNOWN_BUSTYPE = 0xff }; typedef struct BUSTYPENAME { - uint8_t type; - char name[ 7 ]; + uint8_t type; + char name[7]; } busTypeName; -static busTypeName busTypeTable[] = -{ - { CBUS, "CBUS" }, - { CBUSII, "CBUSII" }, - { EISA, "EISA" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { ISA, "ISA" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { PCI, "PCI" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" }, - { UNKNOWN_BUSTYPE, "---" } +static busTypeName busTypeTable[] = { + {CBUS, "CBUS"}, + {CBUSII, "CBUSII"}, + {EISA, "EISA"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {ISA, "ISA"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {PCI, "PCI"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"}, + {UNKNOWN_BUSTYPE, "---"} }; -char* whereStrings[] = { - "Extended BIOS Data Area", - "BIOS top of memory", - "Default top of memory", - "BIOS", - "Extended BIOS", - "GROPE AREA #1", - "GROPE AREA #2" +char *whereStrings[] = { + "Extended BIOS Data Area", + "BIOS top of memory", + "Default top of memory", + "BIOS", + "Extended BIOS", + "GROPE AREA #1", + "GROPE AREA #2" }; typedef struct TABLE_ENTRY { - uint8_t type; - uint8_t length; - char name[ 32 ]; + uint8_t type; + uint8_t length; + char name[32]; } tableEntry; -tableEntry basetableEntryTypes[] = -{ - { 0, 20, "Processor" }, - { 1, 8, "Bus" }, - { 2, 8, "I/O APIC" }, - { 3, 8, "I/O INT" }, - { 4, 8, "Local INT" } +tableEntry basetableEntryTypes[] = { + {0, 20, "Processor"}, + {1, 8, "Bus"}, + {2, 8, "I/O APIC"}, + {3, 8, "I/O INT"}, + {4, 8, "Local INT"} }; -tableEntry extendedtableEntryTypes[] = -{ - { 128, 20, "System Address Space" }, - { 129, 8, "Bus Heirarchy" }, - { 130, 8, "Compatibility Bus Address" } +tableEntry extendedtableEntryTypes[] = { + {128, 20, "System Address Space"}, + {129, 8, "Bus Heirarchy"}, + {130, 8, "Compatibility Bus Address"} }; /* MP Floating Pointer Structure */ typedef struct MPFPS { - uint8_t signature[ 4 ]; - uint32_t pap; - uint8_t length; - uint8_t spec_rev; - uint8_t checksum; - uint8_t mpfb1; - uint8_t mpfb2; - uint8_t mpfb3; - uint8_t mpfb4; - uint8_t mpfb5; + uint8_t signature[4]; + uint32_t pap; + uint8_t length; + uint8_t spec_rev; + uint8_t checksum; + uint8_t mpfb1; + uint8_t mpfb2; + uint8_t mpfb3; + uint8_t mpfb4; + uint8_t mpfb5; } mpfps_t; /* MP Configuration Table Header */ typedef struct MPCTH { - uint8_t signature[ 4 ]; - uint16_t base_table_length; - uint8_t spec_rev; - uint8_t checksum; - uint8_t oem_id[ 8 ]; - uint8_t product_id[ 12 ]; - uint32_t oem_table_pointer; - uint16_t oem_table_size; - uint16_t entry_count; - uint32_t apic_address; - uint16_t extended_table_length; - uint8_t extended_table_checksum; - uint8_t reserved; + uint8_t signature[4]; + uint16_t base_table_length; + uint8_t spec_rev; + uint8_t checksum; + uint8_t oem_id[8]; + uint8_t product_id[12]; + uint32_t oem_table_pointer; + uint16_t oem_table_size; + uint16_t entry_count; + uint32_t apic_address; + uint16_t extended_table_length; + uint8_t extended_table_checksum; + uint8_t reserved; } mpcth_t; - typedef struct PROCENTRY { - uint8_t type; - uint8_t apicID; - uint8_t apicVersion; - uint8_t cpuFlags; - uint32_t cpuSignature; - uint32_t featureFlags; - uint32_t reserved1; - uint32_t reserved2; + uint8_t type; + uint8_t apicID; + uint8_t apicVersion; + uint8_t cpuFlags; + uint32_t cpuSignature; + uint32_t featureFlags; + uint32_t reserved1; + uint32_t reserved2; } ProcEntry; typedef struct BUSENTRY { - uint8_t type; - uint8_t busID; - uint8_t busType[ 6 ]; + uint8_t type; + uint8_t busID; + uint8_t busType[6]; } BusEntry; typedef struct IOAPICENTRY { - uint8_t type; - uint8_t apicID; - uint8_t apicVersion; - uint8_t apicFlags; - uint32_t apicAddress; + uint8_t type; + uint8_t apicID; + uint8_t apicVersion; + uint8_t apicFlags; + uint32_t apicAddress; } IOApicEntry; typedef struct INTENTRY { - uint8_t type; - uint8_t intType; - uint16_t intFlags; - uint8_t srcBusID; - uint8_t srcBusIRQ; - uint8_t dstApicID; - uint8_t dstApicINT; + uint8_t type; + uint8_t intType; + uint16_t intFlags; + uint8_t srcBusID; + uint8_t srcBusIRQ; + uint8_t dstApicID; + uint8_t dstApicINT; } IntEntry; - /* * extended entry type structures */ typedef struct SASENTRY { - uint8_t type; - uint8_t length; - uint8_t busID; - uint8_t addressType; - uint64_t addressBase; - uint64_t addressLength; + uint8_t type; + uint8_t length; + uint8_t busID; + uint8_t addressType; + uint64_t addressBase; + uint64_t addressLength; } SasEntry; - typedef struct BHDENTRY { - uint8_t type; - uint8_t length; - uint8_t busID; - uint8_t busInfo; - uint8_t busParent; - uint8_t reserved[ 3 ]; + uint8_t type; + uint8_t length; + uint8_t busID; + uint8_t busInfo; + uint8_t busParent; + uint8_t reserved[3]; } BhdEntry; - typedef struct CBASMENTRY { - uint8_t type; - uint8_t length; - uint8_t busID; - uint8_t addressMod; - uint32_t predefinedRange; + uint8_t type; + uint8_t length; + uint8_t busID; + uint8_t addressMod; + uint32_t predefinedRange; } CbasmEntry; - typedef uint32_t vm_offset_t; -static void apic_probe( vm_offset_t* paddr, int* where ); +static void apic_probe(vm_offset_t * paddr, int *where); -static void MPConfigDefault( int featureByte ); +static void MPConfigDefault(int featureByte); -static void MPFloatingPointer( vm_offset_t paddr, int where, mpfps_t* mpfps ); -static void MPConfigTableHeader( uint32_t pap ); +static void MPFloatingPointer(vm_offset_t paddr, int where, mpfps_t * mpfps); +static void MPConfigTableHeader(uint32_t pap); -static int readType( void ); -static void seekEntry( vm_offset_t addr ); -static void readEntry( void* entry, int size ); +static int readType(void); +static void seekEntry(vm_offset_t addr); +static void readEntry(void *entry, int size); -static void processorEntry( void ); -static void busEntry( void ); -static void ioApicEntry( void ); -static void intEntry( void ); -static void lintEntry( void ); +static void processorEntry(void); +static void busEntry(void); +static void ioApicEntry(void); +static void intEntry(void); +static void lintEntry(void); -static void sasEntry( void ); -static void bhdEntry( void ); -static void cbasmEntry( void ); +static void sasEntry(void); +static void bhdEntry(void); +static void cbasmEntry(void); -static void doOptionList( void ); -static void doDmesg( void ); -static void pnstr( uint8_t* s, int c ); +static void doOptionList(void); +static void doDmesg(void); +static void pnstr(uint8_t * s, int c); /* global data */ -int pfd; /* physical /dev/mem fd */ +int pfd; /* physical /dev/mem fd */ -int busses[ 16 ]; -int apics[ 16 ]; +int busses[16]; +int apics[16]; -int ncpu; -int nbus; -int napic; -int nintr; +int ncpu; +int nbus; +int napic; +int nintr; -int dmesg = 0; -int grope = 0; -int verbose = 0; -int noisy = 0; +int dmesg = 0; +int grope = 0; +int verbose = 0; +int noisy = 0; /* preamble to the mptable. This is fixed for all coreboots */ char *preamble[] = { -"#include <console/console.h>", -"#include <arch/smp/mpspec.h>", -"#include <arch/ioapic.h>", -"#include <device/pci.h>", -"#include <string.h>", -"#include <stdint.h>", -"", -"static void *smp_write_config_table(void *v)", -"{", -" struct mp_config_table *mc;", -"", -" mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);", -"", -" mptable_init(mc, \"TODO \", LOCAL_APIC_ADDR);", -"", -" smp_write_processors(mc);", -"", -"", -0 + "#include <console/console.h>", + "#include <arch/smp/mpspec.h>", + "#include <arch/ioapic.h>", + "#include <device/pci.h>", + "#include <string.h>", + "#include <stdint.h>", + "", + "static void *smp_write_config_table(void *v)", + "{", + " struct mp_config_table *mc;", + "", + " mc = (void *)(((char *)v) + SMP_FLOATING_TABLE_LEN);", + "", + " mptable_init(mc, \"TODO \", LOCAL_APIC_ADDR);", + "", + " smp_write_processors(mc);", + "", + "", + 0 }; char *postamble[] = { -" /* Compute the checksums. */", -" mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);", -" mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);", -" printk(BIOS_DEBUG, \"Wrote the mp table end at: %p - %p\\n\",", -" mc, smp_next_mpe_entry(mc));", -" return smp_next_mpe_entry(mc);", -"}", -"", -"unsigned long write_smp_table(unsigned long addr)", -"{", -" void *v;", -" v = smp_write_floating_table(addr);", -" return (unsigned long)smp_write_config_table(v);", -"}", -0 + " /* Compute the checksums. */", + " mc->mpe_checksum = smp_compute_checksum(smp_next_mpc_entry(mc), mc->mpe_length);", + " mc->mpc_checksum = smp_compute_checksum(mc, mc->mpc_length);", + " printk(BIOS_DEBUG, \"Wrote the mp table end at: %p - %p\\n\",", + " mc, smp_next_mpe_entry(mc));", + " return smp_next_mpe_entry(mc);", + "}", + "", + "unsigned long write_smp_table(unsigned long addr)", + "{", + " void *v;", + " v = smp_write_floating_table(addr);", + " return (unsigned long)smp_write_config_table(v);", + "}", + 0 }; -static void -usage( void ) +static void usage(void) { - fprintf( stderr, "usage: mptable [-dmesg] [-verbose] [-grope] [-help]\n" ); - exit( 0 ); + fprintf(stderr, + "usage: mptable [-dmesg] [-verbose] [-grope] [-help]\n"); + exit(0); } -void -write_code(char **code) +void write_code(char **code) { - while (*code) - printf("%s\n", *code++); + while (*code) + printf("%s\n", *code++); } + /* * */ -int -main( int argc, char *argv[] ) +int main(int argc, char *argv[]) { - vm_offset_t paddr; - int where; - mpfps_t mpfps; - int defaultConfig; - - /* announce ourselves */ - - if (verbose) puts( SEP_LINE2 ); - - printf( "/* generated by MPTable, version %d.%d.%d*/\n", VMAJOR, VMINOR, VDELTA ); - printf("/* as modified by RGM for coreboot */\n"); - write_code(preamble); - - /* Ron hates getopt() */ - - for(argc--, argv++; argc; argc--, argv++){ - if ( strcmp( argv[0], "-dmesg") == 0 ) { - dmesg = 1; - } else - if ( strcmp( argv[0], "-help") == 0 ) - { - usage(); - } else - if ( strcmp( argv[0], "-grope") == 0 ){ - grope = 1; - } else if ( strcmp( argv[0], "-verbose") == 0 ) - verbose = 1; - else if ( strcmp( argv[0], "-noisy") == 0 ) - noisy = 1; - else usage(); - } - - /* open physical memory for access to MP structures */ - if ( (pfd = open( "/dev/mem", O_RDONLY )) < 0 ) - err( 1, "mem open" ); - - /* probe for MP structures */ - apic_probe( &paddr, &where ); - if ( where <= 0 ) { - fprintf( stderr, "\n MP FPS NOT found,\n" ); - fprintf( stderr, " suggest trying -grope option!!!\n\n" ); - return 1; - } - - if ( verbose ) - printf( "\n MP FPS found in %s @ physical addr: 0x%08x\n", - whereStrings[ where - 1 ], paddr ); - - if (verbose) puts( SEP_LINE ); - - /* analyze the MP Floating Pointer Structure */ - MPFloatingPointer( paddr, where, &mpfps ); - - if (verbose) puts( SEP_LINE ); - - /* check whether an MP config table exists */ - if ( (defaultConfig = mpfps.mpfb1) ) - MPConfigDefault( defaultConfig ); - else - MPConfigTableHeader( mpfps.pap ); - - /* build "options" entries for the kernel config file */ - if (noisy) - doOptionList(); - - write_code(postamble); - /* do a dmesg output */ - if ( dmesg ) - doDmesg(); - - if (verbose) puts( SEP_LINE2 ); - - return 0; -} + vm_offset_t paddr; + int where; + mpfps_t mpfps; + int defaultConfig; + + /* announce ourselves */ + + if (verbose) + puts(SEP_LINE2); + + printf("/* generated by MPTable, version %d.%d.%d*/\n", VMAJOR, VMINOR, + VDELTA); + printf("/* as modified by RGM for coreboot */\n"); + write_code(preamble); + + /* Ron hates getopt() */ + + for (argc--, argv++; argc; argc--, argv++) { + if (strcmp(argv[0], "-dmesg") == 0) { + dmesg = 1; + } else if (strcmp(argv[0], "-help") == 0) { + usage(); + } else if (strcmp(argv[0], "-grope") == 0) { + grope = 1; + } else if (strcmp(argv[0], "-verbose") == 0) + verbose = 1; + else if (strcmp(argv[0], "-noisy") == 0) + noisy = 1; + else + usage(); + } + + /* open physical memory for access to MP structures */ + if ((pfd = open("/dev/mem", O_RDONLY)) < 0) + err(1, "mem open"); + + /* probe for MP structures */ + apic_probe(&paddr, &where); + if (where <= 0) { + fprintf(stderr, "\n MP FPS NOT found,\n"); + fprintf(stderr, " suggest trying -grope option!!!\n\n"); + return 1; + } + + if (verbose) + printf("\n MP FPS found in %s @ physical addr: 0x%08x\n", + whereStrings[where - 1], paddr); + + if (verbose) + puts(SEP_LINE); + /* analyze the MP Floating Pointer Structure */ + MPFloatingPointer(paddr, where, &mpfps); + + if (verbose) + puts(SEP_LINE); + + /* check whether an MP config table exists */ + if ((defaultConfig = mpfps.mpfb1)) + MPConfigDefault(defaultConfig); + else + MPConfigTableHeader(mpfps.pap); + + /* build "options" entries for the kernel config file */ + if (noisy) + doOptionList(); + + write_code(postamble); + /* do a dmesg output */ + if (dmesg) + doDmesg(); + + if (verbose) + puts(SEP_LINE2); + + return 0; +} /* * set PHYSICAL address of MP floating pointer structure */ #define NEXT(X) ((X) += 4) -static void -apic_probe( vm_offset_t* paddr, int* where ) +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" ); - } - - target = 0; - segment = 0; - if ( verbose ) - printf( " searching for coreboot MP table @ 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; - } - } - - - /* 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; - } + /* + * 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"); } - } - - /* 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 = 0; + segment = 0; + if (verbose) + printf(" searching for coreboot MP table @ 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; + } } - 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; - } + /* 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; + } } - } - *where = 0; - *paddr = (vm_offset_t)0; -} + /* 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 -MPFloatingPointer( vm_offset_t paddr, int where, mpfps_t* mpfps ) +static void MPFloatingPointer(vm_offset_t paddr, int where, mpfps_t * mpfps) { - /* read in mpfps structure*/ - seekEntry( paddr ); - readEntry( mpfps, sizeof( mpfps_t ) ); - - /* show its contents */ - if (verbose) { - printf( "MP Floating Pointer Structure:\n\n" ); - - printf( " location:\t\t\t" ); - switch ( where ) - { - case 1: - printf( "EBDA\n" ); - break; - case 2: - printf( "BIOS base memory\n" ); - break; - case 3: - printf( "DEFAULT base memory (639K)\n" ); - break; - case 4: - printf( "BIOS\n" ); - break; - case 5: - printf( "Extended BIOS\n" ); - break; - - case 0: - printf( "NOT found!\n" ); - exit( 1 ); - default: - printf( "BOGUS!\n" ); - exit( 1 ); - } - printf( " physical address:\t\t0x%08x\n", paddr ); - - printf( " signature:\t\t\t'" ); - pnstr( mpfps->signature, 4 ); - printf( "'\n" ); - - printf( " length:\t\t\t%d bytes\n", mpfps->length * 16 ); - printf( " version:\t\t\t1.%1d\n", mpfps->spec_rev ); - printf( " checksum:\t\t\t0x%02x\n", mpfps->checksum ); - - /* bits 0:6 are RESERVED */ - if ( mpfps->mpfb2 & 0x7f ) { - printf( " warning, MP feature byte 2: 0x%02x\n", mpfps->mpfb2 ); - } - - /* bit 7 is IMCRP */ - printf( " mode:\t\t\t\t%s\n", (mpfps->mpfb2 & 0x80) ? - "PIC" : "Virtual Wire" ); - - /* MP feature bytes 3-5 are expected to be ZERO */ - if ( mpfps->mpfb3 ) - printf( " warning, MP feature byte 3 NONZERO!\n" ); - if ( mpfps->mpfb4 ) - printf( " warning, MP feature byte 4 NONZERO!\n" ); - if ( mpfps->mpfb5 ) - printf( " warning, MP feature byte 5 NONZERO!\n" ); - } + /* read in mpfps structure */ + seekEntry(paddr); + readEntry(mpfps, sizeof(mpfps_t)); + + /* show its contents */ + if (verbose) { + printf("MP Floating Pointer Structure:\n\n"); + + printf(" location:\t\t\t"); + switch (where) { + case 1: + printf("EBDA\n"); + break; + case 2: + printf("BIOS base memory\n"); + break; + case 3: + printf("DEFAULT base memory (639K)\n"); + break; + case 4: + printf("BIOS\n"); + break; + case 5: + printf("Extended BIOS\n"); + break; + + case 0: + printf("NOT found!\n"); + exit(1); + default: + printf("BOGUS!\n"); + exit(1); + } + printf(" physical address:\t\t0x%08x\n", paddr); + + printf(" signature:\t\t\t'"); + pnstr(mpfps->signature, 4); + printf("'\n"); + + printf(" length:\t\t\t%d bytes\n", mpfps->length * 16); + printf(" version:\t\t\t1.%1d\n", mpfps->spec_rev); + printf(" checksum:\t\t\t0x%02x\n", mpfps->checksum); + + /* bits 0:6 are RESERVED */ + if (mpfps->mpfb2 & 0x7f) { + printf(" warning, MP feature byte 2: 0x%02x\n", + mpfps->mpfb2); + } + + /* bit 7 is IMCRP */ + printf(" mode:\t\t\t\t%s\n", (mpfps->mpfb2 & 0x80) ? + "PIC" : "Virtual Wire"); + + /* MP feature bytes 3-5 are expected to be ZERO */ + if (mpfps->mpfb3) + printf(" warning, MP feature byte 3 NONZERO!\n"); + if (mpfps->mpfb4) + printf(" warning, MP feature byte 4 NONZERO!\n"); + if (mpfps->mpfb5) + printf(" warning, MP feature byte 5 NONZERO!\n"); + } } - /* * */ -static void -MPConfigDefault( int featureByte ) +static void MPConfigDefault(int featureByte) { - printf( " MP default config type: %d\n\n", featureByte ); - switch ( featureByte ) { - case 1: - printf( " bus: ISA, APIC: 82489DX\n" ); - break; - case 2: - printf( " bus: EISA, APIC: 82489DX\n" ); - break; - case 3: - printf( " bus: EISA, APIC: 82489DX\n" ); - break; - case 4: - printf( " bus: MCA, APIC: 82489DX\n" ); - break; - case 5: - printf( " bus: ISA+PCI, APIC: Integrated\n" ); - break; - case 6: - printf( " bus: EISA+PCI, APIC: Integrated\n" ); - break; - case 7: - printf( " bus: MCA+PCI, APIC: Integrated\n" ); - break; - default: - printf( " future type\n" ); - break; - } - - switch ( featureByte ) { - case 1: - case 2: - case 3: - case 4: - nbus = 1; - break; - case 5: - case 6: - case 7: - nbus = 2; - break; - default: - printf( " future type\n" ); - break; - } - - ncpu = 2; - napic = 1; - nintr = 16; -} + printf(" MP default config type: %d\n\n", featureByte); + switch (featureByte) { + case 1: + printf(" bus: ISA, APIC: 82489DX\n"); + break; + case 2: + printf(" bus: EISA, APIC: 82489DX\n"); + break; + case 3: + printf(" bus: EISA, APIC: 82489DX\n"); + break; + case 4: + printf(" bus: MCA, APIC: 82489DX\n"); + break; + case 5: + printf(" bus: ISA+PCI, APIC: Integrated\n"); + break; + case 6: + printf(" bus: EISA+PCI, APIC: Integrated\n"); + break; + case 7: + printf(" bus: MCA+PCI, APIC: Integrated\n"); + break; + default: + printf(" future type\n"); + break; + } + switch (featureByte) { + case 1: + case 2: + case 3: + case 4: + nbus = 1; + break; + case 5: + case 6: + case 7: + nbus = 2; + break; + default: + printf(" future type\n"); + break; + } + + ncpu = 2; + napic = 1; + nintr = 16; +} /* * */ -static void -MPConfigTableHeader( uint32_t pap ) +static void MPConfigTableHeader(uint32_t pap) { - vm_offset_t paddr; - mpcth_t cth; - int x; - int totalSize; - int count, c; - int type; - - if ( pap == 0 ) { - printf( "MP Configuration Table Header MISSING!\n" ); - exit( 1 ); - } - - /* convert physical address to virtual address */ - paddr = (vm_offset_t)pap; - - /* read in cth structure */ - seekEntry( paddr ); - readEntry( &cth, sizeof( cth ) ); - - if (verbose) { - printf( "MP Config Table Header:\n\n" ); - - printf( " physical address:\t\t0x%08x\n", pap ); - - printf( " signature:\t\t\t'" ); - pnstr( cth.signature, 4 ); - printf( "'\n" ); - - printf( " base table length:\t\t%d\n", cth.base_table_length ); - - printf( " version:\t\t\t1.%1d\n", cth.spec_rev ); - printf( " checksum:\t\t\t0x%02x\n", cth.checksum ); - - printf( " OEM ID:\t\t\t'" ); - pnstr( cth.oem_id, 8 ); - printf( "'\n" ); - - printf( " Product ID:\t\t\t'" ); - pnstr( cth.product_id, 12 ); - printf( "'\n" ); - - printf( " OEM table pointer:\t\t0x%08x\n", cth.oem_table_pointer ); - printf( " OEM table size:\t\t%d\n", cth.oem_table_size ); - - printf( " entry count:\t\t\t%d\n", cth.entry_count ); - - printf( " local APIC address:\t\t0x%08x\n", cth.apic_address ); - - printf( " extended table length:\t%d\n", cth.extended_table_length ); - printf( " extended table checksum:\t%d\n", cth.extended_table_checksum ); - } - - totalSize = cth.base_table_length - sizeof( struct MPCTH ); - count = cth.entry_count; - - if (verbose) { - if (verbose) puts( SEP_LINE ); - - printf( "MP Config Base Table Entries:\n\n" ); - } - - /* initialze tables */ - for ( x = 0; x < 16; ++x ) { - busses[ x ] = apics[ x ] = 0xff; - } - - ncpu = 0; - nbus = 0; - napic = 0; - nintr = 0; - - /* process all the CPUs */ - if (verbose) { - printf( "--\nProcessors:\tAPIC ID\tVersion\tState" - "\t\tFamily\tModel\tStep\tFlags\n" ); - } - for ( c = count; c; c-- ) { - if ( readType() == 0 ) - processorEntry(); - totalSize -= basetableEntryTypes[ 0 ].length; - } - - /* process all the busses */ - printf( "/*Bus:\t\tBus ID\tType*/\n" ); - for ( c = count; c; c-- ) { - if ( readType() == 1 ) - busEntry(); - totalSize -= basetableEntryTypes[ 1 ].length; - } - - /* process all the apics */ - printf( "/*I/O APICs:\tAPIC ID\tVersion\tState\t\tAddress*/\n" ); - for ( c = count; c; c-- ) { - if ( readType() == 2 ) - ioApicEntry(); - totalSize -= basetableEntryTypes[ 2 ].length; - } - - /* process all the I/O Ints */ - printf( "/*I/O Ints:\tType\tPolarity Trigger\tBus ID\t IRQ\tAPIC ID\tPIN#\n*/" ); - for ( c = count; c; c-- ) { - if ( readType() == 3 ) - intEntry(); - totalSize -= basetableEntryTypes[ 3 ].length; - } - - /* process all the Local Ints */ - printf( "/*Local Ints:\tType\tPolarity Trigger\tBus ID\t IRQ\tAPIC ID\tPIN#*/\n" ); - for ( c = count; c; c-- ) { - if ( readType() == 4 ) - lintEntry(); - totalSize -= basetableEntryTypes[ 4 ].length; - } + vm_offset_t paddr; + mpcth_t cth; + int x; + int totalSize; + int count, c; + int type; + + if (pap == 0) { + printf("MP Configuration Table Header MISSING!\n"); + exit(1); + } + /* convert physical address to virtual address */ + paddr = (vm_offset_t) pap; -#if defined( EXTENDED_PROCESSING_READY ) - /* process any extended data */ - if ( (totalSize = cth.extended_table_length) ) { - if (verbose) puts( SEP_LINE ); + /* read in cth structure */ + seekEntry(paddr); + readEntry(&cth, sizeof(cth)); - printf( "MP Config Extended Table Entries:\n\n" ); + if (verbose) { + printf("MP Config Table Header:\n\n"); - while ( totalSize > 0 ) { - switch ( type = readType() ) { - case 128: - sasEntry(); - break; - case 129: - bhdEntry(); - break; - case 130: - cbasmEntry(); - break; - default: - printf( "Extended Table HOSED!\n" ); - exit( 1 ); - } - - totalSize -= extendedtableEntryTypes[ type-128 ].length; - } - } -#endif /* EXTENDED_PROCESSING_READY */ - - /* process any OEM data */ - if ( cth.oem_table_pointer && (cth.oem_table_size > 0) ) { + printf(" physical address:\t\t0x%08x\n", pap); + + printf(" signature:\t\t\t'"); + pnstr(cth.signature, 4); + printf("'\n"); + + printf(" base table length:\t\t%d\n", cth.base_table_length); + + printf(" version:\t\t\t1.%1d\n", cth.spec_rev); + printf(" checksum:\t\t\t0x%02x\n", cth.checksum); + + printf(" OEM ID:\t\t\t'"); + pnstr(cth.oem_id, 8); + printf("'\n"); + + printf(" Product ID:\t\t\t'"); + pnstr(cth.product_id, 12); + printf("'\n"); + + printf(" OEM table pointer:\t\t0x%08x\n", + cth.oem_table_pointer); + printf(" OEM table size:\t\t%d\n", cth.oem_table_size); + + printf(" entry count:\t\t\t%d\n", cth.entry_count); + + printf(" local APIC address:\t\t0x%08x\n", cth.apic_address); + + printf(" extended table length:\t%d\n", + cth.extended_table_length); + printf(" extended table checksum:\t%d\n", + cth.extended_table_checksum); + } + + totalSize = cth.base_table_length - sizeof(struct MPCTH); + count = cth.entry_count; + + if (verbose) { + if (verbose) + puts(SEP_LINE); + + printf("MP Config Base Table Entries:\n\n"); + } + + /* initialze tables */ + for (x = 0; x < 16; ++x) { + busses[x] = apics[x] = 0xff; + } + + ncpu = 0; + nbus = 0; + napic = 0; + nintr = 0; + + /* process all the CPUs */ + if (verbose) { + printf("--\nProcessors:\tAPIC ID\tVersion\tState" + "\t\tFamily\tModel\tStep\tFlags\n"); + } + for (c = count; c; c--) { + if (readType() == 0) + processorEntry(); + totalSize -= basetableEntryTypes[0].length; + } + + /* process all the busses */ + printf("/*Bus:\t\tBus ID\tType*/\n"); + for (c = count; c; c--) { + if (readType() == 1) + busEntry(); + totalSize -= basetableEntryTypes[1].length; + } + + /* process all the apics */ + printf("/*I/O APICs:\tAPIC ID\tVersion\tState\t\tAddress*/\n"); + for (c = count; c; c--) { + if (readType() == 2) + ioApicEntry(); + totalSize -= basetableEntryTypes[2].length; + } + + /* process all the I/O Ints */ + printf + ("/*I/O Ints:\tType\tPolarity Trigger\tBus ID\t IRQ\tAPIC ID\tPIN#\n*/"); + for (c = count; c; c--) { + if (readType() == 3) + intEntry(); + totalSize -= basetableEntryTypes[3].length; + } + + /* process all the Local Ints */ + printf + ("/*Local Ints:\tType\tPolarity Trigger\tBus ID\t IRQ\tAPIC ID\tPIN#*/\n"); + for (c = count; c; c--) { + if (readType() == 4) + lintEntry(); + totalSize -= basetableEntryTypes[4].length; + } + +#if defined( EXTENDED_PROCESSING_READY ) + /* process any extended data */ + if ((totalSize = cth.extended_table_length)) { + if (verbose) + puts(SEP_LINE); + + printf("MP Config Extended Table Entries:\n\n"); + + while (totalSize > 0) { + switch (type = readType()) { + case 128: + sasEntry(); + break; + case 129: + bhdEntry(); + break; + case 130: + cbasmEntry(); + break; + default: + printf("Extended Table HOSED!\n"); + exit(1); + } + + totalSize -= extendedtableEntryTypes[type - 128].length; + } + } +#endif /* EXTENDED_PROCESSING_READY */ + + /* process any OEM data */ + if (cth.oem_table_pointer && (cth.oem_table_size > 0)) { #if defined( OEM_PROCESSING_READY ) -# error your on your own here! - /* convert OEM table pointer to virtual address */ - poemtp = (vm_offset_t)cth.oem_table_pointer; +#error your on your own here! + /* convert OEM table pointer to virtual address */ + poemtp = (vm_offset_t) cth.oem_table_pointer; - /* read in oem table structure */ - if ( (oemdata = (void*)malloc( cth.oem_table_size )) == NULL ) - err( 1, "oem malloc" ); + /* read in oem table structure */ + if ((oemdata = (void *)malloc(cth.oem_table_size)) == NULL) + err(1, "oem malloc"); - seekEntry( poemtp ); - readEntry( oemdata, cth.oem_table_size ); + seekEntry(poemtp); + readEntry(oemdata, cth.oem_table_size); - /** process it */ + /** process it */ - free( oemdata ); + free(oemdata); #else - printf( "\nyou need to modify the source to handle OEM data!\n\n" ); -#endif /* OEM_PROCESSING_READY */ - } + printf + ("\nyou need to modify the source to handle OEM data!\n\n"); +#endif /* OEM_PROCESSING_READY */ + } - fflush( stdout ); + fflush(stdout); #if defined( RAW_DUMP ) -{ - int ofd; - u_char dumpbuf[ 4096 ]; - - ofd = open( "/tmp/mpdump", O_CREAT | O_RDWR ); - seekEntry( paddr ); - readEntry( dumpbuf, 1024 ); - write( ofd, dumpbuf, 1024 ); - close( ofd ); -} -#endif /* RAW_DUMP */ + { + int ofd; + u_char dumpbuf[4096]; + + ofd = open("/tmp/mpdump", O_CREAT | O_RDWR); + seekEntry(paddr); + readEntry(dumpbuf, 1024); + write(ofd, dumpbuf, 1024); + close(ofd); + } +#endif /* RAW_DUMP */ } - /* * */ -static int -readType( void ) +static int readType(void) { - u_char type; + u_char type; - if ( read( pfd, &type, sizeof( u_char ) ) != sizeof( u_char ) ) - err( 1, "type read; pfd: %d", pfd ); + if (read(pfd, &type, sizeof(u_char)) != sizeof(u_char)) + err(1, "type read; pfd: %d", pfd); - if ( lseek( pfd, -1, SEEK_CUR ) < 0 ) - err( 1, "type seek" ); + if (lseek(pfd, -1, SEEK_CUR) < 0) + err(1, "type seek"); - return (int)type; + return (int)type; } - /* * */ -static void -seekEntry( vm_offset_t addr ) +static void seekEntry(vm_offset_t addr) { - if ( lseek( pfd, (off_t)addr, SEEK_SET ) < 0 ) - err( 1, "/dev/mem seek" ); + if (lseek(pfd, (off_t) addr, SEEK_SET) < 0) + err(1, "/dev/mem seek"); } - /* * */ -static void -readEntry( void* entry, int size ) +static void readEntry(void *entry, int size) { - if ( read( pfd, entry, size ) != size ) - err( 1, "readEntry" ); + if (read(pfd, entry, size) != size) + err(1, "readEntry"); } - -static void -processorEntry( void ) +static void processorEntry(void) { - ProcEntry entry; + ProcEntry entry; - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); - /* count it */ - ++ncpu; - if (noisy) { - printf( "\t\t%2d", entry.apicID ); - printf( "\t 0x%2x", entry.apicVersion ); + /* count it */ + ++ncpu; + if (noisy) { + printf("\t\t%2d", entry.apicID); + printf("\t 0x%2x", entry.apicVersion); - printf( "\t %s, %s", - (entry.cpuFlags & PROCENTRY_FLAG_BP) ? "BSP" : "AP", - (entry.cpuFlags & PROCENTRY_FLAG_EN) ? "usable" : "unusable" ); + printf("\t %s, %s", + (entry.cpuFlags & PROCENTRY_FLAG_BP) ? "BSP" : "AP", + (entry. + cpuFlags & PROCENTRY_FLAG_EN) ? "usable" : "unusable"); - printf( "\t %d\t %d\t %d", - (entry.cpuSignature >> 8) & 0x0f, - (entry.cpuSignature >> 4) & 0x0f, - entry.cpuSignature & 0x0f ); + printf("\t %d\t %d\t %d", + (entry.cpuSignature >> 8) & 0x0f, + (entry.cpuSignature >> 4) & 0x0f, + entry.cpuSignature & 0x0f); - printf( "\t 0x%04x\n", entry.featureFlags ); - } + printf("\t 0x%04x\n", entry.featureFlags); + } } - /* * */ -static int -lookupBusType( char* name ) +static int lookupBusType(char *name) { - int x; + int x; - for ( x = 0; x < MAX_BUSTYPE; ++x ) - if ( strcmp( busTypeTable[ x ].name, name ) == 0 ) - return busTypeTable[ x ].type; + for (x = 0; x < MAX_BUSTYPE; ++x) + if (strcmp(busTypeTable[x].name, name) == 0) + return busTypeTable[x].type; - return UNKNOWN_BUSTYPE; + return UNKNOWN_BUSTYPE; } - -static void -busEntry( void ) +static void busEntry(void) { - char name[ 8 ]; - BusEntry entry; + char name[8]; + BusEntry entry; - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); - /* count it */ - ++nbus; + /* count it */ + ++nbus; - if (verbose) { - printf( "\t\t%2d", entry.busID ); - printf( "\t " ); pnstr( entry.busType, 6 ); printf( "\n" ); - } + if (verbose) { + printf("\t\t%2d", entry.busID); + printf("\t "); + pnstr(entry.busType, 6); + printf("\n"); + } - memset(name, '\0', sizeof(name)); - strncpy(name, (char *)entry.busType, 6); + memset(name, '\0', sizeof(name)); + strncpy(name, (char *)entry.busType, 6); - busses[ entry.busID ] = lookupBusType( name ); - printf("\tsmp_write_bus(mc, %d, \"", entry.busID); - pnstr( entry.busType, 6 ); - printf("\");\n"); + busses[entry.busID] = lookupBusType(name); + printf("\tsmp_write_bus(mc, %d, \"", entry.busID); + pnstr(entry.busType, 6); + printf("\");\n"); } - -static void -ioApicEntry( void ) +static void ioApicEntry(void) { - IOApicEntry entry; - - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); - - /* count it */ - ++napic; - - if (noisy) { - printf( "\t\t%2d", entry.apicID ); - printf( "\t 0x%02x", entry.apicVersion ); - printf( "\t %s", - (entry.apicFlags & IOAPICENTRY_FLAG_EN) ? "usable" : "unusable" ); - printf( "\t\t 0x%x\n", entry.apicAddress ); - } + IOApicEntry entry; + + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); + + /* count it */ + ++napic; + + if (noisy) { + printf("\t\t%2d", entry.apicID); + printf("\t 0x%02x", entry.apicVersion); + printf("\t %s", + (entry. + apicFlags & IOAPICENTRY_FLAG_EN) ? "usable" : + "unusable"); + printf("\t\t 0x%x\n", entry.apicAddress); + } - apics[ entry.apicID ] = entry.apicID; + apics[entry.apicID] = entry.apicID; - if (entry.apicFlags & IOAPICENTRY_FLAG_EN) - printf("\tsmp_write_ioapic(mc, 0x%x, 0x%x, 0x%x);\n", - entry.apicID, entry.apicVersion, entry.apicAddress); + if (entry.apicFlags & IOAPICENTRY_FLAG_EN) + printf("\tsmp_write_ioapic(mc, 0x%x, 0x%x, 0x%x);\n", + entry.apicID, entry.apicVersion, entry.apicAddress); } - -char* intTypes[] = { - "mp_INT", "mp_NMI", "mp_SMI", "mp_ExtINT" +char *intTypes[] = { + "mp_INT", "mp_NMI", "mp_SMI", "mp_ExtINT" }; -char* polarityMode[] = { - "MP_IRQ_POLARITY_DEFAULT", "MP_IRQ_POLARITY_HIGH", "reserved", "MP_IRQ_POLARITY_LOW" +char *polarityMode[] = { + "MP_IRQ_POLARITY_DEFAULT", "MP_IRQ_POLARITY_HIGH", "reserved", + "MP_IRQ_POLARITY_LOW" }; -char* triggerMode[] = { - "MP_IRQ_TRIGGER_DEFAULT", "MP_IRQ_TRIGGER_EDGE", "reserved", "MP_IRQ_TRIGGER_LEVEL" + +char *triggerMode[] = { + "MP_IRQ_TRIGGER_DEFAULT", "MP_IRQ_TRIGGER_EDGE", "reserved", + "MP_IRQ_TRIGGER_LEVEL" }; -static void -intEntry( void ) +static void intEntry(void) { - IntEntry entry; - - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); - - /* count it */ - if ( (int)entry.type == 3 ) - ++nintr; - - if (noisy) { - printf( "\n\t\t%s", intTypes[ (int)entry.intType ] ); - - printf( "\t%9s", polarityMode[ (int)entry.intFlags & 0x03 ] ); - printf( "%12s", triggerMode[ ((int)entry.intFlags >> 2) & 0x03 ] ); - - printf( "\t %5d", (int)entry.srcBusID ); - if ( busses[ (int)entry.srcBusID ] == PCI ) - printf( "\t%2d:%c", - ((int)entry.srcBusIRQ >> 2) & 0x1f, - ((int)entry.srcBusIRQ & 0x03) + 'A' ); - else - printf( "\t 0x%x:0x%x(0x%x)", - (int)entry.srcBusIRQ>>2, - (int)entry.srcBusIRQ & 3, - (int)entry.srcBusIRQ ); - printf( "\t %6d", (int)entry.dstApicID ); - printf( "\t %3d\n", (int)entry.dstApicINT ); - } - printf("\tsmp_write_intsrc(mc, %s, %s|%s, 0x%x, 0x%x, 0x%x, 0x%x);\n", - intTypes[ (int)entry.intType ], - triggerMode[ ((int)entry.intFlags >> 2) & 0x03 ] , - polarityMode[ (int)entry.intFlags & 0x03 ], - (int)entry.srcBusID, - (int)entry.srcBusIRQ, - (int)entry.dstApicID , - (int)entry.dstApicINT ); + IntEntry entry; + + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); + + /* count it */ + if ((int)entry.type == 3) + ++nintr; + + if (noisy) { + printf("\n\t\t%s", intTypes[(int)entry.intType]); + + printf("\t%9s", polarityMode[(int)entry.intFlags & 0x03]); + printf("%12s", triggerMode[((int)entry.intFlags >> 2) & 0x03]); + + printf("\t %5d", (int)entry.srcBusID); + if (busses[(int)entry.srcBusID] == PCI) + printf("\t%2d:%c", + ((int)entry.srcBusIRQ >> 2) & 0x1f, + ((int)entry.srcBusIRQ & 0x03) + 'A'); + else + printf("\t 0x%x:0x%x(0x%x)", + (int)entry.srcBusIRQ >> 2, + (int)entry.srcBusIRQ & 3, (int)entry.srcBusIRQ); + printf("\t %6d", (int)entry.dstApicID); + printf("\t %3d\n", (int)entry.dstApicINT); + } + printf("\tsmp_write_intsrc(mc, %s, %s|%s, 0x%x, 0x%x, 0x%x, 0x%x);\n", + intTypes[(int)entry.intType], + triggerMode[((int)entry.intFlags >> 2) & 0x03], + polarityMode[(int)entry.intFlags & 0x03], + (int)entry.srcBusID, + (int)entry.srcBusIRQ, + (int)entry.dstApicID, (int)entry.dstApicINT); } -static void -lintEntry( void ) +static void lintEntry(void) { - IntEntry entry; - - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); - - /* count it */ - if ( (int)entry.type == 3 ) - ++nintr; - - if (noisy) { - printf( "\t\t%s", intTypes[ (int)entry.intType ] ); - - printf( "\t%9s", polarityMode[ (int)entry.intFlags & 0x03 ] ); - printf( "%12s", triggerMode[ ((int)entry.intFlags >> 2) & 0x03 ] ); - - printf( "\t %5d", (int)entry.srcBusID ); - if ( busses[ (int)entry.srcBusID ] == PCI ) - printf( "\t%2d:%c", - ((int)entry.srcBusIRQ >> 2) & 0x1f, - ((int)entry.srcBusIRQ & 0x03) + 'A' ); - else - printf( "\t %3d", (int)entry.srcBusIRQ ); - printf( "\t %6d", (int)entry.dstApicID ); - printf( "\t %3d\n", (int)entry.dstApicINT ); - } - printf("\tsmp_write_lintsrc(mc, %s, %s|%s, 0x%x, 0x%x, MP_APIC_ALL, 0x%x);\n", - intTypes[ (int)entry.intType ], - triggerMode[ ((int)entry.intFlags >> 2) & 0x03 ] , - polarityMode[ (int)entry.intFlags & 0x03 ], - (int)entry.srcBusID, - (int)entry.srcBusIRQ, - (int)entry.dstApicINT ); + IntEntry entry; + + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); + + /* count it */ + if ((int)entry.type == 3) + ++nintr; + + if (noisy) { + printf("\t\t%s", intTypes[(int)entry.intType]); + + printf("\t%9s", polarityMode[(int)entry.intFlags & 0x03]); + printf("%12s", triggerMode[((int)entry.intFlags >> 2) & 0x03]); + + printf("\t %5d", (int)entry.srcBusID); + if (busses[(int)entry.srcBusID] == PCI) + printf("\t%2d:%c", + ((int)entry.srcBusIRQ >> 2) & 0x1f, + ((int)entry.srcBusIRQ & 0x03) + 'A'); + else + printf("\t %3d", (int)entry.srcBusIRQ); + printf("\t %6d", (int)entry.dstApicID); + printf("\t %3d\n", (int)entry.dstApicINT); + } + printf + ("\tsmp_write_lintsrc(mc, %s, %s|%s, 0x%x, 0x%x, MP_APIC_ALL, 0x%x);\n", + intTypes[(int)entry.intType], + triggerMode[((int)entry.intFlags >> 2) & 0x03], + polarityMode[(int)entry.intFlags & 0x03], (int)entry.srcBusID, + (int)entry.srcBusIRQ, (int)entry.dstApicINT); } - -static void -sasEntry( void ) +static void sasEntry(void) { - SasEntry entry; - - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); - - printf( "--\n%s\n", extendedtableEntryTypes[ entry.type - 128 ].name ); - printf( " bus ID: %d", entry.busID ); - printf( " address type: " ); - switch ( entry.addressType ) { - case 0: - printf( "I/O address\n" ); - break; - case 1: - printf( "memory address\n" ); - break; - case 2: - printf( "prefetch address\n" ); - break; - default: - printf( "UNKNOWN type\n" ); - break; - } - - printf( " address base: 0x%lx\n", entry.addressBase ); - printf( " address range: 0x%lx\n", entry.addressLength ); -} + SasEntry entry; + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); -static void -bhdEntry( void ) + printf("--\n%s\n", extendedtableEntryTypes[entry.type - 128].name); + printf(" bus ID: %d", entry.busID); + printf(" address type: "); + switch (entry.addressType) { + case 0: + printf("I/O address\n"); + break; + case 1: + printf("memory address\n"); + break; + case 2: + printf("prefetch address\n"); + break; + default: + printf("UNKNOWN type\n"); + break; + } + + printf(" address base: 0x%lx\n", entry.addressBase); + printf(" address range: 0x%lx\n", entry.addressLength); +} + +static void bhdEntry(void) { - BhdEntry entry; + BhdEntry entry; - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); - printf( "--\n%s\n", extendedtableEntryTypes[ entry.type - 128 ].name ); - printf( " bus ID: %d", entry.busID ); - printf( " bus info: 0x%02x", entry.busInfo ); - printf( " parent bus ID: %d", entry.busParent ); + printf("--\n%s\n", extendedtableEntryTypes[entry.type - 128].name); + printf(" bus ID: %d", entry.busID); + printf(" bus info: 0x%02x", entry.busInfo); + printf(" parent bus ID: %d", entry.busParent); } - -static void -cbasmEntry( void ) +static void cbasmEntry(void) { - CbasmEntry entry; + CbasmEntry entry; - /* read it into local memory */ - readEntry( &entry, sizeof( entry ) ); + /* read it into local memory */ + readEntry(&entry, sizeof(entry)); - printf( "--\n%s\n", extendedtableEntryTypes[ entry.type - 128 ].name ); - printf( " bus ID: %d", entry.busID ); - printf( " address modifier: %s\n", (entry.addressMod & 0x01) ? - "subtract" : "add" ); - printf( " predefined range: 0x%08x", entry.predefinedRange ); + printf("--\n%s\n", extendedtableEntryTypes[entry.type - 128].name); + printf(" bus ID: %d", entry.busID); + printf(" address modifier: %s\n", (entry.addressMod & 0x01) ? + "subtract" : "add"); + printf(" predefined range: 0x%08x", entry.predefinedRange); } - /* * do a dmesg output */ -static void -doDmesg( void ) +static void doDmesg(void) { - if (verbose) puts( SEP_LINE ); + if (verbose) + puts(SEP_LINE); - printf( "dmesg output:\n\n" ); - fflush( stdout ); - system( "dmesg" ); + printf("dmesg output:\n\n"); + fflush(stdout); + system("dmesg"); } - /* * build "options" entries for the kernel config file */ -static void -doOptionList( void ) +static void doOptionList(void) { - if (verbose) puts( SEP_LINE ); - - printf( "# SMP kernel config file options:\n\n" ); - printf( "\n# Required:\n" ); - printf( "options SMP\t\t\t# Symmetric MultiProcessor Kernel\n" ); - printf( "options APIC_IO\t\t\t# Symmetric (APIC) I/O\n" ); - - printf( "\n# Optional (built-in defaults will work in most cases):\n" ); - printf( "#options NCPU=%d\t\t\t# number of CPUs\n", ncpu ); - printf( "#options NBUS=%d\t\t\t# number of busses\n", nbus ); - printf( "#options NAPIC=%d\t\t\t# number of IO APICs\n", napic ); - printf( "#options NINTR=%d\t\t# number of INTs\n", - (nintr < 24) ? 24 : nintr ); + if (verbose) + puts(SEP_LINE); + + printf("# SMP kernel config file options:\n\n"); + printf("\n# Required:\n"); + printf("options SMP\t\t\t# Symmetric MultiProcessor Kernel\n"); + printf("options APIC_IO\t\t\t# Symmetric (APIC) I/O\n"); + + printf("\n# Optional (built-in defaults will work in most cases):\n"); + printf("#options NCPU=%d\t\t\t# number of CPUs\n", ncpu); + printf("#options NBUS=%d\t\t\t# number of busses\n", + nbus); + printf("#options NAPIC=%d\t\t\t# number of IO APICs\n", + napic); + printf("#options NINTR=%d\t\t# number of INTs\n", + (nintr < 24) ? 24 : nintr); } - /* * */ -static void -pnstr( uint8_t* s, int c ) +static void pnstr(uint8_t * s, int c) { - uint8_t string[ MAXPNSTR + 1 ]; + uint8_t string[MAXPNSTR + 1]; - if ( c > MAXPNSTR ) - c = MAXPNSTR; - strncpy( (char *)string, (char *)s, c ); - string[ c ] = '\0'; - printf( "%s", string ); + if (c > MAXPNSTR) + c = MAXPNSTR; + strncpy((char *)string, (char *)s, c); + string[c] = '\0'; + printf("%s", string); } |