@@ -76,6 +76,38 @@ class CrashLogMessage(Register64):
7676 "unk_Z" / Int64ul ,
7777)
7878
79+ CrtkEntry = Struct (
80+ "id" / Int16ul ,
81+ "flags" / Int16ul ,
82+ "unk_4" / Int32ul ,
83+ "unk_8" / Int32ul ,
84+ "unk_c" / Int32ul ,
85+ "ptr" / Int64ul ,
86+ "unk_14" / Int32ul ,
87+ "unk_18" / Int32ul ,
88+ "unk_1c" / Int32ul ,
89+ "unk_20" / Int32ul ,
90+ "ptr_count" / Int32ul ,
91+ "name" / Bytes (0x1c ),
92+ "ptrs" / Array (this .ptr_count , Int64ul )
93+ )
94+
95+ CrashCrtk = Struct (
96+ "tasks" / GreedyRange (CrtkEntry ),
97+ "leftovers" / GreedyBytes ,
98+ )
99+
100+ CcdpEntry = Struct (
101+ "va" / Int64ul ,
102+ "pa" / Int64ul ,
103+ "unk_10" / Int32ul ,
104+ )
105+
106+ CrashCcdp = Struct (
107+ "entries" / GreedyRange (CcdpEntry ),
108+ "leftovers" / GreedyBytes ,
109+ )
110+
79111CrashEntry = Struct (
80112 "type" / FourCC ,
81113 Padding (4 ),
@@ -90,6 +122,8 @@ class CrashLogMessage(Register64):
90122 "Crg8" : CrashCrg8 ,
91123 "Ccst" : CrashCcst ,
92124 "CasC" : CrashCasC ,
125+ "Crtk" : CrashCrtk ,
126+ "Ccdp" : CrashCcdp ,
93127 }, default = GreedyBytes )),
94128)
95129
@@ -101,6 +135,7 @@ class CrashLogMessage(Register64):
101135class CrashLogParser :
102136 def __init__ (self , data = None , asc = None ):
103137 self .asc = asc
138+ self .task_id = None
104139 if data is not None :
105140 self .parse (data )
106141
@@ -114,7 +149,8 @@ def default(self, entry):
114149 print ()
115150
116151 def Ccst (self , entry ):
117- print (f"Call stack (task { entry .payload .task } :" )
152+ self .task_id = entry .payload .task
153+ print (f"Call stack (task { entry .payload .task } ):" )
118154 for i in entry .payload .stack :
119155 if not i :
120156 break
@@ -156,6 +192,12 @@ def Crg8(self, entry):
156192 j = min (30 , i + 3 )
157193 print (f" { f'x{ i } -x{ j } ' :>7} = { ' ' .join (f'{ r :016x} ' for r in ctx .regs [i :j + 1 ])} " )
158194
195+ # print AGX objects where available
196+ for i in range (31 ):
197+ this_addr = addr (ctx .regs [i ])
198+ if "@" in this_addr :
199+ print (" x%d: %s" % (i , this_addr ))
200+
159201 if elr_phys :
160202 v = self .asc .p .read32 (elr_phys )
161203
@@ -167,6 +209,12 @@ def Crg8(self, entry):
167209 dist = 16
168210 self .asc .u .disassemble_at (elr_phys - dist * 4 , (dist * 2 + 1 ) * 4 , elr_phys )
169211
212+ if sp_phys :
213+ for n in range (- 4 , 4 ):
214+ sp_ptr = sp_phys + 8 * n
215+ v = self .asc .p .read64 (sp_ptr )
216+ print (f" stack @ 0x{ sp_ptr :016x} : { v :016x} " )
217+
170218 print ()
171219
172220 def Cstr (self , entry ):
@@ -184,8 +232,40 @@ def Cmbx(self, entry):
184232 print ()
185233
186234 def CLHE (self , entry ):
235+ # terminator?
187236 pass
188237
238+ def Crtk (self , entry ):
239+ print ("Tasks:" )
240+ for task in entry .payload .tasks :
241+ name = task .name .rstrip (b'\x00 ' ).decode ()
242+ if self .task_id == task .id :
243+ print (f"* { task .id } : { name } (flags 0x{ task .flags :x} )" )
244+ else :
245+ print (f" { task .id } : { name } @ { task .ptr :08x} (flags 0x{ task .flags :x} )" )
246+ print (f" Stack: " , end = "" )
247+ for p in task .ptrs :
248+ print (f"0x{ p :08x} " , end = " " )
249+ print ("" )
250+ print (f" Unknowns: { task .unk_4 :08x} { task .unk_8 :08x} { task .unk_c :08x} { task .unk_14 :08x} { task .unk_18 :08x} { task .unk_1c :08x} { task .unk_20 :08x} " )
251+ if len (entry .payload .leftovers ):
252+ chexdump (entry .payload .leftovers )
253+ print ()
254+
255+ def Ccdp (self , entry ):
256+ print ("Ccdp:" )
257+ for e in entry .payload .entries :
258+ real_pa = self .asc .iotranslate (e .va , 1 )[0 ][0 ]
259+ name = self .asc .addr (e .va ) if e .va else ""
260+ name = "(" + name + ")" if ('@' in name ) else ""
261+ print (f" 0x{ e .va :016x} -> 0x{ e .pa :016x} { name } : { e .unk_10 :08x} " )
262+ if real_pa != e .pa :
263+ if real_pa != None :
264+ print (f" (wrong PA; should be 0x{ real_pa :16x} )" )
265+ else :
266+ print (f" (wrong PA; not mapped)" )
267+ print ()
268+
189269 def dump (self ):
190270 print ("### Crash dump:" )
191271 print ()
@@ -234,6 +314,7 @@ def handle_crashed(self, msg):
234314 size = 0x1000 * msg .SIZE
235315
236316 self .log (f"Crashed!" )
317+ self .log (f" DVA @ 0x{ msg .DVA :x} " )
237318 crashdata = self .asc .ioread (msg .DVA , size )
238319 open ("crash.bin" , "wb" ).write (crashdata )
239320 clog = CrashLogParser (crashdata , self .asc )
0 commit comments