Initial commit of OpenSPARC T2 architecture model.
[OpenSPARC-T2-SAM] / sam-t2 / sam / cpus / vonk / ss / api / samfe / src / CmdParserNiCmd.py
CommitLineData
920dae64
AT
1# ========== Copyright Header Begin ==========================================
2#
3# OpenSPARC T2 Processor File: CmdParserNiCmd.py
4# Copyright (c) 2006 Sun Microsystems, Inc. All Rights Reserved.
5# DO NOT ALTER OR REMOVE COPYRIGHT NOTICES.
6#
7# The above named program is free software; you can redistribute it and/or
8# modify it under the terms of the GNU General Public
9# License version 2 as published by the Free Software Foundation.
10#
11# The above named program is distributed in the hope that it will be
12# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
13# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14# General Public License for more details.
15#
16# You should have received a copy of the GNU General Public
17# License along with this work; if not, write to the Free Software
18# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
19#
20# ========== Copyright Header End ============================================
21"""provide user commands' equivalent of function calls.
22"""
23
24import re, sys
25
26import RegisterMap
27
28import Pfe_Tlb
29import Pfe_Assembler
30
31NAME_CPU = 'cpu'
32NAME_CORE = 'core'
33NAME_UCORE = 'ucore'
34NAME_STRAND = 'strand'
35
36TRAP_LEVEL = 6
37
38# before any function in this file is used, the following global variables
39# must be assigned a valid object.
40_myReposit = None # RiesReposit object
41_myRegmap = None
42_asiRegMap = {}
43_myNstrandObj = 1
44_myCpusize = 0
45_myCoresize = 0
46_myuCoresize = 0
47
48_myStrandMap = { }
49_myuCoreMap = { }
50_myCoreMap = { }
51_myCpuMap = { }
52
53_myInstrCount = { }
54_myLastTid = 0
55
56_myVerbose = 1
57
58# zzz_cmd_RS() function registry
59# API_DOCS[api-ext]=('api-ext syntax', 'API-EXT', 'short-desc', 'long-desc')
60# RS_zzz() API registry
61# API_DOCS[api]=('api syntax', 'API', 'short-desc', 'long-desc')
62API_DOCS = { }
63
64
65class AddrType:
66 """
67 the origin of an address
68 """
69 PA_TYPE = 0
70 RA_TYPE = 1
71 VA_TYPE = 2
72
73
74class InstrInfo:
75 """a class contins instr information
76 TODO need more work/fields
77 """
78 def __init__ (self, name, type):
79 """
80 """
81 self.name = name
82 self.type = type
83
84
85def initCmdParserNiCmd (reposit, nstrandObjs):
86 """this function must be called before any other functions in this file
87 can be used.
88 """
89 global _myReposit
90 global _myNstrandObj
91 global _myCpusize
92 global _myCoresize
93 global _myuCoresize
94 global _myInstrCount
95 global _asiRegMap
96 global _myRegmap
97
98## global nasUtil
99
100 _myReposit = reposit
101 _myRegmap = RegisterMap.RegisterMap(reposit.optdir['--ar'])
102 if _myReposit.nucores == 0:
103 _myCpusize = _myReposit.ncores * _myReposit.nstrands
104 _myCoresize = _myReposit.nstrands
105 _myuCoresize = 1
106 else:
107 _myCpusize = _myReposit.ncores * _myReposit.nucores * _myReposit.nstrands
108 _myCoresize = _myReposit.nucores * _myReposit.nstrands
109 _myuCoresize = _myReposit.nstrands
110
111 total = _myCpusize * _myReposit.ncpus
112 if total != nstrandObjs:
113 sys.stderr.write('WARNING: CmdParserNiCmd: initCmdParserNiCmd: total=%d, nstrandObjs=%d\n' % (total, nstrandObjs))
114
115 _myNstrandObj = nstrandObjs
116 i = 0
117 while i < _myNstrandObj:
118 _myInstrCount[i] = 0
119 i += 1
120
121 asiRegMap = _myRegmap.regMapAsi
122 for reg in asiRegMap:
123 regName = reg
124 asi = asiRegMap[reg][0]
125 va = asiRegMap[reg][1]
126 # ha144505: commented this out as asi_alias is per strand
127 # and should be called for each strand. This here is wrong
128 # and we're having trouble gettiung the Sam Front end to work.
129 # TODO TODO TODO TODO TODO cleanup
130
131 # registering an alias with a single strand, registers it for
132 # all the strands ... uncommented
133 # ERROR: Pfe_Strand.GetAttrError: The strand has no getable state member 'asi_alias'
134 #_myReposit.riesling.s[0].asi_alias(regName,asi,va)
135
136 _asiRegMap = asiRegMap
137 _initDoc()
138
139
140def _initDoc ():
141 """ATTENTION!! remember to register any additional zzz_cmd_RS() or
142 RS_zzz() document.
143 """
144 global API_DOCS
145
146 API_DOCS['RS_set_quiet'] = ("RS_set_quiet(num)", 'API', 'num=1 enable quiet mode, 0 disable it', 'TODO')
147 API_DOCS['RS_logical_to_physical'] = ("RS_logical_to_physical(tid,type,addr)", 'API', 'convert logical address to physical address', 'TODO')
148 API_DOCS['RS_write_phys_memory'] = ("RS_write_phys_memory(tid,addr,value,size)", 'API', 'write to a physical memory', 'TODO')
149 API_DOCS['RS_read_phys_memory'] = ("RS_read_phys_memory(tid,addr,size)", 'API', 'read from a physical memory', 'TODO')
150 API_DOCS['RS_disassemble'] = ("RS_disassemble(tid,addr,isva)", 'API', 'disassemble an instruction', 'TODO')
151 API_DOCS['RS_disassemblePC'] = ("RS_disassemblePC(tid)", 'API', 'disassemble the just executed instruction', 'TODO')
152 API_DOCS['RS_read_fp_register_x'] = ("RS_read_fp_register_x(tid,regid)", 'API', 'read from a floating-point double register' ,'TODO')
153 API_DOCS['RS_read_fp_register_i'] = ("RS_read_fp_register_i(tid,regid)", 'API', 'read from a floating-point single register' ,'TODO')
154 API_DOCS['RS_write_fp_register_x'] = ("RS_write_fp_register_x(tid,regid,value)", 'API', 'write to a floating-point double register' ,'TODO')
155 API_DOCS['RS_write_fp_register_i'] = ("RS_write_fp_register_i(tid,regid,value)", 'API', 'write to a floating-point single register' ,'TODO')
156 API_DOCS['RS_print_archregs'] = ("RS_print_archregs(tid=0,a_str='')", 'API', 'print out integer/floating-point/control registers', 'TODO')
157 API_DOCS['RS_print_regs'] = ("RS_print_regs(tid=0,a_str='')", 'API', 'print out integer/floating-point/control registers', 'TODO')
158 API_DOCS['RS_print_fpregs'] = ("RS_print_fpregs(tid=0)", 'API', 'print out floating-point registers', 'TODO')
159 API_DOCS['RS_print_mmuregs'] = ("RS_print_mmuregs(tid=0)", 'API', 'print out mmu regsiters', 'TODO')
160 API_DOCS['RS_print_cmpregs'] = ("RS_print_cmpregs(tid=0)", 'API', 'print out cmp regsiters', 'TODO')
161 API_DOCS['RS_get_register_number'] = ("RS_get_register_number(tid,regname)", 'API', 'convert a regname to a regid', 'TODO')
162 API_DOCS['RS_write_register'] = ("RS_write_register(tid,regid,value)", 'API', 'write to a register by regid', 'TODO')
163 API_DOCS['RS_write_register_name'] = ("RS_write_register_name(regname,value,tid=0)", 'API', 'write to a register by regname', 'TODO')
164 API_DOCS['RS_read_register'] = ("RS_read_register(tid,regid)", 'API', 'read a register by regid', 'TODO')
165 API_DOCS['RS_read_register_name'] = ("RS_read_register_name(regname,tid=0)", 'API', 'read a register by regname', 'TODO')
166 API_DOCS['RS_asi_read'] = ("RS_asi_read(asi,va,tid)", 'API', 'read an asi value by asi/va', 'TODO')
167 API_DOCS['RS_asi_write'] = ("RS_asi_write(asi,va,value,tid)", 'API', 'write an asi value by asi/va', 'TODO')
168 API_DOCS['RS_dump_tlb'] = ("RS_dump_tlb(tid,itlb,valid)", 'API', 'dump i/d-tlb content', 'TODO')
169 API_DOCS['RS_dump_memory'] = ("RS_dump_memory(fileName,startPA,size,binary=0)", 'API', 'dump memory content', 'TODO')
170
171
172def showApiDoc (key=None):
173 """return 1 means a match is found, 0 means no match
174 """
175 if key:
176 # strip off ' ', '(', or ')', they are not part of the key
177 i = key.find('(')
178 if i > -1:
179 key = key[:i]
180 key = key.strip()
181 if API_DOCS.has_key(key):
182 (func,type,shortd,longd) = API_DOCS[key]
183 print '%s: %s: \t%s' % (type, func, shortd)
184 if longd and longd != 'TODO':
185 print '\t\t%s' % (longd)
186 return 1
187 else:
188 return 0
189 else:
190 # show all docs
191 byType = { }
192 for (key2,(func,type,shortd,longd)) in API_DOCS.items():
193 if not byType.has_key(type):
194 byType[type] = { }
195 byType[type][key2] = (func,type,shortd,longd)
196 klist = byType.keys()
197 klist.sort()
198 for key2 in klist:
199 klist3 = byType[key2].keys()
200 klist3.sort()
201 for key3 in klist3:
202 (func,type,shortd,longd) = byType[key2][key3]
203 #print '%s: %s: \t%s' % (type, func, shortd)
204 print '%s: %s' % (type, func)
205 return 1
206
207
208
209def _evalCmd (cmd):
210 """
211 """
212 #print '#DBX: cmd=', cmd
213 #sys.stdout.write(cmd +"\n")
214 return eval(cmd, _myReposit.globals, locals())
215
216def _execCmd (cmd):
217 """
218 """
219 exec cmd in _myReposit.globals, locals()
220 return
221
222###############################################################################
223
224def incrIcount_RSI (tid, count=1):
225 """RSI means riesling internal, not meant for general users
226 """
227 global _myInstrCount
228 global _myLastTid
229
230 _myInstrCount[tid] += count
231 _myLastTid = tid
232
233
234def getIcount_RSI (tid):
235 """
236 """
237 return _myInstrCount[tid]
238
239
240def setLastTid_RSI (tid):
241 """
242 """
243 global _myLastTid
244
245 _myLastTid = tid
246
247
248def getLastTid_RSI ():
249 """
250 """
251 return _myLastTid
252
253
254def isVerbose ():
255 """
256 """
257 return _myVerbose
258
259###############################################################################
260
261def sstepi_cmd_RS (thStr):
262 """e.g., thStr='l0'
263 """
264 tid = int(thStr[1:])
265 # get the pc before stepping
266 pc = _myReposit.riesling.s[tid].pc
267 # step one instr
268 _myReposit.riesling.s[tid].step()
269 # increase instr count
270 incrIcount_RSI(tid)
271
272def pregs_cmd_RS (tid=0, a_str=''):
273 """wrapper for RS_print_archregs(), depricated.
274 """
275 RS_print_archregs(tid, a_str)
276
277
278def pregsMmu_cmd_RS (tid=0):
279 """wrapper for RS_print_mmuregs(), depricated.
280 """
281 RS_print_mmuregs(tid)
282
283
284def _readCtlReg(cmd, regname, i, stride, buffer):
285 """
286 """
287 buffer.append('%s=%#x ' % (regname, _evalCmd(cmd)))
288 i = _addEOL(i, stride, buffer)
289 return i
290
291
292def _addEOL (i, stride, buffer):
293 """
294 """
295 i += 1
296 if i % stride == 0:
297 buffer.append('\n')
298 return i
299
300
301def obj_read_reg_cmd_RS (tid, regname):
302 """obj_read_reg_cmd(th_obj, "pc"):
303 """
304
305 if not _myRegmap.hasReg(regname) or _myRegmap.feName2beName(regname) == '':
306 sys.stdout.write("Unimplemented register %s access\n" % (regname,))
307 return
308
309 newCmd = '%s.s[%d].%s' % (_myReposit.topName,tid,regname)
310 return _evalCmd(newCmd)
311
312###############################################################################
313
314def RS_set_quiet(num):
315 """
316 0 --- verbose mode, instr & reg delta
317 1 --- silent mode
318 2 --- verbose mode, instr only
319 """
320 global _myVerbose
321
322 if num == 1:
323 _myVerbose = 0
324 _lstmode(0)
325 elif num == 0:
326 _myVerbose = 1
327 _lstmode(1)
328 elif num == 2:
329 _myVerbose = 1
330 _lstmode(2)
331 else:
332 raise RuntimeError
333
334
335def _lstmode(mode):
336 """
337 """
338 for s in _myReposit.riesling.s:
339 s.lstmode(mode)
340
341
342def RS_proc_no_2_ptr(tid):
343 """th_obj= RS_proc_no_2_ptr(tid)
344 """
345 # for our Ni command parsing purpose, the tid is quite enough
346 return tid
347
348
349def RS_current_processor ():
350 """
351 """
352 return _myLastTid
353
354
355def RS_logical_to_physical (tid, vaddr, addr_type=AddrType.VA_TYPE, pid=None, ctxt=None):
356 """
357 addr_type: 0 - pa, 1 - ra, 2 - va
358 """
359 # va2pa() always check itlb, then dtlb.
360 if addr_type == AddrType.VA_TYPE:
361 # try va2pa first, if not found, then ra2pa
362 type = addr_type
363 if pid != None and ctxt != None:
364 pa = _myReposit.riesling.s[tid].va2pa(vaddr, ctxt, pid)
365 elif ctxt != None:
366 pa = _myReposit.riesling.s[tid].va2pa(vaddr, ctxt)
367 else:
368 pa = _myReposit.riesling.s[tid].va2pa(vaddr)
369 if pa == 0:
370 # try ra2pa
371 type = AddrType.RA_TYPE
372 if pid != None:
373 pa = _myReposit.riesling.s[tid].ra2pa(vaddr, pid)
374 else:
375 pa = _myReposit.riesling.s[tid].ra2pa(vaddr)
376 elif addr_type == AddrType.RA_TYPE:
377 # go straight to ra2pa
378 type = addr_type
379 if pid != None:
380 pa = _myReposit.riesling.s[tid].ra2pa(vaddr, pid)
381 else:
382 pa = _myReposit.riesling.s[tid].ra2pa(vaddr)
383 else:
384 type = addr_type
385 pa = vaddr
386
387 # if no translation is needed, 0 will be returned, so we should return
388 # the input addr instead of 0
389 if pa == 0:
390## if addr_type == 2:
391## sys.stderr.write('WARNING: no va2pa is performed, original addr is returned\n')
392## elif addr_type == 1:
393## sys.stderr.write('WARNING: no ra2pa is performed, original addr is returned\n')
394 type = AddrType.PA_TYPE
395 pa = vaddr
396
397 return (pa,type)
398
399
400def RS_write_phys_memory (tid, addr, value, size):
401 """RS_write_phys_memory(th_obj, 0x9a00000000, orig_tid, 4):
402 """
403 #sys.stderr.write('DBX: RS_write_phys_memory: tid=%d, addr=%#x, value=%#x, size=%d\n' % (tid, addr, value, size))
404
405 if not size in [1,2,4,8]:
406 sys.stderr.write('ERROR: RS_write_phys_memory: wrong size %d, must be 1,2,4,8-byte\n' % (size))
407 return None
408
409 if long(addr) % size:
410 sys.stderr.write('ERROR: write_phys_memory: addr %#x is not %d-byte aligned\n' % (addr, size))
411 return None
412
413 if size == 1:
414 _myReposit.riesling.mem.b[addr] = value
415 elif size == 2:
416 _myReposit.riesling.mem.h[addr] = value
417 elif size == 4:
418 _myReposit.riesling.mem.w[addr] = value
419 else:
420 _myReposit.riesling.mem.x[addr] = value
421
422 # with type 'K', we can pass over uint64_t value with bit63=1
423## if size == 8 and value > 0x7fffffffffffffff:
424## #TODO I am having difficulty in passing larger value to c++ code,
425## # always get "OverflowError: long too big to convert" error,
426## # have to split the large value into two 4-byte pieces ---
427## # waiting for an explanation/solution from python community.
428## # 10/13/04
429## value1 = value >> 32 # upper 32-bit
430## value2 = value & 0x00000000ffffffffL # lower 32-bit
431## nasUtil.access_cmd(addr, value1, tid, 0, 4)
432## nasUtil.access_cmd(addr+4, value2, tid, 0, 4)
433## else:
434## nasUtil.access_cmd(addr, value, tid, 0, size)
435
436
437def RS_read_phys_memory (tid, addr, size):
438 """
439 """
440 #sys.stderr.write('DBX: RS_read_phys_memory: tid=%d, addr=%#x, size=%d\n' % (tid, addr, size))
441 # the data is returned as L, if the highest bit (bit63) is 1, python
442 # will present it as negative long, so have to convert it back because
443 # we want uint64. ---> change type to K does not help, still return
444 # negative.
445 if not size in [1,2,4,8]:
446 sys.stderr.write('ERROR: RS_read_phys_memory: wrong size %d, must be 1,2,4,8-byte\n' % (size))
447 return None
448
449 if long(addr) % size:
450 sys.stderr.write('ERROR: RS_read_phys_memory: addr %#x is not %d-byte aligned\n' % (addr, size))
451 return None
452
453 if size == 1:
454 data = _myReposit.riesling.mem.b[addr]
455 elif size == 2:
456 data = _myReposit.riesling.mem.h[addr]
457 elif size == 4:
458 data = _myReposit.riesling.mem.w[addr]
459 else:
460 data = _myReposit.riesling.mem.x[addr]
461
462 if (data < 0):
463 data = 0xffffffffffffffffL + data + 1
464 return data
465
466
467def RS_disassemble (tid, addr, addr_type, pyobj=None):
468 """(_, dis_str ) = RS_disassemble(th_obj, currpc, 1)
469 caller must provide the proper Python object, e.g., N2_Python
470 """
471 #sys.stderr.write('DBX: RS_disassemble: tid=%d, addr=%#x, isva=%d\n' % (tid, addr, isva))
472 # addr_type: 0 - pa, 1 - ra, 2 - va
473 if addr_type == AddrType.PA_TYPE:
474 type = addr_type
475 paddr = addr
476 else:
477 (paddr,type) = RS_logical_to_physical(tid, addr, addr_type)
478
479 # get instr word
480 iword = RS_read_phys_memory(tid,paddr,4)
481
482 # disassemble the instr
483 if pyobj:
484 iwStr = '[%08x] %s' % (iword, pyobj.dis(iword,0x0))
485 else:
486 iwStr = '[%08x] %s' % (iword, 'UNKNOWN')
487
488
489 return (4,iwStr,type)
490
491
492def RS_disassemblePC (tid, pyobj=None):
493 """(_, dis_str ) = RS_disassemblePC(th_obj)
494 caller must provide the proper Python object, e.g., N2_Python
495 """
496 # disassemble the just executed instr
497 pc = _myReposit.riesling.s[tid].pc
498 return RS_disassemble(tid, pc, 2, pyobj)
499
500
501def RS_instruction_info (tid, currpc):
502 """instr = RS_instruction_info(RS_current_processor(), currpc)
503 """
504 # TODO InstrInfo should contain more information
505 (size,iw,type) = RS_disassemble(tid, currpc, 1)
506 tokens = re.split('\s+|,', iw)
507 return InstrInfo(tokens[1], -99)
508
509
510def RS_read_fp_register_x (tid, regid):
511 """dest_val = RS_read_fp_register_x(th_obj, rd_n)
512 """
513 newCmd = '%s.s[%d].d%d' % (_myReposit.topName,tid,regid)
514 return _evalCmd(newCmd)
515
516
517def RS_read_fp_register_i (tid, regid):
518 """dest_val = RS_read_fp_register_i(th_obj, rd_n)
519 """
520 newCmd = '%s.s[%d].f%d' % (_myReposit.topName,tid,regid)
521 return _evalCmd(newCmd)
522
523
524def RS_write_fp_register_x (tid, regid, value):
525 """
526 """
527 newCmd = '%s.s[%d].d%d = %d' % (_myReposit.topName,tid,regid,value)
528 #code = compile(newCmd,'sys.stderr','single')
529 #exec code in _myReposit.globals
530 _execCmd(newCmd)
531
532def RS_write_fp_register_i (tid, regid, value):
533 """
534 """
535 newCmd = '%s.s[%d].f%d = %d' % (_myReposit.topName,tid,regid,value)
536 #code = compile(newCmd,'sys.stderr','single')
537 #exec code in _myReposit.globals
538 _execCmd(newCmd)
539
540def print_n2_archregs(tid=0,a_str=''):
541 """print n2 format archregs
542 """
543 sys.stdout.write('Strand %d:\n' % tid)
544 if a_str.find('-i') > -1:
545 # g/o/l/i registers
546 RS_print_ipregs (tid)
547 sys.stdout.write('\n')
548
549 if a_str.find('-f') > -1:
550 # floating-point registers
551 RS_print_fpregs(tid)
552 sys.stdout.write('\n')
553
554 # control registers
555 sys.stdout.write(' %16s %16s %16s %16s\n' % ('PC', 'NPC', 'CWP', 'CCR'))
556 sys.stdout.write(' %016x %016x %016x %016x\n' %
557 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'pc'))),
558 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'npc'))),
559 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'cwp'))),
560 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'ccr')))))
561
562 sys.stdout.write(' %16s %16s %16s %16s\n' % ('FPRS', 'FSR', 'PSTATE', 'HPSTATE'))
563 sys.stdout.write(' %016x %016x %016x %016x\n' %
564 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'fprs'))),
565 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'fsr'))),
566 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'pstate'))),
567 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'hpstate')))))
568
569 sys.stdout.write(' %16s %16s %16s %16s\n' % ('ASI', 'TICK', 'TL', 'PIL'))
570 sys.stdout.write(' %016x %016x %016x %016x\n' %
571 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'asi'))),
572 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'tick'))),
573 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'tl'))),
574 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'pil')))))
575
576 sys.stdout.write(' %16s %16s %16s %16s\n' % ('CANSAVE', 'CANRESTORE', 'CLEANWIN', 'OTHERWIN'))
577 sys.stdout.write(' %016x %016x %016x %016x\n' %
578 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'cansave'))),
579 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'canrestore'))),
580 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'cleanwin'))),
581 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'otherwin')))))
582
583 sys.stdout.write(' %16s %16s %16s %16s\n' % ('HVER', 'WSTATE', 'GL', 'TBA'))
584 sys.stdout.write(' %016x %016x %016x %016x\n' %
585 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'hver'))),
586 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'wstate'))),
587 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'gl'))),
588 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'tba')))))
589
590 sys.stdout.write(' %16s %16s %16s %16s\n' % ('HTBA', 'TICK_CMPR', 'STICK_CMPR', 'HSTICK_CMPR'))
591 sys.stdout.write(' %016x %016x %016x %016x\n' %
592 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'htba'))),
593 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'tick_cmpr'))),
594 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'stick_cmpr'))),
595 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'hstick_cmpr')))))
596
597 sys.stdout.write(' %16s %16s %16s %16s\n' % ('HINTP', 'SOFTINT', 'GSR', 'INTR_RECEIVE'))
598 sys.stdout.write(' %016x %016x %016x %016x\n' %
599 ((_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'hintp'))),
600 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'softint'))),
601 (_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,'gsr'))),
602 (0))) #TODO INTR_RECEIVE
603
604 for i in range(1,7):
605 sys.stdout.write(' %16s %16s %16s %16s\n' % (('TPC%d' % i), ('TNPC%d' % i), ('TSTATE%d' % i), ('TT%d' % i)))
606 sys.stdout.write(' %016x %016x %016x %016x\n' %
607 ((_evalCmd('%s.s[%d].t[%d].tpc' % (_myReposit.topName,tid,i))),
608 (_evalCmd('%s.s[%d].t[%d].tnpc' % (_myReposit.topName,tid,i))),
609 (_evalCmd('%s.s[%d].t[%d].tstate' % (_myReposit.topName,tid,i))),
610 (_evalCmd('%s.s[%d].t[%d].tt' % (_myReposit.topName,tid,i)))))
611
612 sys.stdout.write(' %16s %16s %16s %16s\n' % ('HTSTATE1', 'HTSTATE2', 'HTSTATE3', 'HTSTATE4'))
613 sys.stdout.write(' %016x %016x %016x %016x\n' %
614 ((_evalCmd('%s.s[%d].t[1].htstate' % (_myReposit.topName,tid))),
615 (_evalCmd('%s.s[%d].t[2].htstate' % (_myReposit.topName,tid))),
616 (_evalCmd('%s.s[%d].t[3].htstate' % (_myReposit.topName,tid))),
617 (_evalCmd('%s.s[%d].t[4].htstate' % (_myReposit.topName,tid)))))
618
619 sys.stdout.write(' %16s %16s\n' % ('HTSTATE5', 'HTSTATE6'))
620 sys.stdout.write(' %016x %016x\n' %
621 ((_evalCmd('%s.s[%d].t[5].htstate' % (_myReposit.topName,tid))),
622 (_evalCmd('%s.s[%d].t[6].htstate' % (_myReposit.topName,tid)))))
623 sys.stdout.write('\n')
624
625 if a_str.find('-m') > -1:
626 # mmu registers
627 print_n2_mmuregs(tid)
628 sys.stdout.write('\n')
629
630 if a_str.find('-c') > -1:
631 # cmp registers
632 print_n2_cmpregs(tid)
633
634
635def RS_print_archregs (tid=0, a_str=''):
636 """
637 """
638
639 if (_myReposit.optdir['--ar'] == 'n2'):
640 print_n2_archregs(tid,a_str)
641 return
642
643 sys.stdout.write('Strand %d:\n' % tid)
644 # show the current window, gl register and other ASRs
645 i = 0
646 regs = _myRegmap.regMap.keys()
647 regs.sort()
648 for reg in regs:
649 if i % 4 == 0:
650 sys.stdout.write("\n")
651 if _myRegmap.regMap[reg][0] == '':
652 sys.stdout.write('%-10s%#18s' % (reg,'UNIMP'))
653 else:
654 sys.stdout.write('%-10s%#018x ' % (reg,_evalCmd('%s.s[%d].%s' % (_myReposit.topName,tid,_myRegmap.regMap[reg][0]))))
655 i = i + 1
656
657 # XXX add support for arch specific regs
658
659 sys.stdout.write('\n')
660 if a_str != '-all':
661 return
662
663 # show the regs for all the other windows
664 # show all the global regs
665
666 max_gl = _myReposit.riesling.s0.max_gl
667 for gl in range(0,max_gl+1):
668 if gl == _myReposit.riesling.s[tid].gl:
669 continue
670 sys.stdout.write('\nglobal set %d' % (gl,))
671 for reg in range(0,8):
672 if reg % 4 == 0:
673 sys.stdout.write("\n")
674 key = 'g%d' % (reg,)
675 sys.stdout.write('%-6s%#018x ' % (key,_evalCmd('%s.s[%d].g[%d].%s' % (_myReposit.topName,tid,gl,_myRegmap.regMap[key][0]))))
676
677 sys.stdout.write('\n')
678
679 # show all the window regs
680 max_win = _myReposit.riesling.s0.max_wp
681 for win in range(0,max_win):
682 if win == _myReposit.riesling.s[tid].cwp:
683 continue
684 sys.stdout.write('\nwindow %d' % (win,))
685 for o_reg in range(0,8):
686 if o_reg % 4 == 0:
687 sys.stdout.write("\n")
688 key = 'o%d' % (o_reg,)
689 sys.stdout.write('%-6s%#018x ' % (key,_evalCmd('%s.s[%d].w[%d].%s' % (_myReposit.topName,tid,gl,_myRegmap.regMap[key][0]))))
690 for l_reg in range(0,8):
691 if l_reg % 4 == 0:
692 sys.stdout.write("\n")
693 key = 'l%d' % (l_reg,)
694 sys.stdout.write('%-6s%#018x ' % (key,_evalCmd('%s.s[%d].w[%d].%s' % (_myReposit.topName,tid,gl,_myRegmap.regMap[key][0]))))
695 for i_reg in range(0,8):
696 if i_reg % 4 == 0:
697 sys.stdout.write("\n")
698 key = 'i%d' % (i_reg,)
699 sys.stdout.write('%-6s%#018x ' % (key,_evalCmd('%s.s[%d].w[%d].%s' % (_myReposit.topName,tid,gl,_myRegmap.regMap[key][0]))))
700
701 sys.stdout.write('\n')
702
703 # always output floating point registers
704 sys.stdout.write('\n')
705 RS_print_fpregs(tid)
706
707
708def RS_print_regs (tid=0, a_str=''):
709 """
710 """
711 RS_print_archregs(tid, a_str)
712
713
714def RS_print_ipregs (tid, a_str=''):
715 """
716 """
717 if a_str != '-all':
718 # current g/o/l/i registers
719 gl = _myReposit.riesling.s[tid].gl
720 cwp = _myReposit.riesling.s[tid].cwp
721 sys.stdout.write(' %16s %16s %16s %16s\n' % (('g[%d]' % gl), ('o[%d]' % cwp), ('l[%d]' % cwp), ('i[%d]' % cwp)))
722 for i in range(0,8):
723 sys.stdout.write('%d %016x %016x %016x %016x\n' %
724 (i,
725 (_evalCmd('%s.s[%d].g[%d].g%d' % (_myReposit.topName,tid,gl,i))),
726 (_evalCmd('%s.s[%d].w[%d].o%d' % (_myReposit.topName,tid,cwp,i))),
727 (_evalCmd('%s.s[%d].w[%d].l%d' % (_myReposit.topName,tid,cwp,i))),
728 (_evalCmd('%s.s[%d].w[%d].i%d' % (_myReposit.topName,tid,cwp,i)))))
729 else:
730 # all g/o/l/i registers
731 maxgl = ((_myReposit.riesling.s[tid].hver >> 16) & 0x7) + 1
732 maxwin = (_myReposit.riesling.s[tid].hver & 0x1f) + 1
733 for i in range(0,maxwin):
734 if i < maxgl:
735 sys.stdout.write(' %16s %16s %16s %16s\n' % (('g[%d]'%i), ('o[%d]'%i), ('l[%d]'%i), ('i[%d]'%i)))
736 for j in range(0,8):
737 sys.stdout.write('%d %016x %016x %016x %016x\n' %
738 (j,
739 (_evalCmd('%s.s[%d].g[%d].g%d' % (_myReposit.topName,tid,i,j))),
740 (_evalCmd('%s.s[%d].w[%d].o%d' % (_myReposit.topName,tid,i,j))),
741 (_evalCmd('%s.s[%d].w[%d].l%d' % (_myReposit.topName,tid,i,j))),
742 (_evalCmd('%s.s[%d].w[%d].i%d' % (_myReposit.topName,tid,i,j)))))
743 sys.stdout.write('\n')
744 else:
745 sys.stdout.write(' %16s %16s %16s %16s\n' % ('', ('o[%d]'%i), ('l[%d]'%i), ('i[%d]'%i)))
746 for j in range(0,8):
747 sys.stdout.write('%d %16s %016x %016x %016x\n' %
748 (j,
749 (''),
750 (_evalCmd('%s.s[%d].w[%d].o%d' % (_myReposit.topName,tid,i,j))),
751 (_evalCmd('%s.s[%d].w[%d].l%d' % (_myReposit.topName,tid,i,j))),
752 (_evalCmd('%s.s[%d].w[%d].i%d' % (_myReposit.topName,tid,i,j)))))
753 sys.stdout.write('\n')
754
755
756def RS_print_fpregs (tid=0):
757 """
758 """
759 for i in range(0,64,8):
760 sys.stdout.write(' %16s %16s %16s %16s\n' % ('f%d'%i, 'f%d'%(i+2), 'f%d'%(i+4), 'f%d'%(i+6)))
761 sys.stdout.write(' %016x %016x %016x %016x\n' %
762 ((_evalCmd('%s.s[%d].d%d' % (_myReposit.topName,tid,i))),
763 (_evalCmd('%s.s[%d].d%d' % (_myReposit.topName,tid,i+2))),
764 (_evalCmd('%s.s[%d].d%d' % (_myReposit.topName,tid,i+4))),
765 (_evalCmd('%s.s[%d].d%d' % (_myReposit.topName,tid,i+6)))))
766
767
768def print_n2_mmuregs(tid = 0):
769 """
770 """
771 sys.stdout.write(' %16s %16s %16s %16s\n' % ('CTXT_PRIM_0', 'CTXT_SEC_0', 'CTXT_PRIM_1', 'CTXT_SEC_1'))
772 sys.stdout.write(' %016x %016x %016x %016x\n' %
773 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ID_PRIMARY_CTXT_REG_0'][0],_myRegmap.regMapAsi['MMU_ID_PRIMARY_CTXT_REG_0'][1]))),
774 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_D_SCNDRY_CTXT_REG_0'][0],_myRegmap.regMapAsi['MMU_D_SCNDRY_CTXT_REG_0'][1]))),
775 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ID_PRIMARY_CTXT_REG_1'][0],_myRegmap.regMapAsi['MMU_ID_PRIMARY_CTXT_REG_1'][1]))),
776 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_D_SCNDRY_CTXT_REG_1'][0],_myRegmap.regMapAsi['MMU_D_SCNDRY_CTXT_REG_1'][1])))))
777
778 sys.stdout.write(' %16s %16s %16s %16s\n' % ('I_TAG_ACC', 'D_TAG_ACC', 'DSFAR', 'LSU_CONTROL'))
779 sys.stdout.write(' %016x %016x %016x %016x\n' %
780 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ITLB_TAG_ACCESS'][0],_myRegmap.regMapAsi['MMU_ITLB_TAG_ACCESS'][1]))),
781 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_DTLB_TAG_ACCESS'][0],_myRegmap.regMapAsi['MMU_DTLB_TAG_ACCESS'][1]))),
782 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_DSFAR'][0],_myRegmap.regMapAsi['MMU_DSFAR'][1]))),
783 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_LSU_CONTROL'][0],_myRegmap.regMapAsi['MMU_LSU_CONTROL'][1])))))
784
785 sys.stdout.write(' %16s %16s %16s %16s\n' % ('CTXT_Z_TSB_CFG0', 'CTXT_Z_TSB_CFG1', 'CTXT_Z_TSB_CFG2', 'CTXT_Z_TSB_CFG3'))
786 sys.stdout.write(' %016x %016x %016x %016x\n' %
787 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_0'][0],_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_0'][1]))),
788 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_1'][0],_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_1'][1]))),
789 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_2'][0],_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_2'][1]))),
790 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_3'][0],_myRegmap.regMapAsi['MMU_ZERO_CONTEXT_TSB_CONFIG_3'][1])))))
791
792 sys.stdout.write(' %16s %16s %16s %16s\n' % ('CTXT_NZ_TSB_CFG0', 'CTXT_NZ_TSB_CFG1', 'CTXT_NZ_TSB_CFG2', 'CTXT_NZ_TSB_CFG3'))
793 sys.stdout.write(' %016x %016x %016x %016x\n' %
794 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_0'][0],_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_0'][1]))),
795 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_1'][0],_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_1'][1]))),
796 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_2'][0],_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_2'][1]))),
797 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_3'][0],_myRegmap.regMapAsi['MMU_NONZERO_CONTEXT_TSB_CONFIG_3'][1])))))
798
799 sys.stdout.write(' %16s\n' % ('WATCHPOINT_ADDR'))
800 sys.stdout.write(' %016x\n' %
801 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['MMU_DMMU_WATCHPOINT'][0],_myRegmap.regMapAsi['MMU_DMMU_WATCHPOINT'][1])))))
802
803
804def RS_print_mmuregs (tid=0):
805 """
806 """
807 global _asiRegMap
808
809 if (_myReposit.optdir['--ar'] == 'n2'):
810 print_n2_mmuregs(tid)
811 return ''
812
813 str = ''
814 for reg in _asiRegMap.keys():
815 if reg.startswith('MMU_'):
816 newCmd = '%s.s0.%s' % (_myReposit.topName,reg)
817 val = _evalCmd(newCmd)
818 str = str + '%-40s %#018x' % (reg,val) + '\n'
819
820 return str
821
822def print_n2_cmpregs(tid=0):
823 """
824 """
825 sys.stdout.write(' %16s %16s %16s %16s\n' % ('CORE_AVAIL', 'CORE_ENABLE_ST', 'CORE_ENABLE', 'XIR_STEERING'))
826 sys.stdout.write(' %016x %016x %016x %016x\n' %
827 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_core_available'][0],_myRegmap.regMapAsi['CMP_core_available'][1]))),
828 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_core_enable_status'][0],_myRegmap.regMapAsi['CMP_core_enable_status'][1]))),
829 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_core_enable'][0],_myRegmap.regMapAsi['CMP_core_enable'][1]))),
830 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_xir_steering'][0],_myRegmap.regMapAsi['CMP_xir_steering'][1])))))
831
832 sys.stdout.write(' %16s %16s %16s\n' % ('TICK_ENABLE', 'STRAND_RUN', 'STRAND_RUN_ST'))
833 sys.stdout.write(' %016x %016x %016x\n' %
834 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_tick_enable'][0],_myRegmap.regMapAsi['CMP_tick_enable'][1]))),
835 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_running'][0],_myRegmap.regMapAsi['CMP_running'][1]))),
836 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_running_status'][0],_myRegmap.regMapAsi['CMP_running_status'][1])))))
837
838 sys.stdout.write(' %16s %16s\n' % ('CORE_ID', 'CORE_INTR_ID'))
839 sys.stdout.write(' %016x %016x\n' %
840 ((_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_core_id'][0],_myRegmap.regMapAsi['CMP_core_id'][1]))),
841 (_evalCmd('%s.s[%d].rdasi(%d,%d)' % (_myReposit.topName,tid,_myRegmap.regMapAsi['CMP_core_intr_id'][0],_myRegmap.regMapAsi['CMP_core_intr_id'][1])))))
842
843
844def RS_print_cmpregs (tid=0):
845 """
846 """
847 global _asiRegMap
848
849 if (_myReposit.optdir['--ar'] == 'n2'):
850 print_n2_cmpregs(tid)
851 return ''
852
853 str = ''
854 keylist = _asiRegMap.keys()
855 keylist.sort()
856 for reg in keylist:
857 if reg.startswith('CMP_'):
858 (asi,va) = _asiRegMap[reg]
859 str = str + '%-30s %#018x' % (reg,_myReposit.riesling.s[tid].rdasi(asi,va)) + '\n'
860
861 return str
862
863
864def RS_get_register_number (tid, regname):
865 """rd_n = RS_get_register_number(th_obj, dest_reg)
866 """
867 return _myRegmap.key2id(regname)
868
869
870def RS_write_register (tid, regid, value):
871 """RS_write_register(th_obj, rd_n, new_dest_val)
872 """
873 reg = _myRegmap.id2key(regid)
874 if reg == '':
875 sys.stdout.write("Unimplemented register id %d\n" % (regid,))
876 return
877 newCmd = '%s.s[%d].%s = %d' % (_myReposit.topName,tid,reg,value)
878 code = compile(newCmd,'sys.stderr','single')
879 exec code in _myReposit.globals
880
881def RS_write_register_name (regname, value, tid=0):
882 """
883 """
884 if not _myRegmap.hasReg(regname) or _myRegmap.feName2beName(regname) == '':
885 sys.stdout.write("Unimplemented register %s access\n" % (regname,))
886 return
887
888 newCmd = '%s.s[%d].%s=%d' % (_myReposit.topName,tid,regname,value)
889 #code = compile(newCmd,'sys.stderr','single')
890 #exec code in _myReposit.globals
891 _execCmd(newCmd)
892
893def RS_read_register (tid, regid):
894 """prev_tl = RS_read_register(th_obj, RS_get_register_number(th_obj, "tl"))
895 """
896 reg = _myRegmap.id2key(regid)
897 if reg == '':
898 sys.stdout.write("Unimplemented register id %d\n" % (regid,))
899 return
900 newCmd = '%s.s[%d].%s' % (_myReposit.topName,tid,reg)
901 return _evalCmd(newCmd)
902
903
904def RS_read_register_name (regname, tid=0):
905 """
906 """
907 if not _myRegmap.hasReg(regname) or _myRegmap.feName2beName(regname) == '':
908 sys.stdout.write("Unimplemented register %s access\n" % (regname,))
909 return
910
911 newCmd = '%s.s[%d].%s' % (_myReposit.topName,tid,regname)
912 return _evalCmd(newCmd)
913
914
915## def RS_reset (traptype):
916## """
917## """
918## nasUtil.reset_cmd(traptype)
919
920def RS_asi_read (asi, va, tid=0):
921 """read asi by asi/va
922 """
923 return _myReposit.riesling.s[tid].rdasi(asi, long(va))
924
925def RS_asi_write (asi, va, value, tid=0):
926 """write asi by asi/va/value
927 """
928 _myReposit.riesling.s[tid].wrasi(asi, long(va), long(value))
929
930
931def RS_dump_tlb (tid=0, itlb=1, valid=1):
932 """dump i/d-talb content
933 """
934 if itlb == 1:
935 print 'Strand %d inst_tlb:' % tid
936 print _myReposit.riesling.s[tid].inst_tlb
937 else:
938 print 'Strand %d data_tlb:' % tid
939 print _myReposit.riesling.s[tid].data_tlb
940
941
942def RS_dump_memory (fileName, startPA, size, binary=0):
943 """dump memory content to file, in plain text or binary form
944 if fileName='', then output to stdout
945 """
946 if fileName == '':
947 fr = sys.stdout
948 else:
949 fr = open(fileName,'w')
950 addr = startPA
951 c16 = 0
952 while addr < startPA + size:
953 data = RS_read_phys_memory(0,addr,1)
954 if binary == 1:
955 fr.write(chr(int(data)))
956 else:
957 if c16 == 0 :
958 fr.write("0x%016x " % (addr,))
959 fr.write('%02x' % (data,))
960 c16 = c16 + 1
961 if c16 % 2 == 0:
962 fr.write(' ')
963 if c16 % 16 == 0:
964 fr.write('\n')
965 c16 = 0
966 addr = addr + 1
967
968def __print_N2_Tte__(tte):
969 str = ("%-6s%#01x " % ('r',tte.r)) + ("%-6s%#018x " % ('pid',tte.pid)) + ("%-6s%#018x " % ('ctx',tte.ctx)) + "\n" + ("%-6s%#018x " % ('tag',tte.tag)) + ("%-6s%#018x " % ('addr',tte.addr)) + ("%-6s%#04x " % ('size',tte.size)) + "\n" + ("%-6s%#01x|" % ('valid',tte.valid)) + ("%-6s%#01x|" % ('nfo',tte.nfo)) + ("%-6s%#01x|" % ('ie',tte.ie)) + ("%-6s%#01x|" % ('e',tte.e)) + ("%-6s%#01x|" % ('cp',tte.cp)) + ("%-6s%#01x|" % ('cv',tte.cv)) + ("%-6s%#01x|" % ('p',tte.p)) + ("%-6s%#01x|" % ('w',tte.w)) + ("%-6s%#01x|" % ('x',tte.x)) + ("%-6s%#07x|" % ('sw',tte.soft_flds)) + "\n"
970
971 return str
972
973
974def RS_tlblookup (tid, va, pid=-1, ctxt=-1, ra2pa=-1, bypass=-1):
975 """
976 """
977 return _myReposit.strands[tid].tlblookup(va, pid, ctxt, ra2pa, bypass)
978
979
980def RS_read_memory (tid, addr, size=8, pid=-1, ctxt=-1, ra2pa=-1, bypass=1):
981 """
982 """
983 #sys.stderr.write('DBX: RS_read_memory: tid=%d, addr=%#x, size=%d\n' % (tid, addr, size))
984 # the data is returned as L, if the highest bit (bit63) is 1, python
985 # will present it as negative long, so have to convert it back because
986 # we want uint64. ---> change type to K does not help, still return
987 # negative.
988 if not size in [1,2,4,8]:
989 sys.stderr.write('ERROR: RS_read_memory: wrong size %d, must be 1,2,4,8-byte\n' % (size))
990 return None
991
992 if long(addr) % size:
993 sys.stderr.write('ERROR: RS_read_memory: addr %#x is not %d-byte aligned\n' % (addr, size))
994 return None
995
996 if bypass <= 0:
997 # the address is a VA, have to translate it
998 addr = RS_tlblookup(tid, addr, pid, ctxt, ra2pa, bypass)
999
1000 data = _myReposit.strands[tid].access_system_mem(long(addr), 0L, 1, size)
1001 if (data < 0):
1002 data = 0xffffffffffffffffL + data + 1
1003 return data