From 2115841200f8742bf6a7bae81267f22af87bbed3 Mon Sep 17 00:00:00 2001 From: Liu Shuo Date: Thu, 28 Apr 2022 10:37:46 +0800 Subject: [PATCH] [feature] move all skyeye command implement to skyeye_command directory --- Makefile.am | 1 + utils/pycli/exception.py | 74 +- utils/pycli/skyeye_cli.py | 1459 +---------------- utils/pycli/skyeye_command/__init__.py | 37 + utils/pycli/skyeye_command/_base_.py | 29 + utils/pycli/skyeye_command/bp_create.py | 38 + utils/pycli/skyeye_command/bp_delete.py | 38 + utils/pycli/skyeye_command/bp_list.py | 38 + utils/pycli/skyeye_command/cd.py | 29 + .../skyeye_command/close_instr_record.py | 48 + utils/pycli/skyeye_command/configure_read.py | 73 + utils/pycli/skyeye_command/configure_write.py | 84 + utils/pycli/skyeye_command/define_conf.py | 46 + .../skyeye_command/disable_device_work.py | 44 + utils/pycli/skyeye_command/disassemble.py | 48 + .../skyeye_command/enable_device_work.py | 45 + utils/pycli/skyeye_command/fj_clear.py | 66 + utils/pycli/skyeye_command/fj_list.py | 37 + utils/pycli/skyeye_command/fj_set.py | 66 + utils/pycli/skyeye_command/get_pc.py | 46 + utils/pycli/skyeye_command/help.py | 33 + utils/pycli/skyeye_command/history.py | 30 + utils/pycli/skyeye_command/init_ok.py | 30 + utils/pycli/skyeye_command/list_attr.py | 54 + utils/pycli/skyeye_command/list_class.py | 30 + utils/pycli/skyeye_command/list_connect.py | 40 + utils/pycli/skyeye_command/list_cpu.py | 35 + utils/pycli/skyeye_command/list_device.py | 58 + utils/pycli/skyeye_command/list_iface.py | 41 + utils/pycli/skyeye_command/list_machines.py | 34 + utils/pycli/skyeye_command/list_modules.py | 25 + utils/pycli/skyeye_command/list_register.py | 51 + utils/pycli/skyeye_command/load_binary.py | 54 + utils/pycli/skyeye_command/load_file.py | 65 + utils/pycli/skyeye_command/ls.py | 36 + utils/pycli/skyeye_command/md.py | 48 + utils/pycli/skyeye_command/mm_info.py | 35 + .../pycli/skyeye_command/open_instr_record.py | 57 + utils/pycli/skyeye_command/q.py | 1 + utils/pycli/skyeye_command/quit.py | 34 + utils/pycli/skyeye_command/remote_gdb.py | 62 + utils/pycli/skyeye_command/reset.py | 31 + utils/pycli/skyeye_command/reverse.py | 92 ++ utils/pycli/skyeye_command/reverse_disable.py | 48 + utils/pycli/skyeye_command/reverse_enable.py | 75 + utils/pycli/skyeye_command/run.py | 30 + utils/pycli/skyeye_command/run_command.py | 43 + utils/pycli/skyeye_command/run_py.py | 41 + utils/pycli/skyeye_command/run_script.py | 68 + utils/pycli/skyeye_command/set_mode.py | 41 + utils/pycli/skyeye_command/set_pc.py | 46 + utils/pycli/skyeye_command/set_register.py | 55 + utils/pycli/skyeye_command/shell.py | 38 + utils/pycli/skyeye_command/speed.py | 31 + utils/pycli/skyeye_command/stepi.py | 42 + utils/pycli/skyeye_command/stop.py | 30 + 56 files changed, 2498 insertions(+), 1412 deletions(-) create mode 100644 utils/pycli/skyeye_command/__init__.py create mode 100644 utils/pycli/skyeye_command/_base_.py create mode 100644 utils/pycli/skyeye_command/bp_create.py create mode 100644 utils/pycli/skyeye_command/bp_delete.py create mode 100644 utils/pycli/skyeye_command/bp_list.py create mode 100644 utils/pycli/skyeye_command/cd.py create mode 100644 utils/pycli/skyeye_command/close_instr_record.py create mode 100644 utils/pycli/skyeye_command/configure_read.py create mode 100644 utils/pycli/skyeye_command/configure_write.py create mode 100644 utils/pycli/skyeye_command/define_conf.py create mode 100644 utils/pycli/skyeye_command/disable_device_work.py create mode 100644 utils/pycli/skyeye_command/disassemble.py create mode 100644 utils/pycli/skyeye_command/enable_device_work.py create mode 100644 utils/pycli/skyeye_command/fj_clear.py create mode 100644 utils/pycli/skyeye_command/fj_list.py create mode 100644 utils/pycli/skyeye_command/fj_set.py create mode 100644 utils/pycli/skyeye_command/get_pc.py create mode 100644 utils/pycli/skyeye_command/help.py create mode 100644 utils/pycli/skyeye_command/history.py create mode 100644 utils/pycli/skyeye_command/init_ok.py create mode 100644 utils/pycli/skyeye_command/list_attr.py create mode 100644 utils/pycli/skyeye_command/list_class.py create mode 100644 utils/pycli/skyeye_command/list_connect.py create mode 100644 utils/pycli/skyeye_command/list_cpu.py create mode 100644 utils/pycli/skyeye_command/list_device.py create mode 100644 utils/pycli/skyeye_command/list_iface.py create mode 100644 utils/pycli/skyeye_command/list_machines.py create mode 100644 utils/pycli/skyeye_command/list_modules.py create mode 100644 utils/pycli/skyeye_command/list_register.py create mode 100644 utils/pycli/skyeye_command/load_binary.py create mode 100644 utils/pycli/skyeye_command/load_file.py create mode 100644 utils/pycli/skyeye_command/ls.py create mode 100644 utils/pycli/skyeye_command/md.py create mode 100644 utils/pycli/skyeye_command/mm_info.py create mode 100644 utils/pycli/skyeye_command/open_instr_record.py create mode 120000 utils/pycli/skyeye_command/q.py create mode 100644 utils/pycli/skyeye_command/quit.py create mode 100644 utils/pycli/skyeye_command/remote_gdb.py create mode 100644 utils/pycli/skyeye_command/reset.py create mode 100644 utils/pycli/skyeye_command/reverse.py create mode 100644 utils/pycli/skyeye_command/reverse_disable.py create mode 100644 utils/pycli/skyeye_command/reverse_enable.py create mode 100644 utils/pycli/skyeye_command/run.py create mode 100644 utils/pycli/skyeye_command/run_command.py create mode 100644 utils/pycli/skyeye_command/run_py.py create mode 100644 utils/pycli/skyeye_command/run_script.py create mode 100644 utils/pycli/skyeye_command/set_mode.py create mode 100644 utils/pycli/skyeye_command/set_pc.py create mode 100644 utils/pycli/skyeye_command/set_register.py create mode 100644 utils/pycli/skyeye_command/shell.py create mode 100644 utils/pycli/skyeye_command/speed.py create mode 100644 utils/pycli/skyeye_command/stepi.py create mode 100644 utils/pycli/skyeye_command/stop.py diff --git a/Makefile.am b/Makefile.am index e5446052..0738c536 100644 --- a/Makefile.am +++ b/Makefile.am @@ -266,6 +266,7 @@ endif cp -a $(top_srcdir)/utils/pycli/picture $(prefix)/bin/ cp -a $(top_srcdir)/utils/pycli/doc $(prefix)/bin/ cp -a $(top_srcdir)/utils/pycli/command $(prefix)/bin/ + cp -a $(top_srcdir)/utils/pycli/skyeye_command $(prefix)/bin/ cp -a $(top_srcdir)/utils/pycli/grpc_package $(prefix)/bin/ cp -a $(top_srcdir)/kerneldlls $(prefix)/bin cp -a $(top_srcdir)/common/include $(prefix)/include diff --git a/utils/pycli/exception.py b/utils/pycli/exception.py index fbc14b29..3d7f7b76 100644 --- a/utils/pycli/exception.py +++ b/utils/pycli/exception.py @@ -1,23 +1,69 @@ - - - class JsonConfInitErrorException(Exception): - pass + pass class DeviceAddrClashException(Exception): - pass + pass class SKYError(Exception): - pass + pass class CMDError(SKYError): - def __init__(self, value): - self.message = value - def __str__(self): - return repr(self.message) + def __init__(self, value): + self.message = value + def __str__(self): + return repr(self.message) class DLLError(SKYError): - def __init__(self, value): - self.message = value - def __str__(self): - return repr(self.message) + def __init__(self, value): + self.message = value + def __str__(self): + return repr(self.message) + +import se_path +ERROR_ALL_F = '0xffffffff' +class SkyeyeAPIException(Exception): + Language = 'ch' + err_json = None + + def __init__(self, errMsg): + self._errMsg = errMsg + self.err_json = None + self.err_str = None + + def __str__(self): + return self.msg() + + def msg(self): + if self.err_str is not None: + return self.err_str + + if self._errMsg[0] != ERROR_ALL_F: + if SkyeyeAPIException.err_json is None: + import json + try: + with open(se_path.ErrorDataPath, encoding='utf-8') as f: + SkyeyeAPIException.err_json = json.load(f) + except Exception as e: + raise Exception('读取错误数据文件出错') + + id = int(self._errMsg[0], 0) + l_id = hex(id & 0xffff) + h_id = hex(id - (id & 0xffff)) + try: + msg1 = SkyeyeAPIException.err_json[h_id][SkyeyeAPIException.Language] + msg2 = SkyeyeAPIException.err_json[l_id][SkyeyeAPIException.Language] + except Exception as e: + raise Exception("未找到该ID信息, ID: %x" % id) + k = 0 + for n in range(5): + k = msg2.find('%s', k) + if k == -1: + break + k += 2 + + if len(self._errMsg) - 1 >= n: + msg2 %= tuple(self._errMsg[1:1+n]) + self.err_str = msg1 + ' : ' + msg2 + else: + self.err_str = self._errMsg[-1] + return self.err_str diff --git a/utils/pycli/skyeye_cli.py b/utils/pycli/skyeye_cli.py index ecfc2244..ed34ce61 100755 --- a/utils/pycli/skyeye_cli.py +++ b/utils/pycli/skyeye_cli.py @@ -20,11 +20,10 @@ import pytimer import functools import operator import fault_inject as sfi -import readline import argparse import network_control as NetCtrl +import skyeye_command -cli_init.InitCommandList() sys.path.append(se_path.SkyEyeBin) def add_help_method(cls): @@ -43,16 +42,36 @@ def add_help_method(cls): return cls +def add_do_command_method(cls): + def create_command_method(command): + def do_xxx(self, arg): + try: + command(arg=arg, cli=self) + except Exception as e: + if str(e): + print('[ERROR]', e) + except: + print('!!!BUG!!!') + return do_xxx + + for name, command in skyeye_command._commands.items(): + if 'cli' in command.export: + setattr(cls, 'do_'+name, create_command_method(command)) + + return cls + @add_help_method +@add_do_command_method class SkyEyeCli(cmd.Cmd): Config = None # skyeye prompt prompt = '(skyeye) ' def __init__(self, args=[]): + cmd.Cmd.__init__(self) self.args_list = args - welcome_message() + self.print_welcome_message() # log=output_log() # se.log=log self.open_conf_flag = False @@ -75,33 +94,60 @@ class SkyEyeCli(cmd.Cmd): # 为命令补齐配置readline self.readline_cfg() - # 命令参赛解析器 + # 命令参数解析器 self.cmd_parsers = {} + def print_welcome_message(self): + os_info = platform.system() + if operator.eq(os_info, "Linux"): + system = "Linux" + else: + system = "Windows" + + try: + config = tools.GetPackageConfig() + version = tools.GetBuildVersion(config) + date = tools.GetBuildDate(config) + except: + version = "unknown" + date = "unknown" + welcome_message = "SkyEye %s Copyright 2010-2022 Digiproto Corporation\n" % (version, date, system) + print(welcome_message) + def readline_cfg(self): + import readline s = readline.get_completer_delims() for c in '<>-': s = s.replace(c, '') s += '.' readline.set_completer_delims(s) + self.readline = readline def quit_skyeye(self, arg): libcommon.com_quit(arg) + def cmdloop(self): + try: + super().cmdloop() + except KeyboardInterrupt: + self.do_quit('') + def preloop(self): self.history_file = os.path.join(os.path.expanduser('~'), '.skyeye/cmd_history') if not os.path.exists(self.history_file): - print('not exists') with open(self.history_file, 'w'): pass - readline.read_history_file(self.history_file) + self.readline.read_history_file(self.history_file) def postloop(self): - #print('in postloop') - readline.write_history_file(self.history_file) + self.readline.write_history_file(self.history_file) def precmd(self, arg): + if arg: + if arg.startswith('%'): + arg = 'run_py ' + arg[1:] + arg_list = arg.split() if arg_list: arg_list[0] = arg_list[0].replace('-', '_') @@ -115,20 +161,21 @@ class SkyEyeCli(cmd.Cmd): else: self.prompt = "(skyeye) " - # his_len = readline.get_current_history_length() - # print('len:"%s"' % his_len) return stop def print_help(self, cmd): - parser = self.get_argparser(cmd) - parser.print_help() + cmd_obj = getattr(skyeye_command, cmd, None) + if cmd_obj: + cmd_obj.print_help() + else: + parser = self.get_argparser(cmd) + parser.print_help() def completenames(self, text, *ignored): # TODO: 补齐形如''对象名, # if text.startswith('<'): # pass - # 支持"list-cpu" "list-device"带有"-"的命令 hack = False if '-' in text: text = text.replace('-', '_') @@ -142,1365 +189,7 @@ class SkyEyeCli(cmd.Cmd): pass def default(self, line): - print('*** Unknown command: %s\n'%line) - print('*** Get commands with \'help\' cmd\n') - - def get_argparser(self, cmd): - parser = self.cmd_parsers.get(cmd) - if not parser: - parser = getattr(self, 'create_argparser_'+cmd)() - return parser - - def create_argparser_help(self): - parser = self.cmd_parsers['help'] = argparse.ArgumentParser( - prog='help', - description='Print help info.', - add_help=False, - ) - - parser.add_argument( - 'cmd', - metavar='', - nargs='?', - help='command name', - ) - return parser - - def do_help(self, arg): - arg = arg.replace('-', '_') - return super().do_help(arg) - - def create_argparser_history(self): - parser = self.cmd_parsers['history'] = argparse.ArgumentParser( - prog='history', - description='Show command history.', - add_help=False) - return parser - - def do_history(self, arg): - parser = self.get_argparser('history') - try: - ns = parser.parse_args(arg.split()) - except: - return - - hist_len = readline.get_current_history_length() - for i in range(1, hist_len+1): - hist_item = readline.get_history_item(i) - print('%-5s %s' % (i, hist_item)) - - def create_argparser_list_modules(self): - parser = self.cmd_parsers['list_modules'] = argparse.ArgumentParser( - prog='list_modules', - description='List all the loaded module.', - add_help=False) - return parser - - def do_list_modules(self, arg): - parser = self.get_argparser('list_modules') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeListModules() - except Exception as e: - print(e) - - def create_argparser_list_machines(self): - parser = self.cmd_parsers['list_machines'] = argparse.ArgumentParser( - prog='list_machines', - description='List all the supported machines for SkyEye.', - add_help=False) - return parser - - def do_list_machines(self, arg): - parser = self.get_argparser('list_machines') - try: - arg_ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if config: - ml = config.get_mach_list() - print("%-20s%-20s" % ("Id", "MachinesName")) - for i in range(len(ml)): - print("%-20s%-20s" % (i+1, ml[i])) - - def create_argparser_run_script(self): - parser = self.cmd_parsers['run_script'] = argparse.ArgumentParser( - prog='run_script', - description='Run skyeye script.', - add_help=False) - - parser.add_argument( - 'script_name', - metavar='', - help='name of skyeye-script', - ) - - return parser - - def do_run_script(self, arg): - parser = self.get_argparser('run_script') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("run-script") - if not cmd: - print ("Can not find command: run-script") - return - if self.open_conf_flag: - LogReport("Do not reload until RESET is performed") - return False - - SetGlobalScript(ns.script_name) - try: - res = cmd.run([ns.script_name]) - except Exception as e: - LogReportPack(errormessage.GetErrorInfo()) - res = False - if res: - self.open_conf_flag = True - - def create_argparser_run_command(self): - parser = self.cmd_parsers['run_command'] = argparse.ArgumentParser( - prog='run_command', - description='Run a skyeye command.', - add_help=False) - - parser.add_argument( - 'script_name', - metavar='', - nargs='+', - help='part of skyeye-command', - ) - - return parser - - def do_run_command(self, arg): - parser = self.get_argparser('run_command') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("run-command") - if not cmd: - print ("Can not find command: run-command") - return - cmd.run(arg) - - def create_argparser_bp_create(self): - parser = self.cmd_parsers['bp_create'] = argparse.ArgumentParser( - prog='bp_create', - description='Insert a break-point on a cpu-core.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu-core name', - ) - - parser.add_argument( - 'bp_addr', - metavar='', - type=convert_int, - help='break-point address (int)', - ) - return parser - - def do_bp_create(self, arg): - parser = self.get_argparser('bp_create') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeCreateBreakpoint(ns.cpu, ns.bp_addr) - except Exception as e: - print(e) - print ("Insert breakpoint error") - - def create_argparser_bp_delete(self): - parser = self.cmd_parsers['bp_delete'] = argparse.ArgumentParser( - prog='bp_delete', - description='Delete a break-point on a cpu-core.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu-core name', - ) - - parser.add_argument( - 'bp_addr', - metavar='', - type=convert_int, - help='break-point address (int)', - ) - return parser - - def do_bp_delete(self, arg): - parser = self.get_argparser('bp_delete') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeDeleteBreakpointByAddr(ns.cpu, ns.bp_addr) - except SkyeyeAPIException as e: - print(e) - - def create_argparser_bp_list(self): - parser = self.cmd_parsers['bp_list'] = argparse.ArgumentParser( - prog='bp_list', - description='Show all break-points.', - add_help=False) - parser.add_argument( - 'cpu', - metavar='', - help='cpu-core name', - ) - return parser - - def do_bp_list(self, arg): - parser = self.get_argparser('bp_list') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - temp = [] - n = SkyEyeGetBpNumbers(ns.cpu) - for i in range(n): - temp.append(SkyEyeGetBreakpointAddrById(ns.cpu, i)) - print ("%-25s%-25s"%("CPU","Address(HEX)")) - for i in temp: - print ("%-25s0x%-25x"%(ns.cpu, i)) - except SkyeyeAPIException as e: - print(e) - print ("Breakpoint get error") - - def create_argparser_list_cpu(self): - parser = self.cmd_parsers['list_cpu'] = argparse.ArgumentParser( - prog='list_cpu', - description='Show all available cpu.', - add_help=False) - return parser - - def do_list_cpu(self, arg): - parser = self.get_argparser('list_cpu') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - cpus = config.get_cpu_list() - print ("%-20s%-20s" % ("ID", "CpuName")) - count = 0 - for cpu in cpus: - count = count + 1 - print ("%-20d%-20s" % (count, cpu)) - - def create_argparser_list_register(self): - parser = self.cmd_parsers['list_register'] = argparse.ArgumentParser( - prog='list_register', - description='Show all registers of a device.', - add_help=False) - - parser.add_argument( - 'machine', - metavar='', - help='machine name', - ) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - return parser - - def do_list_register(self, arg): - parser = self.get_argparser('list_register') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - ret = sfi.get_device_register_info(ns.machine, ns.device) - print ("%-20s%-20s%-20s" % ("Register", "Value(HEX)", "Address(HEX)")) - for i in ret.keys(): - print ("%-20s%-20x%-20x" % (i, ret[i]["value"], ret[i]["addr"])) - - def create_argparser_list_device(self): - parser = self.cmd_parsers['list_device'] = argparse.ArgumentParser( - prog='list_device', - description='Show all current device.', - add_help=False) - - parser.add_argument( - 'machine', - metavar='', - nargs='?', - help='machine name', - ) - return parser - - def do_list_device(self, arg): - parser = self.get_argparser('list_device') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - - if ns.machine is None: - print ("%-30s%-30s" % ("DeviceName", "BelongBoard")) - machlist = config.get_mach_list() - for mach in machlist: - mach_cls = config.get_mach_classname(mach) - if mach_cls == 'pc_mach': - cpu = config.get_cpuname_by_mach(mach) - if cpu: - x86_obj = x86(cpu) - for device in x86_obj.devices: - print ("%-30s%-30s" % (device.name, mach)) - else: - device_list = config.get_device_list_by_mach(mach) - for device in device_list: - print ("%-30s%-30s" % (device, mach)) - else: - print ("%-30s%-30s" % ("ID", "DeviceName")) - device_list = config.get_device_list_by_mach(ns.machine) - for i in range(0, len(device_list)): - print ("%-30s%-30s" % (i+1, device_list[i])) - - def create_argparser_set_register(self): - parser = self.cmd_parsers['set_register'] = argparse.ArgumentParser( - prog='set_register', - description='Set a value to a register.', - add_help=False) - - parser.add_argument( - 'machine', - metavar='', - help='machine name', - ) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - - parser.add_argument( - 'register', - metavar='', - help='device name', - ) - - parser.add_argument( - 'value', - metavar='', - type=convert_int, - help='value of int', - ) - - return parser - - def do_set_register(self, arg): - parser = self.get_argparser('set_register') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - regid = SkyEyeGetDevRegIdByName(ns.machine, ns.device, ns.register) - ret = SkyEyeSetDevRegValueById(ns.machine, ns.device, ns.value, regid) - except Exception as e: - print (e) - return - - def create_argparser_list_class(self): - parser = self.cmd_parsers['list_class'] = argparse.ArgumentParser( - prog='list_class', - description='Show all classes.', - add_help=False) - - return parser - - def do_list_class(self, arg): - parser = self.get_argparser('list_class') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - cls_l = SkyEyeGetClassList() - cls_l.sort() - table_print(cls_l) - except Exception as e: - print (e) - - def create_argparser_list_iface(self): - parser = self.cmd_parsers['list_iface'] = argparse.ArgumentParser( - prog='list_iface', - description='Show the information of a class.', - add_help=False) - - parser.add_argument( - 'cls', - metavar='', - help='class name', - ) - - def do_list_iface(self, arg): - parser = self.get_argparser('list_iface') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - cls_l = SkyEyeGetClassList() - if ns.cls not in cls_l: - print ("%s IFACE information was not found" % ns.cls) - return - iface_l = SkyEyeGetClassIfaceList(ns.cls) - iface_l.sort() - table_print(iface_l) - except Exception as e: - print (e) - - def create_argparser_list_connect(self): - parser = self.cmd_parsers['list_connect'] = argparse.ArgumentParser( - prog='list_connect', - description='Show the connect information of a class.', - add_help=False) - - parser.add_argument( - 'cls', - metavar='', - help='class name', - ) - - return parser - - def do_list_connect(self, arg): - parser = self.get_argparser('list_connect') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - cls_l = SkyEyeGetClassList() - if ns.cls not in cls_l: - print ("%s CONNECT information was not found" % ns.cls) - return - connect_l = SkyEyeGetClassConnectList(ns.cls) - connect_l.sort() - table_print(connect_l) - except Exception as e: - print (e) - - - def create_argparser_list_attr(self): - parser = self.cmd_parsers['list_attr'] = argparse.ArgumentParser( - prog='list_attr', - description='Show attribute of a class.', - add_help=False) - - parser.add_argument( - 'cls', - metavar='', - help='class name', - ) - - return parser - - def do_list_attr(self, arg): - parser = self.get_argparser('list_attr') - try: - ns = parser.parse_args(arg.split()) - except: - return - - attr_info_l = [] - try: - cls_l = SkyEyeGetClassList() - if ns.cls not in cls_l: - print ("%s ATTR information was not found" % ns.cls) - return - attr_l = SkyEyeGetClassAttrList(ns.cls) - attr_l.sort() - attr_info_l = [] - for attr in attr_l: - info_l = SkyEyeGetClassAttrInfo(ns.cls, attr) - attr_info_l.append(info_l) - except Exception as e: - print (e) - return - print ("%-20s%-20s%s" % ("AttrName", "Type", "Description")) - #BUG len(info_l) == 4 - for info_l in attr_info_l: - if len(info_l) != 3: - destription = 'NULL' - else: - destription = info_l[2] - print ("%-20s%-20s%s" % (info_l[0], info_l[1], destription)) - -##########################fault inject################################## - def create_argparser_fj_set(self): - parser = self.cmd_parsers['fj_set'] = argparse.ArgumentParser( - prog='fj_set', - description='(xxxxxx)', - add_help=False) - - parser.add_argument( - 'machine', - metavar='', - help='machine name', - ) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - - parser.add_argument( - 'device_addr', - metavar='', - type=convert_int, - help='device addr', - ) - - parser.add_argument( - 'bit_index', - metavar='', - type=convert_int, - help='bit index', - ) - - parser.add_argument( - 'mode', - metavar='', - type=convert_int, - choices=range(3), - help='mode', - ) - - return parser - - - def do_fj_set(self, arg): - parser = self.get_argparser('fj_set') - try: - ns = parser.parse_args(arg.split()) - except: - return - ret = sfi.skyeye_set_fj(ns.machine, ns.device, ns.device_addr, ns.bit_index, ns.mode) - if ret: - print("Injection failure success") - else: - print("Injection failure failed") - - def create_argparser_fj_list(self): - parser = self.cmd_parsers['fj_list'] = argparse.ArgumentParser( - prog='fj_list', - description='(xxxxxx)', - add_help=False) - return parser - - def do_fj_list(self, arg): - parser = self.get_argparser('fj_list') - try: - ns = parser.parse_args(arg.split()) - except: - return - - ret=sfi.skyeye_get_fj() - print ("%-20s%-20s%-20s%-20s%-10s%-10s" % ("Device","Mach","Register","Address(HEX)", "Bit(DEC)", "Mode(DEC)")) - for fj in ret: - print ("%-20s%-20s%-20s%-20x%-10d%-10d" % (fj[0],fj[1],fj[2],fj[3],fj[4],fj[5])) - - def create_argparser_fj_clear(self): - parser = self.cmd_parsers['fj_clear'] = argparse.ArgumentParser( - prog='fj_clear', - description='(xxxxxx)', - add_help=False) - - parser.add_argument( - 'machine', - metavar='', - help='machine name', - ) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - - parser.add_argument( - 'device_addr', - metavar='', - type=convert_int, - help='device addr', - ) - - parser.add_argument( - 'bit_index', - metavar='', - type=convert_int, - help='bit index', - ) - - parser.add_argument( - 'mode', - metavar='', - type=convert_int, - choices=range(3), - help='mode', - ) - - return parser - - def do_fj_clear(self, arg): - parser = self.get_argparser('fj_clear') - try: - ns = parser.parse_args(arg.split()) - except: - return - - ret = sfi.skyeye_clear_fj(ns.machine, ns.device, ns.device_addr, ns.bit_index, ns.mode) - if ret: - print ("Failure deletion successful") - else: - print ("Failure deletion failed") - - def create_argparser_md(self): - parser = self.cmd_parsers['md'] = argparse.ArgumentParser( - prog='md', - description='Get the value at a address of memory.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'addr', - metavar='', - type=convert_int, - help='memory address', - ) - - return parser - - def do_md(self, arg): - parser = self.get_argparser('md') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - try: - ret = SkyEyeReadMemory8(ns.cpu, ns.addr) - print ("%-20s%-20s" % ("Addr(HEX)", "Value(HEX)")) - print ("%-20x%-20x" % (ns.addr, ret)) - except Exception as e: - print (e) - - def create_argparser_disassemble(self): - parser = self.cmd_parsers['disassemble'] = argparse.ArgumentParser( - prog='md', - description='Show infomation of disassembleat a address.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'addr', - metavar='', - type=convert_int, - help='memory address', - ) - - return parser - - def do_disassemble(self, arg): - parser = self.get_argparser('disassemble') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - - try: - disas_str =SkyEyeDisassemble(ns.cpu, ns.addr) - print ("%-20s%-20s" % ("Addr(HEX)", "Value")) - print ("%-20x%-20s" % (ns.addr, disas_str)) - except SkyeyeAPIException as e: - print(e) - - def create_argparser_remote_gdb(self): - parser = self.cmd_parsers['remote_gdb'] = argparse.ArgumentParser( - prog='remote_gdb', - description='Connect remote gdb.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'ip', - metavar='', - nargs='?', - default='0.0.0.0', - help='ip address', - ) - - parser.add_argument( - 'port', - metavar='', - type=convert_int, - help='port number', - ) - - return parser - - def do_remote_gdb(self, arg): - # FIXME: BUG - parser = self.get_argparser('remote_gdb') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - ret = SkyEyeCreateRemoteGdb(ns.cpu, ns.port, ns.ip) - if ret != 1: - print("Remote Gdb Start error, Target Cpu Name: %s, Ip: %s, Port: %d" % (ns.cpu, ns.ip, ns.port)) - else: - print("Remote Gdb Start OK!") - except: - print("An error has occurred happend when remote gdb start!") - print("Target CPU name: %s, Ip: %s, Port: %d" % (ns.cpu, ns.ip, ns.port)) - - def create_argparser_set_mode(self): - parser = self.cmd_parsers['set_mode'] = argparse.ArgumentParser( - prog='set_mode', - description='Set the cpu running mode', - add_help=False) - - parser.add_argument( - 'mode', - metavar='', - type=convert_int, - choices=range(4), - help='mode (choose from 0, 1, 2, 3)', - ) - - return parser - - def do_set_mode(self, arg): - parser = self.get_argparser('set_mode') - try: - ns = parser.parse_args(arg.split()) - except: - return - - config = GetGlobalConfig() - if not config: - return - print ("--%d--" % ns.mode) - SetAllToDyncom(ns.mode) - - def create_argparser_speed(self): - parser = self.cmd_parsers['speed'] = argparse.ArgumentParser( - prog='speed', - description='Show the current running speed of the cpu.', - add_help=False) - - return parser - - def do_speed(self, arg): - parser = self.get_argparser('speed') - try: - ns = parser.parse_args(arg.split()) - except: - return - - mips_dic = mips.get() - for item in mips_dic.keys(): - print ("CPU:%20s SPEED:%d" % (item, mips_dic[item])) - - def create_argparser_ls(self): - parser = self.cmd_parsers['ls'] = argparse.ArgumentParser( - prog='ls', - description='list directory contents', - add_help=False) - - parser.add_argument( - 'path', - metavar='', - nargs='?', - default='', - help='the path of file or directory', - ) - - return parser - - def do_ls(self, arg): - parser = self.get_argparser('ls') - try: - ns = parser.parse_args(arg.split()) - except: - return - - if ns.path and not os.path.exists(ns.path): - print("No such file or directory") - return - try: - SkyEyeListDir(arg) - except Exception as e: - print(e) - - def create_argparser_quit(self): - parser = self.cmd_parsers['quit'] = argparse.ArgumentParser( - prog='quit', - description='Quit skyeye.', - add_help=False) - - return parser - - def do_quit(self, arg): - parser = self.get_argparser('quit') - try: - ns = parser.parse_args(arg.split()) - except: - return - - self.postloop() - - if mips.mips_thread != None: - mips.mips_thread.stop() - NetCtrl.server_stop() - try: - SkyEyeQuit() - except Exception as e: - print (e) - do_q = do_quit - - def create_argparser_run(self): - parser = self.cmd_parsers['run'] = argparse.ArgumentParser( - prog='run', - description='Run.', - add_help=False) - - return parser - - def do_run(self, arg): - parser = self.get_argparser('run') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeRun() - pytimer.set_running(True) - except Exception as e: - print (e) - - def create_argparser_stop(self): - parser = self.cmd_parsers['stop'] = argparse.ArgumentParser( - prog='stop', - description='Stop.', - add_help=False) - - return parser - - def do_stop(self, arg): - parser = self.get_argparser('stop') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeStop() - pytimer.set_running(False) - except Exception as e: - print(e) - input() - - def create_argparser_stepi(self): - parser = self.cmd_parsers['stepi'] = argparse.ArgumentParser( - prog='stepi', - description='Step one instruction exactly.', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'size', - metavar='', - type=convert_int, - help='step size', - ) - - return parser - - def do_stepi(self, arg): - parser = self.get_argparser('stepi') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeStepi(ns.cpu, str(ns.size)) - except Exception as e: - print (e) - - def create_argparser_reset(self): - parser = self.cmd_parsers['reset'] = argparse.ArgumentParser( - prog='reset', - description='Reset.', - add_help=False) - - return parser - - def do_reset(self, arg): - parser = self.get_argparser('reset') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - SkyEyeReset() - pytimer.set_running(False) - self.open_conf_flag = False - except Exception as e: - print(e) - - def create_argparser_reverse(self): - parser = self.cmd_parsers['reverse'] = argparse.ArgumentParser( - prog='reverse', - description='reverse', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'size', - metavar='', - type=convert_int, - help='step size', - ) - - return parser - - def do_reverse(self, arg): - parser = self.get_argparser('reverse') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("reverse") - if not cmd: - LogReport('reverse: Can not find command "reverse"') - return - try: - cmd.run([ns.cpu, str(ns.size)]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_reverse_enable(self): - parser = self.cmd_parsers['reverse_enable'] = argparse.ArgumentParser( - prog='reverse_enable', - description='reverse_enable', - add_help=False) - - return parser - - def do_reverse_enable(self, arg): - parser = self.get_argparser('reverse_enable') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("enable-reverse") - if not cmd: - LogReport('reverse_enable: Can not find command "enable-reverse"') - return - try: - cmd.run([]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_reverse_disable(self): - parser = self.cmd_parsers['reverse_disable'] = argparse.ArgumentParser( - prog='reverse_disable', - description='reverse_disable', - add_help=False) - - return parser - - def do_reverse_disable(self, arg): - parser = self.get_argparser('reverse_disable') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("disable-reverse") - if not cmd: - LogReport('reverse_disable: Can not find command "disable-reverse"') - return - try: - cmd.run([]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_disable_device_work(self): - parser = self.cmd_parsers['disable_device_work'] = argparse.ArgumentParser( - prog='disable_device_work', - description='disable_device_work', - add_help=False) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - - return parser - - def do_disable_device_work(self, arg): - parser = self.get_argparser('disable_device_work') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("disable-device-work") - if not cmd: - LogReport('disable-device-work: Can not find command "disable-device-work"') - return - try: - cmd.run([ns.device]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_enable_device_work(self): - parser = self.cmd_parsers['enable_device_work'] = argparse.ArgumentParser( - prog='enable_device_work', - description='enable_device_work', - add_help=False) - - parser.add_argument( - 'device', - metavar='', - help='device name', - ) - - return parser - - def do_enable_device_work(self, arg): - parser = self.get_argparser('enable_device_work') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("enable-device-work") - if not cmd: - LogReport('enable-device-work: Can not find command "enable-device-work"') - return - try: - cmd.run(arg_list) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_configure_write(self): - parser = self.cmd_parsers['configure_write'] = argparse.ArgumentParser( - prog='configure_write', - description='configure_write', - add_help=False) - - parser.add_argument( - 'snapshot', - metavar='', - help='vmware snapshot', - ) - - return parser - - def do_configure_write(self, arg): - parser = self.get_argparser('configure_write') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("write-configure") - if not cmd: - LogReport('write-configure: Can not find command "write-configure"') - return - try: - cmd.run([ns.snapshot]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_configure_read(self): - parser = self.cmd_parsers['configure_read'] = argparse.ArgumentParser( - prog='configure_read', - description='configure_read', - add_help=False) - - parser.add_argument( - 'snapshot', - metavar='', - help='snapshot', - ) - - return parser - - def do_configure_read(self, arg): - parser = self.get_argparser('configure_read') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("read-configure") - if not cmd: - LogReport('read-configure: Can not find command "read-configure"') - return - try: - cmd.run([ns.snapshot]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_open_instr_record(self): - parser = self.cmd_parsers['open_instr_record'] = argparse.ArgumentParser( - prog='open_instr_record', - description='configure_read', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'log_file', - metavar='', - help='the log file path', - ) - - return parser - - def do_open_instr_record(self, arg): - parser = self.get_argparser('open_instr_record') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("open-instr-record") - if not cmd: - LogReport('open-instr-record: Can not find command "open-instr-record"') - return - try: - cmd.run([ns.cpu, ns.log_file]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_close_instr_record(self): - parser = self.cmd_parsers['close_instr_record'] = argparse.ArgumentParser( - prog='close_instr_record', - description='close_instr_record', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - return parser - - def do_close_instr_record(self,arg): - parser = self.get_argparser('close_instr_record') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("close-instr-record") - if not cmd: - LogReport('close-instr-record: Can not find command "close-instr-record"') - return - try: - cmd.run([ns.cpu]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_set_pc(self): - parser = self.cmd_parsers['set_pc'] = argparse.ArgumentParser( - prog='set_pc', - description='set_pc', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - parser.add_argument( - 'value', - metavar='', - type=convert_int, - help='value', - ) - - return parser - - def do_set_pc(self,arg): - parser = self.get_argparser('set_pc') - try: - ns = parser.parse_args(arg.split()) - except: - return - - try: - ret = SkyEyeSetPC(ns.cpu, ns.value) - if ret == 0: - print ("SkyEyeSetPC Failed!") - except SkyeyeAPIException as e: - print(e) - print("set-pc: SkyEyeSetPC CALL ERROR!") - raise e - - def create_argparser_get_pc(self): - parser = self.cmd_parsers['get_pc'] = argparse.ArgumentParser( - prog='get_pc', - description='get_pc', - add_help=False) - - parser.add_argument( - 'cpu', - metavar='', - help='cpu name', - ) - - return parser - - def do_get_pc(self,arg): - parser = self.get_argparser('get_pc') - try: - ns = parser.parse_args(arg.split()) - except: - return - - cmd = cli.GetCommand("get-pc") - if cmd == None: - LogReport('get-pc: Can not find command "get-pc"') - return - try: - cmd.run([ns.cpu]) - except Exception as e: - print(e, cmd.synopses(), cmd.doc()) - - def create_argparser_mm_info(self): - parser = self.cmd_parsers['mm_info'] = argparse.ArgumentParser( - prog='mm_info', - description='mm_info', - add_help=False) - - parser.add_argument( - 'func', - nargs='?', - default='', - metavar='', - help='function name', - ) - - return parser - - def do_mm_info(self, arg): - parser = self.get_argparser('mm_info') - try: - ns = parser.parse_args(arg.split()) - except: - return - - SkyEyeMemoryInfo(ns.func) - - def do_shell(self, arg): - return self.exec_py_cmd(arg) - - def exec_py_cmd(self, cmd): - try: - exec(cmd) - except: - import traceback - print(traceback.format_exc()) + print('[Error] Unknown command: %s\n'%line) # def do_t(self, arg): # args = arg.split() @@ -1514,30 +203,4 @@ class SkyEyeCli(cmd.Cmd): # raise e ################################################################################ -# util func -def convert_int(x): - return int(x, 0) -convert_int.__name__ = 'int' - -def table_print(l): - COL_NUM = 5 - ITEM_WIDTH = 20 - for i in range(0, len(l), COL_NUM): - print(' '.join([item.ljust(ITEM_WIDTH) for item in l[i:i+COL_NUM]])) - -def welcome_message(): - os_info = platform.system() - if operator.eq(os_info, "Linux"): - system = "Linux" - else: - system = "Windows" - try: - config = tools.GetPackageConfig() - version = tools.GetBuildVersion(config) - date = tools.GetBuildDate(config) - except: - version = "unknown" - date = "unknown" - welcome_message = "SkyEye %s Copyright 2010-2022 Digiproto Corporation\n" % (version, date, system) - print(welcome_message) diff --git a/utils/pycli/skyeye_command/__init__.py b/utils/pycli/skyeye_command/__init__.py new file mode 100644 index 00000000..a4aa37e1 --- /dev/null +++ b/utils/pycli/skyeye_command/__init__.py @@ -0,0 +1,37 @@ +from importlib import import_module +import os +import sys +if __name__ == 'skyeye_command': + from ._base_ import * +else: + from .. import * + +def load_one_command(this, name): + m = import_module('.'+name, __name__) + command = m.Command() + this._commands[name] = command + +def load_package(this, name): + m = import_module('.'+name, __name__) + this._commands.update(m._commands) + +def load_all_commands(this): + path, _ = os.path.split(__file__) + _, dirs, files = next(os.walk(path)) + + for d in dirs: + if d[0] != '_': + m = load_package(this, d) + + for f in files: + if f[0] != '_' and f[-3:] == '.py': + name = f[:-3] + load_one_command(this, name) + + if __name__ == 'skyeye_command': + for name, command in this._commands.items(): + setattr(this, name, command) + +this_module = import_module(__name__) +this_module._commands = {} +load_all_commands(this_module) diff --git a/utils/pycli/skyeye_command/_base_.py b/utils/pycli/skyeye_command/_base_.py new file mode 100644 index 00000000..034ba5f5 --- /dev/null +++ b/utils/pycli/skyeye_command/_base_.py @@ -0,0 +1,29 @@ +from abc import abstractmethod + +class SkyeyeCommand: + export = [] + + def __init__(self): + self.argparser = self.create_argparser() + + def print_help(self): + self.argparser.print_help() + + @abstractmethod + def __call__(self, *args): + pass + + @abstractmethod + def create_argparser(self): + pass + +# util func +def convert_int(x): + return int(x, 0) +convert_int.__name__ = 'int' + +def table_print(l): + COL_NUM = 5 + ITEM_WIDTH = 20 + for i in range(0, len(l), COL_NUM): + print(' '.join([item.ljust(ITEM_WIDTH) for item in l[i:i+COL_NUM]])) diff --git a/utils/pycli/skyeye_command/bp_create.py b/utils/pycli/skyeye_command/bp_create.py new file mode 100644 index 00000000..147e10f7 --- /dev/null +++ b/utils/pycli/skyeye_command/bp_create.py @@ -0,0 +1,38 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeCreateBreakpoint +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='bp_create', + description='Insert a break-point on a cpu-core.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu-core name', + ) + + parser.add_argument( + 'bp_addr', + metavar='', + type=convert_int, + help='break-point address (int)', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeCreateBreakpoint(ns.cpu, ns.bp_addr) + return False diff --git a/utils/pycli/skyeye_command/bp_delete.py b/utils/pycli/skyeye_command/bp_delete.py new file mode 100644 index 00000000..79794f0e --- /dev/null +++ b/utils/pycli/skyeye_command/bp_delete.py @@ -0,0 +1,38 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeDeleteBreakpointByAddr +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='bp_delete', + description='Delete a break-point on a cpu-core.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu-core name', + ) + + parser.add_argument( + 'bp_addr', + metavar='', + type=convert_int, + help='break-point address (int)', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeDeleteBreakpointByAddr(ns.cpu, ns.bp_addr) + return False diff --git a/utils/pycli/skyeye_command/bp_list.py b/utils/pycli/skyeye_command/bp_list.py new file mode 100644 index 00000000..2f65d7a7 --- /dev/null +++ b/utils/pycli/skyeye_command/bp_list.py @@ -0,0 +1,38 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeGetBpNumbers, SkyEyeGetBreakpointAddrById +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='bp_list', + description='Show all break-points.', + add_help=False) + parser.add_argument( + 'cpu', + metavar='', + help='cpu-core name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + temp = [] + n = SkyEyeGetBpNumbers(ns.cpu) + for i in range(n): + temp.append(SkyEyeGetBreakpointAddrById(ns.cpu, i)) + + print("%-25s%-25s" % ("CPU","Address(HEX)")) + for i in temp: + print("%-25s0x%-25x" % (ns.cpu, i)) + + return False diff --git a/utils/pycli/skyeye_command/cd.py b/utils/pycli/skyeye_command/cd.py new file mode 100644 index 00000000..50498c74 --- /dev/null +++ b/utils/pycli/skyeye_command/cd.py @@ -0,0 +1,29 @@ +from . import SkyeyeCommand +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='cd', + description='Change the Skyeye working directory.', + add_help=False) + + parser.add_argument( + 'path', + metavar='', + help='the path of directory', + ) + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + os.chdir(ns.path) + return False diff --git a/utils/pycli/skyeye_command/close_instr_record.py b/utils/pycli/skyeye_command/close_instr_record.py new file mode 100644 index 00000000..9e70cf6f --- /dev/null +++ b/utils/pycli/skyeye_command/close_instr_record.py @@ -0,0 +1,48 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from conf import * + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='close_instr_record', + description='close_instr_record', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x401f0004', ns.cpu]) + + try: + ret = SkyEyeCloseInstrRecord(ns.cpu) + except Exception as e: + raise SkyeyeAPIException(['0x401f0000', e]) + if ret == 0: + raise SkyeyeAPIException(['0x401f1f01', e]) + + return False diff --git a/utils/pycli/skyeye_command/configure_read.py b/utils/pycli/skyeye_command/configure_read.py new file mode 100644 index 00000000..b65fb695 --- /dev/null +++ b/utils/pycli/skyeye_command/configure_read.py @@ -0,0 +1,73 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from conf import * +import tools + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='configure_read', + description='configure_read', + add_help=False) + + parser.add_argument( + 'snapshot', + metavar='', + help='snapshot', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + t_cwd = os.getcwd() + try: + full_dir = tools.cmd_get_chp_dir(ns.snapshot) + except IOError as e: + raise SkyeyeAPIException(['0x40110000', e.message]) + + os.chdir(full_dir) + try: + tools.start_ckpt_config(full_dir) + except IOError as e: + raise SkyeyeAPIException(['0x40110000', e.message]) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + mach_list = config.get_mach_list() + for mach in mach_list: + cpu = config.get_cpuname_by_mach(mach) + cls = config.get_classname(cpu) + if cls == "x86": + SkyEyeX86LoadConfigure(cpu, full_dir) + + info_dic = tools.ckpt_get_image_info(full_dir) + images = info_dic.keys() + for image in images: + for page_l in info_dic[image]: + SkyEyeImageFileToPage(image, page_l[0], page_l[1]) + + config = os.path.join(full_dir, "config") + SkyEyeRecoverConfigure(config) + os.chdir(t_cwd) + + return False diff --git a/utils/pycli/skyeye_command/configure_write.py b/utils/pycli/skyeye_command/configure_write.py new file mode 100644 index 00000000..5632e208 --- /dev/null +++ b/utils/pycli/skyeye_command/configure_write.py @@ -0,0 +1,84 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from conf import * +import tools + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='configure_write', + description='configure_write', + add_help=False) + + parser.add_argument( + 'snapshot', + metavar='', + help='vmware snapshot', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + mach_list = config.get_mach_list() + cmd_dir = ns.snapshot + + json_file = config.get_current_fp() + skyeye_script = GetGlobalScript() + files = [json_file, skyeye_script] + if cmd_dir == None: + cmd_dir = 'skyeye.ckpt' + else: + if cmd_dir.endswith(".ckpt") == False: + cmd_dir = ''.join([cmd_dir, ".ckpt"]) + if tools.is_linux(): + ckpt_dir = os.path.join(os.getcwd(), cmd_dir) + else: + ws_dir = ws.get_workspace_dir() + if not os.path.exists(ws_dir): + raise SkyeyeAPIException(['0x401b1b01']) + ckpt_dir = os.path.join(ws_dir, cmd_dir) + try: + full_dir = tools.create_chp_dir(ckpt_dir) + tools.ckpt_save_files(full_dir, files) + except IOError as e: + raise SkyeyeAPIException(['0x401b0000', e]) + for mach in mach_list: + cpu = config.get_cpuname_by_mach(mach) + cls = config.get_classname(cpu) + if cls == "x86": + SkyEyeX86SaveConfigure(cpu, full_dir) + device_list = config.get_device_list_by_mach(mach) + for device in device_list: + cls = config.get_classname(device) + if cls == "image": + count = SkyEyeImageGetPageCount(device) + for i in range(0, count): + index = SkyEyeImageGetPageIndexById(device, i) + image_file_name = ''.join([device, "_%d" % index, ".image"]) + image_file_path = os.path.join(full_dir, image_file_name) + SkyEyeImagePageToFile(device, index, image_file_path) + tools.ckpt_save_image_info(full_dir, device, index, image_file_name) + steps = SkyEyeGetCpuSteps(cpu) + tools.ckpt_save_steps(full_dir, cpu, steps) + config = os.path.join(full_dir, "config") + print(config) + SkyEyeStoreConfigure(config) + + return False diff --git a/utils/pycli/skyeye_command/define_conf.py b/utils/pycli/skyeye_command/define_conf.py new file mode 100644 index 00000000..89440602 --- /dev/null +++ b/utils/pycli/skyeye_command/define_conf.py @@ -0,0 +1,46 @@ +from . import SkyeyeCommand +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import json_conf, define_json_file, SetGlobalConfig + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='define_conf', + description='config the machine.', + add_help=False) + + parser.add_argument( + 'path', + metavar='', + help='json config file path', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + if script: + script_dir = os.path.dirname(script) + path = os.path.join(script_dir, ns.path) + else: + path = ns.path + + if not os.path.exists(path): + raise SkyeyeAPIException(['0x401c0002', path]) + + Config = json_conf(parent=None, filename=path) + define_json_file[0] = path + Config.conf_check() + if not Config.instance(): + raise SkyeyeAPIException([ERROR_ALL_F, 'Config can\'t instance.']) + SetGlobalConfig(Config) + + return False diff --git a/utils/pycli/skyeye_command/disable_device_work.py b/utils/pycli/skyeye_command/disable_device_work.py new file mode 100644 index 00000000..845224a0 --- /dev/null +++ b/utils/pycli/skyeye_command/disable_device_work.py @@ -0,0 +1,44 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='disable_device_work', + description='disable_device_work', + add_help=False) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.device not in config.get_device_list(): + raise SkyeyeAPIException(['0x40050004', ns.device]) + try: + SkyEyeDisableDeviceWork(ns.device) + except Exception as e: + raise SkyeyeAPIException(['0x40050000', e]) + + return False diff --git a/utils/pycli/skyeye_command/disassemble.py b/utils/pycli/skyeye_command/disassemble.py new file mode 100644 index 00000000..bb6ffd1f --- /dev/null +++ b/utils/pycli/skyeye_command/disassemble.py @@ -0,0 +1,48 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='md', + description='Show infomation of disassembleat a address.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'addr', + metavar='', + type=convert_int, + help='memory address', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + disas_str =SkyEyeDisassemble(ns.cpu, ns.addr) + print ("%-20s%-20s" % ("Addr(HEX)", "Value")) + print ("%-20x%-20s" % (ns.addr, disas_str)) + + return False diff --git a/utils/pycli/skyeye_command/enable_device_work.py b/utils/pycli/skyeye_command/enable_device_work.py new file mode 100644 index 00000000..385c27f1 --- /dev/null +++ b/utils/pycli/skyeye_command/enable_device_work.py @@ -0,0 +1,45 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='enable_device_work', + description='enable_device_work', + add_help=False) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.device not in config.get_device_list(): + raise SkyeyeAPIException(['0x40080004', ns.device]) + + try: + SkyEyeEnableDeviceWork(ns.device) + except Exception as e: + raise SkyeyeAPIException(['0x40080000', e]) + + return False diff --git a/utils/pycli/skyeye_command/fj_clear.py b/utils/pycli/skyeye_command/fj_clear.py new file mode 100644 index 00000000..a6873de8 --- /dev/null +++ b/utils/pycli/skyeye_command/fj_clear.py @@ -0,0 +1,66 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='fj_clear', + description='(xxxxxx)', + add_help=False) + + parser.add_argument( + 'machine', + metavar='', + help='machine name', + ) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + parser.add_argument( + 'device_addr', + metavar='', + type=convert_int, + help='device addr', + ) + + parser.add_argument( + 'bit_index', + metavar='', + type=convert_int, + help='bit index', + ) + + parser.add_argument( + 'mode', + metavar='', + type=convert_int, + choices=range(3), + help='mode', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + ret = sfi.skyeye_clear_fj(ns.machine, ns.device, ns.device_addr, ns.bit_index, ns.mode) + if not ret: + msg = 'Failure deletion failed.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + print('Failure deletion successful.') + + return False diff --git a/utils/pycli/skyeye_command/fj_list.py b/utils/pycli/skyeye_command/fj_list.py new file mode 100644 index 00000000..55ebdb93 --- /dev/null +++ b/utils/pycli/skyeye_command/fj_list.py @@ -0,0 +1,37 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='fj_list', + description='(xxxxxx)', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + ret = sfi.skyeye_get_fj() + if ret is False: + msg = 'Call sfi.skyeye_get_fj() Failed' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + columns = ("Device","Mach","Register","Address(HEX)", "Bit(DEC)", "Mode(DEC)") + print ("%-20s%-20s%-20s%-20s%-10s%-10s" % columns) + for fj in ret: + #print ("%-20s%-20s%-20s%-20x%-10d%-10d" % (fj[0],fj[1],fj[2],fj[3],fj[4],fj[5])) + print("%-20s%-20s%-20s%-20x%-10d%-10d" % tuple(fj)) + + return False diff --git a/utils/pycli/skyeye_command/fj_set.py b/utils/pycli/skyeye_command/fj_set.py new file mode 100644 index 00000000..8e3b53e5 --- /dev/null +++ b/utils/pycli/skyeye_command/fj_set.py @@ -0,0 +1,66 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='fj_set', + description='(xxxxxx)', + add_help=False) + + parser.add_argument( + 'machine', + metavar='', + help='machine name', + ) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + parser.add_argument( + 'device_addr', + metavar='', + type=convert_int, + help='device addr', + ) + + parser.add_argument( + 'bit_index', + metavar='', + type=convert_int, + help='bit index', + ) + + parser.add_argument( + 'mode', + metavar='', + type=convert_int, + choices=range(3), + help='mode', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + ret = sfi.skyeye_set_fj(ns.machine, ns.device, ns.device_addr, ns.bit_index, ns.mode) + if not ret: + msg = 'Injection failure failed' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + print("Injection failure success") + return False diff --git a/utils/pycli/skyeye_command/get_pc.py b/utils/pycli/skyeye_command/get_pc.py new file mode 100644 index 00000000..2f8da6ba --- /dev/null +++ b/utils/pycli/skyeye_command/get_pc.py @@ -0,0 +1,46 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='get_pc', + description='get_pc', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x40200004', ns.cpu]) + try: + pc = SkyEyeGetPC(ns.cpu) + print("Current PC: 0x%x" % pc) + except Exception as e: + raise SkyeyeAPIException(['0x40200000', e]) + + return False diff --git a/utils/pycli/skyeye_command/help.py b/utils/pycli/skyeye_command/help.py new file mode 100644 index 00000000..e21c6a47 --- /dev/null +++ b/utils/pycli/skyeye_command/help.py @@ -0,0 +1,33 @@ +from . import SkyeyeCommand +import argparse +import os +import skyeye_cli +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='help', + description='Print help info.', + add_help=False, + ) + + parser.add_argument( + 'cmd', + metavar='', + nargs='?', + help='command name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + arg = arg.replace('-', '_') + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + return super(skyeye_cli.SkyEyeCli, cli).do_help(arg) diff --git a/utils/pycli/skyeye_command/history.py b/utils/pycli/skyeye_command/history.py new file mode 100644 index 00000000..71275362 --- /dev/null +++ b/utils/pycli/skyeye_command/history.py @@ -0,0 +1,30 @@ +from . import SkyeyeCommand +import argparse +import os +import skyeye_cli +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='history', + description='Show command history.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + arg = arg.replace('-', '_') + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + hist_len = cli.readline.get_current_history_length() + for i in range(1, hist_len+1): + hist_item = cli.readline.get_history_item(i) + print('%-5s %s' % (i, hist_item)) + + return False diff --git a/utils/pycli/skyeye_command/init_ok.py b/utils/pycli/skyeye_command/init_ok.py new file mode 100644 index 00000000..99f212a1 --- /dev/null +++ b/utils/pycli/skyeye_command/init_ok.py @@ -0,0 +1,30 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +import se_system as ss +from skyeye_common_module import * + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='init_ok', + description='init_ok', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyePrepareToRun() + + if ss.system is None: + ss.CreateClass() + + return False diff --git a/utils/pycli/skyeye_command/list_attr.py b/utils/pycli/skyeye_command/list_attr.py new file mode 100644 index 00000000..750ead81 --- /dev/null +++ b/utils/pycli/skyeye_command/list_attr.py @@ -0,0 +1,54 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeGetClassList, SkyEyeGetClassAttrList, SkyEyeGetClassAttrInfo +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_attr', + description='Show attribute of a class.', + add_help=False) + + parser.add_argument( + 'cls', + metavar='', + help='class name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + attr_info_l = [] + cls_l = SkyEyeGetClassList() + + if ns.cls not in cls_l: + msg = '"%s" ATTR information was not found' % ns.cls + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + attr_l = SkyEyeGetClassAttrList(ns.cls) + attr_l.sort() + attr_info_l = [] + for attr in attr_l: + info_l = SkyEyeGetClassAttrInfo(ns.cls, attr) + attr_info_l.append(info_l) + + print ("%-20s%-20s%s" % ("AttrName", "Type", "Description")) + #BUG len(info_l) == 4 + for info_l in attr_info_l: + if len(info_l) != 3: + destription = 'NULL' + else: + destription = info_l[2] + print("%-20s%-20s%s" % (info_l[0], info_l[1], destription)) + + return False diff --git a/utils/pycli/skyeye_command/list_class.py b/utils/pycli/skyeye_command/list_class.py new file mode 100644 index 00000000..456e8ee1 --- /dev/null +++ b/utils/pycli/skyeye_command/list_class.py @@ -0,0 +1,30 @@ +from . import SkyeyeCommand, table_print +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from skyeye_common_module import SkyEyeGetClassList + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_class', + description='Show all classes.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + cls_l = SkyEyeGetClassList() + cls_l.sort() + table_print(cls_l) + + return False diff --git a/utils/pycli/skyeye_command/list_connect.py b/utils/pycli/skyeye_command/list_connect.py new file mode 100644 index 00000000..f3e0be13 --- /dev/null +++ b/utils/pycli/skyeye_command/list_connect.py @@ -0,0 +1,40 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeGetClassList, SkyEyeGetClassConnectList +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_connect', + description='Show the connect information of a class.', + add_help=False) + + parser.add_argument( + 'cls', + metavar='', + help='class name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + cls_l = SkyEyeGetClassList() + if ns.cls not in cls_l: + msg = 'information CONNECT "%s" was not found' % ns.cls + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + connect_l = SkyEyeGetClassConnectList(ns.cls) + connect_l.sort() + table_print(connect_l) + + return False diff --git a/utils/pycli/skyeye_command/list_cpu.py b/utils/pycli/skyeye_command/list_cpu.py new file mode 100644 index 00000000..9c2d8934 --- /dev/null +++ b/utils/pycli/skyeye_command/list_cpu.py @@ -0,0 +1,35 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeCreateBreakpoint +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_cpu', + description='Show all available cpu.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + cpus = config.get_cpu_list() + print ("%-20s%-20s" % ("ID", "CpuName")) + for i, cpu in enumerate(cpus, 1): + print ("%-20d%-20s" % (i, cpu)) + + return False diff --git a/utils/pycli/skyeye_command/list_device.py b/utils/pycli/skyeye_command/list_device.py new file mode 100644 index 00000000..4d4583d4 --- /dev/null +++ b/utils/pycli/skyeye_command/list_device.py @@ -0,0 +1,58 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_device', + description='Show all current device.', + add_help=False) + + parser.add_argument( + 'machine', + metavar='', + nargs='?', + help='machine name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.machine is None: + print ("%-30s%-30s" % ("DeviceName", "BelongBoard")) + machlist = config.get_mach_list() + for mach in machlist: + mach_cls = config.get_mach_classname(mach) + if mach_cls == 'pc_mach': + cpu = config.get_cpuname_by_mach(mach) + if cpu: + x86_obj = x86(cpu) + for device in x86_obj.devices: + print ("%-30s%-30s" % (device.name, mach)) + else: + device_list = config.get_device_list_by_mach(mach) + for device in device_list: + print ("%-30s%-30s" % (device, mach)) + else: + print ("%-30s%-30s" % ("ID", "DeviceName")) + device_list = config.get_device_list_by_mach(ns.machine) + for i in range(0, len(device_list)): + print ("%-30s%-30s" % (i+1, device_list[i])) + + return False diff --git a/utils/pycli/skyeye_command/list_iface.py b/utils/pycli/skyeye_command/list_iface.py new file mode 100644 index 00000000..0c3152ee --- /dev/null +++ b/utils/pycli/skyeye_command/list_iface.py @@ -0,0 +1,41 @@ +from . import SkyeyeCommand, table_print +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from skyeye_common_module import SkyEyeGetClassIfaceList, SkyEyeGetClassList + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_iface', + description='Show the information of a class.', + add_help=False) + + parser.add_argument( + 'cls', + metavar='', + help='class name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + cls_l = SkyEyeGetClassList() + if ns.cls not in cls_l: + msg = 'information IFACE "%s" was not found' % ns.cls + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + iface_l = SkyEyeGetClassIfaceList(ns.cls) + iface_l.sort() + table_print(iface_l) + + return False diff --git a/utils/pycli/skyeye_command/list_machines.py b/utils/pycli/skyeye_command/list_machines.py new file mode 100644 index 00000000..78a54738 --- /dev/null +++ b/utils/pycli/skyeye_command/list_machines.py @@ -0,0 +1,34 @@ +from . import SkyeyeCommand +import argparse +import os +from conf import GetGlobalConfig +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_machines', + description='List all the supported machines for SkyEye.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + ml = config.get_mach_list() + print("%-20s%-20s" % ("Id", "MachinesName")) + for i in range(len(ml)): + print("%-20s%-20s" % (i+1, ml[i])) + + return False diff --git a/utils/pycli/skyeye_command/list_modules.py b/utils/pycli/skyeye_command/list_modules.py new file mode 100644 index 00000000..8e8428d3 --- /dev/null +++ b/utils/pycli/skyeye_command/list_modules.py @@ -0,0 +1,25 @@ +from . import SkyeyeCommand +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_modules', + description='List all the loaded module.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeListModules() + return False diff --git a/utils/pycli/skyeye_command/list_register.py b/utils/pycli/skyeye_command/list_register.py new file mode 100644 index 00000000..54cbcb43 --- /dev/null +++ b/utils/pycli/skyeye_command/list_register.py @@ -0,0 +1,51 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import SkyEyeCreateBreakpoint +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='list_register', + description='Show all registers of a device.', + add_help=False) + + parser.add_argument( + 'machine', + metavar='', + help='machine name', + ) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + ret = sfi.get_device_register_info(ns.machine, ns.device) + if not ret: + print('Device "%s" doesn\'t have any register.' % ns.device) + else: + print ("%-20s%-20s%-20s" % ("Register", "Value(HEX)", "Address(HEX)")) + for i in ret: + print ("%-20s%-20x%-20x" % (i, ret[i]["value"], ret[i]["addr"])) + + return False diff --git a/utils/pycli/skyeye_command/load_binary.py b/utils/pycli/skyeye_command/load_binary.py new file mode 100644 index 00000000..31e87db3 --- /dev/null +++ b/utils/pycli/skyeye_command/load_binary.py @@ -0,0 +1,54 @@ +from . import SkyeyeCommand +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig, binary_l +from skyeye_common_module import SkyEyeLoadBinary + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog=' load_binary', + description='load binary file.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='name of cpu', + ) + + parser.add_argument( + 'path', + metavar='', + help='bin file path', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + if script: + script_dir = os.path.dirname(script) + path = os.path.join(script_dir, ns.path) + else: + path = ns.path + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x40030004', ns.cpu]) + if not os.path.exists(path): + raise SkyeyeAPIException(['0x40030002', ns.path]) + ret = SkyEyeLoadBinary(ns.cpu, path) + binary_l[ns.cpu] = path + + return False diff --git a/utils/pycli/skyeye_command/load_file.py b/utils/pycli/skyeye_command/load_file.py new file mode 100644 index 00000000..6316e119 --- /dev/null +++ b/utils/pycli/skyeye_command/load_file.py @@ -0,0 +1,65 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +from skyeye_common_module import SkyEyeLoadFile + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog=' load_file', + description='load file', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='name of cpu', + ) + + parser.add_argument( + 'path', + metavar='', + help='file path', + ) + + parser.add_argument( + 'addr', + metavar='
', + type=convert_int, + help='address in memory', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + if script: + script_dir = os.path.dirname(script) + path = os.path.join(script_dir, ns.path) + else: + path = ns.path + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if not config: + raise SkyeyeAPIException(['0x40030003']) + + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x40030004', ns.cpu]) + + if not os.path.exists(path): + raise SkyeyeAPIException(['0x40030002', ns.path]) + + SkyEyeLoadFile(ns.cpu, path, ns.addr) + return False diff --git a/utils/pycli/skyeye_command/ls.py b/utils/pycli/skyeye_command/ls.py new file mode 100644 index 00000000..0d574a18 --- /dev/null +++ b/utils/pycli/skyeye_command/ls.py @@ -0,0 +1,36 @@ +from . import SkyeyeCommand +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='ls', + description='list directory contents', + add_help=False) + + parser.add_argument( + 'path', + metavar='', + nargs='?', + default='', + help='the path of file or directory', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns =self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + if ns.path and not os.path.exists(ns.path): + raise SkyeyeAPIException([ERROR_ALL_F, "No such file or directory"]) + + SkyEyeListDir(arg) + return False diff --git a/utils/pycli/skyeye_command/md.py b/utils/pycli/skyeye_command/md.py new file mode 100644 index 00000000..150b590c --- /dev/null +++ b/utils/pycli/skyeye_command/md.py @@ -0,0 +1,48 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='md', + description='Get the value at a address of memory.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'addr', + metavar='', + type=convert_int, + help='memory address', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + ret = SkyEyeReadMemory8(ns.cpu, ns.addr) + print ("%-20s%-20s" % ("Addr(HEX)", "Value(HEX)")) + print ("%-20x%-20x" % (ns.addr, ret)) + + return False diff --git a/utils/pycli/skyeye_command/mm_info.py b/utils/pycli/skyeye_command/mm_info.py new file mode 100644 index 00000000..c9b124d3 --- /dev/null +++ b/utils/pycli/skyeye_command/mm_info.py @@ -0,0 +1,35 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='mm_info', + description='mm_info', + add_help=False) + + parser.add_argument( + 'func', + nargs='?', + default='', + metavar='', + help='function name', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeMemoryInfo(ns.func) + + return False diff --git a/utils/pycli/skyeye_command/open_instr_record.py b/utils/pycli/skyeye_command/open_instr_record.py new file mode 100644 index 00000000..12e7655b --- /dev/null +++ b/utils/pycli/skyeye_command/open_instr_record.py @@ -0,0 +1,57 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +from conf import * +import tools + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='open_instr_record', + description='configure_read', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'log_file', + metavar='', + help='the log file path', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x40210004', ns.cpu]) + print(ns.cpu, ns.log_file) + try: + ret = SkyEyeOpenInstrRecord(ns.cpu, ns.log_file) + except Exception as e: + print('HAHA') + raise SkyeyeAPIException(['0x40210000', e]) + if ret == 0: + print('HOHO') + raise SkyeyeAPIException(['0x40212101', e]) + + return False diff --git a/utils/pycli/skyeye_command/q.py b/utils/pycli/skyeye_command/q.py new file mode 120000 index 00000000..c4a84747 --- /dev/null +++ b/utils/pycli/skyeye_command/q.py @@ -0,0 +1 @@ +quit.py \ No newline at end of file diff --git a/utils/pycli/skyeye_command/quit.py b/utils/pycli/skyeye_command/quit.py new file mode 100644 index 00000000..8d4ddedc --- /dev/null +++ b/utils/pycli/skyeye_command/quit.py @@ -0,0 +1,34 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import network_control as NetCtrl +import mips + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='quit', + description='Quit skyeye.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + cli.postloop() + if mips.mips_thread != None: + mips.mips_thread.stop() + NetCtrl.server_stop() + SkyEyeQuit() + + return False diff --git a/utils/pycli/skyeye_command/remote_gdb.py b/utils/pycli/skyeye_command/remote_gdb.py new file mode 100644 index 00000000..3eaa047e --- /dev/null +++ b/utils/pycli/skyeye_command/remote_gdb.py @@ -0,0 +1,62 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='remote_gdb', + description='Connect remote gdb.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'ip', + metavar='', + nargs='?', + default='0.0.0.0', + help='ip address', + ) + + parser.add_argument( + 'port', + metavar='', + type=convert_int, + help='port number', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + try: + ret = SkyEyeCreateRemoteGdb(ns.cpu, ns.port, ns.ip) + except: + msg = "An error has occurred happend when remote gdb start!\n" + msg += "Target CPU name: %s, Ip: %s, Port: %d" % (ns.cpu, ns.ip, ns.port) + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ret != 1: + msg = "Remote Gdb Start error, Target Cpu Name: %s, Ip: %s, Port: %d" % (ns.cpu, ns.ip, ns.port) + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + print("Remote Gdb Start OK!") + + return False diff --git a/utils/pycli/skyeye_command/reset.py b/utils/pycli/skyeye_command/reset.py new file mode 100644 index 00000000..f72f23b3 --- /dev/null +++ b/utils/pycli/skyeye_command/reset.py @@ -0,0 +1,31 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='reset', + description='Reset.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeReset() + pytimer.set_running(False) + self.open_conf_flag = False + + return False diff --git a/utils/pycli/skyeye_command/reverse.py b/utils/pycli/skyeye_command/reverse.py new file mode 100644 index 00000000..164ded0f --- /dev/null +++ b/utils/pycli/skyeye_command/reverse.py @@ -0,0 +1,92 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import tools +import os +import sys +from conf import * +import traceback +import shutil +from se_path import InstallDir + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='reverse', + description='reverse', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'size', + metavar='', + type=convert_int, + help='step size', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + ckpt = None + if tools.is_windows(): + ckpt = os.path.join(InstallDir, ".reverse.ckpt") + elif tools.is_linux(): + usr = os.path.expanduser('~') + ckpt = os.path.join(usr, ".skyeye", "revere.ckpt") + + t_cwd = os.getcwd() + os.chdir(ckpt) + if not GetReverseState(): + raise SkyeyeAPIException(['0x40131301']) + + core = args[0] + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if ns.cpu not in config.get_cpu_list(): + raise SkyeyeAPIException(['0x40130004', ns.cpu]) + + reverse_steps = tools.str_to_uint(ns.size) + steps = tools.ckpt_get_steps(ckpt, core) + current_steps = SkyEyeGetCpuSteps(core) + run_steps = current_steps - steps - reverse_steps + if current_steps == steps: + return + if reverse_steps > current_steps - steps: + raise SkyeyeAPIException(['0x40131302', current_steps - steps]) + + info_dic = tools.ckpt_get_image_info(ckpt) + images = info_dic.keys() + for image in images: + SkyEyeImageClearAllPages(image) + for page_l in info_dic[image]: + SkyEyeImageFileToPage(image, page_l[0], page_l[1]) + config = os.path.join(ckpt, "config") + SkyEyeRecoverConfigure(config) + os.chdir(t_cwd) + if run_steps != 0: + SkyEyeStepi(core, "%d" % run_steps) + + return False diff --git a/utils/pycli/skyeye_command/reverse_disable.py b/utils/pycli/skyeye_command/reverse_disable.py new file mode 100644 index 00000000..fb66bd6c --- /dev/null +++ b/utils/pycli/skyeye_command/reverse_disable.py @@ -0,0 +1,48 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +import tools +import os +import sys +from conf import * +import traceback +import shutil +from se_path import InstallDir + +import errormessage +from conf import * +from exception import * +import traceback +import shutil +from se_path import InstallDir + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='reverse_disable', + description='reverse_disable', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + if not GetReverseState(): + raise SkyeyeAPIException(['0x40066001']) + + SetReverseState(False) + + return False diff --git a/utils/pycli/skyeye_command/reverse_enable.py b/utils/pycli/skyeye_command/reverse_enable.py new file mode 100644 index 00000000..79281a4c --- /dev/null +++ b/utils/pycli/skyeye_command/reverse_enable.py @@ -0,0 +1,75 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +import tools +import os +import sys +from conf import * +import traceback +import shutil +from se_path import InstallDir +from conf import * +from exception import * +import traceback +import shutil +from se_path import InstallDir + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='reverse_enable', + description='reverse_enable', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + ckpt = None + if tools.is_windows(): + ckpt = os.path.join(InstallDir, ".reverse.ckpt") + elif tools.is_linux(): + usr = os.path.expanduser('~') + ckpt = os.path.join(usr, ".skyeye", "revere.ckpt") + + if GetReverseState(): + raise SkyeyeAPIException(['0x40099001']) + + SetReverseState(True) + if os.path.exists(ckpt): + shutil.rmtree(ckpt) + full_ckpt_dir = tools.create_chp_dir(ckpt) + + mach_list = config.get_mach_list() + for mach in mach_list: + cpu = config.get_cpuname_by_mach(mach) + device_list = config.get_device_list_by_mach(mach) + for device in device_list: + cls = config.get_classname(device) + if cls == "image": + count = SkyEyeImageGetPageCount(device) + for i in range(0, count): + index = SkyEyeImageGetPageIndexById(device, i) + image_file_name = ''.join([device, "_%d" % index, ".image"]) + image_file_path = os.path.join(full_ckpt_dir, image_file_name) + SkyEyeImagePageToFile(device, index, image_file_path) + tools.ckpt_save_image_info(full_ckpt_dir, device, index, image_file_name) + steps = SkyEyeGetCpuSteps(cpu) + tools.ckpt_save_steps(full_ckpt_dir, cpu, steps) + config = os.path.join(full_ckpt_dir, "config") + SkyEyeStoreConfigure(config) + + return False diff --git a/utils/pycli/skyeye_command/run.py b/utils/pycli/skyeye_command/run.py new file mode 100644 index 00000000..496f8c9c --- /dev/null +++ b/utils/pycli/skyeye_command/run.py @@ -0,0 +1,30 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='run', + description='Run.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeRun() + pytimer.set_running(True) + + return False diff --git a/utils/pycli/skyeye_command/run_command.py b/utils/pycli/skyeye_command/run_command.py new file mode 100644 index 00000000..cf333c23 --- /dev/null +++ b/utils/pycli/skyeye_command/run_command.py @@ -0,0 +1,43 @@ +from . import SkyeyeCommand +import argparse +import os +import cli +from tools import SkyEyeSetScriptPath +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import SetGlobalScript +import project_config as pc +from importlib import import_module, reload + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='run_script', + description='Run skyeye script.', + add_help=False) + + parser.add_argument( + 'command', + nargs='+', + metavar='', + help='one-command', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + name, arg = ns.command[0], ' '.join(ns.command[1:]) + skyeye_command = import_module('skyeye_command') + command = getattr(skyeye_command, name, None) + if command is None: + msg = 'Unknown command: %s' % name + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + command(arg=arg, cli=cli) + + return False diff --git a/utils/pycli/skyeye_command/run_py.py b/utils/pycli/skyeye_command/run_py.py new file mode 100644 index 00000000..9e813b99 --- /dev/null +++ b/utils/pycli/skyeye_command/run_py.py @@ -0,0 +1,41 @@ +from . import SkyeyeCommand +import argparse +from exception import SkyeyeAPIException, ERROR_ALL_F +from skyeye_common_module import * + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='run_py', + description='run python expressions', + add_help=False) + + parser.add_argument( + 'expr', + metavar='', + nargs='*', + default='', + help='python expressions', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns =self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + try: + self._run_python_expr(arg) + except: + import traceback + raise SkyeyeAPIException([ERROR_ALL_F, traceback.format_exc()]) + + return False + + def _run_python_expr(self, _expr): + del self + exec(_expr) diff --git a/utils/pycli/skyeye_command/run_script.py b/utils/pycli/skyeye_command/run_script.py new file mode 100644 index 00000000..e6112f7e --- /dev/null +++ b/utils/pycli/skyeye_command/run_script.py @@ -0,0 +1,68 @@ +from . import SkyeyeCommand +import argparse +import os +import cli +from tools import SkyEyeSetScriptPath +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import SetGlobalScript +import project_config as pc +from importlib import import_module, reload + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='run_script', + description='Run skyeye script.', + add_help=False) + + parser.add_argument( + 'path', + metavar='', + help='name of skyeye-script', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + if cli.open_conf_flag: + raise SkyeyeAPIException([ERROR_ALL_F, 'Do not reload until RESET is performed']) + + SetGlobalScript(ns.path) + full_file_name = os.path.realpath(ns.path) + if not os.path.exists(ns.path): + raise SkyeyeAPIException(['0x40160002', ns.path]) + + SkyEyeSetScriptPath(full_file_name) + commands = self._get_commands_form_script(full_file_name) + for command, arg in commands: + command(arg=arg, cli=cli, script=full_file_name) + + cli.open_conf_flag = True + + return False + + def _get_commands_form_script(self, path): + skyeye_command = import_module('skyeye_command') + commands = [] + with open(path) as f: + for line in f: + line = line.strip() + if line and not line.startswith('#'): + name_and_arg = line.split(maxsplit=1) + if len(name_and_arg) == 1: + name_and_arg.append('') + name, arg = name_and_arg + name = name.replace('-', '_') + command = getattr(skyeye_command, name, None) + if command is None: + msg = 'Unknown command: %s' % name + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + commands.append((command, arg)) + return commands diff --git a/utils/pycli/skyeye_command/set_mode.py b/utils/pycli/skyeye_command/set_mode.py new file mode 100644 index 00000000..3e47831c --- /dev/null +++ b/utils/pycli/skyeye_command/set_mode.py @@ -0,0 +1,41 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig, SetAllToDyncom +import fault_inject as sfi + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='set_mode', + description='Set the cpu running mode', + add_help=False) + + parser.add_argument( + 'mode', + metavar='', + type=convert_int, + choices=range(4), + help='mode (choose from 0, 1, 2, 3)', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + config = GetGlobalConfig() + if not config: + msg = 'Can\'t get the config.' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + print ("--%d--" % ns.mode) + SetAllToDyncom(ns.mode) + return False diff --git a/utils/pycli/skyeye_command/set_pc.py b/utils/pycli/skyeye_command/set_pc.py new file mode 100644 index 00000000..cf951b64 --- /dev/null +++ b/utils/pycli/skyeye_command/set_pc.py @@ -0,0 +1,46 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='set_pc', + description='set_pc', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'value', + metavar='', + type=convert_int, + help='value', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + ret = SkyEyeSetPC(ns.cpu, ns.value) + + if ret == 0: + msg = 'SkyEyeSetPC Failed!' + raise SkyeyeAPIException([ERROR_ALL_F, msg]) + + return False diff --git a/utils/pycli/skyeye_command/set_register.py b/utils/pycli/skyeye_command/set_register.py new file mode 100644 index 00000000..56799d19 --- /dev/null +++ b/utils/pycli/skyeye_command/set_register.py @@ -0,0 +1,55 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi + +from skyeye_common_module import SkyEyeGetDevRegIdByName, SkyEyeSetDevRegValueById + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='set_register', + description='Set a value to a register.', + add_help=False) + + parser.add_argument( + 'machine', + metavar='', + help='machine name', + ) + + parser.add_argument( + 'device', + metavar='', + help='device name', + ) + + parser.add_argument( + 'register', + metavar='', + help='device name', + ) + + parser.add_argument( + 'value', + metavar='', + type=convert_int, + help='value of int', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + regid = SkyEyeGetDevRegIdByName(ns.machine, ns.device, ns.register) + ret = SkyEyeSetDevRegValueById(ns.machine, ns.device, ns.value, regid) + + return False diff --git a/utils/pycli/skyeye_command/shell.py b/utils/pycli/skyeye_command/shell.py new file mode 100644 index 00000000..1746c23b --- /dev/null +++ b/utils/pycli/skyeye_command/shell.py @@ -0,0 +1,38 @@ +from . import SkyeyeCommand +import argparse +from exception import SkyeyeAPIException, ERROR_ALL_F +from skyeye_common_module import * +import subprocess +import shlex + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='shell', + description='run a shell command', + add_help=False) + + parser.add_argument( + 'shell_cmd', + metavar='', + default='', + help='shell command', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + # try: + # ns =self.argparser.parse_args(arg.split()) + # except: + # raise SkyeyeAPIException([ERROR_ALL_F, '']) + if arg: + try: + subprocess.run(shlex.split(arg)) + except: + import traceback + raise SkyeyeAPIException([ERROR_ALL_F, traceback.format_exc()]) + + return False diff --git a/utils/pycli/skyeye_command/speed.py b/utils/pycli/skyeye_command/speed.py new file mode 100644 index 00000000..4e5f5172 --- /dev/null +++ b/utils/pycli/skyeye_command/speed.py @@ -0,0 +1,31 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import mips + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='speed', + description='Show the current running speed of the cpu.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + mips_dic = mips.get() + for item in mips_dic: + print ("CPU:%20s SPEED:%d" % (item, mips_dic[item])) + + return False diff --git a/utils/pycli/skyeye_command/stepi.py b/utils/pycli/skyeye_command/stepi.py new file mode 100644 index 00000000..02cecba4 --- /dev/null +++ b/utils/pycli/skyeye_command/stepi.py @@ -0,0 +1,42 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='stepi', + description='Step one instruction exactly.', + add_help=False) + + parser.add_argument( + 'cpu', + metavar='', + help='cpu name', + ) + + parser.add_argument( + 'size', + metavar='', + type=convert_int, + help='step size', + ) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeStepi(ns.cpu, str(ns.size)) + + return False diff --git a/utils/pycli/skyeye_command/stop.py b/utils/pycli/skyeye_command/stop.py new file mode 100644 index 00000000..c97033b0 --- /dev/null +++ b/utils/pycli/skyeye_command/stop.py @@ -0,0 +1,30 @@ +from . import SkyeyeCommand, convert_int +import argparse +import os +from skyeye_common_module import * +from exception import SkyeyeAPIException, ERROR_ALL_F +from conf import GetGlobalConfig +import fault_inject as sfi +import pytimer + +class Command(SkyeyeCommand): + export = ['cli'] + + def create_argparser(self): + parser = argparse.ArgumentParser( + prog='stop', + description='Stop.', + add_help=False) + + return parser + + def __call__(self, arg='', cli=None, script=None, **meta): + try: + ns = self.argparser.parse_args(arg.split()) + except: + raise SkyeyeAPIException([ERROR_ALL_F, '']) + + SkyEyeStop() + pytimer.set_running(False) + + return False -- Gitee