SunFire 4810 upgrade to Solaris 10u8 issue

Yesterday, I was doing a planned upgrade of SunFire 4810 to Solaris 10u8 and faced the following error just awhile after invoking “boot net – install”. It’s worth noting that prior to OS upgrade I’d successfully updated OBP to the latest release – 5.20.14.

SunOS Release 5.10 Version Generic_141444-09 64-bit
Copyright 1983-2009 Sun Microsystems, Inc. All rights reserved.
Use is subject to license terms.
FATAL: PROM_PANIC[0x0]: assertion failed: TTE_IS_VALID(ttep), file: ../../../sun4u/gen/src/hat_sfmmu.c, line: 741
debugger entered.

Both Google and SunSolve led me to the following bug but in my case I wasn’t installing with ZFS root.

Eventually, I used verbose boot with the full path instead to the network device to jumpstart the server but I’m not sure if the original issue wasn’t caused by a moon phase, sun flare or solar wind.

boot /ssm@0,0/pci@18,700000/pci@1/SUNW,hme@0,1 -v – install

Going to double check on another SF4810 since I didn’t have enough time during the last maintenance window.

Update
So I played a bit with another SF4810 and did exactly the same steps in hope to cause similar error as described above but everything I had done was result-less and vain. Sifting through the code I only dug out that assertion fails when tte_inthi > 0 (???). PTE (Page Table Entry) related code:

 typedef union {
      	struct tte {
      		uint32_t	v:1;		/* 1=valid mapping */
      		uint32_t	sz:2;		/* 0=8k 1=64k 2=512k 3=4m */
      		uint32_t	nfo:1;		/* 1=no-fault access only */
      
      		uint32_t	ie:1;		/* 1=invert endianness */
      		uint32_t	hmenum:3;	/* sw - # of hment in hme_blk */
      
      		uint32_t	rsv:7;		/* former rsv:1 lockcnt:6 */
      		uint32_t	sz2:1;		/* sz2[48] Panther, Olympus-C */
      		uint32_t	diag:1;		/* See USII Note above. */
      		uint32_t	pahi:15;	/* pa[46:32] See Note above */
      		uint32_t	palo:19;	/* pa[31:13] */
      		uint32_t	no_sync:1;	/* sw - ghost unload */
      
      		uint32_t	suspend:1;	/* sw bits - suspended */
      		uint32_t	ref:1;		/* sw - reference */
      		uint32_t	wr_perm:1;	/* sw - write permission */
      		uint32_t	exec_synth:1;	/* sw bits - itlb synthesis */
      
      		uint32_t	exec_perm:1;	/* sw - execute permission */
      		uint32_t	l:1;		/* 1=lock in tlb */
      		uint32_t	cp:1;		/* 1=cache in ecache, icache */
      		uint32_t	cv:1;		/* 1=cache in dcache */
      
      		uint32_t	e:1;		/* 1=side effect */
      		uint32_t	p:1;		/* 1=privilege required */
      		uint32_t	w:1;		/* 1=writes allowed */
      		uint32_t	g:1;		/* 1=any context matches */
      	} tte_bit;
      	struct {
      		int32_t		inthi;
      		uint32_t	intlo;
      	} tte_int;
      	uint64_t		ll;
      } tte_t;


#define	tte_inthi	tte_int.inthi
#define	TTE_IS_VALID(ttep)	((ttep)->tte_inthi < 0)

I wish there was more clear and precise description of tte_int.inthi and tte_t.ll in the source code.

Leave a Reply

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.