Date: Thu, 05 Dec 1996 09:51:49 -0700 From: Steve Passe <smp@csn.net> To: "Erich Boleyn,,,," <erich@uruk.org> Cc: Terje Normann Marthinussen <Terje.N.Marthinussen@cc.uit.no>, smp@freebsd.org Subject: Re: >2 CPU SMP test Message-ID: <199612051651.JAA13340@clem.systemsix.com> In-Reply-To: Your message of "Thu, 05 Dec 1996 08:22:06 PST." <E0vVgYo-0004vc-00@uruk.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Hi, > What part of the CMOS memory do you use for the SMP boot test? > > Erich Boleyn > <erich@uruk.org> 0x34-0x39, my BIOS book shows 0x34-0x3f as "reserved" Terje just reported: check: 99, 99, 99, 99, 99, 99 check: 1, 2, 3, 4, 5, 99 < AP 1 ran OK check: 99, 99, 99, 99, 99, 99 Application Processor #3 failed! ^ PHY# == LOG 2 check: 99, 99, 99, 99, 99, 99 < AP 2 failed to even start check: 99, 99, 99, 99, 99, 99 Application Processor #4 failed! ^ PHY# == LOG 3 check: 99, 99, 99, 99, 99, 99 < AP 3 failed to even start --- the very fisrt instructions run by the AP are: NON_GPROF_ENTRY(bootMP) cli CHECK(0x34,1) we see that the 1st AP had no problem setting it. but we see the initial 99 still in that checkpoint for the 2nd/3rd APs. from a previous test I had Terje run we proved that AP 3 (ie the last AP) can run by reversing the order of the loop calling startAP(). In that test AP3 ran, AP2 and AP1 failed. So its NOT specific CPUs, its launching more than 1 AP that breaks. some possible reasons: the bootstrap code, bootMP & MPentry, gets corrupted by being run the 1st time. the code in startAP() somehow leaves its APIC registers in a state where a second run of startAP() doesn't function the same. the first run of startAP() somehow affects all APs, leaving them in a state where they can't respond properly. (partially INITed, or ?) ??? one good test of several of the above would be to modify startAllAPs()" /* install the AP 1st level boot code */ installApTramp( bootAddr ); /* save the current value of the warm-start vector */ mpbioswarmvec = *((u_long*)WARMBOOT_OFF); outb( CMOS_REG, BIOS_RESET ); mpbiosreason = inb( CMOS_DATA ); /* setup a vector to our boot code */ *((volatile u_short *)WARMBOOT_OFF) = WARMBOOT_TARGET; *((volatile u_short *)WARMBOOT_SEG) = (bootAddr >> 4); outb( CMOS_REG, BIOS_RESET ); outb( CMOS_DATA, BIOS_WARM ); /* write 'warm-start' */ /* start each AP */ for ( x = 1; x <= mp_naps; ++x ) { startAP( CPU_TO_ID( x ), (bootAddr >> 12) & 0xff ); cpuApicVersions[ x ] = cpuApicVersions[ 0 ]; } to: /* save the current value of the warm-start vector */ mpbioswarmvec = *((u_long*)WARMBOOT_OFF); outb( CMOS_REG, BIOS_RESET ); mpbiosreason = inb( CMOS_DATA ); /* start each AP */ for ( x = 1; x <= mp_naps; ++x ) { /* install the AP 1st level boot code */ installApTramp( bootAddr ); /* setup a vector to our boot code */ *((volatile u_short *)WARMBOOT_OFF) = WARMBOOT_TARGET; *((volatile u_short *)WARMBOOT_SEG) = (bootAddr >> 4); outb( CMOS_REG, BIOS_RESET ); outb( CMOS_DATA, BIOS_WARM ); /* write 'warm-start' */ startAP( CPU_TO_ID( x ), (bootAddr >> 12) & 0xff ); cpuApicVersions[ x ] = cpuApicVersions[ 0 ]; } -- what we are doing here is reloading the trampoline code each pass and reloading the WARM BOOT vector incase the short "warm boot" section of BIOS run by the APs is changing that address/reason out from under us. for the first test I would NOT do the installApTramp() each time, its the least likely of the 2 to be wrong, and I'm not sure if it will 'install' cleanly 2 times in a row as it is modified in place for runtime addreses. It probably will re-install, but I would have to review to be sure. -- Steve Passe | powered by smp@csn.net | FreeBSD -----BEGIN PGP PUBLIC KEY BLOCK----- Version: 2.6.2 mQCNAzHe7tEAAAEEAM274wAEEdP+grIrV6UtBt54FB5ufifFRA5ujzflrvlF8aoE 04it5BsUPFi3jJLfvOQeydbegexspPXL6kUejYt2OeptHuroIVW5+y2M2naTwqtX WVGeBP6s2q/fPPAS+g+sNZCpVBTbuinKa/C4Q6HJ++M9AyzIq5EuvO0a8Rr9AAUR tBlTdGV2ZSBQYXNzZSA8c21wQGNzbi5uZXQ+ =ds99 -----END PGP PUBLIC KEY BLOCK-----
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199612051651.JAA13340>