Commit | Line | Data |
---|---|---|
86530b38 AT |
1 | """Niagara command parser |
2 | """ | |
3 | ||
4 | import re, string, sys, types | |
5 | ||
6 | ## # if nasAPI is not available (which is the case in MOM mode), we can make do | |
7 | ## # without it. | |
8 | ## try: | |
9 | ## import nasAPI | |
10 | ## except: | |
11 | ## #sys.stderr.write('WARNING: nasAPI module is not available\n') | |
12 | ## pass | |
13 | ||
14 | import RegisterMap | |
15 | from CmdParserNiCmd import * | |
16 | ||
17 | # the following breakpoint constants (BP_*) must be consistent with | |
18 | # include/system/BreakpointEntry.h | |
19 | BP_PC = 1 | |
20 | BP_VA = 2 | |
21 | BP_PA = 3 | |
22 | ||
23 | hexRE = re.compile('^0[xX][0-9A-Fa-f]+$') | |
24 | octRE = re.compile('^0[0-7]+$') | |
25 | # split command line to locate any % variable, e.g., %pc | |
26 | splitRE = re.compile('[^%_\w]') | |
27 | ||
28 | ### need to support the following commands: | |
29 | ||
30 | SYM_PA = 'p:' | |
31 | SYM_RA = 'r:' | |
32 | SYM_VA = 'v:' | |
33 | ||
34 | NAME_CPU = 'cpu' | |
35 | NAME_CORE = 'core' | |
36 | NAME_UCORE = 'ucore' | |
37 | NAME_STRAND = 'strand' | |
38 | ||
39 | NAME_breakpoint = 'phys_mem' | |
40 | NAME_context = 'TODO' | |
41 | NAME_image = 'TODO' | |
42 | NAME_memory_space = 'phys_mem' | |
43 | NAME_port_space = 'TODO' | |
44 | NAME_processor = 'th' | |
45 | NAME_rtl_intf = 'TODO' | |
46 | NAME_swerver_memory = 'swvmem' | |
47 | NAME_swerver_proc_mmu = 'swmmu' | |
48 | NAME_swerver_thread_mmu = 'stmmu' | |
49 | ||
50 | CMD_action = 'action' | |
51 | CMD_add_directory = 'add-directory' | |
52 | CMD_api_apropos = 'api-apropos' | |
53 | CMD_api_help = 'api-help' | |
54 | CMD_apropos = 'apropos' | |
55 | CMD_break_cr = 'break-cr' | |
56 | CMD_break_exception = 'break-exception' | |
57 | CMD_break_hap = 'break-hap' | |
58 | CMD_break_io = 'break-io' | |
59 | CMD_breakpoint_break = 'break' | |
60 | CMD_catch_exception = 'catch-exception' | |
61 | CMD_clear_directories = 'clear-directories' | |
62 | CMD_cmpregs = 'cmpregs' | |
63 | CMD_command_list = 'command-list' | |
64 | CMD_context_off = 'off' | |
65 | CMD_context_on = 'on' | |
66 | CMD_cycle_break = 'cycle-break' | |
67 | CMD_cycle_break_absolute = 'cycle-break-absolute' | |
68 | CMD_debug_level = 'debug-level' | |
69 | CMD_delete = 'delete' | |
70 | CMD_device_interrupt = 'device-interrupt' | |
71 | CMD_devs = 'devs' | |
72 | CMD_disable = 'disable' | |
73 | CMD_disable_real_time_mode = 'disable-real-time-mode' | |
74 | CMD_disassemble = 'disassemble' | |
75 | CMD_display = 'display' | |
76 | CMD_dstc_disable = 'dstc-disable' | |
77 | CMD_dstc_enable = 'dstc-enable' | |
78 | CMD_echo = 'echo' | |
79 | CMD_enable = 'enable' | |
80 | CMD_enable_external_commands = 'enable-external-commands' | |
81 | CMD_enable_real_time_mode = 'enable-real-time-mode' | |
82 | CMD_eosl = 'eosl' | |
83 | CMD_expect = 'expect' | |
84 | CMD_gdb_remote = 'gdb-remote' | |
85 | CMD_get = 'get' | |
86 | CMD_help = 'help' | |
87 | CMD_hex = 'hex' | |
88 | CMD_ignore = 'ignore' | |
89 | CMD_image_add_diff_file = 'add-diff-file' | |
90 | CMD_image_add_partial_diff_file = 'add-partial-diff-file' | |
91 | CMD_image_commit = 'commit' | |
92 | CMD_image_limit_memory = 'limit-memory' | |
93 | CMD_image_save = 'save' | |
94 | CMD_image_x = 'x' | |
95 | CMD_instruction_profile_mode = 'instruction-profile-mode' | |
96 | CMD_io = 'io' | |
97 | CMD_io_buffer = 'io-buffer' | |
98 | CMD_istc_disable = 'istc-disable' | |
99 | CMD_istc_enable = 'istc-enable' | |
100 | CMD_le_checksum = 'le-checksum' | |
101 | CMD_le_permissions = 'le-permissions' | |
102 | CMD_list_attributes = 'list-attributes' | |
103 | CMD_list_breakpoints = 'list-breakpoints' | |
104 | CMD_list_classes = 'list-classes' | |
105 | CMD_list_failed_modules = 'list-failed-modules' | |
106 | CMD_list_haps = 'list-haps' | |
107 | CMD_list_modules = 'list-modules' | |
108 | CMD_list_namespaces = 'list-namespaces' | |
109 | CMD_list_profilers = 'list-profilers' | |
110 | CMD_list_vars = 'list-vars' | |
111 | CMD_load_binary = 'load-binary' | |
112 | CMD_load_file = 'load-file' | |
113 | CMD_load_module = 'load-module' | |
114 | CMD_load_veri_file = 'load-veri-file' | |
115 | CMD_logical_to_physical = 'logical-to-physical' | |
116 | CMD_magic_break_disable = 'magic-break-disable' | |
117 | CMD_magic_break_enable = 'magic-break-enable' | |
118 | CMD_memory_profile = 'memory-profile' | |
119 | CMD_memory_space_map = 'map' | |
120 | CMD_module_list_refresh = 'module-list-refresh' | |
121 | CMD_mmuregs = 'mmuregs' | |
122 | CMD_native_path = 'native-path' | |
123 | CMD_new_command = 'new_command' | |
124 | CMD_new_context = 'new-context' | |
125 | CMD_output_radix = 'output-radix' | |
126 | CMD_pdisable = 'pdisable' | |
127 | CMD_pdisassemble = 'pdisassemble' | |
128 | CMD_penable = 'penable' | |
129 | CMD_pio = 'pio' | |
130 | CMD_pipe = 'pipe' | |
131 | CMD_pli_run = 'pli-run' | |
132 | CMD_port_space_map = 'map' | |
133 | CMD_pregs = 'pregs' | |
134 | CMD_fpregs = 'fpregs' | |
135 | CMD_pregs_all = 'pregs-all' | |
136 | CMD_pregs_hyper = 'pregs-hyper' | |
137 | #CMD_print = 'print' | |
138 | CMD_print_directories = 'print-directories' | |
139 | CMD_print_double_regs = 'print-double-regs' | |
140 | CMD_print_event_queue = 'print-event-queue' | |
141 | CMD_print_float_regs = 'print-float-regs' | |
142 | CMD_print_float_regs_raw = 'print-float-regs-raw' | |
143 | CMD_print_instruction_queue = 'print-instruction-queue' | |
144 | CMD_print_profile = 'print-profile' | |
145 | CMD_print_statistics = 'print-statistics' | |
146 | CMD_print_time = 'print-time' | |
147 | CMD_prof_page_details = 'prof-page-details' | |
148 | CMD_prof_page_map = 'prof-page-map' | |
149 | CMD_prof_weight = 'prof-weight' | |
150 | CMD_pselect = 'pselect' | |
151 | CMD_quit = 'quit' | |
152 | CMD_read_configuration = 'read-configuration' | |
153 | CMD_read_fp_reg_i = 'read-fp-reg-i' | |
154 | CMD_read_fp_reg_x = 'read-fp-reg-x' | |
155 | CMD_read_reg = 'read-reg' | |
156 | CMD_read_sw_pcs = 'read-sw-pcs' | |
157 | CMD_read_th_ctl_reg = 'read-th-ctl-reg' | |
158 | CMD_read_th_fp_reg_i = 'read-th-fp-reg-i' | |
159 | CMD_read_th_fp_reg_x = 'read-th-fp-reg-x' | |
160 | CMD_read_thread_status = 'read-thread-status' | |
161 | CMD_read_th_reg = 'read-th-reg' | |
162 | CMD_resolve_file = 'resolve-file' | |
163 | CMD_rtl_cycle = 'rtl_cycle' | |
164 | CMD_rtl_intf_info = 'info' | |
165 | CMD_run = 'run' | |
166 | CMD_runfast = 'runfast' | |
167 | CMD_whatis = 'whatis' | |
168 | CMD_run_command_file = 'run-command-file' | |
169 | CMD_run_python_file = 'run-python-file' | |
170 | CMD_set = 'set' | |
171 | CMD_set_context = 'set-context' | |
172 | CMD_set_pattern = 'set-pattern' | |
173 | CMD_set_pc = 'set-pc' | |
174 | CMD_set_prefix = 'set-prefix' | |
175 | CMD_set_prof_weight = 'set-prof-weight' | |
176 | CMD_set_substr = 'set-substr' | |
177 | CMD_special_interrupt = 'special-interrupt' | |
178 | CMD_sstepi = 'sstepi' | |
179 | CMD_stc_status = 'stc-status' | |
180 | CMD_step_break = 'step-break' | |
181 | CMD_step_break_absolute = 'step-break-absolute' | |
182 | CMD_step_cycle = 'step-cycle' | |
183 | CMD_step_instruction = 'step-instruction' | |
184 | CMD_stop = 'stop' | |
185 | CMD_swerver_memory_debug = 'debug' | |
186 | CMD_swerver_memory_info = 'info' | |
187 | CMD_swerver_proc_mmu_i_tlb_entry = 'i-tlb-entry' | |
188 | CMD_swerver_proc_mmu_probe = 'probe' | |
189 | CMD_swerver_proc_mmu_regs = 'regs' | |
190 | CMD_swerver_proc_mmu_tlb = 'tlb' | |
191 | CMD_swerver_proc_mmu_trace = 'trace' | |
192 | CMD_swerver_thread_mmu_probe = 'probe' | |
193 | CMD_swerver_thread_mmu_read_spu_trap = 'read-spu-trap' | |
194 | CMD_swerver_thread_mmu_regs = 'regs' | |
195 | CMD_swerver_thread_mmu_set_spu_trap = 'set-spu-trap' | |
196 | CMD_swerver_thread_mmu_trace = 'trace' | |
197 | CMD_swrun = 'swrun' | |
198 | CMD_trace_cr = 'trace-cr' | |
199 | CMD_trace_exception = 'trace-exception' | |
200 | CMD_trace_hap = 'trace-hap' | |
201 | CMD_trace_io = 'trace-io' | |
202 | CMD_trap_info = 'trap-info' | |
203 | CMD_unbreak = 'unbreak' | |
204 | CMD_undisplay = 'undisplay' | |
205 | CMD_unload_module = 'unload-module' | |
206 | CMD_write_configuration = 'write-configuration' | |
207 | CMD_write_fp_reg_i = 'write-fp-reg-i' | |
208 | CMD_write_fp_reg_x = 'write-fp-reg-x' | |
209 | CMD_write_reg = 'write-reg' | |
210 | CMD_write_th_ctl_reg = 'write-th-ctl-reg' | |
211 | CMD_write_th_fp_reg_i = 'write-th-fp-reg-i' | |
212 | CMD_write_th_fp_reg_x = 'write-th-fp-reg-x' | |
213 | CMD_write_thread_status = 'write-thread-status' | |
214 | CMD_x = 'x' | |
215 | CMD_xp = 'xp' | |
216 | ||
217 | # extra commands | |
218 | CMD_ssi = 'ssi' | |
219 | CMD_ALIAS = 'alias' | |
220 | CMD_UNALIAS = 'unalias' | |
221 | #CMD_RESET = 'reset' | |
222 | ||
223 | ||
224 | class BreakPoint: | |
225 | """ | |
226 | """ | |
227 | def __init__ (self, id, sid, addr, cmd, type): | |
228 | """ | |
229 | """ | |
230 | self.id = id | |
231 | self.sid = sid | |
232 | self.addr = addr | |
233 | self.hitCount = 0 | |
234 | self.ignore = 0 | |
235 | self.enable = 1 | |
236 | self.justHit = 0 | |
237 | self.type = type | |
238 | self.action = [] | |
239 | i = cmd.find('{') | |
240 | if i > -1: | |
241 | j = cmd.rfind('}') | |
242 | tokens = cmd[i+1:j].split(';') | |
243 | #print 'DBX: cmd=%s, tokens=%s' % (cmd, tokens) #DBX | |
244 | k = 0 | |
245 | while k < len(tokens): | |
246 | self.action.append(tokens[k].strip()) | |
247 | k += 1 | |
248 | ||
249 | ||
250 | def __str__ (self): | |
251 | """ | |
252 | """ | |
253 | return 'breakpoint=%d, sid=%d, addr=%#x, type=%s, enable=%d, hit=%d, ignore=%d, action=%s' % (self.id, self.sid, self.addr, self.type, self.enable, self.hitCount, self.ignore, self.action) | |
254 | ||
255 | ||
256 | def isHit (self, pc): | |
257 | """ | |
258 | TODO we don't really use this any more, as of 5/10/05, and this | |
259 | function only handle PC | |
260 | """ | |
261 | if self.enable == 1 and self.addr == pc: | |
262 | # a hit, is there an ignore count or do we just hit this same pc | |
263 | # in the previous step? | |
264 | self.hitCount += 1 | |
265 | if ((self.ignore == 0 and self.justHit == 0) or | |
266 | (self.ignore > 0 and self.hitCount > self.ignore)): | |
267 | hit = 1 | |
268 | self.justHit = 1 | |
269 | self.hitCount = 0 | |
270 | else: | |
271 | hit = 0 | |
272 | self.justHit = 0 | |
273 | ||
274 | ## if self.hitCount > self.ignore: | |
275 | ## self.hitCount = 0 | |
276 | ## if (self.justHit == 1) and (self.ignore > 0): | |
277 | ## self.justHit = 0 | |
278 | ## else: | |
279 | ## self.justHit = 1 | |
280 | ## hit = 1 | |
281 | ## else: | |
282 | ## self.justHit = 1 | |
283 | ||
284 | else: | |
285 | hit = 0 | |
286 | self.justHit = 0 | |
287 | ||
288 | return hit | |
289 | ||
290 | ||
291 | class CmdParserNi: | |
292 | """ | |
293 | """ | |
294 | ||
295 | def __init__ (self, riesReposit): | |
296 | """ | |
297 | """ | |
298 | self.riesReposit = riesReposit | |
299 | ||
300 | self.topName = self.riesReposit.topName | |
301 | self.ncpus = self.riesReposit.ncpus | |
302 | self.ncores = self.riesReposit.ncores | |
303 | self.nucores = self.riesReposit.nucores | |
304 | self.nstrands = self.riesReposit.nstrands | |
305 | ||
306 | self.nSpregs = self.riesReposit.nSpregs | |
307 | self.nDpregs = self.riesReposit.nDpregs | |
308 | self.nQpregs = self.riesReposit.nQpregs | |
309 | self.nWinregs = 16 #************CONSTANTS*********** | |
310 | self.nWin = 8 #XXX there should be a better way to initialize from backend | |
311 | ||
312 | ||
313 | #sys.stderr.write('***config\n'); | |
314 | #sys.stderr.write(str(self.topName+' ')) | |
315 | #sys.stderr.write(str(self.ncpus)) | |
316 | #sys.stderr.write(str(self.ncores)) | |
317 | #sys.stderr.write(str(self.nstrands)) | |
318 | #sys.stderr.write('\nend config***\n') | |
319 | ||
320 | if self.nucores == 0: | |
321 | self.cpusize = self.ncores * self.nstrands | |
322 | self.coresize = self.nstrands | |
323 | self.ucoresize = 1 | |
324 | else: | |
325 | self.cpusize = self.ncores * self.nucores * self.nstrands | |
326 | self.coresize = self.nucores * self.nstrands | |
327 | self.ucoresize = self.nstrands | |
328 | ||
329 | self.nstrandObjs = self.cpusize * self.ncpus | |
330 | ||
331 | # thread state: 1 == enabled | |
332 | self.thdEnable = { 0:1 } | |
333 | # instr executed on each strand | |
334 | self.instrCount = { 0:0 } | |
335 | ||
336 | # breakpoint, id:vaddr (in uint64 format) | |
337 | self.bpoint = { } | |
338 | # next breakpoint id | |
339 | self.nextBpoint = 0 | |
340 | ||
341 | # the last strand that issued 'ssi'. | |
342 | # TODO if a user call backend step() directly, it will bypass this | |
343 | # lastTid tracking, it will also bypass breakpoint handling. | |
344 | # ---> with breakpoint set in backend strand.step(), we can catch | |
345 | # breakpoint now. 4/13/05 | |
346 | self.lastTid = 0 | |
347 | # thread/core/cpu mapping | |
348 | self.strandMap = { } | |
349 | self.ucoreMap = { } | |
350 | self.coreMap = { } | |
351 | self.cpuMap = { } | |
352 | # command alias | |
353 | self.alias = { } | |
354 | ||
355 | self.regmap = RegisterMap.RegisterMap(riesReposit.optdir['--ar']) | |
356 | # command mapping | |
357 | self.cmdRE = { } | |
358 | # docs | |
359 | self.DOCS = { } | |
360 | # command extension | |
361 | self.cmdExt = { } | |
362 | # register interactive commands | |
363 | self.initCmd() | |
364 | # allow registration of a command map to re-direct commands to | |
365 | # a different command parser. | |
366 | self.cmdMap = None | |
367 | ||
368 | ||
369 | ####################################### | |
370 | #Function to check the argument types | |
371 | ||
372 | self.intStr = '(^[0-9]+[lL]?$)|(^0[xX][0-9a-fA-F]+[lL]?$)' | |
373 | self.intStrRE = re.compile(self.intStr) | |
374 | ||
375 | try: | |
376 | # import XX_Main.cc as nas, if available | |
377 | if self.riesReposit.arch == 'n2': | |
378 | import n2 as nas | |
379 | else: | |
380 | sys.stderr.write('ERROR: %s not a supported cpu type\n' % (self.riesReposit.arch)) | |
381 | self.nas = nas | |
382 | except: | |
383 | self.nas = None | |
384 | ||
385 | try: | |
386 | # import backend | |
387 | if self.riesReposit.arch == 'n2': | |
388 | import _N2_Python as vonk | |
389 | else: | |
390 | sys.stderr.write('ERROR: %s not a supported cpu type\n' % (self.riesReposit.arch)) | |
391 | self.vonk = vonk | |
392 | except: | |
393 | self.vonk = None | |
394 | ||
395 | ||
396 | def checkArgs(self,Args): | |
397 | """Return a list of boolean values. | |
398 | True if the arg is an int/long | |
399 | False otherwise | |
400 | """ | |
401 | retval = [] | |
402 | for arg in Args: | |
403 | matchOb = self.intStrRE.match(arg) | |
404 | if matchOb == None: | |
405 | retval.append(False) | |
406 | else: | |
407 | retval.append(True) | |
408 | return retval | |
409 | ||
410 | ||
411 | # Function to code double and quad precision | |
412 | # register numbers | |
413 | def codeFpreg(self,regnum, type): | |
414 | """type = 0, code double precision | |
415 | = 1, code quad precision | |
416 | """ | |
417 | val = int(regnum) | |
418 | if type == 0: | |
419 | return str(val << 1) # | (val & 0x10 >> 4)) | |
420 | else: | |
421 | return str(val << 2) # & ~0x3) << 1) | (val & 0x10 >> 4)) | |
422 | ||
423 | ||
424 | def truncVal(self, val, type): | |
425 | """truncate string if larger than | |
426 | 16 or 8 bytes depending on | |
427 | whether type is 1 or 0 | |
428 | """ | |
429 | #sys.stderr.write('DB: truncVal(): <%s>\n' % val) | |
430 | if val.startswith('0X') or val.startswith('0x'): | |
431 | intval = long(val,16) | |
432 | else: | |
433 | intval = long(val,10) | |
434 | ||
435 | # append 'L' to value to quiet complain about larger than 32bit value | |
436 | hexval = '%xL' % intval | |
437 | length = len(hexval) - 1 | |
438 | #sys.stderr.write('DBX: truncVal(): int=%#x, hex=%s, len=%d\n' % (intval, hexval, length)) #DBX | |
439 | if type == 0 and length > 8: | |
440 | return '0x'+hexval[length-8:] | |
441 | elif type == 1 and length > 16: | |
442 | return '0x'+hexval[length-16:] | |
443 | else: | |
444 | return '0x'+hexval | |
445 | ||
446 | ||
447 | def myInt(self,val): | |
448 | val = val.upper() | |
449 | if val.startswith('0X'): | |
450 | return int(val,16) | |
451 | else: | |
452 | return int(val) | |
453 | ||
454 | def polishCommand (self, cmd): | |
455 | """append 'L' to hex values and remove the command's trailing comment | |
456 | """ | |
457 | #sys.stderr.write('DBX: polishCommand: cmd=<%s>\n' % (cmd)) #DBX | |
458 | ||
459 | # TODO be aware that if '#' is part of a valid expression, this will | |
460 | # cause problem. | |
461 | ## i = cmd.find('#') | |
462 | ## if i > -1: | |
463 | ## cmd = cmd[:i] | |
464 | #print 'input cmd=%s' % cmd #DBX | |
465 | prev = 0 | |
466 | i = cmd.find('#') | |
467 | while i > -1: | |
468 | # make sure the # is not embedded in '...' or "..." | |
469 | # 'break' command can have {action...}, so don't remove the # in | |
470 | # there either. | |
471 | j1 = cmd.rfind("'", prev, i) | |
472 | j2 = cmd.find("'", i) | |
473 | k1 = cmd.rfind('"', prev, i) | |
474 | k2 = cmd.find('"', i) | |
475 | l1 = cmd.rfind('{', 0, i) | |
476 | l2 = cmd.find('}', i) | |
477 | #print 'i=%d j1=%d j2=%d k1=%d k2=%d l1=%d l2=%d' % (i, j1, j2, k1, k2, l1, l2) #DBX | |
478 | if (((j1 > -1) and (j2 > -1) and (j1 < i) and (i < j2)) or | |
479 | ((k1 > -1) and (k2 > -1) and (k1 < i) and (i < k2)) or | |
480 | ((l1 > -1) and (l2 > -1) and (l1 < i) and (i < l2))): | |
481 | # this one is embedded in '...' or "...", not a comment sign | |
482 | # let's look for the next one | |
483 | prev = i | |
484 | i = cmd.find('#', i+1) | |
485 | else: | |
486 | break | |
487 | #print 'i=%d before cmd=%s' % (i, cmd) #DBX | |
488 | if i > -1: | |
489 | cmd = cmd[:i] | |
490 | #print ' after cmd=%s' % cmd #DBX | |
491 | ||
492 | # append 'L' to any hex value that has at least 32 bits, no, just | |
493 | # do it to all hex is simplier. Be aware of the overhead involved. | |
494 | # TODO take this out once python 2.4 fix the problem, i.e., | |
495 | # treats number like 0x80000000 as negative int32. | |
496 | tokens = cmd.split() | |
497 | i = 1 | |
498 | while i < len(tokens): | |
499 | if re.match(hexRE, tokens[i]) and tokens[i][-1].upper() != 'L': | |
500 | tokens[i] = tokens[i] + 'L' | |
501 | i += 1 | |
502 | ||
503 | #sys.stderr.write('DBX: polishCommand: cmd2=<%s>\n' % ' '.join(tokens)) #DBX | |
504 | return ' '.join(tokens) | |
505 | ||
506 | ||
507 | def initCmd (self): | |
508 | """ | |
509 | """ | |
510 | #self.dbx('enter initCmd\n') | |
511 | ||
512 | # NAME | |
513 | # % - read register by name | |
514 | # SYNOPSIS | |
515 | # % "reg-name" | |
516 | cmdSyntax = '^%[a-zA-Z]+[a-zA-Z_\d]*' | |
517 | cmdRE = re.compile(cmdSyntax) | |
518 | self.cmdRE[cmdRE] = self.handleRegName | |
519 | ||
520 | # NAME | |
521 | # <breakpoint>.break, <breakpoint>.tbreak, break - set breakpoint | |
522 | # SYNOPSIS | |
523 | # <breakpoint>.break address [length] [-r] [-w] [-x] | |
524 | # <breakpoint>.tbreak address [length] [-r] [-w] [-x] | |
525 | # break address [length] [-r] [-w] [-x] | |
526 | #cmdSyntax = '^(%s\d+\.)?(t)?%s\s+0[Xx][\dA-Fa-f]+' % (NAME_breakpoint, CMD_breakpoint_break) | |
527 | cmdSyntax = '^(%s\d+\.)?(t)?%s\s+' % (NAME_breakpoint, CMD_breakpoint_break) | |
528 | cmdRE = re.compile(cmdSyntax) | |
529 | self.cmdRE[cmdRE] = self.handleBreak | |
530 | ||
531 | # NAME | |
532 | # <context>.on, <context>.off - switch on context object | |
533 | # SYNOPSIS | |
534 | # <context>.off | |
535 | # <context>.on | |
536 | cmdSyntax = '^%s\d+\.(%s|%s)' % (NAME_context, CMD_context_on, CMD_context_off) | |
537 | cmdRE = re.compile(cmdSyntax) | |
538 | #self.cmdRE[cmdRE] = self.handleTodo | |
539 | ||
540 | # NAME | |
541 | # <image>.add-diff-file - add a diff file to the image | |
542 | # SYNOPSIS | |
543 | # <image>.add-diff-file filename | |
544 | # <image>: memory0_image, memory_cache_image, memory_ciop_image | |
545 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_add_diff_file) | |
546 | cmdRE = re.compile(cmdSyntax) | |
547 | #self.cmdRE[cmdRE] = self.handleTodo | |
548 | ||
549 | # NAME | |
550 | # <image>.add-partial-diff-file - add a partial diff file to the image | |
551 | # SYNOPSIS | |
552 | # <image>.add-partial-diff-file filename start size | |
553 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_add_partial_diff_file) | |
554 | cmdRE = re.compile(cmdSyntax) | |
555 | #self.cmdRE[cmdRE] = self.handleTodo | |
556 | ||
557 | # NAME | |
558 | # <image>.commit - commit modifies pages | |
559 | # SYNOPSIS | |
560 | # <image>.commit | |
561 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_commit) | |
562 | cmdRE = re.compile(cmdSyntax) | |
563 | #self.cmdRE[cmdRE] = self.handleTodo | |
564 | ||
565 | # NAME | |
566 | # <image>.limit-memory - limit memory usage | |
567 | # SYNOPSIS | |
568 | # <image>.limit-memory [Mb] ["swapfile"] ["swapdir"] [-k] [-r] | |
569 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_limit_memory) | |
570 | cmdRE = re.compile(cmdSyntax) | |
571 | #self.cmdRE[cmdRE] = self.handleTodo | |
572 | ||
573 | # NAME | |
574 | # <image>.save - save image to disk | |
575 | # SYNOPSIS | |
576 | # <image>.save filename [start-byte] [length] | |
577 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_save) | |
578 | cmdRE = re.compile(cmdSyntax) | |
579 | #self.cmdRE[cmdRE] = self.handleTodo | |
580 | ||
581 | # NAME | |
582 | # <image>.x - examine image data | |
583 | # SYNOPSIS | |
584 | # <image>.x offset [size] | |
585 | cmdSyntax = '^%s\d+\.%s' % (NAME_image, CMD_image_x) | |
586 | cmdRE = re.compile(cmdSyntax) | |
587 | #self.cmdRE[cmdRE] = self.handleTodo | |
588 | ||
589 | # NAME | |
590 | # <memory-space>.map - list memory map | |
591 | # SYNOPSIS | |
592 | # <memory-space>.map | |
593 | cmdSyntax = '^%s\d+\.%s' % (NAME_memory_space, CMD_memory_space_map) | |
594 | cmdRE = re.compile(cmdSyntax) | |
595 | #self.cmdRE[cmdRE] = self.handleTodo | |
596 | ||
597 | # NAME | |
598 | # <port-space>.map - list port map | |
599 | # SYNOPSIS | |
600 | # <port-space>.map | |
601 | cmdSyntax = '^%s\d+\.%s' % (NAME_port_space, CMD_port_space_map) | |
602 | cmdRE = re.compile(cmdSyntax) | |
603 | #self.cmdRE[cmdRE] = self.handleTodo | |
604 | ||
605 | # NAME | |
606 | # <rtl-intf>.info - Drive and expect of rtl | |
607 | # SYNOPSIS | |
608 | # <rtl-intf>.info | |
609 | cmdSyntax = '^%s\d+\.%s' % (NAME_rtl_intf, CMD_rtl_intf_info) | |
610 | cmdRE = re.compile(cmdSyntax) | |
611 | #self.cmdRE[cmdRE] = self.handleTodo | |
612 | ||
613 | # NAME | |
614 | # <swerver-memory>.debug - setup the memory modeling debug level | |
615 | # SYNOPSIS | |
616 | # <swerver-memory>.debug debug_level | |
617 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_memory, CMD_swerver_memory_debug) | |
618 | cmdRE = re.compile(cmdSyntax) | |
619 | #self.cmdRE[cmdRE] = self.handleTodo | |
620 | ||
621 | # NAME | |
622 | # <swerver-memory>.info - print information about swerver-memory model | |
623 | # SYNOPSIS | |
624 | # <swerver-memory>.info | |
625 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_memory, CMD_swerver_memory_info) | |
626 | cmdRE = re.compile(cmdSyntax) | |
627 | #self.cmdRE[cmdRE] = self.handleTodo | |
628 | ||
629 | # NAME | |
630 | # <swerver-proc-mmu>.d-probe, <swerver-proc-mmu>.i-probe - check data tlb for | |
631 | # translation | |
632 | # SYNOPSIS | |
633 | # <swerver-proc-mmu>.d-probe address | |
634 | # <swerver-proc-mmu>.i-probe address | |
635 | cmdSyntax = '^%s\d+\.[di]-%s' % (NAME_swerver_proc_mmu, CMD_swerver_proc_mmu_probe) | |
636 | cmdRE = re.compile(cmdSyntax) | |
637 | #self.cmdRE[cmdRE] = self.handleTodo | |
638 | ||
639 | # NAME | |
640 | # <swerver-proc-mmu>.d-tlb, <swerver-proc-mmu>.i-tlb, < | |
641 | # swerver-proc-mmu>.i-tlb-entry - print data tlb contents | |
642 | # SYNOPSIS | |
643 | # <swerver-proc-mmu>.d-tlb | |
644 | # <swerver-proc-mmu>.i-tlb | |
645 | # <swerver-proc-mmu>.i-tlb-entry idx | |
646 | cmdSyntax = '^%s\d+\.[di]-%s' % (NAME_swerver_proc_mmu, CMD_swerver_proc_mmu_tlb) | |
647 | cmdRE = re.compile(cmdSyntax) | |
648 | self.cmdRE[cmdRE] = self.handleTLB | |
649 | ||
650 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_proc_mmu, CMD_swerver_proc_mmu_i_tlb_entry) | |
651 | cmdRE = re.compile(cmdSyntax) | |
652 | self.cmdRE[cmdRE] = self.handleTLB | |
653 | ||
654 | # NAME | |
655 | # <swerver-proc-mmu>.regs - print mmu registers | |
656 | # SYNOPSIS | |
657 | # <swerver-proc-mmu>.regs | |
658 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_proc_mmu, CMD_swerver_proc_mmu_regs) | |
659 | cmdRE = re.compile(cmdSyntax) | |
660 | #self.cmdRE[cmdRE] = self.handleTodo | |
661 | ||
662 | # NAME | |
663 | # <swerver-proc-mmu>.trace - toggle trace functionality | |
664 | # SYNOPSIS | |
665 | # <swerver-proc-mmu>.trace | |
666 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_proc_mmu, CMD_swerver_proc_mmu_trace) | |
667 | cmdRE = re.compile(cmdSyntax) | |
668 | #self.cmdRE[cmdRE] = self.handleTodo | |
669 | ||
670 | # NAME | |
671 | # <swerver-thread-mmu>.d-probe, <swerver-thread-mmu>.i-probe - check data tlb | |
672 | # for translation | |
673 | # SYNOPSIS | |
674 | # <swerver-thread-mmu>.d-probe address | |
675 | # <swerver-thread-mmu>.i-probe address | |
676 | cmdSyntax = '^%s\d+\.[di]-%s' % (NAME_swerver_thread_mmu, CMD_swerver_thread_mmu_probe) | |
677 | cmdRE = re.compile(cmdSyntax) | |
678 | #self.cmdRE[cmdRE] = self.handleTodo | |
679 | ||
680 | # NAME | |
681 | # <swerver-thread-mmu>.read-spu-trap - Display SPU traps. | |
682 | # SYNOPSIS | |
683 | # <swerver-thread-mmu>.read-spu-trap | |
684 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_thread_mmu, CMD_swerver_thread_mmu_read_spu_trap) | |
685 | cmdRE = re.compile(cmdSyntax) | |
686 | #self.cmdRE[cmdRE] = self.handleTodo | |
687 | ||
688 | # NAME | |
689 | # <swerver-thread-mmu>.regs - print mmu registers | |
690 | # SYNOPSIS | |
691 | # <swerver-thread-mmu>.regs | |
692 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_thread_mmu, CMD_swerver_thread_mmu_regs) | |
693 | cmdRE = re.compile(cmdSyntax) | |
694 | self.cmdRE[cmdRE] = self.handleMmu | |
695 | ||
696 | # NAME | |
697 | # <swerver-thread-mmu>.set-spu-trap - Set SPU traps. | |
698 | # SYNOPSIS | |
699 | # <swerver-thread-mmu>.set-spu-trap trap-type | |
700 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_thread_mmu, CMD_swerver_thread_mmu_set_spu_trap) | |
701 | cmdRE = re.compile(cmdSyntax) | |
702 | #self.cmdRE[cmdRE] = self.handleTodo | |
703 | ||
704 | # NAME | |
705 | # <swerver-thread-mmu>.trace - toggle trace functionality | |
706 | # SYNOPSIS | |
707 | # <swerver-thread-mmu>.trace | |
708 | cmdSyntax = '^%s\d+\.%s' % (NAME_swerver_thread_mmu, CMD_swerver_thread_mmu_trace) | |
709 | cmdRE = re.compile(cmdSyntax) | |
710 | #self.cmdRE[cmdRE] = self.handleTodo | |
711 | ||
712 | # NAME | |
713 | # action - bind action to breakpoint | |
714 | # SYNOPSIS | |
715 | # action id "action" | |
716 | cmdSyntax = '^%s\s+\d+' % (CMD_action) | |
717 | cmdRE = re.compile(cmdSyntax) | |
718 | #self.cmdRE[cmdRE] = self.handleTodo | |
719 | ||
720 | # NAME | |
721 | # add-directory, clear-directories, print-directories - add a directory to | |
722 | # the search path | |
723 | # SYNOPSIS | |
724 | # add-directory "path" [-prepend] | |
725 | # clear-directories | |
726 | # print-directories | |
727 | cmdSyntax = '^%s' % (CMD_add_directory) | |
728 | cmdRE = re.compile(cmdSyntax) | |
729 | #self.cmdRE[cmdRE] = self.handleTodo | |
730 | ||
731 | cmdSyntax = '^%s' % (CMD_clear_directories) | |
732 | cmdRE = re.compile(cmdSyntax) | |
733 | #self.cmdRE[cmdRE] = self.handleTodo | |
734 | ||
735 | cmdSyntax = '^%s' % (CMD_print_directories) | |
736 | cmdRE = re.compile(cmdSyntax) | |
737 | #self.cmdRE[cmdRE] = self.handleTodo | |
738 | ||
739 | # NAME | |
740 | # api-apropos - search API help | |
741 | # SYNOPSIS | |
742 | # api-apropos "search-string" | |
743 | cmdSyntax = '^%s' % (CMD_api_apropos) | |
744 | cmdRE = re.compile(cmdSyntax) | |
745 | #self.cmdRE[cmdRE] = self.handleTodo | |
746 | ||
747 | # NAME | |
748 | # api-help - get API help | |
749 | # SYNOPSIS | |
750 | # api-help "help-string" | |
751 | cmdSyntax = '^%s' % (CMD_api_help) | |
752 | cmdRE = re.compile(cmdSyntax) | |
753 | #self.cmdRE[cmdRE] = self.handleTodo | |
754 | ||
755 | # NAME | |
756 | # apropos - search for text in documentation | |
757 | # SYNOPSIS | |
758 | # apropos [-r] "string" | |
759 | cmdSyntax = '^%s' % (CMD_apropos) | |
760 | cmdRE = re.compile(cmdSyntax) | |
761 | #self.cmdRE[cmdRE] = self.handleTodo | |
762 | ||
763 | # NAME | |
764 | # break-cr, unbreak-cr - break on control register updates | |
765 | # SYNOPSIS | |
766 | # break-cr ("register"|-all|-list) | |
767 | # unbreak-cr ("register"|-all|-list) | |
768 | cmdSyntax = '^(un)?%s' % (CMD_break_cr) | |
769 | cmdRE = re.compile(cmdSyntax) | |
770 | #self.cmdRE[cmdRE] = self.handleTodo | |
771 | ||
772 | # NAME | |
773 | # break-exception, unbreak-exception - break on control register updates | |
774 | # SYNOPSIS | |
775 | # break-exception ("name"|number|-all|-list) | |
776 | # unbreak-exception ("name"|number|-all|-list) | |
777 | cmdSyntax = '^(un)?%s' % (CMD_break_exception) | |
778 | cmdRE = re.compile(cmdSyntax) | |
779 | #self.cmdRE[cmdRE] = self.handleTodo | |
780 | ||
781 | # NAME | |
782 | # break-hap, unbreak-hap - break on haps | |
783 | # SYNOPSIS | |
784 | # break-hap ("hap"|-all|-list) | |
785 | # unbreak-hap ("hap"|-all|-list) | |
786 | cmdSyntax = '^(un)?%s' % (CMD_break_hap) | |
787 | cmdRE = re.compile(cmdSyntax) | |
788 | #self.cmdRE[cmdRE] = self.handleTodo | |
789 | ||
790 | # NAME | |
791 | # break-io, unbreak-io - break on device accesses | |
792 | # SYNOPSIS | |
793 | # break-io ("device"|-all|-list) | |
794 | # unbreak-io ("device"|-all|-list) | |
795 | cmdSyntax = '^(un)?%s' % (CMD_break_io) | |
796 | cmdRE = re.compile(cmdSyntax) | |
797 | #self.cmdRE[cmdRE] = self.handleTodo | |
798 | ||
799 | # NAME | |
800 | # catch-exception, uncatch-exception - catch exceptions | |
801 | # SYNOPSIS | |
802 | # catch-exception [("name"|number|-all)] | |
803 | # uncatch-exception [("name"|vector|-all)] | |
804 | cmdSyntax = '^(un)?%s' % (CMD_catch_exception) | |
805 | cmdRE = re.compile(cmdSyntax) | |
806 | #self.cmdRE[cmdRE] = self.handleTodo | |
807 | ||
808 | # NAME | |
809 | # command-list - generate html document describing commands | |
810 | # SYNOPSIS | |
811 | # command-list file | |
812 | #cmdSyntax = '^%s\s+\S+' % (CMD_command_list) | |
813 | cmdSyntax = '^%s' % (CMD_command_list) | |
814 | cmdRE = re.compile(cmdSyntax) | |
815 | #self.cmdRE[cmdRE] = self.handleTodo | |
816 | ||
817 | # NAME | |
818 | # cycle-break-absolute, <processor>.cycle-break, < | |
819 | # processor>.cycle-break-absolute, cycle-break - set absolute cycle | |
820 | # breakpoint | |
821 | # SYNOPSIS | |
822 | # <processor>.cycle-break cycles | |
823 | # <processor>.cycle-break-absolute cycles | |
824 | # cycle-break ["cpu-name"] cycles | |
825 | # cycle-break-absolute ["cpu-name"] cycles | |
826 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_cycle_break_absolute) | |
827 | cmdRE = re.compile(cmdSyntax) | |
828 | #self.cmdRE[cmdRE] = self.handleTodo | |
829 | ||
830 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_cycle_break) | |
831 | cmdRE = re.compile(cmdSyntax) | |
832 | #self.cmdRE[cmdRE] = self.handleTodo | |
833 | ||
834 | # NAME | |
835 | # debug-level - set or get the debug level | |
836 | # SYNOPSIS | |
837 | # debug-level "object-name" [level] | |
838 | cmdSyntax = '^%s' % (CMD_debug_level) | |
839 | cmdRE = re.compile(cmdSyntax) | |
840 | #self.cmdRE[cmdRE] = self.handleTodo | |
841 | ||
842 | # NAME | |
843 | # delete - remove a breakpoint | |
844 | # SYNOPSIS | |
845 | # delete (-all|id) | |
846 | #cmdSyntax = '^%s\s+(-all|\d+(\s+\d+)*)' % (CMD_delete) | |
847 | cmdSyntax = '^%s\s+' % (CMD_delete) | |
848 | cmdRE = re.compile(cmdSyntax) | |
849 | self.cmdRE[cmdRE] = self.handleDelete | |
850 | ||
851 | # NAME | |
852 | # device-interrupt - Device interrupt | |
853 | # SYNOPSIS | |
854 | # device-interrupt issue-device target-thread intvec | |
855 | cmdSyntax = '^%s' % (CMD_device_interrupt) | |
856 | cmdRE = re.compile(cmdSyntax) | |
857 | #self.cmdRE[cmdRE] = self.handleTodo | |
858 | ||
859 | # NAME | |
860 | # devs - list all devices in system | |
861 | # SYNOPSIS | |
862 | # devs ["object-name"] | |
863 | cmdSyntax = '^%s' % (CMD_devs) | |
864 | cmdRE = re.compile(cmdSyntax) | |
865 | #self.cmdRE[cmdRE] = self.handleTodo | |
866 | ||
867 | # NAME | |
868 | # disassemble, <processor>.disassemble - disassemble instructions | |
869 | # SYNOPSIS | |
870 | # <processor>.disassemble [address] [count] | |
871 | # disassemble ["cpu-name"] [address] [count] | |
872 | cmdSyntax ='^(%s\d+\.%s\s*)|^(%s(\s*%s\d+)?\s*)' % (NAME_processor, CMD_disassemble,CMD_disassemble,NAME_processor) | |
873 | cmdRE = re.compile(cmdSyntax) | |
874 | self.cmdRE[cmdRE] = self.handleDisassemble | |
875 | ||
876 | # NAME | |
877 | # display - print expression at prompt | |
878 | # SYNOPSIS | |
879 | # display ["expression"] [-l] [-p] [-t] | |
880 | cmdSyntax = '^%s' % (CMD_display) | |
881 | cmdRE = re.compile(cmdSyntax) | |
882 | #self.cmdRE[cmdRE] = self.handleTodo | |
883 | ||
884 | # NAME | |
885 | # echo - echo a value to screen | |
886 | # SYNOPSIS | |
887 | # echo [("string"|integer|float)] | |
888 | #cmdSyntax = '^(%s|%s\s+.*)' % (CMD_echo, CMD_echo) | |
889 | cmdSyntax = '^%s' % (CMD_echo) | |
890 | cmdRE = re.compile(cmdSyntax) | |
891 | self.cmdRE[cmdRE] = self.handleEcho | |
892 | ||
893 | # NAME | |
894 | # enable, disable - enable/disable breakpoint | |
895 | # SYNOPSIS | |
896 | # disable (-all|id) | |
897 | # enable (-all|id) | |
898 | #cmdSyntax = '^%s\s+(-all|\d+)' % (CMD_enable) | |
899 | cmdSyntax = '^(%s|%s\s+.*)' % (CMD_enable, CMD_enable) | |
900 | cmdRE = re.compile(cmdSyntax) | |
901 | self.cmdRE[cmdRE] = self.handleEnable | |
902 | ||
903 | cmdSyntax = '^(%s|%s\s+.*)' % (CMD_disable, CMD_disable) | |
904 | cmdRE = re.compile(cmdSyntax) | |
905 | self.cmdRE[cmdRE] = self.handleDisable | |
906 | ||
907 | # NAME | |
908 | # enable-external-commands - enable external command port | |
909 | # SYNOPSIS | |
910 | # enable-external-commands [port] | |
911 | cmdSyntax = '^%s' % (CMD_enable_external_commands) | |
912 | cmdRE = re.compile(cmdSyntax) | |
913 | #self.cmdRE[cmdRE] = self.handleTodo | |
914 | ||
915 | # NAME | |
916 | # enable-real-time-mode, disable-real-time-mode - set real time mode | |
917 | # SYNOPSIS | |
918 | # disable-real-time-mode | |
919 | # enable-real-time-mode [speed] [check_interval] | |
920 | cmdSyntax = '^%s' % (CMD_enable_real_time_mode) | |
921 | cmdRE = re.compile(cmdSyntax) | |
922 | #self.cmdRE[cmdRE] = self.handleTodo | |
923 | ||
924 | cmdSyntax = '^%s' % (CMD_disable_real_time_mode) | |
925 | cmdRE = re.compile(cmdSyntax) | |
926 | #self.cmdRE[cmdRE] = self.handleTodo | |
927 | ||
928 | # NAME | |
929 | # eosl - end-of-sas-line | |
930 | # SYNOPSIS | |
931 | # eosl | |
932 | cmdSyntax = '^%s' % (CMD_eosl) | |
933 | cmdRE = re.compile(cmdSyntax) | |
934 | #self.cmdRE[cmdRE] = self.handleTodo | |
935 | ||
936 | # NAME | |
937 | # expect - fail if not equal | |
938 | # SYNOPSIS | |
939 | # expect i1 i2 [-v] | |
940 | #cmdSyntax = '^%s\s+(\(.+\)\s+(\d+|0[Xx][\dA-Fa-f]+)|(\d+|0[Xx][\dA-Fa-f]+)\s+(\d+|0[Xx][\dA-Fa-f]+))' % (CMD_expect) | |
941 | cmdSyntax = '^%s\s+\S+' % (CMD_expect) | |
942 | cmdRE = re.compile(cmdSyntax) | |
943 | self.cmdRE[cmdRE] = self.handleExpect | |
944 | ||
945 | # NAME | |
946 | # gdb-remote - start gdb-remote | |
947 | # SYNOPSIS | |
948 | # gdb-remote [port] | |
949 | cmdSyntax = '^%s' % (CMD_gdb_remote) | |
950 | cmdRE = re.compile(cmdSyntax) | |
951 | #self.cmdRE[cmdRE] = self.handleTodo | |
952 | ||
953 | # NAME | |
954 | # get, <memory-space>.get - get value of physical address | |
955 | # SYNOPSIS | |
956 | # <memory-space>.get address [size] [-l] [-b] | |
957 | # get address [size] [-l] [-b] | |
958 | #cmdSyntax = '^(%s\d+\.)?%s\s+0[Xx][\dA-Fa-f]+' % (NAME_memory_space, CMD_get) | |
959 | cmdSyntax = '^(%s\d+\.)?%s\s+' % (NAME_memory_space, CMD_get) | |
960 | cmdRE = re.compile(cmdSyntax) | |
961 | self.cmdRE[cmdRE] = self.handleGet | |
962 | ||
963 | # NAME | |
964 | # help - help command | |
965 | # SYNOPSIS | |
966 | # help [("help-string"|-all)] | |
967 | cmdSyntax = '^(%s\s*$|%s\s+\S+)' % (CMD_help, CMD_help) | |
968 | cmdRE = re.compile(cmdSyntax) | |
969 | self.cmdRE[cmdRE] = self.handleHelp | |
970 | ||
971 | # NAME | |
972 | # hex - display integer in hexadecimal notation | |
973 | # SYNOPSIS | |
974 | # hex value | |
975 | cmdSyntax = '^%s\s+\d+' % (CMD_hex) | |
976 | cmdRE = re.compile(cmdSyntax) | |
977 | #self.cmdRE[cmdRE] = self.handleTodo | |
978 | ||
979 | # NAME | |
980 | # ignore - set ignore count for a breakpoint | |
981 | # SYNOPSIS | |
982 | # ignore id num | |
983 | #cmdSyntax = '^%s\s+\d+\s+\d+' % (CMD_ignore) | |
984 | cmdSyntax = '^%s\s+' % (CMD_ignore) | |
985 | cmdRE = re.compile(cmdSyntax) | |
986 | self.cmdRE[cmdRE] = self.handleIgnore | |
987 | ||
988 | # NAME | |
989 | # instruction-profile-mode - set or get current mode for instruction | |
990 | # profiling | |
991 | # SYNOPSIS | |
992 | # instruction-profile-mode ["mode"] | |
993 | cmdSyntax = '^%s' % (CMD_instruction_profile_mode) | |
994 | cmdRE = re.compile(cmdSyntax) | |
995 | #self.cmdRE[cmdRE] = self.handleTodo | |
996 | ||
997 | # NAME | |
998 | # io - print I/O trace | |
999 | # SYNOPSIS | |
1000 | # io ["object-name"] [count] | |
1001 | cmdSyntax = '^%s' % (CMD_io) | |
1002 | cmdRE = re.compile(cmdSyntax) | |
1003 | #self.cmdRE[cmdRE] = self.handleTodo | |
1004 | ||
1005 | # NAME | |
1006 | # io-buffer - set I/O buffer size | |
1007 | # SYNOPSIS | |
1008 | # io-buffer ["object-name"] [size] | |
1009 | cmdSyntax = '^%s' % (CMD_io_buffer) | |
1010 | cmdRE = re.compile(cmdSyntax) | |
1011 | #self.cmdRE[cmdRE] = self.handleTodo | |
1012 | ||
1013 | # NAME | |
1014 | # istc-enable, dstc-disable, dstc-enable, istc-disable, stc-status - enable | |
1015 | # or disable internal caches | |
1016 | # SYNOPSIS | |
1017 | # dstc-disable | |
1018 | # dstc-enable | |
1019 | # istc-disable | |
1020 | # istc-enable | |
1021 | # stc-status | |
1022 | cmdSyntax = '^%s' % (CMD_dstc_disable) | |
1023 | cmdRE = re.compile(cmdSyntax) | |
1024 | #self.cmdRE[cmdRE] = self.handleTodo | |
1025 | ||
1026 | cmdSyntax = '^%s' % (CMD_dstc_enable) | |
1027 | cmdRE = re.compile(cmdSyntax) | |
1028 | #self.cmdRE[cmdRE] = self.handleTodo | |
1029 | ||
1030 | cmdSyntax = '^%s' % (CMD_istc_disable) | |
1031 | cmdRE = re.compile(cmdSyntax) | |
1032 | #self.cmdRE[cmdRE] = self.handleTodo | |
1033 | ||
1034 | cmdSyntax = '^%s' % (CMD_istc_enable) | |
1035 | cmdRE = re.compile(cmdSyntax) | |
1036 | #self.cmdRE[cmdRE] = self.handleTodo | |
1037 | ||
1038 | cmdSyntax = '^%s' % (CMD_stc_status) | |
1039 | cmdRE = re.compile(cmdSyntax) | |
1040 | #self.cmdRE[cmdRE] = self.handleTodo | |
1041 | ||
1042 | # NAME | |
1043 | # le-checksum - display the checksum of the module-list attribute | |
1044 | # SYNOPSIS | |
1045 | # le-checksum ["obj"] | |
1046 | cmdSyntax = '^%s' % (CMD_le_checksum) | |
1047 | cmdRE = re.compile(cmdSyntax) | |
1048 | #self.cmdRE[cmdRE] = self.handleTodo | |
1049 | ||
1050 | # NAME | |
1051 | # le-permissions - describe the current 'Limited Edition' permissions | |
1052 | # SYNOPSIS | |
1053 | # le-permissions ["obj"] | |
1054 | cmdSyntax = '^%s' % (CMD_le_permissions) | |
1055 | cmdRE = re.compile(cmdSyntax) | |
1056 | #self.cmdRE[cmdRE] = self.handleTodo | |
1057 | ||
1058 | # NAME | |
1059 | # list-attributes - list all attributes | |
1060 | # SYNOPSIS | |
1061 | # list-attributes "object-name" ["attribute-name"] | |
1062 | cmdSyntax = '^%s' % (CMD_list_attributes) | |
1063 | cmdRE = re.compile(cmdSyntax) | |
1064 | #self.cmdRE[cmdRE] = self.handleTodo | |
1065 | ||
1066 | # NAME | |
1067 | # list-breakpoints - print information about breakpoints | |
1068 | # SYNOPSIS | |
1069 | # list-breakpoints [-all] | |
1070 | cmdSyntax = '^%s' % (CMD_list_breakpoints) | |
1071 | cmdRE = re.compile(cmdSyntax) | |
1072 | self.cmdRE[cmdRE] = self.handleListBreak | |
1073 | ||
1074 | # NAME | |
1075 | # list-classes - list all configuration classes | |
1076 | # SYNOPSIS | |
1077 | # list-classes | |
1078 | cmdSyntax = '^%s' % (CMD_list_classes) | |
1079 | cmdRE = re.compile(cmdSyntax) | |
1080 | #self.cmdRE[cmdRE] = self.handleTodo | |
1081 | ||
1082 | # NAME | |
1083 | # list-failed-modules - show list of failed modules | |
1084 | # SYNOPSIS | |
1085 | # list-failed-modules ["substr"] [-v] | |
1086 | cmdSyntax = '^%s' % (CMD_list_failed_modules) | |
1087 | cmdRE = re.compile(cmdSyntax) | |
1088 | #self.cmdRE[cmdRE] = self.handleTodo | |
1089 | ||
1090 | # NAME | |
1091 | # list-haps - print list of haps | |
1092 | # SYNOPSIS | |
1093 | # list-haps ["substring"] | |
1094 | cmdSyntax = '^%s' % (CMD_list_haps) | |
1095 | cmdRE = re.compile(cmdSyntax) | |
1096 | #self.cmdRE[cmdRE] = self.handleTodo | |
1097 | ||
1098 | # NAME | |
1099 | # list-modules - list loadable modules | |
1100 | # SYNOPSIS | |
1101 | # list-modules ["substr"] [-v] | |
1102 | cmdSyntax = '^%s' % (CMD_list_modules) | |
1103 | cmdRE = re.compile(cmdSyntax) | |
1104 | #self.cmdRE[cmdRE] = self.handleTodo | |
1105 | ||
1106 | # NAME | |
1107 | # list-namespaces - list all namespaces | |
1108 | # SYNOPSIS | |
1109 | # list-namespaces | |
1110 | cmdSyntax = '^%s' % (CMD_list_namespaces) | |
1111 | cmdRE = re.compile(cmdSyntax) | |
1112 | #self.cmdRE[cmdRE] = self.handleTodo | |
1113 | ||
1114 | # NAME | |
1115 | # list-profilers - list description of active profilers | |
1116 | # SYNOPSIS | |
1117 | # list-profilers | |
1118 | cmdSyntax = '^%s' % (CMD_list_profilers) | |
1119 | cmdRE = re.compile(cmdSyntax) | |
1120 | #self.cmdRE[cmdRE] = self.handleTodo | |
1121 | ||
1122 | # NAME | |
1123 | # list-vars - list environment variables | |
1124 | # SYNOPSIS | |
1125 | # list-vars | |
1126 | cmdSyntax = '^%s' % (CMD_list_vars) | |
1127 | cmdRE = re.compile(cmdSyntax) | |
1128 | #self.cmdRE[cmdRE] = self.handleTodo | |
1129 | ||
1130 | # NAME | |
1131 | # load-binary, <memory-space>.load-binary - load binary (executable) file | |
1132 | # into memory | |
1133 | # SYNOPSIS | |
1134 | # <memory-space>.load-binary filename [offset] [-v] [-pa] | |
1135 | # load-binary filename [offset] [-v] [-pa] | |
1136 | #cmdSyntax = '^(%s\d+\.)?%s\s+\S+' % (NAME_memory_space, CMD_load_binary) | |
1137 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_memory_space, CMD_load_binary) | |
1138 | cmdRE = re.compile(cmdSyntax) | |
1139 | #self.cmdRE[cmdRE] = self.handleTodo | |
1140 | ||
1141 | # NAME | |
1142 | # load-file, <memory-space>.load-file - load file into memory | |
1143 | # SYNOPSIS | |
1144 | # <memory-space>.load-file filename [offset] | |
1145 | # load-file filename [offset] | |
1146 | #cmdSyntax = '^(%s\d+\.)?%s\s+\S+' % (NAME_memory_space, CMD_load_file) | |
1147 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_memory_space, CMD_load_file) | |
1148 | cmdRE = re.compile(cmdSyntax) | |
1149 | #self.cmdRE[cmdRE] = self.handleTodo | |
1150 | ||
1151 | # NAME | |
1152 | # load-module - load module into system | |
1153 | # SYNOPSIS | |
1154 | # load-module "module" | |
1155 | cmdSyntax = '^%s' % (CMD_load_module) | |
1156 | cmdRE = re.compile(cmdSyntax) | |
1157 | #self.cmdRE[cmdRE] = self.handleTodo | |
1158 | ||
1159 | # NAME | |
1160 | # load-veri-file - load the physical addres from verilog memory format file | |
1161 | # SYNOPSIS | |
1162 | # load-veri-file "verilog-mem-format-file-name" | |
1163 | cmdSyntax = '^%s' % (CMD_load_veri_file) | |
1164 | cmdRE = re.compile(cmdSyntax) | |
1165 | #self.cmdRE[cmdRE] = self.handleTodo | |
1166 | ||
1167 | # NAME | |
1168 | # logical-to-physical, <processor>.logical-to-physical - translate logical | |
1169 | # address to physical | |
1170 | # SYNOPSIS | |
1171 | # <processor>.logical-to-physical address | |
1172 | # logical-to-physical ["cpu-name"] address | |
1173 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_logical_to_physical) | |
1174 | cmdRE = re.compile(cmdSyntax) | |
1175 | self.cmdRE[cmdRE] = self.handleVa2Pa | |
1176 | ||
1177 | # NAME | |
1178 | # magic-break-enable, magic-break-disable - install magic instruction hap | |
1179 | # handler | |
1180 | # SYNOPSIS | |
1181 | # magic-break-disable | |
1182 | # magic-break-enable | |
1183 | cmdSyntax = '^%s' % (CMD_magic_break_enable) | |
1184 | cmdRE = re.compile(cmdSyntax) | |
1185 | #self.cmdRE[cmdRE] = self.handleTodo | |
1186 | ||
1187 | cmdSyntax = '^%s' % (CMD_magic_break_disable) | |
1188 | cmdRE = re.compile(cmdSyntax) | |
1189 | #self.cmdRE[cmdRE] = self.handleTodo | |
1190 | ||
1191 | # NAME | |
1192 | # memory-profile - enable or disable memory profiling | |
1193 | # SYNOPSIS | |
1194 | # memory-profile ["mode"] | |
1195 | cmdSyntax = '^%s' % (CMD_memory_profile) | |
1196 | cmdRE = re.compile(cmdSyntax) | |
1197 | #self.cmdRE[cmdRE] = self.handleTodo | |
1198 | ||
1199 | # NAME | |
1200 | # module-list-refresh - create a new list of loadable modules | |
1201 | # SYNOPSIS | |
1202 | # module-list-refresh | |
1203 | cmdSyntax = '^%s' % (CMD_module_list_refresh) | |
1204 | cmdRE = re.compile(cmdSyntax) | |
1205 | #self.cmdRE[cmdRE] = self.handleTodo | |
1206 | ||
1207 | # NAME | |
1208 | # native-path - convert a filename to host native form | |
1209 | # SYNOPSIS | |
1210 | # native-path "filename" | |
1211 | cmdSyntax = '^%s' % (CMD_native_path) | |
1212 | cmdRE = re.compile(cmdSyntax) | |
1213 | #self.cmdRE[cmdRE] = self.handleTodo | |
1214 | ||
1215 | # NAME | |
1216 | # new-context - create a new context | |
1217 | # SYNOPSIS | |
1218 | # new-context "name" | |
1219 | cmdSyntax = '^%s' % (CMD_new_context) | |
1220 | cmdRE = re.compile(cmdSyntax) | |
1221 | #self.cmdRE[cmdRE] = self.handleTodo | |
1222 | ||
1223 | # NAME | |
1224 | # output-radix - change the default output radix | |
1225 | # SYNOPSIS | |
1226 | # output-radix [base] | |
1227 | cmdSyntax = '^%s' % (CMD_output_radix) | |
1228 | cmdRE = re.compile(cmdSyntax) | |
1229 | #self.cmdRE[cmdRE] = self.handleTodo | |
1230 | ||
1231 | # NAME | |
1232 | # pdisassemble - disassemble instructions in physical memory | |
1233 | # SYNOPSIS | |
1234 | # pdisassemble [address] [count] | |
1235 | cmdSyntax = '^%s' % (CMD_pdisassemble) | |
1236 | cmdRE = re.compile(cmdSyntax) | |
1237 | #self.cmdRE[cmdRE] = self.handleTodo | |
1238 | ||
1239 | # NAME | |
1240 | # penable, <processor>.disable, <processor>.enable, pdisable - switch | |
1241 | # processor on | |
1242 | # SYNOPSIS | |
1243 | # <processor>.disable | |
1244 | # <processor>.enable | |
1245 | # pdisable [("cpu-name"|-all)] | |
1246 | # penable [("cpu-name"|-all)] | |
1247 | cmdSyntax = '^(%s|%s\d+\.%s)' % (CMD_penable, NAME_processor, CMD_enable) | |
1248 | cmdRE = re.compile(cmdSyntax) | |
1249 | self.cmdRE[cmdRE] = self.handlePenable | |
1250 | ||
1251 | cmdSyntax = '^(%s|%s\d+\.%s)' % (CMD_pdisable, NAME_processor, CMD_disable) | |
1252 | cmdRE = re.compile(cmdSyntax) | |
1253 | self.cmdRE[cmdRE] = self.handlePdisable | |
1254 | ||
1255 | # NAME | |
1256 | # pio - print information about an object | |
1257 | # SYNOPSIS | |
1258 | # pio "object-name" | |
1259 | cmdSyntax = '^%s' % (CMD_pio) | |
1260 | cmdRE = re.compile(cmdSyntax) | |
1261 | #self.cmdRE[cmdRE] = self.handleTodo | |
1262 | ||
1263 | # NAME | |
1264 | # pipe - run commands through a pipe | |
1265 | # SYNOPSIS | |
1266 | # pipe "command" "pipe" | |
1267 | cmdSyntax = '^%s' % (CMD_pipe) | |
1268 | cmdRE = re.compile(cmdSyntax) | |
1269 | #self.cmdRE[cmdRE] = self.handleTodo | |
1270 | ||
1271 | # NAME | |
1272 | # pli-run - Run # of instruction through PLI command interface | |
1273 | # SYNOPSIS | |
1274 | # pli-run value | |
1275 | #cmdSyntax = '^%s\s+\d+' % (CMD_pli_run) | |
1276 | cmdSyntax = '^%s' % (CMD_pli_run) | |
1277 | cmdRE = re.compile(cmdSyntax) | |
1278 | #self.cmdRE[cmdRE] = self.handlePlirun | |
1279 | ||
1280 | # NAME | |
1281 | # pregs, <processor>.pregs - print cpu registers | |
1282 | # SYNOPSIS | |
1283 | # <processor>.pregs [-all] | |
1284 | # pregs ["cpu-name"] [-all] | |
1285 | cmdSyntax = '^(%s\d+\.)?%s$|^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_pregs, NAME_processor, CMD_pregs) | |
1286 | cmdRE = re.compile(cmdSyntax) | |
1287 | self.cmdRE[cmdRE] = self.handlePregs | |
1288 | ||
1289 | # NAME | |
1290 | # fpregs, <processor>.fpregs - print cpu fp registers | |
1291 | # SYNOPSIS | |
1292 | # <processor>.fpregs | |
1293 | # fpregs ["cpu-name"] | |
1294 | cmdSyntax = '^(%s\d+\.)?%s$|^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_fpregs, NAME_processor, CMD_fpregs) | |
1295 | cmdRE = re.compile(cmdSyntax) | |
1296 | self.cmdRE[cmdRE] = self.handleFpregs | |
1297 | ||
1298 | # NAME | |
1299 | # cmpregs, <processor>.cmpregs - print cmp registers | |
1300 | # SYNOPSIS | |
1301 | # <processor>.cmpregs | |
1302 | # cmpregs ["cpu-name"] | |
1303 | cmdSyntax = '^(%s\d+\.)?%s$|^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_cmpregs, NAME_processor, CMD_cmpregs) | |
1304 | cmdRE = re.compile(cmdSyntax) | |
1305 | self.cmdRE[cmdRE] = self.handleCmpregs | |
1306 | ||
1307 | # NAME | |
1308 | # mmuregs, <processor>.mmuregs - print mmu registers | |
1309 | # SYNOPSIS | |
1310 | # <processor>.mmuregs | |
1311 | # mmuregs ["cpu-name"] | |
1312 | cmdSyntax = '^(%s\d+\.)?%s$|^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_mmuregs, NAME_processor, CMD_mmuregs) | |
1313 | cmdRE = re.compile(cmdSyntax) | |
1314 | self.cmdRE[cmdRE] = self.handleMmuregs | |
1315 | ||
1316 | # NAME | |
1317 | # pregs-all - print all cpu registers | |
1318 | # SYNOPSIS | |
1319 | # pregs-all ["cpu-name"] | |
1320 | cmdSyntax = '^%s' % (CMD_pregs_all) | |
1321 | cmdRE = re.compile(cmdSyntax) | |
1322 | #self.cmdRE[cmdRE] = self.handleTodo | |
1323 | ||
1324 | # NAME | |
1325 | # pregs-hyper, <processor>.pregs-hyper - print hypervisor registers | |
1326 | # SYNOPSIS | |
1327 | # <processor>.pregs-hyper [-all] | |
1328 | # pregs-hyper ["cpu-name"] [-all] | |
1329 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_pregs_hyper) | |
1330 | cmdRE = re.compile(cmdSyntax) | |
1331 | #self.cmdRE[cmdRE] = self.handleTodo | |
1332 | ||
1333 | # NAME | |
1334 | # print - display integer in various bases | |
1335 | # SYNOPSIS | |
1336 | # print [(-x|-o|-b|-s|-d)] value [size] | |
1337 | #cmdSyntax = '^%s' % (CMD_print) | |
1338 | #cmdRE = re.compile(cmdSyntax) | |
1339 | #self.cmdRE[cmdRE] = self.handleTodo | |
1340 | ||
1341 | # NAME | |
1342 | # print-double-regs - print floating point registers as doubles | |
1343 | # SYNOPSIS | |
1344 | # print-double-regs | |
1345 | cmdSyntax = '^%s' % (CMD_print_double_regs) | |
1346 | cmdRE = re.compile(cmdSyntax) | |
1347 | #self.cmdRE[cmdRE] = self.handleTodo | |
1348 | ||
1349 | # NAME | |
1350 | # print-event-queue - print event queue for processor | |
1351 | # SYNOPSIS | |
1352 | # print-event-queue ["cpu-name"] [queue] | |
1353 | cmdSyntax = '^%s' % (CMD_print_event_queue) | |
1354 | cmdRE = re.compile(cmdSyntax) | |
1355 | #self.cmdRE[cmdRE] = self.handleTodo | |
1356 | ||
1357 | # NAME | |
1358 | # print-float-regs - print floating point registers | |
1359 | # SYNOPSIS | |
1360 | # print-float-regs | |
1361 | cmdSyntax = '^%s' % (CMD_print_float_regs) | |
1362 | cmdRE = re.compile(cmdSyntax) | |
1363 | #self.cmdRE[cmdRE] = self.handleTodo | |
1364 | ||
1365 | # NAME | |
1366 | # print-float-regs-raw - print raw floating point register contents | |
1367 | # SYNOPSIS | |
1368 | # print-float-regs-raw | |
1369 | cmdSyntax = '^%s' % (CMD_print_float_regs_raw) | |
1370 | cmdRE = re.compile(cmdSyntax) | |
1371 | #self.cmdRE[cmdRE] = self.handleTodo | |
1372 | ||
1373 | # NAME | |
1374 | # print-instruction-queue - print instruction queue | |
1375 | # SYNOPSIS | |
1376 | # print-instruction-queue [-v] | |
1377 | cmdSyntax = '^%s' % (CMD_print_instruction_queue) | |
1378 | cmdRE = re.compile(cmdSyntax) | |
1379 | #self.cmdRE[cmdRE] = self.handleTodo | |
1380 | ||
1381 | # NAME | |
1382 | # print-profile - print execution profile | |
1383 | # SYNOPSIS | |
1384 | # print-profile [address] [length] | |
1385 | cmdSyntax = '^%s' % (CMD_print_profile) | |
1386 | cmdRE = re.compile(cmdSyntax) | |
1387 | #self.cmdRE[cmdRE] = self.handleTodo | |
1388 | ||
1389 | # NAME | |
1390 | # print-statistics, <processor>.print-statistics - print various statistics | |
1391 | # SYNOPSIS | |
1392 | # <processor>.print-statistics | |
1393 | # print-statistics [("cpu-name"|-all)] | |
1394 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_print_statistics) | |
1395 | cmdRE = re.compile(cmdSyntax) | |
1396 | #self.cmdRE[cmdRE] = self.handleTodo | |
1397 | ||
1398 | # NAME | |
1399 | # print-time, <processor>.print-time - print simulated time | |
1400 | # SYNOPSIS | |
1401 | # <processor>.print-time | |
1402 | # print-time ["cpu-name"] | |
1403 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_print_time) | |
1404 | cmdRE = re.compile(cmdSyntax) | |
1405 | #self.cmdRE[cmdRE] = self.handleTodo | |
1406 | ||
1407 | # NAME | |
1408 | # prof-page-details - print profile details for a page | |
1409 | # SYNOPSIS | |
1410 | # prof-page-details [address] [strand] | |
1411 | cmdSyntax = '^%s' % (CMD_prof_page_details) | |
1412 | cmdRE = re.compile(cmdSyntax) | |
1413 | #self.cmdRE[cmdRE] = self.handleTodo | |
1414 | ||
1415 | # NAME | |
1416 | # prof-page-map - print summary profile statistics for each page | |
1417 | # SYNOPSIS | |
1418 | # prof-page-map | |
1419 | cmdSyntax = '^%s' % (CMD_prof_page_map) | |
1420 | cmdRE = re.compile(cmdSyntax) | |
1421 | #self.cmdRE[cmdRE] = self.handleTodo | |
1422 | ||
1423 | # NAME | |
1424 | # prof-weight, set-prof-weight - print weighted result of profilers | |
1425 | # SYNOPSIS | |
1426 | # prof-weight [block-size] [count] | |
1427 | # set-prof-weight profiler weight | |
1428 | cmdSyntax = '^%s' % (CMD_prof_weight) | |
1429 | cmdRE = re.compile(cmdSyntax) | |
1430 | #self.cmdRE[cmdRE] = self.handleTodo | |
1431 | ||
1432 | cmdSyntax = '^%s' % (CMD_set_prof_weight) | |
1433 | cmdRE = re.compile(cmdSyntax) | |
1434 | #self.cmdRE[cmdRE] = self.handleTodo | |
1435 | ||
1436 | # NAME | |
1437 | # pselect - select a processor | |
1438 | # SYNOPSIS | |
1439 | # pselect ["cpu-name"] | |
1440 | cmdSyntax = '^%s' % (CMD_pselect) | |
1441 | cmdRE = re.compile(cmdSyntax) | |
1442 | self.cmdRE[cmdRE] = self.handlePselect | |
1443 | ||
1444 | # NAME | |
1445 | # quit - quit from system | |
1446 | # SYNOPSIS | |
1447 | # quit [status] | |
1448 | cmdSyntax = '^%s(\s+\d+)?' % (CMD_quit) | |
1449 | cmdRE = re.compile(cmdSyntax) | |
1450 | self.cmdRE[cmdRE] = self.handleQuit | |
1451 | ||
1452 | # NAME | |
1453 | # read-configuration - restore configuration | |
1454 | # SYNOPSIS | |
1455 | # read-configuration file | |
1456 | cmdSyntax = '^%s' % (CMD_read_configuration) | |
1457 | cmdRE = re.compile(cmdSyntax) | |
1458 | #self.cmdRE[cmdRE] = self.handleTodo | |
1459 | ||
1460 | # NAME | |
1461 | # read-fp-reg-i - print floating point single register as integer | |
1462 | # SYNOPSIS | |
1463 | # read-fp-reg-i reg-num | |
1464 | #cmdSyntax = '^%s\s+\d+' % (CMD_read_fp_reg_i) | |
1465 | cmdSyntax = '^%s\s+' % (CMD_read_fp_reg_i) | |
1466 | cmdRE = re.compile(cmdSyntax) | |
1467 | self.cmdRE[cmdRE] = self.handleReadFpi | |
1468 | ||
1469 | # NAME | |
1470 | # read-fp-reg-x - print floating point double register as integer | |
1471 | # SYNOPSIS | |
1472 | # read-fp-reg-x reg-num | |
1473 | #cmdSyntax = '^%s\s+\d+' % (CMD_read_fp_reg_x) | |
1474 | cmdSyntax = '^%s\s+' % (CMD_read_fp_reg_x) | |
1475 | cmdRE = re.compile(cmdSyntax) | |
1476 | self.cmdRE[cmdRE] = self.handleReadFpx | |
1477 | ||
1478 | # NAME | |
1479 | # read-reg, <processor>.read-reg - read a register | |
1480 | # SYNOPSIS | |
1481 | # <processor>.read-reg "reg-name" | |
1482 | # read-reg ["cpu-name"] "reg-name" | |
1483 | #cmdSyntax = '^(%s\d+\.%s\s+\S+|%s(\s+%s\d+)?\s+\S+' % (NAME_processor, CMD_read_reg, CMD_read_reg, NAME_cpu) | |
1484 | cmdSyntax = '^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_read_reg) | |
1485 | cmdRE = re.compile(cmdSyntax) | |
1486 | self.cmdRE[cmdRE] = self.handleReadReg | |
1487 | ||
1488 | # NAME | |
1489 | # read-sw-pcs - read all pc and npc of a swerver processor | |
1490 | # SYNOPSIS | |
1491 | # read-sw-pcs "swerver-num" | |
1492 | cmdSyntax = '^%s' % (CMD_read_sw_pcs) | |
1493 | cmdRE = re.compile(cmdSyntax) | |
1494 | #self.cmdRE[cmdRE] = self.handleTodo | |
1495 | ||
1496 | # NAME | |
1497 | # read-th-ctl-reg - Control Register value of a thread | |
1498 | # SYNOPSIS | |
1499 | # read-th-ctl-reg thread control-register-num | |
1500 | #cmdSyntax = '^%s\s+\d+\s+\d+' % (CMD_read_th_ctl_reg) | |
1501 | cmdSyntax = '^%s\s+' % (CMD_read_th_ctl_reg) | |
1502 | cmdRE = re.compile(cmdSyntax) | |
1503 | self.cmdRE[cmdRE] = self.handleReadCtlReg | |
1504 | ||
1505 | # NAME | |
1506 | # write-th-ctl-reg - Control Register value of a thread | |
1507 | # SYNOPSIS | |
1508 | # write-th-ctl-reg thread control-register-num value | |
1509 | cmdSyntax = '^%s\s+' % (CMD_write_th_ctl_reg) | |
1510 | cmdRE = re.compile(cmdSyntax) | |
1511 | self.cmdRE[cmdRE] = self.handleWriteCtlReg | |
1512 | ||
1513 | # NAME | |
1514 | # read-th-fp-reg-i - Read single Fp Register value of a thread | |
1515 | # SYNOPSIS | |
1516 | # read-th-fp-reg-i thread register-num | |
1517 | #cmdSyntax = '^%s\s+\d+\s+\d+' % (CMD_read_th_fp_reg_i) | |
1518 | cmdSyntax = '^%s\s+' % (CMD_read_th_fp_reg_i) | |
1519 | cmdRE = re.compile(cmdSyntax) | |
1520 | self.cmdRE[cmdRE] = self.handleReadThFpi | |
1521 | ||
1522 | # NAME | |
1523 | # read-th-fp-reg-x - Read double Fp Register value of a thread | |
1524 | # SYNOPSIS | |
1525 | # read-th-fp-reg-x thread register-num | |
1526 | #cmdSyntax = '^%s\s+\d+\s+\d+' % (CMD_read_th_fp_reg_x) | |
1527 | cmdSyntax = '^%s\s+' % (CMD_read_th_fp_reg_x) | |
1528 | cmdRE = re.compile(cmdSyntax) | |
1529 | self.cmdRE[cmdRE] = self.handleReadThFpx | |
1530 | ||
1531 | # NAME | |
1532 | # read-th-reg - Register value of a window on a thread | |
1533 | # SYNOPSIS | |
1534 | # read-th-reg thread window register-num | |
1535 | #cmdSyntax = '^%s\s+\d+\s+\d+\s+\d+' % (CMD_read_th_reg) | |
1536 | cmdSyntax = '^%s\s+' % (CMD_read_th_reg) | |
1537 | cmdRE = re.compile(cmdSyntax) | |
1538 | self.cmdRE[cmdRE] = self.handleReadThReg | |
1539 | ||
1540 | # NAME | |
1541 | # read-thread-status - Read Thread Status Register | |
1542 | # SYNOPSIS | |
1543 | # read-thread-status "thread" | |
1544 | cmdSyntax = '^%s' % (CMD_read_thread_status) | |
1545 | cmdRE = re.compile(cmdSyntax) | |
1546 | #self.cmdRE[cmdRE] = self.handleTodo | |
1547 | ||
1548 | # NAME | |
1549 | # resolve-file - resolve a filename | |
1550 | # SYNOPSIS | |
1551 | # resolve-file "filename" | |
1552 | cmdSyntax = '^%s' % (CMD_resolve_file) | |
1553 | cmdRE = re.compile(cmdSyntax) | |
1554 | #self.cmdRE[cmdRE] = self.handleTodo | |
1555 | ||
1556 | # NAME | |
1557 | # rtl_cycle - update the interface | |
1558 | # SYNOPSIS | |
1559 | # rtl_cycle | |
1560 | cmdSyntax = '^%s' % (CMD_rtl_cycle) | |
1561 | cmdRE = re.compile(cmdSyntax) | |
1562 | #self.cmdRE[cmdRE] = self.handleTodo | |
1563 | ||
1564 | # NAME | |
1565 | # run - start execution | |
1566 | # SYNOPSIS | |
1567 | # run [count] [sid] | |
1568 | cmdSyntax = '^(%s$|%s\s+\d+)' % (CMD_run, CMD_run) | |
1569 | cmdRE = re.compile(cmdSyntax) | |
1570 | self.cmdRE[cmdRE] = self.handleRun | |
1571 | ||
1572 | # NAME | |
1573 | # runfast - start execution | |
1574 | # SYNOPSIS | |
1575 | # runfast [count] [sid] | |
1576 | cmdSyntax = '^(%s$|%s\s+\d+)' % (CMD_runfast, CMD_runfast) | |
1577 | cmdRE = re.compile(cmdSyntax) | |
1578 | self.cmdRE[cmdRE] = self.handleRunfast | |
1579 | ||
1580 | # NAME | |
1581 | # whatis - map va to symbol | |
1582 | # SYNOPSIS | |
1583 | # whatis va | |
1584 | cmdSyntax = '^%s' % (CMD_whatis) | |
1585 | cmdRE = re.compile(cmdSyntax) | |
1586 | self.cmdRE[cmdRE] = self.handleWhatis | |
1587 | ||
1588 | # NAME | |
1589 | # run-command-file - run commands from a file | |
1590 | # SYNOPSIS | |
1591 | # run-command-file file | |
1592 | #cmdSyntax = '^%s\s+\S+' % (CMD_run_command_file) | |
1593 | cmdSyntax = '^%s\s+' % (CMD_run_command_file) | |
1594 | cmdRE = re.compile(cmdSyntax) | |
1595 | self.cmdRE[cmdRE] = self.handleRunCommandFile | |
1596 | ||
1597 | # NAME | |
1598 | # run-python-file - execute Python file | |
1599 | # SYNOPSIS | |
1600 | # run-python-file filename | |
1601 | #cmdSyntax = '^%s\s+\S+' % (CMD_run_python_file) | |
1602 | cmdSyntax = '^%s\s+' % (CMD_run_python_file) | |
1603 | cmdRE = re.compile(cmdSyntax) | |
1604 | self.cmdRE[cmdRE] = self.handleRunPythonFile | |
1605 | ||
1606 | # NAME | |
1607 | # set, <memory-space>.set - set physical address to specified value | |
1608 | # SYNOPSIS | |
1609 | # <memory-space>.set address value [size] [-l] [-b] | |
1610 | # set address value [size] [-l] [-b] | |
1611 | #cmdSyntax = '^(%s\d+\.)%s\s+0[xX][\dA-Fa-f]+\s+0[xX][\dA-Fa-f]+' % (NAME_memory_space, CMD_set) | |
1612 | cmdSyntax = '^(%s\d+\.)?%s\s+' % (NAME_memory_space, CMD_set) | |
1613 | cmdRE = re.compile(cmdSyntax) | |
1614 | self.cmdRE[cmdRE] = self.handleSet | |
1615 | ||
1616 | # NAME | |
1617 | # set-context, <processor>.set-context - set the current context of a cpu | |
1618 | # SYNOPSIS | |
1619 | # <processor>.set-context "context" | |
1620 | # set-context "context" | |
1621 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_set_context) | |
1622 | cmdRE = re.compile(cmdSyntax) | |
1623 | #self.cmdRE[cmdRE] = self.handleTodo | |
1624 | ||
1625 | # NAME | |
1626 | # set-pattern - set an instruction pattern for a breakpoint | |
1627 | # SYNOPSIS | |
1628 | # set-pattern id "pattern" "mask" | |
1629 | cmdSyntax = '^%s' % (CMD_set_pattern) | |
1630 | cmdRE = re.compile(cmdSyntax) | |
1631 | #self.cmdRE[cmdRE] = self.handleTodo | |
1632 | ||
1633 | # NAME | |
1634 | # set-pc, <processor>.set-pc - set the current processor's program counter | |
1635 | # SYNOPSIS | |
1636 | # <processor>.set-pc address | |
1637 | # set-pc address | |
1638 | cmdSyntax = '^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_set_pc) | |
1639 | cmdRE = re.compile(cmdSyntax) | |
1640 | self.cmdRE[cmdRE] = self.handleSetPc | |
1641 | ||
1642 | # NAME | |
1643 | # set-prefix - set a syntax prefix for a breakpoint | |
1644 | # SYNOPSIS | |
1645 | # set-prefix id "prefix" | |
1646 | cmdSyntax = '^%s' % (CMD_set_prefix) | |
1647 | cmdRE = re.compile(cmdSyntax) | |
1648 | #self.cmdRE[cmdRE] = self.handleTodo | |
1649 | ||
1650 | # NAME | |
1651 | # set-substr - set a syntax substring for a breakpoint | |
1652 | # SYNOPSIS | |
1653 | # set-substr id "substr" | |
1654 | cmdSyntax = '^%s' % (CMD_set_substr) | |
1655 | cmdRE = re.compile(cmdSyntax) | |
1656 | #self.cmdRE[cmdRE] = self.handleTodo | |
1657 | ||
1658 | # NAME | |
1659 | # special-interrupt - Special interrupt | |
1660 | # SYNOPSIS | |
1661 | # special-interrupt reset-type target-thread rstvec | |
1662 | cmdSyntax = '^%s' % (CMD_special_interrupt) | |
1663 | cmdRE = re.compile(cmdSyntax) | |
1664 | #self.cmdRE[cmdRE] = self.handleTodo | |
1665 | ||
1666 | # NAME | |
1667 | # sstepi - step one instr of all swerver processor | |
1668 | # SYNOPSIS | |
1669 | # sstepi "thread_seq" | |
1670 | cmdSyntax = '^%s' % (CMD_sstepi) | |
1671 | cmdRE = re.compile(cmdSyntax) | |
1672 | #self.cmdRE[cmdRE] = self.handleTodo | |
1673 | ||
1674 | # NAME | |
1675 | # step-break-absolute, <processor>.step-break, < | |
1676 | # processor>.step-break-absolute, step-break - set step breakpoints | |
1677 | # SYNOPSIS | |
1678 | # <processor>.step-break instructions | |
1679 | # <processor>.step-break-absolute instructions | |
1680 | # step-break ["cpu-name"] instructions | |
1681 | # step-break-absolute ["cpu-name"] instructions | |
1682 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_step_break) | |
1683 | cmdRE = re.compile(cmdSyntax) | |
1684 | #self.cmdRE[cmdRE] = self.handleTodo | |
1685 | ||
1686 | cmdSyntax = '^(%s\d+\.)?%s' % (NAME_processor, CMD_step_break_absolute) | |
1687 | cmdRE = re.compile(cmdSyntax) | |
1688 | #self.cmdRE[cmdRE] = self.handleTodo | |
1689 | ||
1690 | # NAME | |
1691 | # step-cycle - step one or more cycles | |
1692 | # SYNOPSIS | |
1693 | # step-cycle [count] | |
1694 | #cmdSyntax = '^%s(\s+\d+)?' % (CMD_step_cycle) | |
1695 | cmdSyntax = '^%s' % (CMD_step_cycle) | |
1696 | cmdRE = re.compile(cmdSyntax) | |
1697 | #self.cmdRE[cmdRE] = self.handleTodo | |
1698 | ||
1699 | # NAME | |
1700 | # step-instruction - step one or more instructions | |
1701 | # SYNOPSIS | |
1702 | # step-instruction [count] | |
1703 | #cmdSyntax = '^%s(\s+\d+)?' % (CMD_step_instruction) | |
1704 | cmdSyntax = '^%s' % (CMD_step_instruction) | |
1705 | cmdRE = re.compile(cmdSyntax) | |
1706 | #self.cmdRE[cmdRE] = self.handleTodo | |
1707 | ||
1708 | # NAME | |
1709 | # stop - interrupt simulation | |
1710 | # SYNOPSIS | |
1711 | # stop | |
1712 | cmdSyntax = '^%s' % (CMD_stop) | |
1713 | cmdRE = re.compile(cmdSyntax) | |
1714 | #self.cmdRE[cmdRE] = self.handleTodo | |
1715 | ||
1716 | # NAME | |
1717 | # swrun - start execution | |
1718 | # SYNOPSIS | |
1719 | # swrun [count] | |
1720 | #cmdSyntax = '^%s(\s+\d+)?' % (CMD_swrun) | |
1721 | cmdSyntax = '^%s' % (CMD_swrun) | |
1722 | cmdRE = re.compile(cmdSyntax) | |
1723 | #self.cmdRE[cmdRE] = self.handleTodo | |
1724 | ||
1725 | # NAME | |
1726 | # trace-cr, untrace-cr - trace control register updates | |
1727 | # SYNOPSIS | |
1728 | # trace-cr ("register"|-all|-list) | |
1729 | # untrace-cr ("register"|-all|-list) | |
1730 | cmdSyntax = '^(un)?%s' % (CMD_trace_cr) | |
1731 | cmdRE = re.compile(cmdSyntax) | |
1732 | #self.cmdRE[cmdRE] = self.handleTodo | |
1733 | ||
1734 | # NAME | |
1735 | # trace-exception, untrace-exception - trace exceptions | |
1736 | # SYNOPSIS | |
1737 | # trace-exception ("name"|number|-all|-list) | |
1738 | # untrace-exception ("name"|number|-all|-list) | |
1739 | cmdSyntax = '^(un)?%s' % (CMD_trace_exception) | |
1740 | cmdRE = re.compile(cmdSyntax) | |
1741 | #self.cmdRE[cmdRE] = self.handleTodo | |
1742 | ||
1743 | # NAME | |
1744 | # trace-hap, untrace-hap - trace haps | |
1745 | # SYNOPSIS | |
1746 | # trace-hap ("hap"|-all|-list) | |
1747 | # untrace-hap ("hap"|-all|-list) | |
1748 | cmdSyntax = '^(un)?%s' % (CMD_trace_hap) | |
1749 | cmdRE = re.compile(cmdSyntax) | |
1750 | #self.cmdRE[cmdRE] = self.handleTodo | |
1751 | ||
1752 | # NAME | |
1753 | # trace-io, untrace-io - trace device accesses | |
1754 | # SYNOPSIS | |
1755 | # trace-io ("device"|-all|-list) | |
1756 | # untrace-io ("device"|-all|-list) | |
1757 | cmdSyntax = '^(un)?%s' % (CMD_trace_io) | |
1758 | cmdRE = re.compile(cmdSyntax) | |
1759 | #self.cmdRE[cmdRE] = self.handleTodo | |
1760 | ||
1761 | # NAME | |
1762 | # trap-info - print information about current traps | |
1763 | # SYNOPSIS | |
1764 | # trap-info | |
1765 | cmdSyntax = '^%s' % (CMD_trap_info) | |
1766 | cmdRE = re.compile(cmdSyntax) | |
1767 | #self.cmdRE[cmdRE] = self.handleTodo | |
1768 | ||
1769 | # NAME | |
1770 | # unbreak - remove breakpoint range | |
1771 | # SYNOPSIS | |
1772 | # unbreak (id|-all) address length [-r] [-w] [-x] | |
1773 | #cmdSyntax = '^%s\s+(\d+|-all)' % (CMD_unbreak) | |
1774 | cmdSyntax = '^%s' % (CMD_unbreak) | |
1775 | cmdRE = re.compile(cmdSyntax) | |
1776 | #self.cmdRE[cmdRE] = self.handleTodo | |
1777 | ||
1778 | # NAME | |
1779 | # undisplay - remove expression installed by display | |
1780 | # SYNOPSIS | |
1781 | # undisplay expression-id | |
1782 | cmdSyntax = '^%s' % (CMD_undisplay) | |
1783 | cmdRE = re.compile(cmdSyntax) | |
1784 | #self.cmdRE[cmdRE] = self.handleTodo | |
1785 | ||
1786 | # NAME | |
1787 | # unload-module - unload module | |
1788 | # SYNOPSIS | |
1789 | # unload-module "module" | |
1790 | cmdSyntax = '^%s' % (CMD_unload_module) | |
1791 | cmdRE = re.compile(cmdSyntax) | |
1792 | #self.cmdRE[cmdRE] = self.handleTodo | |
1793 | ||
1794 | # NAME | |
1795 | # write-configuration - save configuration | |
1796 | # SYNOPSIS | |
1797 | # write-configuration file | |
1798 | cmdSyntax = '^%s' % (CMD_write_configuration) | |
1799 | cmdRE = re.compile(cmdSyntax) | |
1800 | #self.cmdRE[cmdRE] = self.handleTodo | |
1801 | ||
1802 | # NAME | |
1803 | # write-fp-reg-i - write floating point single register as integer | |
1804 | # SYNOPSIS | |
1805 | # write-fp-reg-i reg-num value | |
1806 | #cmdSyntax = '^%s\s+\d+\s+(\d+|0[xX][\da-fA-F]+)' % (CMD_write_fp_reg_i) | |
1807 | cmdSyntax = '^%s\s+' % (CMD_write_fp_reg_i) | |
1808 | cmdRE = re.compile(cmdSyntax) | |
1809 | self.cmdRE[cmdRE] = self.handleWriteFpi | |
1810 | ||
1811 | # NAME | |
1812 | # write-fp-reg-x - write floating point double register as integer | |
1813 | # SYNOPSIS | |
1814 | # write-fp-reg-x reg-num value | |
1815 | #cmdSyntax = '^%s\s+\d+\s+(\d+|0[xX][\da-fA-F]+)' % (CMD_write_fp_reg_x) | |
1816 | cmdSyntax = '^%s\s+' % (CMD_write_fp_reg_x) | |
1817 | cmdRE = re.compile(cmdSyntax) | |
1818 | self.cmdRE[cmdRE] = self.handleWriteFpx | |
1819 | ||
1820 | # NAME | |
1821 | # write-reg, <processor>.write-reg - write to register | |
1822 | # SYNOPSIS | |
1823 | # <processor>.write-reg "reg-name" value | |
1824 | # write-reg ["cpu-name"] "reg-name" value | |
1825 | cmdSyntax = '^(%s\d+\.)?%s\s+' % (NAME_processor, CMD_write_reg) | |
1826 | cmdRE = re.compile(cmdSyntax) | |
1827 | self.cmdRE[cmdRE] = self.handleWriteReg | |
1828 | ||
1829 | # NAME | |
1830 | # write-th-fp-reg-i - Write double Fp Register value of a thread | |
1831 | # SYNOPSIS | |
1832 | # write-th-fp-reg-i thread register-num value | |
1833 | cmdSyntax = '^%s\s+' % (CMD_write_th_fp_reg_i) | |
1834 | cmdRE = re.compile(cmdSyntax) | |
1835 | self.cmdRE[cmdRE] = self.handleWriteThFpi | |
1836 | ||
1837 | # NAME | |
1838 | # write-th-fp-reg-x - Write double Fp Register value of a thread | |
1839 | # SYNOPSIS | |
1840 | # write-th-fp-reg-x thread register-num value | |
1841 | cmdSyntax = '^%s\s+' % (CMD_write_th_fp_reg_x) | |
1842 | cmdRE = re.compile(cmdSyntax) | |
1843 | self.cmdRE[cmdRE] = self.handleWriteThFpx | |
1844 | ||
1845 | # NAME | |
1846 | # write-thread-status - Write Thread Status Register | |
1847 | # SYNOPSIS | |
1848 | # write-thread-status "thread" value | |
1849 | cmdSyntax = '^%s' % (CMD_write_thread_status) | |
1850 | cmdRE = re.compile(cmdSyntax) | |
1851 | #self.cmdRE[cmdRE] = self.handleTodo | |
1852 | ||
1853 | # NAME | |
1854 | # x, <memory-space>.x, <processor>.x, xp - examine raw memory contents | |
1855 | # SYNOPSIS | |
1856 | # <memory-space>.x address [size] | |
1857 | # <processor>.x address [size] | |
1858 | # x ["cpu-name"] address [size] | |
1859 | # xp address [size] | |
1860 | cmdSyntax = '^(%s\d+|%s\d+)\.%s\s+0[xX][\da-fA-F]+' % (NAME_memory_space, NAME_processor, CMD_x) | |
1861 | cmdRE = re.compile(cmdSyntax) | |
1862 | #self.cmdRE[cmdRE] = self.handleTodo | |
1863 | ||
1864 | cmdSyntax = '^%s(\s+%s\d+)?\s+0[xX][\da-fA-F]+' % (CMD_x, NAME_processor) | |
1865 | cmdRE = re.compile(cmdSyntax) | |
1866 | #self.cmdRE[cmdRE] = self.handleTodo | |
1867 | ||
1868 | cmdSyntax = '^%s\s+0[xX][\da-fA-F]+' % (CMD_xp) | |
1869 | cmdRE = re.compile(cmdSyntax) | |
1870 | #self.cmdRE[cmdRE] = self.handleTodo | |
1871 | ||
1872 | ##### extra commands ##### | |
1873 | cmdSyntax = '^%s\s+' % (CMD_ssi) | |
1874 | cmdRE = re.compile(cmdSyntax) | |
1875 | self.cmdRE[cmdRE] = self.handleStep | |
1876 | ||
1877 | cmdSyntax = '^%s' % (CMD_ALIAS) | |
1878 | cmdRE = re.compile(cmdSyntax) | |
1879 | self.cmdRE[cmdRE] = self.handleAlias | |
1880 | ||
1881 | cmdSyntax = '^%s' % (CMD_UNALIAS) | |
1882 | cmdRE = re.compile(cmdSyntax) | |
1883 | self.cmdRE[cmdRE] = self.handleUnalias | |
1884 | ||
1885 | #TODO reset, in current form, does not work as intended. | |
1886 | ## cmdSyntax = '^%s' % (CMD_RESET) | |
1887 | ## cmdRE = re.compile(cmdSyntax) | |
1888 | ## self.cmdRE[cmdRE] = self.handleReset | |
1889 | ||
1890 | # keep a list of all the keys, do this AFTER all the commands are | |
1891 | # registered | |
1892 | self.cmdList = self.cmdRE.keys() | |
1893 | #self.dbx('cmdList=%s\n' % (self.cmdList)) | |
1894 | # init docs | |
1895 | self.initDoc() | |
1896 | ||
1897 | ||
1898 | def initDoc (self): | |
1899 | """ | |
1900 | """ | |
1901 | # DOCS[cmd]=('cmd syntax', 'CMD', 'short-desc', 'long-desc') | |
1902 | self.DOCS['set-pc'] = ("set-pc", 'CMD', "set a strand's pc", 'syntax: set-pc address') | |
1903 | self.DOCS['set'] = ("set", 'CMD', 'set value at a memory location', 'syntax: set [v:]address value [size]') | |
1904 | self.DOCS['get'] = ("get", 'CMD', 'get value from a memory location', 'syntax: get [v:]address [size]') | |
1905 | self.DOCS['write-th-fp-reg-i'] = ("write-th-fp-reg-i", 'CMD', 'write to a floating-point single register', 'syntax: write-th-fp-reg-i thread register-num value') | |
1906 | self.DOCS['write-th-fp-reg-x'] = ("write-th-fp-reg-x", 'CMD', 'write to a floating-point double register', 'syntax: write-th-fp-reg-x thread register-num value') | |
1907 | self.DOCS['read-th-fp-reg-i'] = ("read-th-fp-reg-i", 'CMD', 'read a floating-point single register', 'syntax: read-th-fp-reg-i thread reg-num') | |
1908 | self.DOCS['read-th-fp-reg-x'] = ("read-th-fp-reg-x", 'CMD', 'read a floating-point double register', 'syntax: read-th-fp-reg-x thread reg-num') | |
1909 | self.DOCS['write-fp-reg-i'] = ("write-fp-reg-i", 'CMD', 'write to a floating-point single register of current strand', 'syntax: write-fp-reg-i register-num value') | |
1910 | self.DOCS['write-fp-reg-x'] = ("write-fp-reg-x", 'CMD', 'write to a floating-point double register of current strand', 'syntax: write-fp-reg-x register-num value') | |
1911 | self.DOCS['read-fp-reg-i'] = ("read-fp-reg-i", 'CMD', 'read a floating-point single register of current strand', 'syntax: read-fp-reg-i register-num') | |
1912 | self.DOCS['read-fp-reg-x'] = ("read-fp-reg-x", 'CMD', 'read a floating-point double register of current strand', 'syntax: read-fp-reg-x register-num') | |
1913 | self.DOCS['write-reg'] = ("write-reg", 'CMD', 'write to a register', 'syntax: write-reg [cpu-name] reg-name value') | |
1914 | self.DOCS['read-reg'] = ("read-reg", 'CMD', 'read a register', 'syntax: read-reg [cpu-name] reg-name') | |
1915 | self.DOCS['read-th-reg'] = ("read-th-reg", 'CMD', 'read a register of a specified strand', 'syntax: read-th-reg thread window register-num') | |
1916 | self.DOCS['read-th-ctl-reg'] = ("read-th-ctl-reg", 'CMD', 'read a control register of a specified strand', 'syntax: read-th-ctl-reg thread control-register-num') | |
1917 | self.DOCS['write-th-ctl-reg'] = ("write-th-ctl-reg", 'CMD', 'write to a control register of a specified strand', 'syntax: write-th-ctl-reg thread control-register-num value') | |
1918 | self.DOCS['echo'] = ("echo", 'CMD', 'echo a string or value', 'syntax: echo [("string"|integer|float)]') | |
1919 | self.DOCS['expect'] = ("expect", 'CMD', 'compare two values, exit if the values do not match', 'syntax: expect i1 i2') | |
1920 | self.DOCS['%'] = ("%", 'CMD', 'read a register', 'syntax: %regname') | |
1921 | #self.DOCS['ssi'] = ("ssi", 'CMD', 'step instruction(s) on strand(s)', 'syntax: ssi cN, ssi sN, ssi lN') | |
1922 | self.DOCS['pregs'] = ("pregs", 'CMD', 'print out integer/floating-point/control registers', 'syntax: pregs [cpu-name] [-all]') | |
1923 | self.DOCS['fpregs'] = ("fpregs", 'CMD', 'print out floating-point registers', 'syntax: fpregs [cpu-name]') | |
1924 | self.DOCS['cmpregs'] = ("cmpregs", 'CMD', 'print out cmp registers', 'syntax: cmpregs [cpu-name]') | |
1925 | self.DOCS['mmuregs'] = ("mmuregs", 'CMD', 'print out mmu registers', 'syntax: mmuregs [cpu-name]') | |
1926 | self.DOCS['stmmuN.regs'] = ("stmmuN.regs", 'CMD', 'print out mmu registers', 'syntax: stmmuN.regs') | |
1927 | self.DOCS['swmmuN.d-tlb'] = ("swmmuN.d-tlb", 'CMD', 'print out d-tlb values', 'syntax: swmmuN.d-tlb') | |
1928 | self.DOCS['swmmuN.i-tlb'] = ("swmmuN.i-tlb", 'CMD', 'print out i-tlb values', 'syntax: swmmuN.i-tlb') | |
1929 | self.DOCS['break'] = ("break", 'CMD', 'set a breakpoint', 'syntax: break 0xpc|v:0xva|p:0xpa [sid=-1], break &symbol [sid=-1]') | |
1930 | self.DOCS['delete'] = ("delete", 'CMD', 'delete a breakpoint', 'syntax: delete (-all|id)') | |
1931 | self.DOCS['enable'] = ("enable", 'CMD', 'enable a breakpoint', 'syntax: enable (-all|id)') | |
1932 | self.DOCS['disable'] = ("disable", 'CMD', 'disable a breakpoint', 'syntax: disable (-all|id)') | |
1933 | self.DOCS['pdisable'] = ("pdisable", 'CMD', 'disable a strand', 'syntax: pdisable [(cpu-name|-all)]') | |
1934 | self.DOCS['penable'] = ("penable", 'CMD', 'enable one or more strands', 'syntax: penable [(cpu-name|-all|0x3210)]') | |
1935 | self.DOCS['pmask'] = ("pmask", 'CMD', 'control strand enabling in SAM setting', 'syntax: pmask [hex - one bit per strand, lowest bit as strand0]') | |
1936 | self.DOCS['run'] = ("run", 'CMD', 'continue to execute instructions, until hit breakpoint or exit', 'syntax: run [count] [strand-id]') | |
1937 | #self.DOCS['runfast'] = ("runfast", 'CMD', 'execute instructions in fast mode', 'syntax: runfast [count] [strand-id]') | |
1938 | self.DOCS['whatis'] = ("whatis", 'CMD', 'map a VA/PA to symbol+offset', 'syntax: whatis 0xva|p:0xpa') | |
1939 | self.DOCS['alias'] = ("alias", 'CMD', 'set an alias', 'syntax: alias zzz z1, e.g., alias pr print "%s=%#x" % ($1,$2)') | |
1940 | self.DOCS['unalias'] = ("unalias", 'CMD', 'unalias an alias', 'syntax: unalias zzz [zzz]* | -all') | |
1941 | #self.DOCS['reset'] = ("reset", 'CMD', "reset all strands' back to a system reset state", 'syntax: reset [traptype=0x1]') | |
1942 | #self.DOCS['ignore'] = ("ignore", 'CMD', 'ignore hitting breakpoint N times', 'syntax: ignore id num') | |
1943 | self.DOCS['list-breakpoints'] = ("list-breakpoints", 'CMD', 'list all breakpoints', 'syntax: list-breakpoints') | |
1944 | self.DOCS['pselect'] = ("pselect", 'CMD', 'select a strand to be the current strand', 'syntax: pselect [cpu-name]') | |
1945 | self.DOCS['quit'] = ("quit", 'CMD', 'terminate the execution', 'syntax: quit [status]') | |
1946 | self.DOCS['run-command-file'] = ("run-command-file", 'CMD', 'execute a command file', 'syntax: run-command-file file') | |
1947 | self.DOCS['run-python-file'] = ("run-python-file", 'CMD', 'execute a python file', 'syntax: run-python-file file') | |
1948 | self.DOCS['logical-to-physical'] = ("logical-to-physical", 'CMD', 'convert logical address to physical address', 'syntax: logical-to-physical [cpu-name] address') | |
1949 | self.DOCS['disassemble'] = ("disassemble", 'CMD', 'disassembler one or more instructions', 'syntax: [thN.]disassemble [address [count]]') | |
1950 | ||
1951 | ||
1952 | def showDoc (self, key=None): | |
1953 | """return 1 means a match is found, 0 means no match | |
1954 | """ | |
1955 | found = 0 | |
1956 | if key: | |
1957 | # strip off ' ', '(', or ')', they are not part of the key | |
1958 | i = key.find('(') | |
1959 | if i > -1: | |
1960 | key = key[:i] | |
1961 | key = key.strip() | |
1962 | if self.DOCS.has_key(key): | |
1963 | (func,type,shortd,longd) = self.DOCS[key] | |
1964 | print '%s: %s: \t%s' % (type, func, shortd) | |
1965 | if longd and longd != 'TODO': | |
1966 | print '\t\t%s' % (longd) | |
1967 | found = 1 | |
1968 | else: | |
1969 | found = 0 | |
1970 | else: | |
1971 | # show all docs | |
1972 | byType = { } | |
1973 | for (key2,(func,type,shortd,longd)) in self.DOCS.items(): | |
1974 | if not byType.has_key(type): | |
1975 | byType[type] = { } | |
1976 | byType[type][key2] = (func,type,shortd,longd) | |
1977 | klist = byType.keys() | |
1978 | klist.sort() | |
1979 | for key2 in klist: | |
1980 | klist3 = byType[key2].keys() | |
1981 | klist3.sort() | |
1982 | for key3 in klist3: | |
1983 | (func,type,shortd,longd) = byType[key2][key3] | |
1984 | #print '%s: %s: \t%s' % (type, func, shortd) | |
1985 | print '%s: %s' % (type, func) | |
1986 | # also show API docs | |
1987 | showApiDoc() | |
1988 | found = 1 | |
1989 | ||
1990 | if found == 0: | |
1991 | found = showApiDoc(key) | |
1992 | ||
1993 | return found | |
1994 | ||
1995 | ||
1996 | def registerCommand (self, key, cmdlist): | |
1997 | """ | |
1998 | """ | |
1999 | #@new_command("write-th-fp-reg-x", write_th_fp_reg_x_cmd, | |
2000 | # args = [arg(int_t, "thread"), arg(int_t, "register-num"), arg(integer_t, "value")], | |
2001 | # type = "niagara commands", | |
2002 | # short = "Write double Fp Register value of a thread", | |
2003 | # doc = """ | |
2004 | # Write double precision fp-reg. """) | |
2005 | ||
2006 | #self.dbx('key=%s, cmdlist=%s\n' % (key, cmdlist)) | |
2007 | if type(cmdlist) is types.ListType: | |
2008 | oneline = '' | |
2009 | for cmd in cmdlist: | |
2010 | oneline += ' ' + cmd.strip() | |
2011 | else: | |
2012 | oneline = cmdlist | |
2013 | #self.dbx('oneline=%s\n' % (oneline)) | |
2014 | ||
2015 | # function name | |
2016 | lindex = oneline.find(',') | |
2017 | rindex = oneline.find(',', lindex+1) | |
2018 | if lindex > -1 and rindex > -1: | |
2019 | func = oneline[lindex+1:rindex].strip() | |
2020 | else: | |
2021 | #self.wrongSyntax(oneline) | |
2022 | raise RuntimeError | |
2023 | ||
2024 | argcount = 0 | |
2025 | # TODO we don't keep track the following values yet | |
2026 | ctype = '' | |
2027 | short = '' | |
2028 | doc = '' | |
2029 | ||
2030 | more = 1 | |
2031 | ||
2032 | # args | |
2033 | lindex = oneline.find('[', rindex+1) | |
2034 | rindex = oneline.find(']', lindex+1) | |
2035 | if lindex > -1 and rindex > -1: | |
2036 | args = oneline[lindex+1:rindex].strip() | |
2037 | # squeeze out blank space(s) | |
2038 | tokens = args.split() | |
2039 | args = ''.join(tokens) | |
2040 | argcount = args.count('arg(') | |
2041 | else: | |
2042 | more = 0 | |
2043 | ||
2044 | # ctype | |
2045 | if more == 1: | |
2046 | lindex = oneline.find('"', rindex+1) | |
2047 | rindex = oneline.find('"', lindex+1) | |
2048 | if lindex > -1 and rindex > -1: | |
2049 | ctype = oneline[lindex+1:rindex].strip() | |
2050 | else: | |
2051 | more = 0 | |
2052 | ||
2053 | # short description | |
2054 | if more == 1: | |
2055 | lindex = oneline.find('"', rindex+1) | |
2056 | rindex = oneline.find('"', lindex+1) | |
2057 | if lindex > -1 and rindex > -1: | |
2058 | short = oneline[lindex+1:rindex].strip() | |
2059 | else: | |
2060 | more = 0 | |
2061 | ||
2062 | # long description | |
2063 | if more == 1: | |
2064 | lindex = oneline.find('"', rindex+1) | |
2065 | rindex = oneline.rfind('"', lindex+1) | |
2066 | if lindex > -1 and rindex > -1: | |
2067 | doc = oneline[lindex+1:rindex].strip('"').strip() | |
2068 | else: | |
2069 | more = 0 | |
2070 | ||
2071 | #self.dbx('key=%s\n' % (key)) | |
2072 | #self.dbx('func=%s\n' % (func)) | |
2073 | #self.dbx('args=%s\n' % (args)) | |
2074 | #self.dbx('argcount=%s\n' % (argcount)) | |
2075 | #self.dbx('ctype=%s\n' % (ctype)) | |
2076 | #self.dbx('short=%s\n' % (short)) | |
2077 | #self.dbx('doc=%s\n' % (doc)) | |
2078 | ||
2079 | if argcount > 0: | |
2080 | cmdSyntax = '^%s\s+' % (key) | |
2081 | else: | |
2082 | cmdSyntax = '^%s$' % (key) | |
2083 | cmdRE = re.compile(cmdSyntax) | |
2084 | self.cmdExt[cmdRE] = (func, argcount) | |
2085 | ||
2086 | # add entry in DOCS | |
2087 | self.registerDoc(key, key, 'CMD-EXT', short, doc) | |
2088 | ||
2089 | ||
2090 | def registerDoc (self, key, fname, type, shortdoc, longdoc): | |
2091 | """ | |
2092 | """ | |
2093 | self.DOCS[key] = (fname, type, shortdoc, longdoc) | |
2094 | ||
2095 | ||
2096 | def setNstrandObjs (self, count): | |
2097 | """ | |
2098 | """ | |
2099 | if self.nstrandObjs != count: | |
2100 | sys.stderr.write('WARNING: CmdParserNi: setNstrandObjs: self.nstrandObjs=%d, count=%d\n' % (self.nstrandObjs, count)) | |
2101 | ||
2102 | self.nstrandObjs = count | |
2103 | i = 0 | |
2104 | while i < self.nstrandObjs: | |
2105 | # 5/25/05: penable/pdisable will update CMP registers, and step() | |
2106 | # is controlled by core_running_status, so frontend thdEnable[] | |
2107 | # will always be true. | |
2108 | self.thdEnable[i] = 1 | |
2109 | self.instrCount[i] = 0 | |
2110 | i += 1 | |
2111 | ||
2112 | ||
2113 | def registerCmdMap (self, cmdMap): | |
2114 | """ | |
2115 | """ | |
2116 | self.cmdMap = cmdMap | |
2117 | ||
2118 | ||
2119 | def parseCmd (self, line, **parms): | |
2120 | """ | |
2121 | """ | |
2122 | #self.dbx('DBX: enter parseCmd(%s)\n' % (line)) #DBX | |
2123 | if not line: | |
2124 | return line | |
2125 | ||
2126 | try: | |
2127 | return self._parseCmd(line, **parms) | |
2128 | except SystemExit: | |
2129 | raise | |
2130 | except Exception, ex: | |
2131 | sys.stderr.write('Wrong command syntax: <%s>, ex=%s\n' % (line, ex)) | |
2132 | #self.showtraceback() | |
2133 | #return line | |
2134 | return None | |
2135 | ||
2136 | ||
2137 | def _parseCmd (self, line, **parms): | |
2138 | """ | |
2139 | """ | |
2140 | #self.dbx('DBX: enter _parseCmd(%s)\n' % (line)) #DBX | |
2141 | ||
2142 | # preserve leading white space | |
2143 | i, n = 0, len(line) | |
2144 | while (i < n) and (line[i] in string.whitespace): | |
2145 | i = i + 1 | |
2146 | indent = line[:i] | |
2147 | cmd = line[i:] | |
2148 | ||
2149 | if not cmd: | |
2150 | return line | |
2151 | ||
2152 | if self.riesReposit.running == 1: | |
2153 | # check to see if the 'run' non-blocking command has hit a bpoint | |
2154 | #bid = self.riesReposit.riesling.getBreakpointTablePtr().queryLast() | |
2155 | pass | |
2156 | ## bid = self.riesReposit.riesling.bp_table.hit_bp() | |
2157 | ## if (bid > 0): | |
2158 | ## #sid = self.riesReposit.riesling.getBreakpointTablePtr().queryLastSid() | |
2159 | ## sid = self.riesReposit.riesling.bp_table.hit_strand() | |
2160 | ## #TODO what to do if bpCmd is not none? | |
2161 | ## bpCmd = self.showBreakpoint(sid, bid) | |
2162 | ||
2163 | # resolve command alias | |
2164 | #print 'DBX: alias: cmd=%s' % cmd #DBX | |
2165 | tokens = cmd.split() | |
2166 | if self.alias.has_key(tokens[0]): | |
2167 | #cmd = self.alias[tokens[0]] + ' ' + ' '.join(tokens[1:]) | |
2168 | cmd = self.alias[tokens[0]] | |
2169 | #print 'DBX: alias: cmd0=%s' % cmd #DBX | |
2170 | if cmd.find('$') > -1: | |
2171 | # there are embedded parameters | |
2172 | for i in range(1, len(tokens)): | |
2173 | cmd = cmd.replace(('$%d' % i), tokens[i]) | |
2174 | #print 'DBX: alias: cmd%d=%s' % (i ,cmd) #DBX | |
2175 | while cmd.find('$') > -1: | |
2176 | # if there are extra (optional) $parameter, get rid of them | |
2177 | cmd = cmd.replace(('$%d' % i), '') | |
2178 | i += 1 | |
2179 | else: | |
2180 | cmd = cmd + ' ' + ' '.join(tokens[1:]) | |
2181 | #print 'DBX: alias: final cmd=%s' % cmd #DBX | |
2182 | ||
2183 | if tokens[0] == CMD_ALIAS: | |
2184 | self.handleAlias(cmd) | |
2185 | return None | |
2186 | ||
2187 | # replace % variable, e.g., %pc, with RS_read_register_name(), so they | |
2188 | # can be used in any expression, e.g., "print '%#x' % %pc", hex(%pc), | |
2189 | # hex(%pc+4), etc. | |
2190 | cmd = self.replaceToken(cmd) | |
2191 | ||
2192 | # TODO we would like to collect cmd ouput in variable 'cmdOut' so that | |
2193 | # the output can be processed, but current structure does not | |
2194 | # allow that. | |
2195 | if self.cmdMap != None: | |
2196 | # if the program is in running mode, accept only 'stop' or 'quit' | |
2197 | import sam | |
2198 | if (not sam.is_stopped()) and ((cmd != 'stop') and (cmd != 'quit') and (not cmd.startswith('mips'))): | |
2199 | sys.stderr.write("not in stop state, enter 'stop' first before issue the command\n") | |
2200 | return None | |
2201 | cmdOut = None | |
2202 | returnCmd = self.cmdMap.issueCmd(cmd, cmdOut, self.riesReposit) | |
2203 | if returnCmd == None: | |
2204 | # return of 'None' means the command has a match in cmdMap and | |
2205 | # had been executed, so go no further. | |
2206 | # for 'run N' and 'stepi N', we need to check if there is | |
2207 | # a breakpoint hit | |
2208 | #TODO if it is a 'run' command, cannot check it here, and it | |
2209 | # is hard to check whether a 'run' hit a breakpoint at | |
2210 | # all, so we won't be able to do showBreakpoint() for | |
2211 | # non-blocking 'run' command. | |
2212 | tokens = cmd.split() | |
2213 | bpCmd = None | |
2214 | if ((tokens[0] == 'run') or (tokens[0] == 'stepi')): | |
2215 | #bid = self.riesReposit.riesling.getBreakpointTablePtr().query() | |
2216 | pass | |
2217 | ## bid = self.riesReposit.riesling.bp_table.last_hit_bp() | |
2218 | ## if (bid > 0): | |
2219 | ## #sid = self.riesReposit.riesling.getBreakpointTablePtr().querySid() | |
2220 | ## sid = self.riesReposit.riesling.bp_table.last_hit_strand() | |
2221 | ## bpCmd = self.showBreakpoint(sid, bid) | |
2222 | return bpCmd | |
2223 | else: | |
2224 | # if no match, use the returned command (likely the original | |
2225 | # cmd) for further processing | |
2226 | cmd = returnCmd | |
2227 | ||
2228 | cmdkey = cmd.split()[0] | |
2229 | newCmd = None | |
2230 | #sys.stderr.write('DBX: line=<%s>, cmd=<%s>, cmdkey=<%s>\n' % (line, cmd, cmdkey)) #DBX | |
2231 | if cmdkey == CMD_pli_run and (parms['socketInit'] == 1): | |
2232 | # pli-run command is valid only if pli-socket layer is init'ed | |
2233 | try: | |
2234 | tokens = cmd.split() | |
2235 | if len(tokens) > 1: | |
2236 | self.riesReposit.socketAPI.plirun(int(tokens[1])) | |
2237 | else: | |
2238 | self.riesReposit.socketAPI.plirun() | |
2239 | except Exception, ex: | |
2240 | sys.stderr.write('WARNING: socketAPI exception, ex=%s\n' % (ex)) | |
2241 | return None | |
2242 | ||
2243 | elif cmdkey == '@def': | |
2244 | #sys.stderr.write('DBX: @def=<%s>\n' % (cmd)) #DBX | |
2245 | # simics uses @def foo() ---> @foo() syntax, bring | |
2246 | # it back to normal def foo() ---> foo() | |
2247 | newCmd = cmd[1:] | |
2248 | # register it in doc | |
2249 | lindex = cmd.find(' ') | |
2250 | mindex = cmd.find('(', lindex) | |
2251 | rindex = cmd.rfind(':') | |
2252 | fname = cmd[lindex+1:mindex].strip() | |
2253 | func = cmd[lindex+1:rindex].strip() | |
2254 | self.registerDoc(fname, func, '@DEF', '@def '+func, None) | |
2255 | ||
2256 | elif cmdkey.startswith('@new_command') or cmdkey.startswith('new_command'): | |
2257 | eindex = cmd.find(',') | |
2258 | lindex = cmd.find('"', 0, eindex) | |
2259 | rindex = cmd.find('"', lindex+1, eindex) | |
2260 | if lindex == -1 or rindex == -1: | |
2261 | #self.wrongSyntax(cmd) | |
2262 | raise RuntimeError | |
2263 | else: | |
2264 | key = cmd[lindex+1:rindex] | |
2265 | self.registerCommand(key, cmd) | |
2266 | return None | |
2267 | ||
2268 | else: | |
2269 | # match command extension first | |
2270 | for key in self.cmdExt.keys(): | |
2271 | if re.match(key, cmd): | |
2272 | cmd = self.polishCommand(cmd) | |
2273 | (func,argcount) = self.cmdExt[key] | |
2274 | return self.dispatcher(cmd, func, argcount) | |
2275 | ||
2276 | # if no match in extension, try matching registered commands | |
2277 | for key in self.cmdList: | |
2278 | # sys.stdout.write(cmd + '\n') | |
2279 | if re.match(key, cmd): | |
2280 | cmd = self.polishCommand(cmd) | |
2281 | newCmd = self.cmdRE[key](cmd) | |
2282 | if newCmd == None: | |
2283 | return None | |
2284 | else: | |
2285 | return indent + newCmd | |
2286 | ||
2287 | # get here only if we cannot find any match | |
2288 | newCmd = cmd | |
2289 | ||
2290 | if newCmd == None: | |
2291 | return None | |
2292 | else: | |
2293 | return indent + newCmd | |
2294 | ||
2295 | ||
2296 | def mapRS (self, tid, level): | |
2297 | """ | |
2298 | """ | |
2299 | if level == RegisterMap.LEVEL_STRAND: | |
2300 | return self.mapThdid(tid) | |
2301 | elif level == RegisterMap.LEVEL_UCORE: | |
2302 | return self.mapuCoreid(tid) | |
2303 | elif level == RegisterMap.LEVEL_CORE: | |
2304 | return self.mapCoreid(tid) | |
2305 | elif level == RegisterMap.LEVEL_CPU: | |
2306 | return self.mapCpuid(tid) | |
2307 | else: | |
2308 | return self.topName | |
2309 | ||
2310 | ||
2311 | def mapThdid (self, tid): | |
2312 | """ | |
2313 | """ | |
2314 | if tid >= self.nstrandObjs: | |
2315 | return None | |
2316 | ||
2317 | if not self.strandMap.has_key(tid): | |
2318 | self.strandMap[tid] = 'strands[%d]' % tid | |
2319 | ## cpuid = tid / self.cpusize | |
2320 | ## leftover = tid % self.cpusize | |
2321 | ## coreid = leftover / self.nstrands | |
2322 | ## strandid = leftover % self.nstrands | |
2323 | ## self.strandMap[tid] = '%s.%s%d.%s%d.%s%d' % (self.topName, NAME_CPU, cpuid, NAME_CORE, coreid, NAME_STRAND, strandid) | |
2324 | ||
2325 | return self.strandMap[tid] | |
2326 | ||
2327 | ||
2328 | def mapuCoreid (self, tid): | |
2329 | """ | |
2330 | """ | |
2331 | if tid >= self.nstrandObjs: | |
2332 | return None | |
2333 | ||
2334 | if not self.ucoreMap.has_key(tid): | |
2335 | ucoreid = tid / self.ucoresize | |
2336 | self.ucoreMap[tid] = 'ucores[%d]' % ucoreid | |
2337 | ## cpuid = tid / self.cpusize | |
2338 | ## leftover = tid % self.cpusize | |
2339 | ## coreid = leftover / self.nstrands | |
2340 | ## self.coreMap[tid] = '%s.%s%d.%s%d' % (self.topName, NAME_CPU, cpuid, NAME_CORE, coreid) | |
2341 | ||
2342 | return self.ucoreMap[tid] | |
2343 | ||
2344 | ||
2345 | def mapCoreid (self, tid): | |
2346 | """ | |
2347 | """ | |
2348 | if tid >= self.nstrandObjs: | |
2349 | return None | |
2350 | ||
2351 | if not self.coreMap.has_key(tid): | |
2352 | coreid = tid / self.coresize | |
2353 | self.coreMap[tid] = 'cores[%d]' % coreid | |
2354 | ## cpuid = tid / self.cpusize | |
2355 | ## leftover = tid % self.cpusize | |
2356 | ## coreid = leftover / self.nstrands | |
2357 | ## self.coreMap[tid] = '%s.%s%d.%s%d' % (self.topName, NAME_CPU, cpuid, NAME_CORE, coreid) | |
2358 | ||
2359 | return self.coreMap[tid] | |
2360 | ||
2361 | ||
2362 | def mapCpuid (self, tid): | |
2363 | """ | |
2364 | """ | |
2365 | if tid >= self.nstrandObjs: | |
2366 | return None | |
2367 | ||
2368 | if not self.cpuMap.has_key(tid): | |
2369 | cpuid = tid / self.cpusize | |
2370 | self.cpuMap[tid] = 'cpus[%d]' % cpuid | |
2371 | ## self.cpuMap[tid] = '%s.%s%d' % (self.topName, NAME_CPU, cpuid) | |
2372 | ||
2373 | return self.cpuMap[tid] | |
2374 | ||
2375 | ||
2376 | def dbx (self, msg): | |
2377 | """ | |
2378 | """ | |
2379 | sys.stderr.write('DBX: CmdParserNi.py: %s' % (msg)) | |
2380 | ||
2381 | ||
2382 | def todo (self, msg): | |
2383 | """ | |
2384 | """ | |
2385 | sys.stderr.write('TODO: CmdParserNi.py: %s' % (msg)) | |
2386 | ||
2387 | ||
2388 | def _eval (self, cmd): | |
2389 | """ | |
2390 | """ | |
2391 | return eval(cmd, self.riesReposit.globals) | |
2392 | ||
2393 | ||
2394 | def dispatcher (self, cmd, func, argcount): | |
2395 | """ | |
2396 | """ | |
2397 | if argcount == 0: | |
2398 | return self._eval('%s()' % (func)) | |
2399 | else: | |
2400 | tokens = cmd.split() | |
2401 | if len(tokens) != (argcount+1): | |
2402 | raise RuntimeError, 'input parameters do not match command syntax, cmd=<%s>' % (cmd) | |
2403 | else: | |
2404 | #self.dbx('%s(%s)\n' % (func, ','.join(tokens[1:]))) | |
2405 | return self._eval('%s(%s)' % (func, ','.join(tokens[1:]))) | |
2406 | ||
2407 | ||
2408 | def handleSetPc (self, cmd): | |
2409 | """ | |
2410 | <processor>.set-pc address | |
2411 | set-pc address | |
2412 | ||
2413 | e.g., set-pc 0x00010000 | |
2414 | """ | |
2415 | #self.dbx('handleSetPC(%s)\n' % (cmd)) | |
2416 | tokens = cmd.split() | |
2417 | if tokens[0].startswith(CMD_set_pc): | |
2418 | # set-pc 0x00010000 | |
2419 | # use current tid | |
2420 | tid = self.lastTid | |
2421 | else: | |
2422 | # <processor>.set-pc 0x00010000 | |
2423 | i = tokens[0].find('.') | |
2424 | tid = tokens[0][len(NAME_processor):i] | |
2425 | ||
2426 | retval = self.checkArgs([tokens[1]]) | |
2427 | if retval[0] ==False: | |
2428 | sys.stderr.write('ERROR: invalid argument\n') | |
2429 | return '' | |
2430 | ||
2431 | ## newCmd = '%s.s%s.pc=%s' % (self.topName,tid, tokens[1]) | |
2432 | ## #eval(newCmd, self.riesReposit.globals) | |
2433 | ## return newCmd | |
2434 | if tokens[1].startswith('0x'): | |
2435 | addr = long(tokens[1], 16) | |
2436 | else: | |
2437 | addr = long(tokens[1]) | |
2438 | self.riesReposit.riesling.s[tid].pc = addr | |
2439 | return None | |
2440 | ||
2441 | def handleSet (self, cmd): | |
2442 | """ | |
2443 | TODO <memory-space>.set address value size [-l] [-b] | |
2444 | set address value size [-l] [-b] | |
2445 | ||
2446 | 1 <= size [4] <= 8 | |
2447 | TODO -l/-b: little-endian/big-endian byte order | |
2448 | ||
2449 | e.g., set 0x00010004 0xafa0188b # fitos %f11, %f23 | |
2450 | """ | |
2451 | #print 'DBX: handleSet(): <%s>' % (cmd) #DBX | |
2452 | tokens = cmd.split() | |
2453 | addrStr = tokens[1] | |
2454 | tid = self.lastTid | |
2455 | ||
2456 | if addrStr.startswith(SYM_VA): | |
2457 | # logical address: v:0x... | |
2458 | # RS_logical_to_physical always check itlb, then dtlb | |
2459 | (addr,type) = RS_logical_to_physical(tid, eval(addrStr[len(SYM_VA):]), 2) | |
2460 | elif addrStr.startswith(SYM_PA): | |
2461 | addr = eval(addrStr[len(SYM_PA):]) | |
2462 | else: | |
2463 | if self.checkArgs([addrStr]) != [True]: | |
2464 | sys.stderr.write('ERROR: wrong addr argument\n') | |
2465 | return | |
2466 | else: | |
2467 | addr = eval(addrStr) | |
2468 | ||
2469 | ||
2470 | if self.checkArgs([tokens[2]]) != [True]: | |
2471 | sys.stderr.write('ERROR: wrong value argument\n') | |
2472 | return | |
2473 | ||
2474 | if len(tokens) >= 4 and self.checkArgs([tokens[3]]) != [True]: | |
2475 | sys.stderr.write('ERROR: wrong value or size argument\n') | |
2476 | return | |
2477 | ||
2478 | value = eval(self.truncVal(tokens[2],1)) | |
2479 | ||
2480 | # set 4 or 8 bytes | |
2481 | try: | |
2482 | size = eval(tokens[3]) | |
2483 | except: | |
2484 | # if size is not provided, or is not valid, use 4 bytes | |
2485 | #raise | |
2486 | size = 4 | |
2487 | ||
2488 | #print 'DBX: handleSet(): tid=%d, addr=%#x, value=%#x, size=%d' % (tid, addr, value, size) #DBX | |
2489 | if not size in [1,2,4,8]: | |
2490 | sys.stderr.write('ERROR: set: wrong size %d, must be 1,2,4,8-byte\n' % (size)) | |
2491 | elif (addr % size) != 0: | |
2492 | sys.stderr.write('ERROR: set: misaligned address\n') | |
2493 | else: | |
2494 | RS_write_phys_memory(tid, addr, value, size) | |
2495 | ||
2496 | return None | |
2497 | ||
2498 | ||
2499 | def handleGet (self, cmd): | |
2500 | """ | |
2501 | TODO <memory-space>.get address [size] [-l] [-b] | |
2502 | get address size [-l] [-b] | |
2503 | ||
2504 | 1 <= size [4] <= 8 | |
2505 | TODO -l/-b: little-endian/big-endian byte order | |
2506 | ||
2507 | e.g., get 0x00010004 | |
2508 | """ | |
2509 | tokens = cmd.split() | |
2510 | addrStr = tokens[1] | |
2511 | tid = self.lastTid | |
2512 | ||
2513 | if addrStr.startswith(SYM_VA): | |
2514 | # logical address: v:0x... | |
2515 | # RS_logical_to_physical() always check itlb, then dtlb. | |
2516 | (addr,type) = RS_logical_to_physical(tid, eval(addrStr[len(SYM_VA):]), 2) | |
2517 | elif addrStr.startswith(SYM_PA): | |
2518 | addr = eval(addrStr[len(SYM_PA):]) | |
2519 | else: | |
2520 | if self.checkArgs([addrStr]) != [True]: | |
2521 | sys.stderr.write('ERROR: wrong addr argument\n') | |
2522 | return | |
2523 | addr = eval(addrStr) | |
2524 | ||
2525 | if len(tokens) >=3 and self.checkArgs([tokens[2]]) != [True]: | |
2526 | sys.stderr.write('ERROR: wrong size argument\n') | |
2527 | return | |
2528 | ||
2529 | # retrieve 4 or 8 bytes | |
2530 | try: | |
2531 | size = eval(tokens[2]) | |
2532 | except: | |
2533 | # if tokens[2] is not provided or not valid, use 4 bytes | |
2534 | #raise | |
2535 | size = 4 | |
2536 | ||
2537 | if (not size in [1,2,4]) and ((size % 8) != 0): | |
2538 | sys.stderr.write('ERROR: get: wrong size %d, must be 1,2,4,8N-byte\n' % (size)) | |
2539 | return None | |
2540 | ||
2541 | if (size <= 8) and ((addr % size) != 0): | |
2542 | sys.stderr.write('ERROR: get: addr %#x is not aligned to %d\n' % (addr, size)) | |
2543 | return None | |
2544 | ||
2545 | if (size > 8) and ((addr % 8) != 0): | |
2546 | sys.stderr.write('ERROR: get: addr %#x is not aligned to %d\n' % (addr, 8)) | |
2547 | return None | |
2548 | ||
2549 | if size >= 8: | |
2550 | i = 0 | |
2551 | while i < size/8: | |
2552 | #newCmd = 'hex(%s)' % (RS_read_phys_memory(0, addr+8*i, 8)) | |
2553 | #print eval(newCmd) | |
2554 | sys.stdout.write('%#018x ' % (RS_read_phys_memory(tid, addr+8*i, 8))) | |
2555 | i += 1 | |
2556 | if (i % 4) == 0: | |
2557 | sys.stdout.write('\n'); | |
2558 | # make sure we finish off the last value with an EOL | |
2559 | if (i % 4) != 0: | |
2560 | sys.stdout.write('\n'); | |
2561 | return None | |
2562 | else: | |
2563 | #newCmd = 'hex(%s)' % (RS_read_phys_memory(0, addr, size)) | |
2564 | #return newCmd | |
2565 | print '%#010x' % (RS_read_phys_memory(tid, addr, size)) | |
2566 | return None | |
2567 | ||
2568 | ||
2569 | def handleWriteThFpi (self, cmd): | |
2570 | """ | |
2571 | write-th-fp-reg-i thread register-num value | |
2572 | ||
2573 | e.g., write-th-fp-reg-i 0 10 0x00000000fbff1391 | |
2574 | """ | |
2575 | tokens = cmd.split() | |
2576 | if self.checkArgs([tokens[1],tokens[2],tokens[3]]) != [True,True,True]: | |
2577 | sys.stderr.write('ERROR: wrong input paramters\n') | |
2578 | return '' | |
2579 | ||
2580 | tid = int(tokens[1]) | |
2581 | regid = tokens[2] | |
2582 | value = tokens[3] | |
2583 | ||
2584 | if tid < self.nstrandObjs and self.myInt(regid) < self.nSpregs: | |
2585 | value = self.truncVal(value,0) | |
2586 | newCmd = '%s.s%d.f%s=%s' % (self.topName,tid, regid, value) | |
2587 | # eval(newCmd, self.riesReposit.globals) | |
2588 | return newCmd | |
2589 | else: | |
2590 | sys.stderr.write('ERROR: out of bounds tid or regid\n') | |
2591 | return '' | |
2592 | ||
2593 | ||
2594 | def handleWriteThFpx (self, cmd): | |
2595 | """ | |
2596 | write-th-fp-reg-x thread register-num value | |
2597 | ||
2598 | e.g., write-th-fp-reg-x 0 10 0x00000000fbff1391 | |
2599 | """ | |
2600 | tokens = cmd.split() | |
2601 | if self.checkArgs([tokens[1],tokens[2],tokens[3]]) != [True,True,True]: | |
2602 | sys.stderr.write('ERROR: wrong input paramters\n') | |
2603 | return '' | |
2604 | ||
2605 | tid = int(tokens[1]) | |
2606 | regid = tokens[2] | |
2607 | value = tokens[3] | |
2608 | ||
2609 | if tid < self.nstrandObjs and self.myInt(regid) < self.nDpregs: | |
2610 | value = self.truncVal(value,1) | |
2611 | newCmd = '%s.s%d.d%s=%s' % (self.topName,tid, regid, value) | |
2612 | # eval(newCmd, self.riesReposit.globals) | |
2613 | # sys.stderr.write(newCmd + '\n') | |
2614 | return newCmd | |
2615 | else: | |
2616 | sys.stderr.write('ERROR: out of bounds tid or regid\n') | |
2617 | return '' | |
2618 | ||
2619 | ||
2620 | def handleReadThFpi (self, cmd): | |
2621 | """ | |
2622 | read-th-fp-reg-i thread reg-num | |
2623 | """ | |
2624 | tokens = cmd.split() | |
2625 | if self.checkArgs([tokens[1],tokens[2]]) != [True,True]: | |
2626 | system.stderr.write('ERROR: wrong input parameters\n') | |
2627 | return '' | |
2628 | ||
2629 | if (int(tokens[1]) < self.nstrandObjs) and (int(tokens[2]) < self.nSpregs): | |
2630 | # as the result will be passed through python interpreter, it must | |
2631 | # be in string format. | |
2632 | newCmd = '%s.s%s.f%s' % (self.topName,tokens[1], tokens[2]) | |
2633 | #return str(eval(newCmd, self.riesReposit.globals)) | |
2634 | return newCmd | |
2635 | else: | |
2636 | sys.stderr.write("ERROR: thread id or register number out of bounds\n") | |
2637 | return '' | |
2638 | ||
2639 | ||
2640 | def handleReadThFpx (self, cmd): | |
2641 | """ | |
2642 | read-th-fp-reg-x thread reg-num | |
2643 | """ | |
2644 | tokens = cmd.split() | |
2645 | if self.checkArgs([tokens[1],tokens[2]]) != [True,True]: | |
2646 | system.stderr.write('ERROR: wrong input parameters\n') | |
2647 | return '' | |
2648 | ||
2649 | if (int(tokens[1]) < self.nstrandObjs) and (int(tokens[2]) < self.nDpregs): | |
2650 | # as the result will be passed through python interpreter, it must | |
2651 | # be in string format. | |
2652 | newCmd = '%s.s%s.d%s' % (self.topName,tokens[1], tokens[2]) | |
2653 | #return str(eval(newCmd, self.riesReposit.globals)) | |
2654 | return newCmd | |
2655 | else: | |
2656 | sys.stderr.write("ERROR: thread id or register number out of bounds\n") | |
2657 | return '' | |
2658 | ||
2659 | ||
2660 | def handleWriteFpi (self, cmd): | |
2661 | """ | |
2662 | write-fp-reg-i register-num value | |
2663 | """ | |
2664 | tokens = cmd.split() | |
2665 | regid = tokens[1] | |
2666 | value = tokens[2] | |
2667 | if self.checkArgs([regid,value]) != [True, True]: | |
2668 | sys.stderr.write('ERROR: wrong command arguments\n') | |
2669 | return '' | |
2670 | ||
2671 | if int(regid) < self.nSpregs: | |
2672 | value = self.truncVal(value,0) | |
2673 | newCmd = '%s.s%d.f%s=%s' % (self.topName,self.lastTid, regid, value) | |
2674 | # eval(newCmd, self.riesReposit.globals) | |
2675 | return newCmd | |
2676 | else: | |
2677 | sys.stderr.write('ERROR: register index %s out of bound %s\n' % (regid,self.nSpregs - 1)) | |
2678 | return '' | |
2679 | ||
2680 | ||
2681 | def handleWriteFpx (self, cmd): | |
2682 | """ | |
2683 | write-fp-reg-x thread register-num value | |
2684 | """ | |
2685 | tokens = cmd.split() | |
2686 | regid = tokens[1] | |
2687 | value = tokens[2] | |
2688 | if self.checkArgs([regid,value]) != [True, True]: | |
2689 | sys.stderr.write('ERROR: wrong command arguments\n') | |
2690 | return '' | |
2691 | ||
2692 | if int(regid) < self.nDpregs: | |
2693 | value = self.truncVal(value,1) | |
2694 | newCmd = '%s.s%d.d%s=%s' % (self.topName,self.lastTid, regid, value) | |
2695 | #eval(newCmd, self.riesReposit.globals) | |
2696 | return newCmd | |
2697 | else: | |
2698 | sys.stderr.write('ERROR: register index %s out of bound %s\n' % (regid,self.nDpregs - 1)) | |
2699 | return '' | |
2700 | ||
2701 | ||
2702 | def handleReadFpi (self, cmd): | |
2703 | """ | |
2704 | read-fp-reg-i reg-num | |
2705 | ||
2706 | e.g., read-fp-reg-i 22 | |
2707 | """ | |
2708 | #self.dbx('handleReadFpx(%s)\n' % (cmd)) | |
2709 | tokens = cmd.split() | |
2710 | if self.checkArgs([tokens[1]]) != [True]: | |
2711 | sys.stderr.write('ERROR: wrong input argument\n') | |
2712 | return '' | |
2713 | ||
2714 | if int(tokens[1]) < self.nSpregs: | |
2715 | # as the result will be passed through python interpreter, it must | |
2716 | # be in string format. | |
2717 | newCmd = '%s.s%d.f%s' % (self.topName,self.lastTid, tokens[1]) | |
2718 | #return str(eval(newCmd, self.riesReposit.globals)) | |
2719 | return newCmd | |
2720 | else: | |
2721 | sys.stderr.write('ERROR: register index %s out of bound %s\n' % (tokens[1],self.nSpregs - 1)) | |
2722 | return '' | |
2723 | ||
2724 | ||
2725 | def handleReadFpx (self, cmd): | |
2726 | """ | |
2727 | read-fp-reg-x reg-num | |
2728 | ||
2729 | e.g., read-fp-reg-x 22 | |
2730 | """ | |
2731 | #self.dbx('handleReadFpx(%s)\n' % (cmd)) | |
2732 | tokens = cmd.split() | |
2733 | if self.checkArgs([tokens[1]]) != [True]: | |
2734 | sys.stdout.write('ERROR: wrong input argument\n') | |
2735 | return '' | |
2736 | ||
2737 | if int(tokens[1]) < self.nDpregs: | |
2738 | # as the result will be passed through python interpreter, it must | |
2739 | # be in string format. | |
2740 | newCmd = 'strands[%d].d%s' % (self.lastTid, tokens[1]) | |
2741 | #return str(eval(newCmd, self.riesReposit.globals)) | |
2742 | return newCmd | |
2743 | else: | |
2744 | sys.stdout.write('ERROR: register index %s out of bound %s\n' % (tokens[1],self.nDpregs - 1)) | |
2745 | return '' | |
2746 | ||
2747 | ||
2748 | def regMapSrch(self, reg_name): | |
2749 | name = self.regmap.feName2beName(reg_name) | |
2750 | if name == '': | |
2751 | sys.stderr.write('ERROR: unimplemented register access or unknown register\n') | |
2752 | return '' | |
2753 | else: | |
2754 | return name | |
2755 | ||
2756 | def handleWriteReg (self, cmd): | |
2757 | """ | |
2758 | <processor>.write-reg "reg-name" value | |
2759 | write-reg ["cpu-name"] "reg-name" value | |
2760 | ||
2761 | e.g., write-reg fsr 0x40000be0 | |
2762 | """ | |
2763 | tokens = cmd.split() | |
2764 | if tokens[0].startswith(CMD_write_reg): | |
2765 | # write-reg ['cpu-name'] fsr 0x40000be0 | |
2766 | if tokens[1].startswith(NAME_processor): | |
2767 | # use specified tid | |
2768 | tid = int(tokens[1][len(NAME_processor):]) | |
2769 | name = tokens[2] | |
2770 | value = tokens[3] | |
2771 | else: | |
2772 | # use current tid | |
2773 | tid = self.lastTid | |
2774 | name = tokens[1] | |
2775 | value = tokens[2] | |
2776 | else: | |
2777 | # <processor>.write-reg fsr 0x40000be0 | |
2778 | index = tokens[0].find('.') | |
2779 | tid = int(tokens[0][len(NAME_processor):index]) | |
2780 | name = tokens[1] | |
2781 | value = tokens[2] | |
2782 | ||
2783 | value = self.truncVal(value,1) | |
2784 | name = self.regMapSrch(name) | |
2785 | if name != '': | |
2786 | newCmd = '%s.s%d.%s=%s' % (self.topName,tid,name,value) | |
2787 | else: | |
2788 | newCmd = '' | |
2789 | ||
2790 | return newCmd | |
2791 | ||
2792 | ||
2793 | def handleReadReg (self, cmd): | |
2794 | """ | |
2795 | <processor>.read-reg "reg-name" | |
2796 | read-reg ["cpu-name"] "reg-name" | |
2797 | ||
2798 | e.g., read-reg fsr | |
2799 | """ | |
2800 | tokens = cmd.split() | |
2801 | if tokens[0].startswith(CMD_read_reg): | |
2802 | # read-reg ['cpu-name'] fsr | |
2803 | if tokens[1].startswith(NAME_processor): | |
2804 | # use specified tid | |
2805 | tid = int(tokens[1][len(NAME_processor):]) | |
2806 | name = tokens[2] | |
2807 | else: | |
2808 | # use current tid | |
2809 | tid = self.lastTid | |
2810 | name = tokens[1] | |
2811 | else: | |
2812 | # <processor>.read-reg fsr | |
2813 | i = tokens[0].find('.') | |
2814 | tid = int(tokens[0][len(NAME_processor):i]) | |
2815 | name = tokens[1] | |
2816 | ||
2817 | name = self.regMapSrch(name) | |
2818 | if name != '': | |
2819 | newCmd = '%s.s%d.%s' % (self.topName,tid,name) | |
2820 | else: | |
2821 | newCmd = '' | |
2822 | ||
2823 | return newCmd | |
2824 | ||
2825 | ||
2826 | def handleReadThReg (self, cmd): | |
2827 | """ | |
2828 | read-th-reg thread window register-num | |
2829 | """ | |
2830 | tokens = cmd.split() | |
2831 | if len(tokens) < 4: | |
2832 | sys.stderr.write('ERROR: wrong number of arguments\n') | |
2833 | return '' | |
2834 | ||
2835 | if self.checkArgs([tokens[1],tokens[2],tokens[3]]) != [True,True,True]: | |
2836 | sys.stderr.write('ERROR: wrong input argument\n') | |
2837 | return '' | |
2838 | ||
2839 | tid = int(tokens[1]) | |
2840 | win = tokens[2] | |
2841 | reg = tokens[3] | |
2842 | if tid >= self.nstrandObjs or int(reg) >= self.nWinregs + 8 or int(reg) < 8 or int(win) >= self.nWin: | |
2843 | sys.stderr.write('ERROR: thread id or register # or win # out of bounds\n') | |
2844 | return '' | |
2845 | ||
2846 | newCmd = '%s.s%d.w[%s][%s]' % (self.topName,tid, win, reg) | |
2847 | return newCmd | |
2848 | ||
2849 | ||
2850 | def handleReadCtlReg (self, cmd): | |
2851 | """ | |
2852 | read-th-ctl-reg thread control-register-num | |
2853 | """ | |
2854 | tokens = cmd.split() | |
2855 | tid = int(tokens[1]) | |
2856 | rid = int(tokens[2]) | |
2857 | reg = self.regmap.id2key(rid) | |
2858 | ||
2859 | if reg == '': | |
2860 | sys.stdout.write('no register mapped at id %d or UNIMP\n' % (rid,)) | |
2861 | return '' | |
2862 | newCmd = '%s.s%d.%s' % (self.topName,tid,reg) | |
2863 | return newCmd | |
2864 | ||
2865 | ||
2866 | def handleWriteCtlReg (self, cmd): | |
2867 | """ | |
2868 | write-th-ctl-reg thread control-register-num value | |
2869 | """ | |
2870 | tokens = cmd.split() | |
2871 | tid = int(tokens[1]) | |
2872 | rid = int(tokens[2]) | |
2873 | reg = self.regmap.id2key(rid) | |
2874 | value = tokens[3] | |
2875 | value = self.truncVal(value,1) | |
2876 | if reg == '': | |
2877 | sys.stdout.write('no register mapped at id %d or UNIMP\n' % (rid,)) | |
2878 | return '' | |
2879 | ||
2880 | newCmd = '%s.s%d.%s=%s' % (self.topName,tid,reg,value) | |
2881 | ||
2882 | #sys.stderr.write('DBX: handleWriteCtlReg: newCmd=%s\n' % (newCmd)) #DBX | |
2883 | return newCmd | |
2884 | ||
2885 | ||
2886 | def handleEcho (self, cmd): | |
2887 | """ | |
2888 | echo [("string"|integer|float)] | |
2889 | ||
2890 | e.g., echo ?Checking fsr ..? | |
2891 | """ | |
2892 | #self.dbx('handleEcho(%s)\n' % (cmd)) | |
2893 | cmd = cmd[len(CMD_echo):].strip() | |
2894 | if ((cmd.startswith("'") and cmd.endswith("'")) or | |
2895 | (cmd.startswith('"') and cmd.endswith('"'))): | |
2896 | cmd = cmd[1:-1] | |
2897 | cmd = cmd.replace("'", "\\'") | |
2898 | newCmd = 'print \'%s\'' % (cmd) | |
2899 | return newCmd | |
2900 | ||
2901 | ||
2902 | def handleExpect (self, cmd): | |
2903 | """ | |
2904 | expect i1 i2 [-v] | |
2905 | ||
2906 | e.g., expect (read-fp-reg-x 22) 0xb06dd828cc801d8d | |
2907 | """ | |
2908 | #self.dbx('handleExpect(%s)\n' % (cmd)) | |
2909 | lindex = cmd.find('(') | |
2910 | if lindex > -1: | |
2911 | # expect (expr) value2 | |
2912 | rindex = cmd.rfind(')') | |
2913 | expr1 = cmd[lindex+1:rindex].strip() | |
2914 | tokens = cmd[rindex+1:].split() | |
2915 | expr2 = tokens[0].strip() | |
2916 | else: | |
2917 | # expect value1 value2 | |
2918 | tokens = cmd.split() | |
2919 | expr1 = tokens[1] | |
2920 | expr2 = tokens[2] | |
2921 | ||
2922 | ## # make sure 0x87654321 does not turn into negative value | |
2923 | ## if re.match(hexRE, expr1) or re.match(octRE, expr1): | |
2924 | ## expr1 = expr1 + 'L' | |
2925 | ## if re.match(hexRE, expr2) or re.match(octRE, expr2): | |
2926 | ## expr2 = expr2 + 'L' | |
2927 | ||
2928 | value1 = self._eval(self.parseCmd(expr1)) | |
2929 | if type(value1) is types.StringType: | |
2930 | value1 = self._eval(value1) | |
2931 | value2 = self._eval(expr2) | |
2932 | ||
2933 | if value1 != value2: | |
2934 | sys.stdout.write('ERROR: EXPECT mismatch: (%s = %s) != (%s = %s)\n' % (expr1, value1, expr2, value2)) | |
2935 | sys.exit(1) | |
2936 | ||
2937 | return None | |
2938 | ||
2939 | ||
2940 | def handleRegName (self, cmd): | |
2941 | """ | |
2942 | % "reg-name" | |
2943 | """ | |
2944 | name = cmd[1:] | |
2945 | name = self.regmap.feName2beName(name) | |
2946 | tid = self.lastTid | |
2947 | if name == '': | |
2948 | sys.stderr.out("register %s unimplemented\n") | |
2949 | else: | |
2950 | print name | |
2951 | newCmd = '%s.s[%d].%s' % (self.riesReposit.topName,tid,name) | |
2952 | #sys.stderr.write('DBX: lastTid=%d newCmd=%s\n' % (self.lastTid, newCmd)) #DBX | |
2953 | return newCmd | |
2954 | ||
2955 | ||
2956 | def handleStep (self, cmd): | |
2957 | """ ssi cN, ssi sN, ssi lNN | |
2958 | """ | |
2959 | bpCmd = None | |
2960 | tokens = cmd.split() | |
2961 | if tokens[1].startswith('s'): | |
2962 | self.stepOverPreviousHit() | |
2963 | # every strand executes one instr in round-robin fashion, until | |
2964 | # every strand has executed N instrs. | |
2965 | count = int(tokens[1][1:]) | |
2966 | done = 0 | |
2967 | i = 0 | |
2968 | while done == 0 and i < count: | |
2969 | j = 0 | |
2970 | while done == 0 and j < self.nstrandObjs: | |
2971 | if self.thdEnable[j] == 1: | |
2972 | bid = self.riesReposit.strands[j].step() | |
2973 | if (bid > 0): | |
2974 | # hit a breakpoint | |
2975 | #self.lastTid = j | |
2976 | #self.handlePselect('pselect th%d' % j) | |
2977 | bpCmd = self.showBreakpoint(j, bid) | |
2978 | done = 1 | |
2979 | else: | |
2980 | self.instrCount[j] += 1 | |
2981 | #self.lastTid = j | |
2982 | j += 1 | |
2983 | i += 1 | |
2984 | return bpCmd | |
2985 | ||
2986 | elif tokens[1].startswith('c'): | |
2987 | self.stepOverPreviousHit() | |
2988 | # strand 0 in each core executes one instr in round-robin | |
2989 | # fashion, until every strand 0 has executed N instrs. | |
2990 | count = int(tokens[1][1:]) | |
2991 | done = 0 | |
2992 | i = 0 | |
2993 | while done == 0 and i < count: | |
2994 | j = 0 | |
2995 | while done == 0 and j < self.nstrandObjs: | |
2996 | if self.thdEnable[j] == 1: | |
2997 | bid = self.riesReposit.strands[j].step() | |
2998 | if (bid > 0): | |
2999 | # hit a breakpoint | |
3000 | #self.lastTid = j | |
3001 | #self.handlePselect('pselect th%d' % j) | |
3002 | bpCmd = self.showBreakpoint(j, bid) | |
3003 | done = 1 | |
3004 | else: | |
3005 | self.instrCount[j] += 1 | |
3006 | #self.lastTid = j | |
3007 | j += self.nstrands | |
3008 | i += 1 | |
3009 | return bpCmd | |
3010 | ||
3011 | elif tokens[1].startswith('l'): | |
3012 | tid = int(tokens[1][1:]) | |
3013 | if tid < self.nstrandObjs: | |
3014 | j = tid | |
3015 | if self.thdEnable[j] == 1: | |
3016 | bid = self.riesReposit.strands[j].step() | |
3017 | if (bid > 0): | |
3018 | # hit a breakpoint | |
3019 | #self.lastTid = j | |
3020 | #self.handlePselect('pselect th%d' % j) | |
3021 | bpCmd = self.showBreakpoint(j, bid) | |
3022 | done = 1 | |
3023 | else: | |
3024 | self.instrCount[j] += 1 | |
3025 | #self.lastTid = j | |
3026 | ||
3027 | return bpCmd | |
3028 | ||
3029 | # no longer used | |
3030 | # def showLastInstr (self, tid, thd, pc): no longer used | |
3031 | # no longer used | |
3032 | ||
3033 | ||
3034 | def handlePregs (self, cmd): | |
3035 | """ | |
3036 | <processor>.pregs [-all] | |
3037 | pregs ["cpu-name"] [-all] | |
3038 | ||
3039 | pregs, thNN.pregs | |
3040 | """ | |
3041 | tokens = cmd.split() | |
3042 | if cmd.startswith(CMD_pregs): | |
3043 | if len(tokens) > 1: | |
3044 | if tokens[1].startswith(NAME_processor): | |
3045 | tid = int(tokens[1][len(NAME_processor):]) | |
3046 | else: | |
3047 | tid = self.lastTid | |
3048 | ## sys.stderr.write('ERROR: wrong command argument, enter tid as thN\n') | |
3049 | ## return None | |
3050 | else: | |
3051 | tid = self.lastTid | |
3052 | else: | |
3053 | i = cmd.find('.pregs') | |
3054 | tid = int(cmd[len(NAME_processor):i]) | |
3055 | ||
3056 | all = '' | |
3057 | if cmd.find(' -all') > -1: | |
3058 | all = '-all' | |
3059 | ||
3060 | RS_print_archregs(tid, all) | |
3061 | ||
3062 | ||
3063 | def handleFpregs (self, cmd): | |
3064 | """ | |
3065 | <processor>.fpregs | |
3066 | fpregs ["cpu-name"] | |
3067 | ||
3068 | fpregs, thNN.fpregs | |
3069 | """ | |
3070 | tokens = cmd.split() | |
3071 | if cmd.startswith(CMD_fpregs): | |
3072 | if len(tokens) > 1: | |
3073 | if tokens[1].startswith(NAME_processor): | |
3074 | tid = int(tokens[1][len(NAME_processor):]) | |
3075 | else: | |
3076 | sys.stderr.write('ERROR: wrong command argument, enter tid as thN\n') | |
3077 | return | |
3078 | else: | |
3079 | tid = self.lastTid | |
3080 | else: | |
3081 | i = cmd.find('.fpregs') | |
3082 | tid = int(cmd[len(NAME_processor):i]) | |
3083 | sys.stderr.write('Strand %d\n' % (tid,)) | |
3084 | RS_print_fpregs(tid) | |
3085 | ||
3086 | ||
3087 | def handleMmu (self, cmd): | |
3088 | """ | |
3089 | <swerver-thread-mmu>.regs | |
3090 | """ | |
3091 | i = cmd.find('.regs') | |
3092 | tid = int(cmd[len(NAME_swerver_thread_mmu):i]) | |
3093 | print RS_print_mmuregs(tid) | |
3094 | ||
3095 | ||
3096 | def handleMmuregs (self, cmd): | |
3097 | """ | |
3098 | <processor>.mmuregs | |
3099 | mmuregs ["cpu-name"] | |
3100 | ||
3101 | mmuregs, thNN.mmuregs | |
3102 | """ | |
3103 | tokens = cmd.split() | |
3104 | if cmd.startswith(CMD_mmuregs): | |
3105 | if len(tokens) > 1: | |
3106 | if tokens[1].startswith(NAME_processor): | |
3107 | tid = int(tokens[1][len(NAME_processor):]) | |
3108 | else: | |
3109 | sys.stderr.write('ERROR: wrong command syntax\n') | |
3110 | return | |
3111 | else: | |
3112 | tid = self.lastTid | |
3113 | else: | |
3114 | i = cmd.find('.mmuregs') | |
3115 | tid = int(cmd[len(NAME_processor):i]) | |
3116 | ||
3117 | if tid >= self.nstrandObjs: | |
3118 | sys.stderr.write('ERRORL tid out of bound\n') | |
3119 | return | |
3120 | print RS_print_mmuregs(tid) | |
3121 | ||
3122 | ||
3123 | def handleCmpregs (self, cmd): | |
3124 | """ | |
3125 | <processor>.cmpregs | |
3126 | cmpregs ["cpu-name"] | |
3127 | ||
3128 | cmpregs, thNN.cmpregs | |
3129 | """ | |
3130 | tokens = cmd.split() | |
3131 | if cmd.startswith(CMD_cmpregs): | |
3132 | if len(tokens) > 1: | |
3133 | if tokens[1].startswith(NAME_processor): | |
3134 | tid = int(tokens[1][len(NAME_processor):]) | |
3135 | else: | |
3136 | sys.stderr.write('ERROR: wrong command syntax\n') | |
3137 | return | |
3138 | else: | |
3139 | tid = self.lastTid | |
3140 | else: | |
3141 | i = cmd.find('.cmpregs') | |
3142 | tid = int(cmd[len(NAME_processor):i]) | |
3143 | ||
3144 | if tid >= self.nstrandObjs: | |
3145 | sys.stderr.write('ERRORL tid out of bound\n') | |
3146 | return | |
3147 | print RS_print_cmpregs(tid) | |
3148 | ||
3149 | ||
3150 | def handleTLB (self, cmd): | |
3151 | """ | |
3152 | <swerver-proc-mmu>.d-tlb | |
3153 | <swerver-proc-mmu>.i-tlb | |
3154 | <swerver-proc-mmu>.i-tlb-entry idx | |
3155 | ||
3156 | swmmuN.i-tlb, swmmuN.d-tlb, N is strand-id | |
3157 | """ | |
3158 | if cmd.find(CMD_swerver_proc_mmu_i_tlb_entry) > -1: | |
3159 | raise RuntimeError | |
3160 | ||
3161 | index = cmd.find('.i-tlb') | |
3162 | if index > -1: | |
3163 | tid = int(cmd[len(NAME_swerver_proc_mmu):index]) | |
3164 | newCmd = 'print RS_dump_tlb(%d, 1, 1)' % (tid) | |
3165 | else: | |
3166 | index = cmd.find('.d-tlb') | |
3167 | if index > -1: | |
3168 | tid = int(cmd[len(NAME_swerver_proc_mmu):index]) | |
3169 | newCmd = 'print RS_dump_tlb(%d, 0, 1)' % (tid) | |
3170 | else: | |
3171 | # not an expected syntax, return to interpreter | |
3172 | raise RuntimeError | |
3173 | ||
3174 | return newCmd | |
3175 | ||
3176 | ||
3177 | def handleBreak (self, cmd): | |
3178 | """ | |
3179 | <breakpoint>.break address [length] [-r] [-w] [-x] | |
3180 | <breakpoint>.tbreak address [length] [-r] [-w] [-x] | |
3181 | break address [length] [-r] [-w] [-x] | |
3182 | ||
3183 | break v:0xaddr | |
3184 | break p:0xaddr | |
3185 | break symbol | |
3186 | ||
3187 | currently we support: (4/13/05) | |
3188 | break [0x]pc [sid] [{cmd;cmd;cmd}] | |
3189 | break v:[0x]vaddr [sid] [{cmd;cmd;cmd}] | |
3190 | break p:[0x]paddr [sid] [{cmd;cmd;cmd}] | |
3191 | break &symbol [sid] [{cmd;cmd;cmd}] | |
3192 | """ | |
3193 | # TODO we don't handle <breakpoint>.break, <breakpoint>.tbreak | |
3194 | # TODO we don't handle [length] [-r] [-w] [-x] | |
3195 | if not cmd.startswith(CMD_breakpoint_break): | |
3196 | raise RuntimeError | |
3197 | ||
3198 | # 'break' by itself is a python keyword, cannot use it alone for | |
3199 | # displaying the list of breakpoints, use enable|disable for that | |
3200 | tokens = cmd.split() | |
3201 | if len(tokens) >= 2: | |
3202 | if len(tokens) >= 3 and not tokens[2].startswith('{'): | |
3203 | # breakpoint ona specific strand | |
3204 | sid = int(tokens[2]) | |
3205 | else: | |
3206 | # breakpoint on all strands | |
3207 | sid = -1 | |
3208 | if tokens[1].startswith('&'): | |
3209 | # symbol is used, it is considered a vaddr for PC breakpoint | |
3210 | try: | |
3211 | if self.riesReposit.symTable: | |
3212 | va = self.riesReposit.symTable.symbol2va(tokens[1][1:]) | |
3213 | if va >= 0: | |
3214 | self.setBpoint(va, sid, cmd, 'PC') | |
3215 | else: | |
3216 | sys.stderr.write('WARNING: break: symbol %s not found\n' % (tokens[1][1:])) | |
3217 | return None | |
3218 | else: | |
3219 | sys.stderr.write('WARNING: break: symbol table is not available\n') | |
3220 | return None | |
3221 | except Exception, ex: | |
3222 | self.wrongSyntax('1 %s, ex=%s' % (cmd, ex)) | |
3223 | return None | |
3224 | else: | |
3225 | # if not symbol, then the value must be in hex format, | |
3226 | # with or without 0x | |
3227 | try: | |
3228 | if tokens[1].startswith('v:'): | |
3229 | addr = long(tokens[1][2:], 16) | |
3230 | self.setBpoint(addr, sid, cmd, 'VA') | |
3231 | elif tokens[1].startswith('p:'): | |
3232 | addr = long(tokens[1][2:], 16) | |
3233 | self.setBpoint(addr, sid, cmd, 'PA') | |
3234 | else: | |
3235 | addr = long(tokens[1], 16) | |
3236 | self.setBpoint(addr, sid, cmd, 'PC') | |
3237 | except Exception, ex: | |
3238 | self.wrongSyntax('2 %s, ex=%s' % (cmd, ex)) | |
3239 | return None | |
3240 | else: | |
3241 | self.wrongSyntax('3 %s' % (cmd)) | |
3242 | return None | |
3243 | ||
3244 | return None | |
3245 | ||
3246 | ||
3247 | def setBpoint (self, addr, sid, cmd, type): | |
3248 | """ | |
3249 | """ | |
3250 | ## if self.riesReposit.running == 1: | |
3251 | ## sys.stderr.write('Simulator is running, issue "stop" before adding breakpoint\n') | |
3252 | ## return | |
3253 | if addr % 4 != 0: | |
3254 | sys.stderr.write('ERROR: unaligned address\n') | |
3255 | return | |
3256 | ||
3257 | # right now we only support interval=1 | |
3258 | if type == 'PC': | |
3259 | if sid == -1: | |
3260 | for ss in self.riesReposit.riesling.s: | |
3261 | bid = ss.brk.on_inst_va(addr) | |
3262 | sys.stderr.write('%s breakpoint id=%d at %s=%#x\n' % (ss.ref, bid, type, addr)) | |
3263 | else: | |
3264 | try: | |
3265 | ss = self.riesReposit.riesling.s[sid] | |
3266 | bid = ss.brk.on_inst_va(addr) | |
3267 | sys.stderr.write('%s breakpoint id=%d at %s=%#x\n' % (ss.ref, bid, type, addr)) | |
3268 | except: | |
3269 | sys.stderr.write('Breakpoin on wrong strand-id %d\n' % (sid)) | |
3270 | else: | |
3271 | sys.stderr.write('Breakpoint on type %s not supported\n' % type) | |
3272 | ||
3273 | ## if self.riesReposit.symTable: | |
3274 | ## if type == 'PC': | |
3275 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), 1, self.riesReposit.symTable.va2symbol(addr), BP_PC) | |
3276 | ## elif type == 'VA': | |
3277 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), 1, self.riesReposit.symTable.va2symbol(addr), BP_VA) | |
3278 | ## else: | |
3279 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), 1, self.riesReposit.symTable.pa2symbol(addr), BP_PA) | |
3280 | ||
3281 | ## else: | |
3282 | ## if type == 'PC': | |
3283 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), int(1), '', BP_PC) | |
3284 | ## elif type == 'VA': | |
3285 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), 1, '', BP_VA) | |
3286 | ## else: | |
3287 | ## bid = self.riesReposit.riesling.bp_table.add(sid, long(addr), 1, '', BP_PA) | |
3288 | ||
3289 | ## self.bpoint[bid] = BreakPoint(bid, sid, addr, cmd, type) | |
3290 | ## sys.stderr.write('Break id: %d at %#x\n' % (bid, addr)) | |
3291 | ## self.nextBpoint = bid + 1 | |
3292 | ||
3293 | ||
3294 | def handleDelete (self, cmd): | |
3295 | """ | |
3296 | delete (-all|id) | |
3297 | """ | |
3298 | if self.riesReposit.running == 1: | |
3299 | sys.stderr.write('Simulator is running, issue "stop" before deleting breakpoint\n') | |
3300 | return | |
3301 | ||
3302 | cmd = cmd.replace(',',' ') | |
3303 | tokens = cmd.split() | |
3304 | if tokens[1] == '-all': | |
3305 | # delete all | |
3306 | for ss in self.riesReposit.riesling.s: | |
3307 | keys = ss.brk.keys() | |
3308 | for key in keys: | |
3309 | del ss.brk[key] | |
3310 | ## self.bpoint = { } | |
3311 | ## self.riesReposit.riesling.bp_table.remove(-1) | |
3312 | else: | |
3313 | i = 1 | |
3314 | while i < len(tokens): | |
3315 | bid = eval(tokens[i]) | |
3316 | ## if tokens[i].lower().startswith('0x'): | |
3317 | ## bid = long(tokens[i],16) | |
3318 | ## else: | |
3319 | ## bid = long(tokens[i]) | |
3320 | found = 0 | |
3321 | for ss in self.riesReposit.riesling.s: | |
3322 | try: | |
3323 | del ss.brk[bid] | |
3324 | found = 1 | |
3325 | break | |
3326 | except: | |
3327 | pass | |
3328 | if found == 0: | |
3329 | sys.stderr.write('Breakpoint id %d not found\n' % (bid)) | |
3330 | ## if self.bpoint.has_key(bid): | |
3331 | ## del self.bpoint[bid] | |
3332 | ## self.riesReposit.riesling.bp_table.remove(bid) | |
3333 | ## else: | |
3334 | ## sys.stderr.write('break id %d not found\n' % (bid)) | |
3335 | i += 1 | |
3336 | return None | |
3337 | ||
3338 | ||
3339 | def handleEnable (self, cmd): | |
3340 | """ | |
3341 | """ | |
3342 | return self._handleEnable(cmd, 1) | |
3343 | ||
3344 | ||
3345 | def handleDisable (self, cmd): | |
3346 | """ | |
3347 | """ | |
3348 | return self._handleEnable(cmd, 0) | |
3349 | ||
3350 | ||
3351 | def _handleEnable (self, cmd, enable): | |
3352 | """ | |
3353 | disable (-all|id) | |
3354 | enable (-all|id) | |
3355 | """ | |
3356 | ## if self.riesReposit.running == 1: | |
3357 | ## sys.stderr.write('Simulator is running, issue "stop" before enabling/disabling breakpoint\n') | |
3358 | ## return | |
3359 | ||
3360 | cmd = cmd.replace(',',' ') | |
3361 | tokens = cmd.split() | |
3362 | if len(tokens) == 1: | |
3363 | # display all breakpoints, regardless it is enabled or not | |
3364 | self.handleListBreak(cmd) | |
3365 | #sys.stdout.write('%s\n' % (self.riesReposit.riesling.bp_table.list())) | |
3366 | ##########DBX | |
3367 | ## print 'DBX: DBX DBX DBX' #DBX | |
3368 | ## klist = self.bpoint.keys() | |
3369 | ## klist.sort() | |
3370 | ## for bid in klist: | |
3371 | ## if self.bpoint[bid].enable == enable: | |
3372 | ## sys.stdout.write('%s\n' % (self.bpoint[bid])) | |
3373 | ##########DBX | |
3374 | elif tokens[1] == '-all': | |
3375 | # enable/disable all | |
3376 | if enable == 1: | |
3377 | for ss in self.riesReposit.riesling.s: | |
3378 | for key in ss.brk.keys(): | |
3379 | ss.brk[key].enable() | |
3380 | #self.riesReposit.riesling.bp_table.enable(-1) | |
3381 | else: | |
3382 | for ss in self.riesReposit.riesling.s: | |
3383 | for key in ss.brk.keys(): | |
3384 | ss.brk[key].disable() | |
3385 | #self.riesReposit.riesling.bp_table.disable(-1) | |
3386 | ## # even though we no longer rely on the frontend bpoint[] for | |
3387 | ## # everthing, it is good to keep it updated | |
3388 | ## for bid in self.bpoint.keys(): | |
3389 | ## self.bpoint[bid].enable = enable | |
3390 | ## self.bpoint[bid].hitCount = 0 | |
3391 | ## self.bpoint[bid].justHit = 0 | |
3392 | else: | |
3393 | i = 1 | |
3394 | while i < len(tokens): | |
3395 | bid = eval(tokens[i]) | |
3396 | ## if tokens[i].lower().startswith('0x'): | |
3397 | ## bid = long(tokens[i],16) | |
3398 | ## else: | |
3399 | ## bid = long(tokens[i]) | |
3400 | found = 0 | |
3401 | for ss in self.riesReposit.riesling.s: | |
3402 | try: | |
3403 | if enable == 1: | |
3404 | ss.brk[bid].enable() | |
3405 | else: | |
3406 | ss.brk[bid].disable() | |
3407 | found = 1 | |
3408 | break | |
3409 | except: | |
3410 | pass | |
3411 | if found == 0: | |
3412 | sys.stderr.write('Breakpoint id %d not found\n' % (bid,)) | |
3413 | ## if self.bpoint.has_key(bid): | |
3414 | ## if enable == 1: | |
3415 | ## self.riesReposit.riesling.bp_table.enable(bid) | |
3416 | ## else: | |
3417 | ## self.riesReposit.riesling.bp_table.disable(bid) | |
3418 | ## # ditto, keep it updated | |
3419 | ## self.bpoint[bid].enable = enable | |
3420 | ## self.bpoint[bid].hitCount = 0 | |
3421 | ## self.bpoint[bid].justHit = 0 | |
3422 | ## else: | |
3423 | ## sys.stderr.write('break id %d not found\n' % (bid,)) | |
3424 | i += 1 | |
3425 | ||
3426 | return None | |
3427 | ||
3428 | ||
3429 | def handlePenable (self, cmd): | |
3430 | """ | |
3431 | """ | |
3432 | return self._handlePenable(cmd, 1) | |
3433 | ||
3434 | ||
3435 | def handlePdisable (self, cmd): | |
3436 | """ | |
3437 | """ | |
3438 | return self._handlePenable(cmd, 0) | |
3439 | ||
3440 | # XXX XXX XXX | |
3441 | def _handlePenable (self, cmd, enable): | |
3442 | """ | |
3443 | <processor>.disable | |
3444 | <processor>.enable | |
3445 | pdisable [("cpu-name"|-all)] | |
3446 | penable [("cpu-name"|-all|0x3210)] | |
3447 | """ | |
3448 | #sys.stderr.write('DBX: handlePenable(): cmd=%s enable=%d\n' % (cmd, enable)) #DBX | |
3449 | ||
3450 | if self.riesReposit.optdir['--ar'] == 'n1': | |
3451 | sys.stderr.write('no enable/disable support for n1\n') | |
3452 | return '' | |
3453 | ||
3454 | ||
3455 | if cmd.startswith(NAME_processor): | |
3456 | i = cmd.find('.') | |
3457 | tid = long(cmd[len(NAME_processor):i]) | |
3458 | #TODO this part never get called, somehow re cannot match | |
3459 | # thN.penable, thN.pdisable. 5/25/05 | |
3460 | #---> it works, 11/11/05 | |
3461 | if tid < self.nstrandObjs: | |
3462 | if enable: | |
3463 | newRunning = long(1L<<(tid%self.cpusize)) | self.riesReposit.strands[tid].rdasi(0x41, 0x50L) | |
3464 | else: | |
3465 | newRunning = ~long(1L<<(tid%self.cpusize)) & self.riesReposit.strands[tid].rdasi(0x41, 0x50L) | |
3466 | self.riesReposit.strands[tid].wrasi(0x41, 0x50L, newRunning) | |
3467 | else: | |
3468 | sys.stderr.write('ERROR: strand-id %d out of range\n' % (tid)) | |
3469 | else: | |
3470 | tokens = cmd.lower().split() | |
3471 | if len(tokens) == 1: | |
3472 | # list penable/pdisable | |
3473 | for ii in range(self.riesReposit.ncpus): | |
3474 | running = self.riesReposit.strands[ii*self.cpusize].rdasi(0x41, 0x50L) | |
3475 | i = 0 | |
3476 | while i < self.cpusize: | |
3477 | if ((running >> i) & 0x1L): | |
3478 | sys.stdout.write('strand%d enabled\n' % (i+(ii*self.cpusize))) | |
3479 | i += 1 | |
3480 | elif tokens[1] == '-all': | |
3481 | for ii in range(self.riesReposit.ncpus): | |
3482 | if enable: | |
3483 | # enable all, asiWrite will mask the value with core_avail | |
3484 | self.riesReposit.strands[ii*self.cpusize].wrasi(0x41, 0x50L, 0xffffffffffffffffL) | |
3485 | else: | |
3486 | # disable all, asiWrite will make sure one strand remains | |
3487 | # enabled. | |
3488 | self.riesReposit.strands[ii*self.cpusize].wrasi(0x41, 0x50L, 0x0L) | |
3489 | elif tokens[1].startswith('-mask='): | |
3490 | # make sure we don't replace 0x with 00 | |
3491 | ii = tokens[1].find(':') | |
3492 | if ii > -1: | |
3493 | # -mask=0:1234, -mask=0:0x1234 | |
3494 | jj = tokens[1].find('-mask=') | |
3495 | cpuid = int(tokens[1][jj+len('-mask='):ii]) | |
3496 | if cpuid+1 > self.ncpus: | |
3497 | sys.stderr.write('ERROR: cpuid %d out of range\n' % (cpuid)) | |
3498 | return None | |
3499 | else: | |
3500 | headStrand = cpuid * self.cpusize | |
3501 | if tokens[1][ii+1:].startswith('0x'): | |
3502 | mask = long(tokens[1][ii+3:].replace('x','0'),16) | |
3503 | else: | |
3504 | mask = long(tokens[1][ii+1:].replace('x','0'),16) | |
3505 | else: | |
3506 | # -mask=1234, -mask=0x1234, default to cpu0 | |
3507 | headStrand = 0 | |
3508 | if tokens[1].startswith('-mask=0x'): | |
3509 | mask = long(tokens[1][len('-mask=0x'):].replace('x','0'),16) | |
3510 | else: | |
3511 | mask = long(tokens[1][len('-mask='):].replace('x','0'),16) | |
3512 | if not enable: | |
3513 | mask = 0xffffffffffffffffL ^ mask | |
3514 | self.riesReposit.strands[headStrand].wrasi(0x41, 0x50L, mask) | |
3515 | elif tokens[1].startswith(NAME_processor): | |
3516 | # thN | |
3517 | tid = int(tokens[1][len(NAME_processor):]) | |
3518 | if tid < self.nstrandObjs: | |
3519 | if enable: | |
3520 | newRunning = long(1L<<(tid%self.cpusize)) | self.riesReposit.strands[tid].rdasi(0x41, 0x50L) | |
3521 | else: | |
3522 | newRunning = ~long(1L<<(tid%self.cpusize)) & self.riesReposit.strands[tid].rdasi(0x41, 0x50L) | |
3523 | self.riesReposit.strands[tid].wrasi(0x41, 0x50L, newRunning) | |
3524 | else: | |
3525 | sys.stderr.write('ERROR: strand-id %d out of range\n' % (tid)) | |
3526 | else: | |
3527 | ii = tokens[1].find(':') | |
3528 | if ii > -1: | |
3529 | # 0:1234, 0:0x1234 | |
3530 | cpuid = int(tokens[1][:ii]) | |
3531 | if cpuid+1 > self.ncpus: | |
3532 | sys.stderr.write('ERROR: cpuid %d out of range\n' % (cpuid)) | |
3533 | return None | |
3534 | headStrand = cpuid * self.cpusize | |
3535 | if tokens[1][ii+1:].lower().startswith('0x'): | |
3536 | mask = long(tokens[1][ii+3:],16) | |
3537 | else: | |
3538 | mask = long(tokens[1][ii+1:],16) | |
3539 | else: | |
3540 | # 1234, 0x1234 | |
3541 | headStrand = 0 | |
3542 | if tokens[1].lower().startswith('0x'): | |
3543 | mask = long(tokens[1][2:],16) | |
3544 | else: | |
3545 | mask = long(tokens[1],16) | |
3546 | ||
3547 | if not enable: | |
3548 | mask = 0xffffffffffffffffL ^ mask | |
3549 | self.riesReposit.strands[headStrand].wrasi(0x41, 0x50L, mask) | |
3550 | ||
3551 | return None | |
3552 | ||
3553 | ||
3554 | def handleRun (self, cmd): | |
3555 | """ | |
3556 | run [count] [strand-id] | |
3557 | """ | |
3558 | bpCmd = None | |
3559 | tokens = cmd.split() | |
3560 | if len(tokens) == 1: | |
3561 | # no #instr is specified, use max | |
3562 | ninstr = sys.maxint | |
3563 | else: | |
3564 | # run #instr | |
3565 | ninstr = int(tokens[1]) | |
3566 | ||
3567 | theTid = -1 | |
3568 | if len(tokens) >= 3: | |
3569 | # run on a particular strand only, otherwise round-rabin all | |
3570 | # strands (theTid == -1) | |
3571 | theTid = int(tokens[2]) | |
3572 | ||
3573 | if (theTid == -1): | |
3574 | self.stepOverPreviousHit() | |
3575 | tid = 0 | |
3576 | else: | |
3577 | tid = theTid | |
3578 | count = 0 | |
3579 | done = 0 | |
3580 | while (done == 0) and (count < ninstr): | |
3581 | doneOne = 0 | |
3582 | while (tid < self.nstrandObjs) and (doneOne == 0): | |
3583 | if self.thdEnable[tid] == 1: | |
3584 | bid = self.riesReposit.strands[tid].step() | |
3585 | if (bid > 0): | |
3586 | # hit a breakpoint | |
3587 | #self.lastTid = tid | |
3588 | #self.handlePselect('pselect th%d' % tid) | |
3589 | bpCmd = self.showBreakpoint(tid, bid) | |
3590 | done = 1 | |
3591 | doneOne = 1 | |
3592 | else: | |
3593 | self.instrCount[tid] += 1 | |
3594 | #self.lastTid = tid | |
3595 | ||
3596 | if (theTid == -1): | |
3597 | tid += 1 | |
3598 | else: | |
3599 | # only run on a particular strand, cut short of inner | |
3600 | # while loop | |
3601 | doneOne = 1 | |
3602 | ||
3603 | # out of inner while | |
3604 | if (theTid == -1): | |
3605 | tid = 0 | |
3606 | count += 1 | |
3607 | ||
3608 | return bpCmd | |
3609 | ||
3610 | ||
3611 | def handleRunfast (self, cmd): | |
3612 | """ | |
3613 | runfast [count] [strand-id] | |
3614 | ||
3615 | the difference between run and runfast is that with runfast, each | |
3616 | strand will execute the specified number of instructions before pass | |
3617 | the control to the next strand, unless a breakpoint is hit. 'run' will | |
3618 | have each strand run one instruciton at a time, in a round-rabin order, | |
3619 | until every strand has executed the specified number of instructions, | |
3620 | or until a breakpoint is hit. | |
3621 | ===> this function is no longer advertised | |
3622 | """ | |
3623 | bpCmd = None | |
3624 | tokens = cmd.split() | |
3625 | if (len(tokens) == 1): | |
3626 | # no #instr is specified, use 1, as control will not return | |
3627 | # until the specified number instructions have been executed, | |
3628 | # use sys.maxint here will send the execution into an endless loop | |
3629 | # ---> we have breakpoint in strand now, so treat it the same as | |
3630 | # run, which uses sys.maxint | |
3631 | ninstr = sys.maxint | |
3632 | else: | |
3633 | # run #instr | |
3634 | ninstr = int(tokens[1]) | |
3635 | ||
3636 | tid = -1 | |
3637 | if (len(tokens) >= 3): | |
3638 | # run on a particular strand only, otherwise round-rabin all | |
3639 | # strands (tid == -1), but each strand runs the specified number | |
3640 | # of instructions before passes the control to the next strand, | |
3641 | # which is different to run, where each strand run one instruciton | |
3642 | # at a time. | |
3643 | tid = int(tokens[2]) | |
3644 | ||
3645 | if (tid == -1): | |
3646 | self.stepOverPreviousHit() | |
3647 | i = 0 | |
3648 | done = 0 | |
3649 | while (done == 0 and i < self.nstrandObjs): | |
3650 | if (self.thdEnable[i] == 1): | |
3651 | bid = self.riesReposit.strands[i].step(ninstr) | |
3652 | if (bid > 0): | |
3653 | # hit a breakpoint, but we don't know how many | |
3654 | # instructions have been executed before the breakpoint | |
3655 | #self.lastTid = i | |
3656 | #self.handlePselect('pselect th%d' % i) | |
3657 | bpCmd = self.showBreakpoint(i, bid) | |
3658 | done = 1 | |
3659 | else: | |
3660 | self.instrCount[i] += ninstr | |
3661 | #self.lastTid = i | |
3662 | i += 1 | |
3663 | else: | |
3664 | if (self.thdEnable[tid] == 1): | |
3665 | bid = self.riesReposit.strands[tid].step(ninstr) | |
3666 | if (bid > 0): | |
3667 | # hit a breakpoint, but we don't know how many | |
3668 | # instructions have been executed before the breakpoint | |
3669 | #self.lastTid = tid | |
3670 | #self.handlePselect('pselect th%d' % tid) | |
3671 | bpCmd = self.showBreakpoint(tid, bid) | |
3672 | done = 1 | |
3673 | else: | |
3674 | self.instrCount[tid] += ninstr | |
3675 | #self.lastTid = tid | |
3676 | ||
3677 | return bpCmd | |
3678 | ||
3679 | ||
3680 | def handleWhatis (self, cmd): | |
3681 | """ | |
3682 | whatis va | |
3683 | """ | |
3684 | tokens = cmd.split() | |
3685 | va = 1 | |
3686 | if (len(tokens) == 1): | |
3687 | addr = 0 | |
3688 | else: | |
3689 | if tokens[1].startswith('p:'): | |
3690 | addr = tokens[1][2:] | |
3691 | va = 0 | |
3692 | else: | |
3693 | addr = tokens[1] | |
3694 | ||
3695 | if self.riesReposit.symTable: | |
3696 | #print 'addr=%s va=' % (addr, va) | |
3697 | if va == 1: | |
3698 | print '%s' % self.riesReposit.symTable.va2symbol(addr) | |
3699 | else: | |
3700 | print '%s' % self.riesReposit.symTable.pa2symbol(addr) | |
3701 | else: | |
3702 | print 'No symbol table is available' | |
3703 | ||
3704 | return None | |
3705 | ||
3706 | # no longer used | |
3707 | # def hitBreakpoint (self, tid, thd): no longer used | |
3708 | # no longer used | |
3709 | ||
3710 | def showBreakpoint (self, tid, bid): | |
3711 | """ | |
3712 | """ | |
3713 | #sys.stderr.write('DBX: showBreakpoint: strand-is=%d bpoint-id=%d\n' % (tid, bid)) #DBX | |
3714 | # a breakpoint is hit, switch command prompt to that strand, and set | |
3715 | # state in 'stop' | |
3716 | while tid < 0: | |
3717 | # maybe riesling backend does not complete the update of sid yet, | |
3718 | # wait for it. | |
3719 | #tid = self.riesReposit.riesling.getBreakpointTablePtr().queryLastSid() | |
3720 | tid = self.riesReposit.riesling.bp_table.hit_strand() | |
3721 | self.handlePselect('pselect th%d' % tid) | |
3722 | self.riesReposit.running = 0 | |
3723 | ||
3724 | #thd = self.mapThdid(tid) | |
3725 | #newCmd = '%s.getArchStatePtr().getPc()' % (thd) | |
3726 | #pc = eval(newCmd, self.riesReposit.globals) | |
3727 | #symbol = self.riesReposit.symTable.va2symbol(pc) | |
3728 | ||
3729 | # let instrCount includes the instruction supposed to be executed, | |
3730 | # but didn't because of the breakpoint | |
3731 | #sys.stdout.write('breakpoint %d: T%d, ic=%d, pc=<%s>\n' % (bid, tid, self.instrCount[tid]+1, symbol)) | |
3732 | # ---> ic won't be accurate when runfast is used, so might as well not | |
3733 | # showing it. | |
3734 | # ---> move the display to riesling backend, so that a basic breakpoint | |
3735 | # info is displayed there. | |
3736 | #sys.stdout.write('Hit breakpoint %d: T%d, pc=<%s>\n' % (bid, tid, symbol)) | |
3737 | ||
3738 | # take action(s) associated with the breakpoint | |
3739 | if self.bpoint[bid].action != None and len(self.bpoint[bid].action) > 0: | |
3740 | # if 'run' or 'step' is part of a breakpoint's action, we can | |
3741 | # get into a recursive call-chain, when hitting the breakpoint | |
3742 | # triggers the 'run' (or 'step'), which in turns hits the same | |
3743 | # breakpoint, and on and on, ... | |
3744 | BP_ACTION = '.breakpoint_action' | |
3745 | fd = open(BP_ACTION, 'w') | |
3746 | for action in self.bpoint[bid].action: | |
3747 | fd.write('%s\n' % action) | |
3748 | fd.close() | |
3749 | newCmd = 'execfile("%s")' % BP_ACTION | |
3750 | else: | |
3751 | newCmd = None | |
3752 | ||
3753 | return newCmd | |
3754 | ||
3755 | # we check for breakpoint hit before the instruction is fetched, | |
3756 | # so we don't have the instruction word yet. | |
3757 | #newCmd = '%s.lastInstr()' % (thd) | |
3758 | #lastInstr = eval(newCmd, self.riesReposit.globals) | |
3759 | #newCmd = '%s.lastInstrToString()' % (thd) | |
3760 | #lastInstrCode = eval(newCmd, self.riesReposit.globals) | |
3761 | ##sys.stdout.write('breakpoint: T%d, ic=%d, pc=<v:%#016x>[%s] [%08x] %s\n' % (tid, self.instrCount[tid], pc, symbol, lastInstr, lastInstrCode)) | |
3762 | #sys.stdout.write('breakpoint: T%d, ic=%d, pc=<%s> [%08x] %s\n' % (tid, self.instrCount[tid], symbol, lastInstr, lastInstrCode)) | |
3763 | ||
3764 | ||
3765 | def stepOverPreviousHit (self): | |
3766 | """ | |
3767 | every time before we step, we reset breakpoint hit status so | |
3768 | that we won't hit the same point twice in a row. If T1 hits a | |
3769 | breakpoint, then in the next step/run command T0 is executed first | |
3770 | T0 will reset the breakpoint hit status, so when T1 is to execute | |
3771 | again, it can hit the same breakpoint, which is not desirable, so we | |
3772 | want step over that first. If user chooses to step/run a particular | |
3773 | strand after a breakpoint hit, then we don't execute the function | |
3774 | first, even if that means T1 in the above example will hit the same | |
3775 | breakpoint twice in a row. One problem with this function is that | |
3776 | the strand which hit a breakpoint in the previous step/run will execute | |
3777 | one extra instruction than user specified. | |
3778 | """ | |
3779 | sid = self.riesReposit.riesling.bp_table.last_hit_strand() | |
3780 | if ((sid >= 0) and (self.thdEnable[sid] == 1)): | |
3781 | self.riesReposit.strands[sid].step() | |
3782 | self.instrCount[sid] += 1 | |
3783 | ||
3784 | ||
3785 | def handleAlias (self, cmd): | |
3786 | """alias | |
3787 | alias zzz z1 [z2]* | |
3788 | """ | |
3789 | tokens = cmd.split() | |
3790 | if len(tokens) == 1: | |
3791 | # list alias | |
3792 | klist = self.alias.keys() | |
3793 | klist.sort() | |
3794 | for key in klist: | |
3795 | sys.stdout.write('alias %s == %s\n' % (key, self.alias[key])) | |
3796 | elif len(tokens) >= 3: | |
3797 | # set alias | |
3798 | self.alias[tokens[1]] = ' '.join(tokens[2:]) | |
3799 | else: | |
3800 | self.wrongSyntax(cmd) | |
3801 | ||
3802 | return None | |
3803 | ||
3804 | ||
3805 | def handleUnalias (self, cmd): | |
3806 | """unalias zzz [zzz]* | |
3807 | """ | |
3808 | cmd = cmd.replace(',', ' ') | |
3809 | tokens = cmd.split() | |
3810 | if len(tokens) == 2 and tokens[1] == '-all': | |
3811 | self.alias = { } | |
3812 | else: | |
3813 | i = 1 | |
3814 | while i < len(tokens): | |
3815 | if self.alias.has_key(tokens[i]): | |
3816 | del self.alias[tokens[i]] | |
3817 | i += 1 | |
3818 | ||
3819 | return None | |
3820 | ||
3821 | ||
3822 | def handleHelp (self, cmd): | |
3823 | """ | |
3824 | """ | |
3825 | tokens = cmd.split() | |
3826 | if len(tokens) == 1: | |
3827 | # show high level help | |
3828 | self.showDoc() | |
3829 | print '\nTo use python help utility, enter help()' | |
3830 | else: | |
3831 | # get down to detail | |
3832 | if tokens[1] == 'regid' or tokens[1] == 'regname': | |
3833 | # show regid to regname mapping | |
3834 | __localMap = {} | |
3835 | for regname in self.regmap.regMap.keys(): | |
3836 | __localMap[self.regmap.regMap[regname][1]] = regname | |
3837 | for regname in self.regmap.regMapArch.keys(): | |
3838 | __localMap[self.regmap.regMapArch[regname][1]] = regname | |
3839 | keys = __localMap.keys() | |
3840 | keys.sort() | |
3841 | for key in keys: | |
3842 | print __localMap[key] + '\t\t\t\t' + str(key) | |
3843 | ||
3844 | else: | |
3845 | self.showDoc(tokens[1]) | |
3846 | ||
3847 | return None | |
3848 | ||
3849 | ||
3850 | ## def handleReset (self, cmd): | |
3851 | ## """handle system reset | |
3852 | ## syntax: reset [traptype=0x1] | |
3853 | ||
3854 | ## traptype=0x1: power_on_reset | |
3855 | ## """ | |
3856 | ## tokens = cmd.split() | |
3857 | ## traptype = 0x1 | |
3858 | ## if len(tokens) >= 2: | |
3859 | ## traptype = eval(tokens[2]) | |
3860 | ||
3861 | ## i = 0 | |
3862 | ## while i < self.nstrandObjs: | |
3863 | ## self.instrCount[i] = 0 | |
3864 | ## i += 1 | |
3865 | ||
3866 | ## RS_reset(traptype) | |
3867 | ## return None | |
3868 | ||
3869 | ## def handleReset (self, cmd): | |
3870 | ## """return every strand's pc to power-on-reset | |
3871 | ## """ | |
3872 | ## # .RED.Power_on_Reset fffffffff0000020 X fff0000020 | |
3873 | ## try: | |
3874 | ## pc = self.riesReposit.symTable.symbol2va('.RED.Power_on_Reset') | |
3875 | ## if pc == -1: | |
3876 | ## sys.stderr.write('symbol .RED.Power_on_Reset not found\n') | |
3877 | ## pc = 0xfffffffff0000020 | |
3878 | ## except: | |
3879 | ## pc = 0xfffffffff0000020 | |
3880 | ||
3881 | ## i = 0 | |
3882 | ## while i < self.nstrandObjs: | |
3883 | ## if self.thdEnable[i] == 1: | |
3884 | ## self.instrCount[i] = 0 | |
3885 | ## thd = self.mapThdid(i) | |
3886 | ## newCmd = '%s.getArchStatePtr().setPc(value=%u)' % (thd, pc) | |
3887 | ## eval(newCmd, self.riesReposit.globals) | |
3888 | ## newCmd = '%s.getArchStatePtr().setNpc(value=%u)' % (thd, pc+4) | |
3889 | ## eval(newCmd, self.riesReposit.globals) | |
3890 | ## i += 1 | |
3891 | ||
3892 | ## return None | |
3893 | ||
3894 | ||
3895 | def handleIgnore (self, cmd): | |
3896 | """ | |
3897 | ignore id num | |
3898 | sys.stderr.write('%s\n' % (newCmd,)) | |
3899 | """ | |
3900 | sys.stderr.write('"ignore" command is not supported\n') | |
3901 | return None | |
3902 | ||
3903 | tokens = cmd.split() | |
3904 | retval = self.checkArgs([tokens[1],tokens[2]]) | |
3905 | if not retval == [True,True]: | |
3906 | sys.stderr.write('ERROR: wrong i/p paramters\n') | |
3907 | return | |
3908 | id = int(tokens[1]) | |
3909 | num = int(tokens[2]) | |
3910 | if self.bpoint.has_key(id): | |
3911 | self.bpoint[id].ignore = num | |
3912 | self.bpoint[id].hitCount = 0 | |
3913 | self.bpoint[id].justHit = 0 | |
3914 | else: | |
3915 | sys.stderr.write('ERROR: Break id not found\n') | |
3916 | return None | |
3917 | ||
3918 | ||
3919 | def handleListBreak (self, cmd): | |
3920 | """ | |
3921 | list-breakpoints [-all] | |
3922 | """ | |
3923 | for ss in self.riesReposit.riesling.s: | |
3924 | if len(ss.brk): | |
3925 | print '%s: %s' % (ss.ref, ss.brk) | |
3926 | #sys.stdout.write('%s\n' % (self.riesReposit.riesling.bp_table.list())) | |
3927 | ## klist = self.bpoint.keys() | |
3928 | ## klist.sort() | |
3929 | ## for id in klist: | |
3930 | ## sys.stdout.write('%s\n' % (self.bpoint[id])) | |
3931 | ||
3932 | ||
3933 | def handlePselect (self, cmd): | |
3934 | """ | |
3935 | pselect ["cpu-name"] | |
3936 | """ | |
3937 | tokens = cmd.split() | |
3938 | if len(tokens) == 1: | |
3939 | sys.stdout.write('pselect: th%d\n' % (self.lastTid)) | |
3940 | else: | |
3941 | if tokens[1].startswith(NAME_processor): | |
3942 | tid = int(tokens[1][len(NAME_processor):]) | |
3943 | if tid < self.nstrandObjs: | |
3944 | self.lastTid = tid | |
3945 | sys.ps1 = "%s-th%d>>> " % (self.riesReposit.prompt, self.lastTid) | |
3946 | else: | |
3947 | sys.stderr.write('ERROR: tid value out of range\n') | |
3948 | else: | |
3949 | sys.stderr.write('ERROR: wrong input parameter, enter tid as thN\n') | |
3950 | ||
3951 | ||
3952 | def handleQuit (self, cmd): | |
3953 | """ | |
3954 | quit [status] | |
3955 | """ | |
3956 | tokens = cmd.split() | |
3957 | status = 0 | |
3958 | if len(tokens) > 1: | |
3959 | try: | |
3960 | status = int(tokens[1]) | |
3961 | except: | |
3962 | pass | |
3963 | ||
3964 | # if pli-socket does not present, we shouldn't make socketAPI calls | |
3965 | try: | |
3966 | self.riesReposit.socketAPI.fini() | |
3967 | except: | |
3968 | pass | |
3969 | ||
3970 | if (status == 0): | |
3971 | #sys.exit(self.riesReposit.riesling.bp_table.is_bad_trap()) | |
3972 | sys.exit(0) | |
3973 | else: | |
3974 | sys.exit(status) | |
3975 | ||
3976 | ||
3977 | def handleRunCommandFile (self, cmd): | |
3978 | """ | |
3979 | run-command-file file | |
3980 | """ | |
3981 | return self.handleRunPythonFile(cmd) | |
3982 | ||
3983 | ||
3984 | def handleRunPythonFile (self, cmd): | |
3985 | """ | |
3986 | run-python-file filename | |
3987 | """ | |
3988 | tokens = cmd.split() | |
3989 | newCmd = 'execfile("%s")' % (tokens[1]) | |
3990 | return newCmd | |
3991 | ||
3992 | ||
3993 | def handleVa2Pa (self, cmd): | |
3994 | """ | |
3995 | <processor>.logical-to-physical address | |
3996 | logical-to-physical ["cpu-name"] address | |
3997 | """ | |
3998 | tokens = cmd.split() | |
3999 | if cmd.startswith(NAME_processor): | |
4000 | i = cmd.find('.') | |
4001 | tid = int(cmd[len(NAME_processor):i]) | |
4002 | va = tokens[1] | |
4003 | else: | |
4004 | if tokens[1].startswith(NAME_processor): | |
4005 | tid = int(tokens[1][len(NAME_processor):]) | |
4006 | va = tokens[2] | |
4007 | else: | |
4008 | tid = self.lastTid | |
4009 | va = tokens[1] | |
4010 | ||
4011 | # remove leading 'v:' if any | |
4012 | if va.startswith(SYM_VA): | |
4013 | va = va[len(SYM_VA):] | |
4014 | ||
4015 | if tid >= self.nstrandObjs: | |
4016 | sys.stderr.write('ERROR: strand id out of bounds\n') | |
4017 | return '' | |
4018 | ||
4019 | (addr,type) = RS_logical_to_physical(tid, eval(va), 2) | |
4020 | print addr | |
4021 | return None | |
4022 | ||
4023 | ||
4024 | def decode_addr (self, addr): | |
4025 | """ | |
4026 | p:[0x]addr, r:[0x]addr, v:[0x]addr, [0x]addr | |
4027 | """ | |
4028 | # 0 - pa, 1 - ra, 2 - va | |
4029 | if addr.startswith(SYM_PA): | |
4030 | addr_type = AddrType.PA_TYPE | |
4031 | addr = eval(addr[len(SYM_PA):]) | |
4032 | elif addr.startswith(SYM_RA): | |
4033 | addr_type = AddrType.RA_TYPE | |
4034 | addr = eval(addr[len(SYM_RA):]) | |
4035 | elif addr.startswith(SYM_VA): | |
4036 | addr_type = AddrType.VA_TYPE | |
4037 | addr = eval(addr[len(SYM_VA):]) | |
4038 | else: | |
4039 | # default is VA | |
4040 | addr_type = AddrType.VA_TYPE | |
4041 | addr = eval(addr) | |
4042 | ||
4043 | return (addr_type,addr) | |
4044 | ||
4045 | ||
4046 | def handle_va2pa (self, cmd): | |
4047 | """ | |
4048 | syntax: va2pa [(p|r|v):][0x]addr [-p pid] [-c context] [strand-di] | |
4049 | """ | |
4050 | tokens = cmd.split() | |
4051 | (addr_type,addr) = self.decode_addr(tokens[1]) | |
4052 | pid = None | |
4053 | ctxt = None | |
4054 | tid = self.selectTid | |
4055 | i = 2 | |
4056 | while i < len(tokens): | |
4057 | if tokens[i] == '-p': | |
4058 | pid = eval(tokens[i+1]) | |
4059 | i += 2 | |
4060 | elif tokens[i] == '-c': | |
4061 | ctxt = eval(tokens[i+1]) | |
4062 | i += 2 | |
4063 | else: | |
4064 | try: | |
4065 | tid = eval(tokens[i]) | |
4066 | except: | |
4067 | pass | |
4068 | i += 1 | |
4069 | ||
4070 | (addr,type) = RS_logical_to_physical(tid, addr, addr_type, pid, ctxt) | |
4071 | print addr | |
4072 | return None | |
4073 | ||
4074 | ||
4075 | def handleDisassemble (self, cmd): | |
4076 | """ | |
4077 | <processor>.disassemble [address [count]] | |
4078 | disassemble [address [count]] | |
4079 | ||
4080 | 2/27/07: alias to dism | |
4081 | """ | |
4082 | count = '1' | |
4083 | addr = None | |
4084 | addr_type = AddrType.VA_TYPE # 0 - pa, 1 - ra, 2 - va, default is VA | |
4085 | tokens = cmd.split() | |
4086 | if cmd.startswith(NAME_processor): | |
4087 | i = cmd.find('.') | |
4088 | tid = int(cmd[len(NAME_processor):i]) | |
4089 | else: | |
4090 | #tid = self.selectTid | |
4091 | tid = self.lastTid | |
4092 | ||
4093 | if len(tokens) > 1: | |
4094 | addr = tokens[1] | |
4095 | if len(tokens) > 2: | |
4096 | count = tokens[2] | |
4097 | ||
4098 | if tid >= self.nstrandObjs: | |
4099 | sys.stderr.write('ERROR: strand id out of bounds\n') | |
4100 | return | |
4101 | ||
4102 | if addr.startswith(SYM_PA): | |
4103 | addr = addr[len(SYM_PA):] | |
4104 | ## if not addr.startswith('0x') and not addr.startswith('0X'): | |
4105 | ## addr = '0x' + addr | |
4106 | addr_type = AddrType.PA_TYPE | |
4107 | elif addr.startswith(SYM_RA): | |
4108 | addr = addr[len(SYM_RA):] | |
4109 | ## if not addr.startswith('0x') and not addr.startswith('0X'): | |
4110 | ## addr = '0x' + addr | |
4111 | addr_type = AddrType.RA_TYPE | |
4112 | elif addr.startswith(SYM_VA): | |
4113 | addr = addr[len(SYM_VA):] | |
4114 | ## if not addr.startswith('0x') and not addr.startswith('0X'): | |
4115 | ## addr = '0x' + addr | |
4116 | else: | |
4117 | # default is VA, if no addr is given, PC is used | |
4118 | if addr == None: | |
4119 | # use selected strand's pc | |
4120 | addr = str(self.riesReposit.riesling.s[tid].pc) | |
4121 | ||
4122 | if self.checkArgs([addr,count]) != [True, True]: | |
4123 | sys.stderr.write('ERROR: invalid address or count arguments\n') | |
4124 | return | |
4125 | ||
4126 | try: | |
4127 | addrv = eval(addr) | |
4128 | except: | |
4129 | sys.stderr.write('ERROR: %s is not a proper address, use prefix "0x" for hex value\n' % (addr)) | |
4130 | return | |
4131 | ||
4132 | if addr_type == AddrType.PA_TYPE: | |
4133 | return self.handle_dism('dism p:%#x -c %s %d' % (addrv, count, tid)) | |
4134 | elif addr_type == AddrType.RA_TYPE: | |
4135 | return self.handle_dism('dism r:%#x -c %s %d' % (addrv, count, tid)) | |
4136 | else: | |
4137 | return self.handle_dism('dism v:%#x -c %s %d' % (addrv, count, tid)) | |
4138 | ||
4139 | ||
4140 | def handle_dism (self, cmd): | |
4141 | """ | |
4142 | syntax: dism | |
4143 | dism pc [-c count] [strand-id] | |
4144 | dism [(p|r|v):]addr [-c count] [strand-id] | |
4145 | """ | |
4146 | tokens = cmd.split() | |
4147 | ||
4148 | if len(tokens) == 1: | |
4149 | # if no addr is specified, use the selected strand's PC | |
4150 | #addr = self.riesReposit.riesling.s[self.selectTid].pc | |
4151 | addr = self.riesReposit.riesling.s[self.lastTid].pc | |
4152 | addr_type = AddrType.VA_TYPE | |
4153 | else: | |
4154 | # special syntax, allow accessing PC of a different strand | |
4155 | if tokens[1] == 'pc': | |
4156 | addr = None | |
4157 | addr_type = AddrType.VA_TYPE | |
4158 | else: | |
4159 | (addr_type,addr) = self.decode_addr(tokens[1]) | |
4160 | ||
4161 | count = 1 | |
4162 | #tid = self.selectTid | |
4163 | tid = self.lastTid | |
4164 | i = 2 | |
4165 | while i < len(tokens): | |
4166 | if tokens[i] == '-c': | |
4167 | count = eval(tokens[i+1]) | |
4168 | i += 2 | |
4169 | else: | |
4170 | tid = eval(tokens[i]) | |
4171 | i += 1 | |
4172 | ||
4173 | if addr == None: | |
4174 | addr = self.riesReposit.riesling.s[tid].pc | |
4175 | ||
4176 | i = 0 | |
4177 | while i < count: | |
4178 | (size,iwStr,type) = RS_disassemble(tid, addr, addr_type, self.vonk) | |
4179 | if type == AddrType.PA_TYPE: | |
4180 | sys.stdout.write('PA %#x %s\n' % (addr, iwStr)) | |
4181 | elif type == AddrType.RA_TYPE: | |
4182 | sys.stdout.write('RA %#x %s\n' % (addr, iwStr)) | |
4183 | else: | |
4184 | sys.stdout.write('VA %#x %s\n' % (addr, iwStr)) | |
4185 | addr += 4 | |
4186 | i += 1 | |
4187 | ||
4188 | return None | |
4189 | ||
4190 | ||
4191 | def str2long (self, str): | |
4192 | """ | |
4193 | """ | |
4194 | if str.startswith('0x') or str.startswith('0X'): | |
4195 | return long(str, 16) | |
4196 | elif str.startswith('0'): | |
4197 | return long(str, 8) | |
4198 | else: | |
4199 | return long(str, 10) | |
4200 | ||
4201 | ||
4202 | def handleTodo (self, cmd): | |
4203 | """ | |
4204 | """ | |
4205 | self.todo(cmd) | |
4206 | raise RuntimeError | |
4207 | ||
4208 | ||
4209 | def wrongSyntax (self, cmd): | |
4210 | """ | |
4211 | """ | |
4212 | sys.stderr.write('Wrong command syntax: <%s>\n' % (cmd)) | |
4213 | raise RuntimeError | |
4214 | ||
4215 | ||
4216 | def showtraceback(self): | |
4217 | """Display the exception that just occurred. | |
4218 | #We remove the first stack item because it is our own code. | |
4219 | The output is written by self.write(), below. | |
4220 | """ | |
4221 | import traceback | |
4222 | ||
4223 | try: | |
4224 | type, value, tb = sys.exc_info() | |
4225 | sys.last_type = type | |
4226 | sys.last_value = value | |
4227 | sys.last_traceback = tb | |
4228 | tblist = traceback.extract_tb(tb) | |
4229 | #del tblist[:1] | |
4230 | list = traceback.format_list(tblist) | |
4231 | if list: | |
4232 | list.insert(0, "Traceback (most recent call last):\n") | |
4233 | list[len(list):] = traceback.format_exception_only(type, value) | |
4234 | finally: | |
4235 | tblist = tb = None | |
4236 | ||
4237 | map(self.write, list) | |
4238 | #sys.stderr.write('%s' % (list)) | |
4239 | ||
4240 | ||
4241 | def write (self, data): | |
4242 | """ | |
4243 | """ | |
4244 | sys.stderr.write(data) | |
4245 | ||
4246 | ||
4247 | def replaceToken (self, cmd): | |
4248 | """replace %reg with RS_read_register_name() so that the %reg can be | |
4249 | treated as a variable and used in any valid python expression. | |
4250 | """ | |
4251 | tokens = splitRE.split(cmd) | |
4252 | for token in tokens: | |
4253 | #print token | |
4254 | if token.startswith('%'): | |
4255 | name = self.regmap.feName2beName(token[1:]) | |
4256 | if name != '': | |
4257 | newToken = "%s.s%d.%s" % (self.topName,self.lastTid,name) | |
4258 | #sys.stderr.write('DBX: newToken=%s\n' % (newToken)) #DBX | |
4259 | cmd = cmd.replace(token, newToken) | |
4260 | return cmd | |
4261 | else: | |
4262 | #sys.stderr.write('unimplemented register %s\n' % (token[1:],)) | |
4263 | pass | |
4264 | return cmd | |
4265 | ||
4266 | ||
4267 | ||
4268 | """self-testing | |
4269 | """ | |
4270 | if __name__ == "__main__": | |
4271 | """ | |
4272 | """ | |
4273 | import Repository | |
4274 | niParser = CmdParserNi(Repository.Repository()) | |
4275 | ||
4276 | ||
4277 | ||
4278 |