Skip site navigation (1)Skip section navigation (2)
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>