commit e08b05fb4af43520d97dc761f328acaaf45bcb79 Author: Brandon Bergren Date: Thu Feb 6 13:29:54 2020 -0600 Low level mchk dumper diff --git a/sys/powerpc/aim/aim_machdep.c b/sys/powerpc/aim/aim_machdep.c index c18bf6ce0a7..c346251e21a 100644 --- a/sys/powerpc/aim/aim_machdep.c +++ b/sys/powerpc/aim/aim_machdep.c @@ -157,6 +157,7 @@ extern void *dsitrap_bridgemode, *dsiend_bridgemode; #endif extern void *decrint, *decrsize; extern void *extint, *extsize; +extern void *mchk_dblow; extern void *dblow, *dbend; extern void *imisstrap, *imisssize; extern void *dlmisstrap, *dlmisssize; @@ -403,8 +404,8 @@ aim_cpu_init(vm_offset_t toc) (size_t)&rstcode); #ifdef KDB - bcopy(&dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbend - - (size_t)&dblow); + bcopy(&mchk_dblow, (void *)(EXC_MCHK + trap_offset), (size_t)&dbend - + (size_t)&mchk_dblow); bcopy(&dblow, (void *)(EXC_PGM + trap_offset), (size_t)&dbend - (size_t)&dblow); bcopy(&dblow, (void *)(EXC_TRC + trap_offset), (size_t)&dbend - diff --git a/sys/powerpc/aim/trap_subr64.S b/sys/powerpc/aim/trap_subr64.S index 69a146ece70..71a50bd4ace 100644 --- a/sys/powerpc/aim/trap_subr64.S +++ b/sys/powerpc/aim/trap_subr64.S @@ -936,6 +936,48 @@ dbleave: FRAME_LEAVE(PC_DBSAVE) rfid + + .globl CNAME(mchk_dblow) + .p2align 3 +CNAME(mchk_dblow): +/* + * When we get a MCE, we need to dump some additional info while we have + * a chance. + */ + mtsprg1 %r1 /* save SP */ + mtsprg2 %r28 /* save r28 */ + mfcr %r28 /* save CR in r28 */ + + /* + * For MCE debug, we don't care what mode we're in yet. + * We will dump out the SLB either way. + */ + GET_CPUINFO(%r1) + std %r29,(PC_DBSAVE+CPUSAVE_R29)(%r1) /* free r29 */ + std %r30,(PC_DBSAVE+CPUSAVE_R30)(%r1) /* free r30 */ + std %r31,(PC_DBSAVE+CPUSAVE_R31)(%r1) /* free r31 */ + + li %r29, 0 /* set counter to zero */ + mr %r30, %r1 + addi %r30, %r30, SLB_DEBUG /* set r30 to slb_debug[0] */ +1: + /* Read the SLB into the slb_debug array. */ + slbmfee %r31, %r29 + std %r31, 0(%r30) + slbmfev %r31, %r29 + std %r31, 8(%r30) + addi %r30, %r30, 16 + cmpdi %r29, 32 /* 64 on PPC970? */ + beq- 1b + + /* Put things back like they were and fall through to dblow. */ + ld %r31, (PC_DBSAVE+CPUSAVE_R31)(%r1) + ld %r30, (PC_DBSAVE+CPUSAVE_R30)(%r1) + ld %r29, (PC_DBSAVE+CPUSAVE_R29)(%r1) + mtcr %r28 + mfsprg2 %r28 + mfsprg1 %r1 + /* * In case of KDB we want a separate trap catcher for it */ diff --git a/sys/powerpc/include/pcpu.h b/sys/powerpc/include/pcpu.h index 76829ea50df..e3ea9a1ad40 100644 --- a/sys/powerpc/include/pcpu.h +++ b/sys/powerpc/include/pcpu.h @@ -65,11 +65,12 @@ struct pvo_entry; struct slb slb[64]; \ struct slb **userslb; \ register_t slbsave[18]; \ - uint8_t slbstack[1024]; \ + uint8_t slbstack[1024]; \ struct pvo_entry *qmap_pvo; \ struct mtx qmap_lock; \ uint64_t opal_hmi_flags; \ - char __pad[1337]; + struct slb slbdebug[64]; \ + char __pad[313]; #ifdef __powerpc64__ #define PCPU_MD_AIM_FIELDS PCPU_MD_AIM64_FIELDS diff --git a/sys/powerpc/powerpc/genassym.c b/sys/powerpc/powerpc/genassym.c index 8c632a4027b..a4c1f991efb 100644 --- a/sys/powerpc/powerpc/genassym.c +++ b/sys/powerpc/powerpc/genassym.c @@ -116,6 +116,7 @@ ASSYM(PC_SLBSTACK, offsetof(struct pcpu, pc_aim.slbstack)); ASSYM(USER_SLB_SLOT, USER_SLB_SLOT); ASSYM(USER_SLB_SLBE, USER_SLB_SLBE); ASSYM(SEGMENT_MASK, SEGMENT_MASK); +ASSYM(SLB_DEBUG, offsetof(struct pcpu, pc_aim.slbdebug)); #else ASSYM(PM_SR, offsetof(struct pmap, pm_sr)); ASSYM(USER_SR, USER_SR);