Subject: Re: --db_more-- in recent sparc64 kernel
To: Andrey Petrov <petrov@netbsd.org>
From: Andrey Petrov <petrov@netbsd.org>
List: port-sparc64
Date: 07/20/2001 18:29:25
On Fri, Jul 20, 2001 at 01:30:51PM -0700, Andrey Petrov wrote:
> Occasional power-cycle changed the whole picture,
> now I'm reliably observing:
> 
> 1) power cycle, boot solaris 2.7, halt it, boot netbsd, kernel crash
> 2) power cycle, boot netbsd, all works, netbsd can be rebooted no problem
> 

I'm including logs and patch/workaround for the problem. In case
more information is needed just let me know.

Here is how kernel boots successfully:

chain: calling OF_chain(800000, ee48, 1000000, fffb1a80, 18)
[ using 397072 bytes of netbsd ELF symbol table ]

Entered pmap_bootstrap.
Available virtual memory:
memlist start 0xfffff80000000000 size 7fc00000000
memlist start 0x100000000 size 7ff00000000
memlist start 0xffff0000 size e000
memlist start 0x149e000 size eeb62000
memlist start 0x0 size 1000000
memlist start 0xfffa6000 size 2000
memlist start 0xfff94000 size 8000
memlist start 0xfff28000 size 52000
End of available virtual memory
Trying to allocate msgbuf at e0006000, size 8000
We should have the memory at f400000, let's map it in
msgbuf mapped at 0xe0006000
Available virtual memory:
memlist start 0xfffff80000000000 size 7fc00000000
memlist start 0x100000000 size 7ff00000000
memlist start 0xffff0000 size e000
memlist start 0xe000e000 size fff2000
memlist start 0x149e000 size deb68000
memlist start 0x0 size 1000000
memlist start 0xfffa6000 size 2000
memlist start 0xfff94000 size 8000
End of available virtual memory
translating kernelstart 0x1000000, data_start 0x1400000
Kernel data is mapped at 1400000, next free seg: 149e000, deb68000
kdatap fc00000, szdiff 362000
pmap_bootstrap: could not claim physical dseg extension at fc9e000 size 362000
Allocating new 400000 kernel data at 4MB boundary
Allocating new va for buffer at f000000
Mapping in buffer f000000 at 0
Copying 647168 bytes kernel data...done.  Swapping maps..unmap new
remap old free old
pmap_bootstrap: firstaddr is 149db00 virt (f09db00 phys)avail for kernel
pmap_bootstrap: getting phys installed
Installed physical memory:
memlist start 0 size 10000000
Calculating physmem: result 8000 or 32768 pages
Prom xlations:
start 00000000fffe0000 size 0000000000010000 tte 800000000ff700b6
start 00000000fffd4000 size 000000000000c000 tte 800000000ff5c0b6
start 00000000fffc8000 size 0000000000008000 tte 800001fe0000008e
start 00000000fffc4000 size 0000000000004000 tte 800000000ff580b6
start 00000000fffc2000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffc0000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbe000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbc000 size 0000000000002000 tte 800001fff120008e
start 00000000fffba000 size 0000000000002000 tte 800001fff120008e
start 00000000fffb8000 size 0000000000002000 tte 800001fff130008e
start 00000000fffb6000 size 0000000000002000 tte 800001fff190008e
start 00000000fffb4000 size 0000000000002000 tte 800001fff100008e
start 00000000fffb2000 size 0000000000002000 tte 800000000fefe0b6
start 00000000fffb0000 size 0000000000002000 tte 800000000ff540b6
start 00000000fffae000 size 0000000000002000 tte 800001fff140008e
start 00000000fffac000 size 0000000000002000 tte 800001fff110008e
start 00000000fffa8000 size 0000000000004000 tte 800000000ff400b6
start 00000000fffa4000 size 0000000000002000 tte 800000000ff480b6
start 00000000fffa0000 size 0000000000004000 tte 800000000ff4a0b6
start 00000000fff9c000 size 0000000000004000 tte 800000000ff440b6
start 00000000fff7c000 size 0000000000018000 tte 800000000ff0a0b6
start 00000000fff7a000 size 0000000000002000 tte 800000000ff060b6
start 00000000fff26000 size 0000000000002000 tte 800001fc0061008e
start 00000000fef9e000 size 0000000000062000 tte 800000000fe9c0b6
start 00000000f0000000 size 0000000000080000 tte 800000000ff800b6
start 00000000e0006000 size 0000000000008000 tte 800000000f400036
start 0000000001400000 size 0000000000400000 tte 800000000f000036
start 0000000001000000 size 0000000000400000 tte 800000000f800036
start 0000000000400000 size 0000000000600000 tte 8000000000400036
End of prom xlations
Prom xlations:
start 00000000fffe0000 size 0000000000010000 tte 800000000ff700b6
start 00000000fffd4000 size 000000000000c000 tte 800000000ff5c0b6
start 00000000fffc8000 size 0000000000008000 tte 800001fe0000008e
start 00000000fffc4000 size 0000000000004000 tte 800000000ff580b6
start 00000000fffc2000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffc0000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbe000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbc000 size 0000000000002000 tte 800001fff120008e
start 00000000fffba000 size 0000000000002000 tte 800001fff120008e
start 00000000fffb8000 size 0000000000002000 tte 800001fff130008e
start 00000000fffb6000 size 0000000000002000 tte 800001fff190008e
start 00000000fffb4000 size 0000000000002000 tte 800001fff100008e
start 00000000fffb2000 size 0000000000002000 tte 800000000fefe0b6
start 00000000fffb0000 size 0000000000002000 tte 800000000ff540b6
start 00000000fffae000 size 0000000000002000 tte 800001fff140008e
start 00000000fffac000 size 0000000000002000 tte 800001fff110008e
start 00000000fffa8000 size 0000000000004000 tte 800000000ff400b6
start 00000000fffa4000 size 0000000000002000 tte 800000000ff480b6
start 00000000fffa0000 size 0000000000004000 tte 800000000ff4a0b6
start 00000000fff9c000 size 0000000000004000 tte 800000000ff440b6
start 00000000fff7c000 size 0000000000018000 tte 800000000ff0a0b6
start 00000000fff7a000 size 0000000000002000 tte 800000000ff060b6
start 00000000fff26000 size 0000000000002000 tte 800001fc0061008e
start 00000000fef9e000 size 0000000000062000 tte 800000000fe9c0b6
start 00000000f0000000 size 0000000000080000 tte 800000000ff800b6
start 00000000e0006000 size 0000000000008000 tte 800000000f400036
start 0000000000400000 size 0000000000600000 tte 8000000000400036
start 0000000000000000 size 0000000000000000 tte 800000000f800036
start 0000000000000000 size 0000000000000000 tte 800000000f000036
End of prom xlations
Available physical memory:
memlist start ff22000 size 1c000
memlist start ff00000 size 6000
memlist start fe90000 size c000
memlist start fc00000 size 280000
memlist start f408000 size 3f8000
memlist start 0 size f000000
End of available physical memory
firstaddr before TSB=14adec8
frobbed i, firstaddr before TSB=14ae000, 14ae000
firstaddr after TSB=14b0000
TSB allocated at 0x14ae000 size 00002000
firstaddr after pmap=014b0000
kernel virtual size 01000000 - 014b0000
kernel virtual size 01000000 - 0149db00
Available 149de58 physical memory before cleanup:
memlist start ff22000 size 1c000
memlist start ff00000 size 6000
memlist start fe90000 size c000
memlist start fc00000 size 280000
memlist start f408000 size 3f8000
memlist start 0 size f000000
End of available physical memory before cleanup
kernel physical text size 0f800000 - 0fc00000
kernel physical data size 0f000000 - 0f0b0000
Available physical memory after cleanup:
avail start 2000 size effe000
avail start f408000 size 3f8000
avail start fc00000 size 280000
avail start fe90000 size c000
avail start ff00000 size 6000
avail start ff22000 size 1c000
End of available physical memory after cleanup
pmap_kernel()->pm_physaddr = 2000
Calling consinit()
console is unknown

Inserting mesgbuf into pmap_kernel()
pseg_set: pm=0x149dac8 va=0xe0006000 data=800000000f400036 newp 4000
pseg_set: pm=0x149dac8 va=0xe0006000 data=800000000f400036 newp 6000
pseg_set: pm=0x149dac8 va=0x0 data=9000000000000034 newp 8000
Done inserting mesgbuf into pmap_kernel()
Inserting PROM mappings into pmap_kernel()
pseg_set: pm=0x149dac8 va=0xfffe0000 data=800000000ff700b6 newp a000
pseg_set: pm=0x149dac8 va=0xfef9e000 data=800000000fe9c0b6 newp c000
pseg_set: pm=0x149dac8 va=0xf0000000 data=800000000ff800b6 newp e000
pseg_set: pm=0x149dac8 va=0x800000 data=8000000000800036 newp 10000
Done inserting PROM mappings into pmap_kernel()
Inserting stack 0 into pmap_kernel() at 0x1802000
pseg_set: pm=0x149dac8 va=0x1802000 data=8000000000012036 newp 14000
Done inserting stack 0 into pmap_kernel()
Inserting cpu_info into pmap_kernel() at 0x1812000
Initializing cpu_info
Done inserting cpu_info into pmap_kernel()
Finished pmap_bootstrap()
Setting DTLB entry 00000000 01000000 data e0000000 0f800074
Setting DTLB entry 00000000 01400000 data e0000000 0f000076
Setting ITLB entry 00000000 01000000 data e0000000 0f800074
Setting CPUINFO mappings...
Setting TSB pointer 00000000 014ae000
console is unknown

here when it fails:

chain: calling OF_chain(800000, ee48, 1000000, fffb1a80, 18)
[ using 397072 bytes of netbsd ELF symbol table ]

Entered pmap_bootstrap.
Available virtual memory:
memlist start 0xfffff80000000000 size 7fc00000000
memlist start 0x100000000 size 7ff00000000
memlist start 0xffff0000 size e000
memlist start 0x149e000 size eeb62000
memlist start 0x0 size 1000000
memlist start 0xfffa6000 size 2000
memlist start 0xfff94000 size 8000
memlist start 0xfff28000 size 52000
End of available virtual memory
Trying to allocate msgbuf at e0006000, size 8000
We should have the memory at f400000, let's map it in
msgbuf mapped at 0xe0006000
Available virtual memory:
memlist start 0xfffff80000000000 size 7fc00000000
memlist start 0x100000000 size 7ff00000000
memlist start 0xffff0000 size e000
memlist start 0xe000e000 size fff2000
memlist start 0x149e000 size deb68000
memlist start 0x0 size 1000000
memlist start 0xfffa6000 size 2000
memlist start 0xfff94000 size 8000
End of available virtual memory
translating kernelstart 0x1000000, data_start 0x1400000
Kernel data is mapped at 1400000, next free seg: 149e000, deb68000
kdatap e800000, szdiff 362000
pmap_bootstrap: getting phys installed
Installed physical memory:
memlist start 0 size 10000000
Calculating physmem: result 8000 or 32768 pages
Prom xlations:
start 00000000fffe0000 size 0000000000010000 tte 800000000ff700b6
start 00000000fffd4000 size 000000000000c000 tte 800000000ff5c0b6
start 00000000fffc8000 size 0000000000008000 tte 800001fe0000008e
start 00000000fffc4000 size 0000000000004000 tte 800000000ff580b6
start 00000000fffc2000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffc0000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbe000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbc000 size 0000000000002000 tte 800001fff120008e
start 00000000fffba000 size 0000000000002000 tte 800001fff120008e
start 00000000fffb8000 size 0000000000002000 tte 800001fff130008e
start 00000000fffb6000 size 0000000000002000 tte 800001fff190008e
start 00000000fffb4000 size 0000000000002000 tte 800001fff100008e
start 00000000fffb2000 size 0000000000002000 tte 800000000fefe0b6
start 00000000fffb0000 size 0000000000002000 tte 800000000ff540b6
start 00000000fffae000 size 0000000000002000 tte 800001fff140008e
start 00000000fffac000 size 0000000000002000 tte 800001fff110008e
start 00000000fffa8000 size 0000000000004000 tte 800000000ff400b6
start 00000000fffa4000 size 0000000000002000 tte 800000000ff480b6
start 00000000fffa0000 size 0000000000004000 tte 800000000ff4a0b6
start 00000000fff9c000 size 0000000000004000 tte 800000000ff440b6
start 00000000fff7c000 size 0000000000018000 tte 800000000ff0a0b6
start 00000000fff7a000 size 0000000000002000 tte 800000000ff060b6
start 00000000fff26000 size 0000000000002000 tte 800001fc0061008e
start 00000000fef9e000 size 0000000000062000 tte 800000000fe9c0b6
start 00000000f0000000 size 0000000000080000 tte 800000000ff800b6
start 00000000e0006000 size 0000000000008000 tte 800000000f400036
start 0000000001000000 size 0000000000800000 tte 800000000e400036
start 0000000000002000 size 00000000009fe000 tte 8000000000002036
End of prom xlations
Prom xlations:
start 00000000fffe0000 size 0000000000010000 tte 800000000ff700b6
start 00000000fffd4000 size 000000000000c000 tte 800000000ff5c0b6
start 00000000fffc8000 size 0000000000008000 tte 800001fe0000008e
start 00000000fffc4000 size 0000000000004000 tte 800000000ff580b6
start 00000000fffc2000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffc0000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbe000 size 0000000000002000 tte 800001fe0000208e
start 00000000fffbc000 size 0000000000002000 tte 800001fff120008e
start 00000000fffba000 size 0000000000002000 tte 800001fff120008e
start 00000000fffb8000 size 0000000000002000 tte 800001fff130008e
start 00000000fffb6000 size 0000000000002000 tte 800001fff190008e
start 00000000fffb4000 size 0000000000002000 tte 800001fff100008e
start 00000000fffb2000 size 0000000000002000 tte 800000000fefe0b6
start 00000000fffb0000 size 0000000000002000 tte 800000000ff540b6
start 00000000fffae000 size 0000000000002000 tte 800001fff140008e
start 00000000fffac000 size 0000000000002000 tte 800001fff110008e
start 00000000fffa8000 size 0000000000004000 tte 800000000ff400b6
start 00000000fffa4000 size 0000000000002000 tte 800000000ff480b6
start 00000000fffa0000 size 0000000000004000 tte 800000000ff4a0b6
start 00000000fff9c000 size 0000000000004000 tte 800000000ff440b6
start 00000000fff7c000 size 0000000000018000 tte 800000000ff0a0b6
start 00000000fff7a000 size 0000000000002000 tte 800000000ff060b6
start 00000000fff26000 size 0000000000002000 tte 800001fc0061008e
start 00000000fef9e000 size 0000000000062000 tte 800000000fe9c0b6
start 00000000f0000000 size 0000000000080000 tte 800000000ff800b6
start 00000000e0006000 size 0000000000008000 tte 800000000f400036
start 0000000000002000 size 00000000009fe000 tte 8000000000002036
start 0000000000000000 size 0000000000000000 tte 800000000e400036
End of prom xlations
Available physical memory:
memlist start ff22000 size 1c000
memlist start ff00000 size 6000
memlist start fe90000 size c000
memlist start fc02000 size 27e000
memlist start f408000 size 7f8000
memlist start ec02000 size 7fe000
memlist start 0 size e400000
End of available physical memory
firstaddr before TSB=14aded0
frobbed i, firstaddr before TSB=14ae000, 14ae000
firstaddr after TSB=14b0000
TSB allocated at 0x14ae000 size 00002000
firstaddr after pmap=014b0000
kernel virtual size 01000000 - 014b0000
kernel virtual size 01000000 - 0149db00
Available 149de50 physical memory before cleanup:
memlist start ff22000 size 1c000
memlist start ff00000 size 6000
memlist start fe90000 size c000
memlist start fc02000 size 27e000
memlist start f408000 size 7f8000
memlist start ec02000 size 7fe000
memlist start 0 size e400000
End of available physical memory before cleanup
kernel physical text size 0e400000 - 0ec00000
kernel physical data size 0e800000 - 0e8b0000
Available physical memory after cleanup:
avail start 2000 size e3fe000
avail start ec02000 size 7fe000
avail start f408000 size 7f8000
avail start fc02000 size 27e000
avail start fe90000 size c000
avail start ff00000 size 6000
avail start ff22000 size 1c000
End of available physical memory after cleanup
pmap_kernel()->pm_physaddr = 2000
Calling consinit()
console is unknown

Inserting mesgbuf into pmap_kernel()
pseg_set: pm=0x149dac8 va=0xe0006000 data=800000000f400036 newp 4000
pseg_set: pm=0x149dac8 va=0xe0006000 data=800000000f400036 newp 6000
pseg_set: pm=0x149dac8 va=0x0 data=9000000000000034 newp 8000
Done inserting mesgbuf into pmap_kernel()
Inserting PROM mappings into pmap_kernel()
pseg_set: pm=0x149dac8 va=0xfffe0000 data=800000000ff700b6 newp a000
pseg_set: pm=0x149dac8 va=0xfef9e000 data=800000000fe9c0b6 newp c000
pseg_set: pm=0x149dac8 va=0xf0000000 data=800000000ff800b6 newp e000
pseg_set: pm=0x149dac8 va=0x800000 data=8000000000800036 newp 10000
Done inserting PROM mappings into pmap_kernel()
Inserting stack 0 into pmap_kernel() at 0x1802000
pseg_set: pm=0x149dac8 va=0x1802000 data=8000000000012036 newp 14000
Done inserting stack 0 into pmap_kernel()
Inserting cpu_info into pmap_kernel() at 0x1812000
Initializing cpu_info
Done inserting cpu_info into pmap_kernel()
Finished pmap_bootstrap()
Setting DTLB entry 00000000 01000000 data e0000000 0e400074
Setting DTLB entry 00000000 01400000 data e0000000 0e800076
Fast Data Access Protection
ok 


Here is a patch which makes it work, well workaround. Important thing
is always to remap data segment without trying to enlarge.

Index: pmap.c
===================================================================
RCS file: /cvsroot/syssrc/sys/arch/sparc64/sparc64/pmap.c,v
retrieving revision 1.103
diff -c -r1.103 pmap.c
*** pmap.c	2001/07/12 23:13:15	1.103
--- pmap.c	2001/07/21 01:22:59
***************
*** 1,6 ****
--- 1,7 ----
  /*	$NetBSD: pmap.c,v 1.103 2001/07/12 23:13:15 eeh Exp $	*/
  #undef	NO_VCACHE /* Don't forget the locked TLB in dostart */
  #define	HWREF
+ #define DEBUG
  /*
   * 
   * Copyright (C) 1996-1999 Eduardo Horvath.
***************
*** 673,684 ****
  	msgbufmapped = 1;	/* enable message buffer */
  	initmsgbuf((caddr_t)msgbufp, msgbufsiz);
  
  	/* 
  	 * Record kernel mapping -- we will map these with a permanent 4MB
  	 * TLB entry when we initialize the CPU later.
  	 */
! 	BDPRINTF(PDB_BOOT, ("translating kernelstart %p\r\n", 
! 		(void *)kernelstart));
  	ktext = kernelstart;
  	ktextp = prom_vtop(kernelstart);
  
--- 674,707 ----
  	msgbufmapped = 1;	/* enable message buffer */
  	initmsgbuf((caddr_t)msgbufp, msgbufsiz);
  
+ 	/*
+ 	 * reread available vm
+ 	 */
+ 	bzero((caddr_t)memlist, sizeof(memlist));
+ 	if (OF_getprop(vmemh, "available", memlist, sizeof(memlist)) <= 0) {
+ 		prom_printf("no vmemory avail?");
+ 		OF_exit();
+ 	}
+ 
+ #ifdef DEBUG
+ 	if (pmapdebug & PDB_BOOT) {
+ 		/* print out mem list */
+ 		prom_printf("Available virtual memory:\r\n");
+ 		for (mp = memlist; mp->size; mp++) {
+ 			prom_printf("memlist start %p size %lx\r\n", 
+ 				    (void *)(u_long)mp->start,
+ 				    (u_long)mp->size);
+ 		}
+ 		prom_printf("End of available virtual memory\r\n");
+ 	}
+ #endif
+ 
  	/* 
  	 * Record kernel mapping -- we will map these with a permanent 4MB
  	 * TLB entry when we initialize the CPU later.
  	 */
! 	BDPRINTF(PDB_BOOT, ("translating kernelstart %p, data_start %p\r\n", 
! 		(void *)kernelstart, (void *)data_start));
  	ktext = kernelstart;
  	ktextp = prom_vtop(kernelstart);
  
***************
*** 732,737 ****
--- 755,762 ----
  	 */
  	kdsize = round_page(ekdata - kdata);
  
+ 	goto remap_data;
+ 
  	if ((kdatap & (4*MEG-1)) == 0) {
  		/* We were at a 4MB boundary -- claim the rest */
  		psize_t szdiff = 4*MEG - (kdsize & (4*MEG-1));
***************
*** 756,765 ****
  			if (prom_claim_virt(newkv, szdiff) != newkv)
  			prom_printf("pmap_bootstrap: could not claim "
  				"virtual dseg extension "
! 				"at size %lx\r\n", newkv, szdiff);
  
  			/* Make sure all 4MB are mapped */
! 			prom_map_phys(newkp, szdiff, newkv, -1);
  		}
  	} else {
  		psize_t sz;
--- 781,794 ----
  			if (prom_claim_virt(newkv, szdiff) != newkv)
  			prom_printf("pmap_bootstrap: could not claim "
  				"virtual dseg extension "
! 				"at %lx size %lx\r\n", newkv, szdiff);
  
  			/* Make sure all 4MB are mapped */
! 			if (prom_map_phys(newkp, szdiff, newkv, -1) == -1)
! 				prom_printf("pmap_bootstrap: map_phys failed "
! 					    "newkp %lx, newkv %lx, sz %lx\r\n",
! 					    newkp, newkv, szdiff);
! 
  		}
  	} else {
  		psize_t sz;