jacking/zynq/elf2oocd.py

50 lines
1.1 KiB
Python
Executable File

#!/usr/bin/env python3
import struct, sys
import hackyelf
if len(sys.argv) == 1:
printf("Usage: %s <input.elf> > <output.cfg>" % sys.argv[0], file=sys.stderr)
sys.exit(1)
elfblob = None
with open(sys.argv[1], 'rb') as f:
elfblob = f.read()
elf = hackyelf.parse(elfblob)
print("""
# TODO: reset halt maybe?
halt
""")
endian = '<' if elf.ident[5] == 1 else '>'
for phdr in elf.phdrs:
lenbytes = min(phdr.filesz, phdr.memsz)
zerobytes = phdr.memsz - lenbytes
baseaddr = phdr.paddr if phdr.paddr else phdr.vaddr
# text/data
lenm4 = lenbytes - (lenbytes & 3)
data = struct.unpack('%c%dI' % (endian, lenm4>>2), elfblob[phdr.off:(phdr.off+lenm4)])
for i in range(0, lenbytes, 4):
print("mww 0x%08x 0x%08x" % ((baseaddr + i), data[i>>2]))
if lenm4 != lenbytes:
for i in range(lenm4, lenbytes):
print("mwb 0x%08x 0x%02x" % ((baseaddr + i), elfblob[phdr.off + i]))
# bss
if zerobytes:
print("mwb 0x%08x 0x00 0x%08x" % ((baseaddr + lenbytes), zerobytes))
print("""
# set pc to entrypoint
reg pc 0x%08x
""" % elf.entry)