Exemplo n.º 1
0
 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())
Exemplo n.º 2
0
 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())
Exemplo n.º 3
0
    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
Exemplo n.º 4
0
    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())