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
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
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
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())
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
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)