Example #1
0
def do_patch_cmd(args):
    img = args.image
    logging.info("loading ROM from '%s'", img)
    rom_img = rom.Loader.load(img)
    # is kick?
    kh = rom.KickRomAccess(rom_img)
    is_kick = kh.is_kick_rom()
    # apply patches
    rp = rom.RomPatcher(rom_img)
    for patch in args.patches:
        name, patch_args = KeyValue.parse_name_args_string(patch)
        logging.info("searching patch '%s' -> %s %s", patch, name, patch_args)
        p = rp.find_patch(name)
        if p is None:
            logging.error("can't find patch '%s'", name)
            return 1
        ok = rp.apply_patch(p, patch_args)
        if ok:
            logging.info("applied patch '%s'", name)
        else:
            logging.error("error applying patch '%s'", name)
            return 2
    # update kick sum
    rom_data = rp.get_patched_rom()
    if is_kick:
        kh = rom.KickRomAccess(rom_data)
        cs = kh.write_check_sum()
        logging.info("updated kicksum=%08x", cs)
    # save rom
    output = args.output
    if output is not None:
        logging.info("saving ROM to '%s'", output)
        with open(output, "wb") as fh:
            fh.write(rom_data)
    return 0
Example #2
0
def do_info_cmd(args):
    img = args.image
    rom_img = rom.Loader.load(img)
    kh = rom.KickRomAccess(rom_img)
    checks = [
        ("size", kh.check_size()),
        ("header", kh.check_header()),
        ("footer", kh.check_footer()),
        ("size_field", kh.check_size()),
        ("chk_sum", kh.verify_check_sum()),
        ("kickety_split", kh.check_kickety_split()),
        ("magic_reset", kh.check_magic_reset()),
        ("is_kick", kh.is_kick_rom()),
    ]
    c = ["%-20s  %s" % (x[0], "ok" if x[1] else "NOK") for x in checks]
    for i in c:
        print(i)
    values = [
        ("check_sum", "%08x", kh.read_check_sum()),
        ("base_addr", "%08x", kh.get_base_addr()),
        ("boot_pc", "%08x", kh.read_boot_pc()),
        ("rom_rev", "%d.%d", kh.read_rom_ver_rev()),
        ("exec_rev", "%d.%d", kh.read_exec_ver_rev()),
    ]
    v = ["%-20s  %s" % (x[0], x[1] % x[2]) for x in values]
    for i in v:
        print(i)
    return 0
Example #3
0
def do_diff_cmd(args):
    # load ROMs
    img_a = args.image_a
    logging.info("loading ROM A from '%s'", img_a)
    rom_a = rom.Loader.load(img_a)
    img_b = args.image_b
    logging.info("loading ROM B from '%s'", img_b)
    rom_b = rom.Loader.load(img_b)
    # check sizes
    size_a = len(rom_a)
    size_b = len(rom_b)
    if not args.force and size_a != size_b:
        logging.error("ROM differ in size (%08x != %08x). Aborting", size_a,
                      size_b)
        return 2
    # do diff
    base_addr = 0
    if args.rom_addr:
        base_addr = int(args.rom_addr, 16)
    elif args.show_address:
        kh = rom.KickRomAccess(rom_a)
        if kh.is_kick_rom():
            base_addr = kh.get_base_addr()
        else:
            logging.error("Not a KickROM! Can't detect base address.")
            return 3
    print_hex_diff(rom_a,
                   rom_b,
                   num=args.columns,
                   show_same=args.same,
                   base_addr=base_addr)
    return 0
Example #4
0
def do_copy_cmd(args):
    in_img = args.in_image
    logging.info("loading ROM from '%s'", in_img)
    rom_img = rom.Loader.load(in_img)
    kh = rom.KickRomAccess(rom_img)
    if args.fix_checksum:
        kh.make_writable()
        kh.write_check_sum()
    out_img = args.out_image
    logging.info("saving ROM to '%s'", out_img)
    with open(out_img, "wb") as fh:
        fh.write(kh.get_data())
Example #5
0
def do_combine_cmd(args):
    # load kick rom
    kick_img = args.kick_rom
    logging.info("loading Kick ROM from '%s'", kick_img)
    kick_rom = rom.Loader.load(kick_img)
    # load ext rom
    ext_img = args.ext_rom
    logging.info("loading Ext ROM from '%s'", ext_img)
    ext_rom = rom.Loader.load(ext_img)
    # check kick
    logging.info("validating Kick ROM")
    ka = rom.KickRomAccess(kick_rom)
    if not ka.is_kick_rom():
        logging.error("Not a Kick ROM image!")
        return 1
    if ka.get_size_kib() != 512:
        logging.error("Not a 512 KiB Kick ROM image!")
        return 2
    if ka.get_base_addr() != 0xF80000:
        logging.error("Kick ROM base address is not 0xf80000!")
        return 3
    # check ext
    logging.info("validating Ext ROM")
    ka = rom.KickRomAccess(ext_rom)
    if not ka.check_header():
        logging.error("No ROM Header in Ext ROM image found!")
    if (ka.get_size_kib() != 512 and ka.get_size_kib() != 1536
            and ka.get_size_kib() != 3584):
        logging.error("Not a 512/1536/3584 KiB Ext ROM image!")
    # write rom
    rom_img = ext_rom + kick_rom
    output = args.output
    if output is not None:
        logging.info("saving ROM to '%s'", output)
        with open(output, "wb") as fh:
            fh.write(rom_img)
    return 0
Example #6
0
def do_dump_cmd(args):
    img = args.image
    logging.info("loading ROM from '%s'", img)
    rom_img = rom.Loader.load(img)
    base_addr = 0
    if args.rom_addr:
        base_addr = int(args.rom_addr, 16)
    elif args.show_address:
        kh = rom.KickRomAccess(rom_img)
        if kh.is_kick_rom():
            base_addr = kh.get_base_addr()
        else:
            logging.error("Not a KickROM! Can't detect base address.")
            return 3
    print_hex(rom_img, num=args.columns, base_addr=base_addr)