def __init__(self, config): assert("s2e" in config) #S2E configuration must be present assert("machine_configuration" in config) #Configurable machine configuration must be present self._s2e_configuration = config["s2e"] self._cm_configuration = config["machine_configuration"] self._output_directory = config["output_directory"] self._config_directory = config["configuration_directory"] self._avatar_configuration = "avatar_configuration" in config and config["avatar_configuration"] or {} self._qemu_configuration = ("qemu_configuration" in config) and config["qemu_configuration"] or {} mem_addr = "localhost" mem_port = get_random_free_port() if not isinstance(self._s2e_configuration["plugins"],OrderedDict): log.warn("plugins dictionnary should be ordered (use OrderedDict), s2e should take care of ordering plugins one day !") if "RemoteMemory" in self._s2e_configuration["plugins"] \ and "listen_address" in self._s2e_configuration["plugins"]["RemoteMemory"] \ and self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"]: listen_addr = self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"] mem_addr = str(listen_addr[:listen_addr.rfind(":")]) mem_port = int(listen_addr[listen_addr.rfind(":") + 1:]) self._s2e_remote_memory_plugin_sockaddr = (mem_addr, mem_port) #TODO: Test if this is specified in configuration, and use values from config if so self._s2e_gdb_sockaddr = ("localhost", get_random_free_port())
def __init__(self, config): assert("s2e" in config) #S2E configuration must be present assert("machine_configuration" in config) #Configurable machine configuration must be present self._s2e_configuration = config["s2e"] self._cm_configuration = config["machine_configuration"] self._output_directory = config["output_directory"] self._config_directory = config["configuration_directory"] self._avatar_configuration = "avatar_configuration" in config and config["avatar_configuration"] or {} self._qemu_configuration = ("qemu_configuration" in config) and config["qemu_configuration"] or {} mem_addr = "127.0.0.1" mem_port = get_random_free_port() if not isinstance(self._s2e_configuration["plugins"],OrderedDict): log.warn("plugins dictionnary should be ordered (use OrderedDict), s2e should take care of ordering plugins one day !") if "RemoteMemory" in self._s2e_configuration["plugins"] \ and "listen_address" in self._s2e_configuration["plugins"]["RemoteMemory"] \ and self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"]: listen_addr = self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"] mem_addr = str(listen_addr[:listen_addr.rfind(":")]) mem_port = int(listen_addr[listen_addr.rfind(":") + 1:]) self._s2e_remote_memory_plugin_sockaddr = (mem_addr, mem_port) #TODO: Test if this is specified in configuration, and use values from config if so self._s2e_gdb_sockaddr = ("127.0.0.1", get_random_free_port())
def get_command_line(self): cmdline = [] # Check if debugging/tracing facilities are to be employed. # See http://wiki.qemu.org/Documentation/Debugging for details. if "gdbserver" in self._qemu_configuration and self._qemu_configuration["gdbserver"]: cmdline.append("gdbserver") # TODO: make this a configurable IP:port tuple cmdline.append("localhost:1222") elif "valgrind" in self._qemu_configuration and self._qemu_configuration["valgrind"]: cmdline.append("valgrind") cmdline.append("--smc-check=all") cmdline.append("--leak-check=full") # S2E parameters cmdline.append(self.get_s2e_executable(self._cm_configuration["architecture"], "endianness" in self._cm_configuration and self._cm_configuration["endianness"] or "little")) cmdline.append("-s2e-config-file") cmdline.append(os.path.join(self._output_directory, "s2e_conf.lua")) if "verbose" in self._s2e_configuration and self._s2e_configuration["verbose"]: cmdline.append("-s2e-verbose") if "max-process" in self._s2e_configuration : cmdline.append("-s2e-max-processes") cmdline.append(" %d"% self._s2e_configuration["verbose"]) cmdline.append("-nographic") # QEMU parameters cmdline.append("-M") cmdline.append("configurable") cmdline.append("-kernel") cmdline.append(os.path.join(self._output_directory, "configurable_machine.json")) if "halt_processor_on_startup" in self._qemu_configuration and self._qemu_configuration["halt_processor_on_startup"]: cmdline.append("-S") self._qemu_configuration["gdb"] = "tcp::%d,server" % get_random_free_port() cmdline.append("-gdb") cmdline.append("tcp:127.0.0.1:%d,server" % self._s2e_gdb_sockaddr[1]) if "append" in self._qemu_configuration: for val in self._qemu_configuration["append"]: cmdline.append(val) TRACE_OPTIONS = {"trace_instructions": "in_asm", "trace_microops": "op"} trace_opts = [] for (config_trace_opt, qemu_trace_opt) in TRACE_OPTIONS.items(): if config_trace_opt in self._qemu_configuration and self._qemu_configuration[config_trace_opt]: trace_opts.append(qemu_trace_opt) if trace_opts: cmdline.append("-D") cmdline.append(os.path.join(self._output_directory, "qemu_trace.log")) cmdline.append("-d") cmdline.append(",".join(trace_opts)) if "extra_opts" in self._qemu_configuration: for o in self._qemu_configuration["extra_opts"]: cmdline.append(o) return cmdline
def __init__(self, s2e_configuration, qemu_configuration, output_directory, configuration_directory): self._s2e_configuration = s2e_configuration self._cm_configuration = qemu_configuration["machine_configuration"] self._output_directory = output_directory self._config_directory = configuration_directory self._avatar_configuration = "avatar_configuration" in qemu_configuration and qemu_configuration["avatar_configuration"] or {} self._qemu_configuration = qemu_configuration["qemu_configuration"] or {} mem_addr = "127.0.0.1" mem_port = get_random_free_port() if not isinstance(self._s2e_configuration["plugins"],OrderedDict): log.warn("plugins dictionnary should be ordered (use OrderedDict), s2e should take care of ordering plugins one day !") if "RemoteMemory" in self._s2e_configuration["plugins"] \ and "listen_address" in self._s2e_configuration["plugins"]["RemoteMemory"] \ and self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"]: listen_addr = self._s2e_configuration["plugins"]["RemoteMemory"]["listen_address"] mem_addr = str(listen_addr[:listen_addr.rfind(":")]) mem_port = int(listen_addr[listen_addr.rfind(":") + 1:]) self._s2e_remote_memory_plugin_sockaddr = (mem_addr, mem_port) #TODO: Test if this is specified in configuration, and use values from config if so self._s2e_gdb_sockaddr = ("127.0.0.1", get_random_free_port())