@@ -32,6 +32,7 @@ def __init__(self, hv, devpath, **kwargs):
3232 elif compat in ["dart,t8110" ]:
3333 self .REGMAPS = [DART8110Regs ]
3434
35+ self .page_map = ScalarRangeMap ()
3536 return super ().__init__ (hv , devpath , ** kwargs )
3637
3738 def start (self ):
@@ -67,3 +68,30 @@ def w_TLB_OP(self, tlb_op):
6768 self .dart .invalidate_cache ()
6869 else :
6970 self .log (f"Unknown TLB op { tlb_op } " )
71+
72+ self .page_map = ScalarRangeMap ()
73+
74+ def trace_range (self , stream , zone , read = True , write = True , mode = TraceMode .ASYNC ):
75+ ranges = self .dart .iotranslate (stream , zone .start , zone .stop - zone .start )
76+ va = zone .start
77+ for pa , size in ranges :
78+ if pa is not None :
79+ pzone = irange (pa , size )
80+ self .page_map [pzone ] = (pa , va )
81+ self .hv .add_tracer (pzone , "DARTVATracer" , mode ,
82+ self .event_va if read else None ,
83+ self .event_va if write else None ,
84+ stream = stream )
85+ va += size
86+
87+ def event_va (self , evt , stream = None ):
88+ pabase , vabase = self .page_map .get (evt .addr , (None , None ))
89+ if pabase is None :
90+ addr = "UNKNOWN"
91+ else :
92+ addr = f"{ evt .addr - pabase + vabase :#x} "
93+ t = "W" if evt .flags .WRITE else "R"
94+ m = "+" if evt .flags .MULTI else " "
95+ logline = (f"[cpu{ evt .flags .CPU } ] [0x{ evt .pc :016x} ] IOVA/{ stream } : { t } .{ 1 << evt .flags .WIDTH :<2} { m } " +
96+ f"{ addr } (0x{ evt .addr :x} ) = 0x{ evt .data :x} " )
97+ self .hv .log (logline , show_cpu = False )
0 commit comments