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.
