Skip to content

Commit 1c6309d

Browse files
noopwafeljannau
authored andcommitted
m1n1.fw.asc.crash: Print more information/context
Signed-off-by: Alyssa Milburn <[email protected]>
1 parent f5f0134 commit 1c6309d

1 file changed

Lines changed: 82 additions & 1 deletion

File tree

proxyclient/m1n1/fw/asc/crash.py

Lines changed: 82 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -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+
79111
CrashEntry = 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):
101135
class 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

Comments
 (0)