@@ -88,7 +88,7 @@ def start(self):
8888
8989
9090class 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
102195BTTracer = BTTracer ._reloadcls ()
103196
104197dart_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
106200print (dart_tracer )
107201
0 commit comments