Exemple #1
0
def c2mpt_local_run(input_file, arguments):
    """

    :param input_file:
    :type input_file:
    :param arguments:
    :type arguments:
    """

    print_info("Compiling program for host")

    cprog = arguments["host_c_compiler"]
    cflags = " -std=c99"
    cflags += " -DMPT_BASE_ADDRESS=%d" % arguments.get("host_displacement", 0)
    cflags += " ".join(
        [" -I \"" + elem + "\"" for elem in MICROPROBE_RC['template_paths']])
    cflags += " \"%s\"" % findfiles(MICROPROBE_RC['template_paths'],
                                    "c2mpt.c$")[0]
    cflags += " -Wl,--section-start,microprobe.text="
    cflags += hex(arguments["default_code_address"])
    cflags += " -Wl,--section-start,microprobe.data="
    cflags += hex(arguments["default_data_address"])
    cflags += " " + arguments["host_c_compiler_flags"]

    suffix = ".host.bin"
    if "save_temps" in arguments:
        compile_file = input_file.rstrip(".c") + suffix
    else:
        compile_file = _temp_file(suffix=suffix)
        _RM_FILES.append(compile_file)

    cmd = "\"%s\" %s \"%s\" -o \"%s\"" % (cprog, cflags, input_file,
                                          compile_file)

    print_info("Executing compilation command")
    run_cmd(cmd)

    print_info("Executing the compiled program")
    vardefinitions = run_cmd_output("%s" % compile_file)

    return vardefinitions
Exemple #2
0
def dump_bin(target, arguments):
    """

    :param target:
    :type target:
    :param arguments:
    :type arguments:
    """

    print_info("Parsing input file...")

    cmd = "od -Ax -tx1 -v '%s'" % arguments['input_bin_file']
    text_string = run_cmd_output(cmd)
    bintext = []
    for line in text_string.split('\n'):
        if line == "":
            continue
        bintext.append("".join(line.split(' ')[1:]))

    instrs = interpret_bin("".join(bintext), target, safe=arguments['safe'])

    for instr in instrs:
        print(instruction_from_definition(instr).assembly())
def dump_objdump(target, arguments):
    """

    :param target:
    :type target:
    :param arguments:
    :type arguments:
    """

    cmd = "'%s' -Ax -tx1 -v '%s'" % (arguments['od_bin'],
                                     arguments['input_bin_file'])
    text_string = run_cmd_output(cmd)
    bintext = []
    for line in text_string.split('\n'):
        if line == "":
            continue
        bintext.append("".join(line.split(' ')[1:]))

    instrs = interpret_bin("".join(bintext), target)

    print("")
    print("%s:\tfile format raw %s" %
          (os.path.basename(arguments['input_bin_file']), target.isa.name))
    print("")
    print("")
    print("Disassembly of section .raw:")
    print("")

    maxlen = max(len(instr.asm[2:]) for instr in instrs)
    if maxlen % 2 != 0:
        maxlen = maxlen + 1
    maxlen += maxlen // 2

    counter = arguments['start_address']

    label_dict = RejectingOrderedDict()
    instr_dict = RejectingOrderedDict()

    for instr_def in instrs:
        instr = instruction_from_definition(instr_def, fix_relative=False)
        asm = instr.assembly().lower()

        relative = None
        absolute = None
        if instr.branch:

            for memoperand in instr.memory_operands():

                if not memoperand.descriptor.is_branch_target:
                    continue

                for operand in memoperand.operands:

                    if operand.type.address_relative:
                        relative = operand.value

                    if operand.type.address_absolute:
                        absolute = operand.value

        masm = instr_def.asm[2:]
        if len(masm) % 2 != 0:
            masm = "0" + masm

        binary = " ".join([str(masm)[i:i + 2] for i in range(0, len(masm), 2)])

        label = None
        if counter == 0:
            label = ".raw"
            label_dict[counter] = label
        elif counter in label_dict:
            label = label_dict[counter]

        rtarget = None
        atarget = None
        if relative is not None or absolute is not None:

            if relative is not None:
                assert absolute is None

                if isinstance(relative, six.integer_types):
                    target_addr = counter + relative
                    rtarget = relative
                elif isinstance(relative, Address):
                    target_addr = counter + relative.displacement
                    rtarget = relative.displacement
                else:
                    raise NotImplementedError

            if absolute is not None:
                assert relative is None

                if isinstance(absolute, six.integer_types):
                    target_addr = absolute
                    atarget = absolute
                elif isinstance(absolute, Address):
                    target_addr = absolute.displacement
                    atarget = absolute.displacement
                else:
                    raise NotImplementedError

            if target_addr not in label_dict:
                label_dict[target_addr] = "branch_%x" % target_addr

            if target_addr in instr_dict:
                instr_dict[target_addr][2] = label_dict[target_addr]

        instr_dict[counter] = [binary, asm, label, rtarget, atarget]
        counter = counter + len(masm) // 2

    str_format = "%8s:\t%-" + str(maxlen) + "s\t%s"
    addresses = []
    for counter, values in instr_dict.items():

        binary, asm, label, rtarget, atarget = values

        if label is not None:
            print("%016x <%s>:" % (counter, label))

        cformat = str_format
        if rtarget is not None:
            cformat = str_format + "\t <%s>" % (label_dict[counter + rtarget])
        elif atarget is not None:
            cformat = str_format + "\t <%s>" % (label_dict[atarget])

        print(cformat % (hex(counter)[2:], binary, asm))
        addresses.append(counter)

    error = False
    for key in label_dict.keys():
        if key not in addresses:
            print_warning("Target address '%s' not in the objdump" % hex(key))
            error = True

    if error and arguments['strict']:
        print_error("Check target addresses of relative branches")
        exit(-1)