FYI: powerpc EXC_LAST==0x2f00 vs. EXC_DEBUG ==0x2f10 and such?

Mark Millard markmi at dsl-only.net
Tue May 16 22:41:35 UTC 2017


[Context:

I'm having problems with production-style kernel builds
for TARGET_ARCH=powerpc (used an old PowerMac G5 so-called
"Quad Core") getting occasional panics that involve
oddities like:

frame->exc == 0x903a64e

in the fatal kernel trap information on the console
display.

I'm not claiming the below is related but while looking
around to figure out how to investigate I ran into
what I report below. (The first 2 are from a block of
4xx / 85xx EXC_<?>'s).
]


From /usr/src/sys/powerpc/include/trap.h :

#define EXC_DEBUG       0x2f10          /* Debug trap */
#define EXC_VECAST_E    0x2f20          /* Altivec Assist (Book-E) */

#define EXC_LAST        0x2f00          /* Last possible exception vector */

#define EXC_AST         0x3000          /* Fake AST vector */

/* Trap was in user mode */
#define EXC_USER        0x10000

And also:

/usr/src/sys/powerpc/ofw/ofw_machdep.c:char             save_trap_init[0x2f00];          /* EXC_LAST */
/usr/src/sys/powerpc/ofw/ofw_machdep.c:char             save_trap_of[0x2f00];            /* EXC_LAST */

/usr/src/sys/powerpc/include/profile.h:#define  __PROFILE_VECTOR_TOP    (EXC_LAST + 0x100)

These makes it look like EXC_LAST and some literal
0x2f00's might be insufficient for some contexts.

If they are sufficient for those contexts some
notes about the relationships of the beyond-last
ones would seem appropriate.

The other power specific references for EXC_LAST are below.
Note the __syncicache ones and bcopy ones, for example.

/usr/src/sys/powerpc/aim/mmu_oea.c:             if (phys_avail[j] < EXC_LAST)
/usr/src/sys/powerpc/aim/mmu_oea.c:                     phys_avail[j] += EXC_LAST;
/usr/src/sys/powerpc/aim/mmu_oea64.c:           if (phys_avail[j] < EXC_LAST)
/usr/src/sys/powerpc/aim/mmu_oea64.c:                   phys_avail[j] += EXC_LAST;
/usr/src/sys/powerpc/aim/aim_machdep.c: for (trap = EXC_RST; trap < EXC_LAST; trap += 0x20)
/usr/src/sys/powerpc/aim/aim_machdep.c: __syncicache(EXC_RSVD, EXC_LAST - EXC_RSVD);
/usr/src/sys/powerpc/powerpc/trap.c:    { EXC_LAST,     NULL }
/usr/src/sys/powerpc/powerpc/trap.c:    for (pe = powerpc_exceptions; pe->vector != EXC_LAST; pe++) {
/usr/src/sys/powerpc/ofw/ofw_machdep.c: bcopy((void *)EXC_RST, save_trap_vec, EXC_LAST - EXC_RST);
/usr/src/sys/powerpc/ofw/ofw_machdep.c: bcopy(restore_trap_vec, (void *)EXC_RST, EXC_LAST - EXC_RST);
/usr/src/sys/powerpc/ofw/ofw_machdep.c: __syncicache(EXC_RSVD, EXC_LAST - EXC_RSVD);


===
Mark Millard
markmi at dsl-only.net



More information about the freebsd-ppc mailing list