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.