Skip to content

Commit d7bf521

Browse files
committed
bluetooth: dump firmware, a little bit of context
Signed-off-by: R <[email protected]>
1 parent f5046e5 commit d7bf521

1 file changed

Lines changed: 95 additions & 1 deletion

File tree

proxyclient/hv/trace_bt.py

Lines changed: 95 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ def start(self):
8888

8989

9090
class BTTracer(MemRangeTracer):
91-
DEFAULT_MODE = TraceMode.ASYNC
91+
DEFAULT_MODE = TraceMode.SYNC
9292
REGMAPS = [BTBAR0Regs, BTBAR1Regs]
9393
# FIXME this is kinda a hack
9494
REGRANGES = [(0x5c2410000, 0x8000), (0x5c2000000, 0x400000)]
@@ -97,11 +97,105 @@ class BTTracer(MemRangeTracer):
9797
def __init__(self, hv, dart_tracer):
9898
super().__init__(hv, verbose=3)
9999
self.dart_tracer = dart_tracer
100+
self._dart_tracer_started = False
101+
self._dumped_host_window = False
102+
self._dump_idx = 0
103+
self._host_window_lo = 0
104+
self._host_window_hi = 0
105+
self._host_window_sz = 0
106+
self._rti_window_lo = 0
107+
self._rti_window_hi = 0
108+
self._rti_window_sz = 0
109+
self._rti_context_lo = 0
110+
self._rti_context_hi = 0
111+
112+
def w_DOORBELL_6(self, val):
113+
# this is the first access macos does
114+
if not self._dart_tracer_started:
115+
self.dart_tracer.start()
116+
self._dart_tracer_started = True
117+
print("starting DART tracer")
118+
119+
def w_HOST_WINDOW_LO(self, val):
120+
self._host_window_lo = val
121+
122+
def w_HOST_WINDOW_HI(self, val):
123+
self._host_window_hi = val
124+
125+
def w_HOST_WINDOW_SZ(self, val):
126+
self._host_window_sz = val
127+
128+
def w_IMG_DOORBELL(self, val):
129+
print("Image doorbell was rung")
130+
host_window_iova = int(self._host_window_hi) << 32 | int(self._host_window_lo)
131+
host_window_sz = int(self._host_window_sz)
132+
print(f"Host window @ {host_window_iova:016X} sz {host_window_sz:08X}")
133+
134+
self.dart_tracer.dart.dump_all()
135+
136+
# FIXME how do we get stream IDs without hardcoding?
137+
try:
138+
data = self.dart_tracer.dart.ioread(2, host_window_iova, host_window_sz)
139+
with open(f'bt_dump_{self._dump_idx}.bin', 'wb') as f:
140+
f.write(data)
141+
chexdump(data[:0x400])
142+
self._dump_idx += 1
143+
except Exception as e:
144+
print(e)
145+
146+
147+
def w_RTI_WINDOW_LO(self, val):
148+
self._rti_window_lo = val
149+
150+
def w_RTI_WINDOW_HI(self, val):
151+
self._rti_window_hi = val
152+
153+
def w_RTI_WINDOW_SZ(self, val):
154+
self._rti_window_sz = val
155+
156+
def w_RTI_CONTEXT_LO(self, val):
157+
self._rti_context_lo = val
158+
159+
def w_RTI_CONTEXT_HI(self, val):
160+
self._rti_context_hi = val
161+
162+
def w_RTI_CONTROL(self, val):
163+
print("RTI control was set")
164+
host_window_iova = int(self._host_window_hi) << 32 | int(self._host_window_lo)
165+
host_window_sz = int(self._host_window_sz)
166+
print(f"Host window @ {host_window_iova:016X} sz {host_window_sz:08X}")
167+
rti_window_iova = int(self._rti_window_hi) << 32 | int(self._rti_window_lo)
168+
rti_window_sz = int(self._rti_window_sz)
169+
print(f"RTI window @ {rti_window_iova:016X} sz {rti_window_sz:08X}")
170+
rti_context_iova = int(self._rti_context_hi) << 32 | int(self._rti_context_lo)
171+
print(f"RTI context @ {rti_context_iova:016X}")
172+
173+
self.dart_tracer.dart.dump_all()
174+
175+
# FIXME how do we get stream IDs without hardcoding?
176+
try:
177+
data = self.dart_tracer.dart.ioread(2, host_window_iova, host_window_sz)
178+
with open(f'bt_dump_{self._dump_idx}.bin', 'wb') as f:
179+
f.write(data)
180+
chexdump(data[:0x400])
181+
self._dump_idx += 1
182+
except Exception as e:
183+
print(e)
184+
185+
try:
186+
data = self.dart_tracer.dart.ioread(2, rti_context_iova, 0x100)
187+
with open(f'bt_dump_{self._dump_idx}.bin', 'wb') as f:
188+
f.write(data)
189+
chexdump(data)
190+
self._dump_idx += 1
191+
except Exception as e:
192+
print(e)
100193

101194

102195
BTTracer = BTTracer._reloadcls()
103196

104197
dart_tracer = DARTTracer(hv, "/arm-io/dart-apcie0", verbose=1)
198+
dart_tracer.DEFAULT_MODE = TraceMode.SYNC
105199
# do not start, clock gates aren't enabled yet
106200
print(dart_tracer)
107201

0 commit comments

Comments
 (0)