Subject: Re: port-sparc/7860: crashme will rapidly panic NetBSD/sparc 1.4
To: None <abs@mono.org>
From: Bill Sommerfeld <sommerfeld@orchard.arlington.ma.us>
List: port-sparc
Date: 06/27/1999 00:26:11
I got somewhat different results on a sparcstation 2:

First run gets to:

...
try 40, Badboy at 114688. 0x1C000
Got signal 4 illegal instruction
Barfed
try 41, Badboy at 116736. 0x1C800
Got signal 4 illegal instruction
Barfed
try 42, Badboy at 118784. 0x1D000
zsh: illegal hardware instruction (core dumped)  ./crashme +2000.0 690 100

immediately re-running it, i get:

window# ./crashme +2000.0 690 100
Crashme: (c) data fault: pc=0xf011afe4 addr=0x207374ac ser=80<INVAL>
panic: kernel fault
Stopped in crashme at   _Debugger+0x4:  jmpl            [%o7 + 0x8], %g0
db> trace
_mem_access_fault(0x9, 0x80, 0x207374ac, 0xf011afe4, 0x40, 0xf1a47df0) at _mem_
access_fault+0x2e8
normal_mem_fault(0x48, 0x3c89, 0x20737464, 0x9, 0x80000000, 0xf2) at normal_mem
_fault+0x28
_sys_setitimer(0xf1915380, 0xf2262000, 0x1, 0xf0174800, 0x0, 0x10) at _sys_seti
timer+0x164
_mem_access_fault(0xf19149a0, 0x80, 0xf226254c, 0xf226254c, 0x0, 0xf1a47fb0) at
 _mem_access_fault+0x190
normal_mem_fault(0x6000, 0x8000, 0xeffffa48, 0x10069208, 0x0, 0xf1a47fb0) at no
rmal_mem_fault+0x28

The traceback looks quite odd (with the sys_setitimer in the middle
there..)

The faulting instruction mentioned in the "data fault" message above
appears to be in mmu_pagein():

db> x/i 0xf011afe4
_mmu_pagein+0x50:       ld              [%o2 + %o0], %i2
db> x/iiiiiiii 0xf011afd0
_mmu_pagein+0x3c:       srl             %i1, 0x12, %o1
_mmu_pagein+0x40:       subcc           %o2, 0x0, %g0
_mmu_pagein+0x44:       be              _mmu_pagein+0x60
_mmu_pagein+0x48:       and             %o1, 0x3f, %o3
_mmu_pagein+0x4c:       sll             %o3, 0x3, %o0
_mmu_pagein+0x50:       ld              [%o2 + %o0], %i2
_mmu_pagein+0x54:       subcc           %i2, 0x0, %g0
_mmu_pagein+0x58:       bne             _mmu_pagein+0x68
db> 
_mmu_pagein+0x5c:       add             %o2, %o0, %o1
_mmu_pagein+0x60:       ba              _mmu_pagein+0x124
_mmu_pagein+0x64:       or              %g0, 0x0, %i0
_mmu_pagein+0x68:       lduh            [%o1 + 0x4], %o2
_mmu_pagein+0x6c:       sethi           %hi(0xf016dc00), %o0
_mmu_pagein+0x70:       ld              [%o0 + 0x250], %o1
_mmu_pagein+0x74:       subcc           %o2, %o1, %g0
_mmu_pagein+0x78:       be              _mmu_pagein+0xa0

now, i don't read sparc assembler all that well, but it looks like the
faulting instruction at mmu_pagein+0x50 may correspond to the fetch of
sp->sg_pte in the following:

	/* return 0 if we have no PTEs to load */
	if ((pte = sp->sg_pte) == NULL)
		return (0);

Hope this is of use to someone who actually understands the sparc pmap...