util: bsp-tool: extract bootstrap exec constants and store them in the bsp image
This commit is contained in:
@@ -3,7 +3,9 @@ import sys
|
||||
import os
|
||||
import shutil
|
||||
import tarfile
|
||||
import struct
|
||||
from lib.manifest import Manifest, Component
|
||||
from lib.elf import ELF64Image
|
||||
|
||||
|
||||
def reset():
|
||||
@@ -59,12 +61,13 @@ def add_binary():
|
||||
|
||||
|
||||
def build_bsp():
|
||||
if len(sys.argv) < 3:
|
||||
print("USAGE: {} build-bsp <manifest-path> <dest-path>".format(sys.argv[0]))
|
||||
if len(sys.argv) < 4:
|
||||
print("USAGE: {} build-bsp <manifest-path> <bootstrap-program-path> <dest-path>".format(sys.argv[0]))
|
||||
return -1
|
||||
|
||||
manifest_path = sys.argv[2]
|
||||
bsp_path = sys.argv[3]
|
||||
bootstrap_path = sys.argv[3]
|
||||
bsp_path = sys.argv[4]
|
||||
|
||||
if os.path.exists(bsp_path):
|
||||
os.remove(bsp_path)
|
||||
@@ -82,9 +85,6 @@ def build_bsp():
|
||||
header_dest = header_dest[1:]
|
||||
|
||||
for f in os.listdir(header_src):
|
||||
print('ADD {} -> {}'.format(
|
||||
os.path.join(header_src, f),
|
||||
os.path.join(header_dest, f)))
|
||||
bsp_file.add(
|
||||
os.path.join(header_src, f),
|
||||
arcname=os.path.join(header_dest, f))
|
||||
@@ -94,10 +94,54 @@ def build_bsp():
|
||||
binary_dest = b['dest']
|
||||
while binary_dest.startswith('/'):
|
||||
binary_dest = binary_dest[1:]
|
||||
binary_dest = os.path.join(binary_dest, os.path.basename(binary_src))
|
||||
|
||||
bsp_file.add(binary_src, arcname=binary_dest)
|
||||
|
||||
bsp_file.close()
|
||||
bootstrap_offset = os.path.getsize(bsp_path)
|
||||
|
||||
bsp = open(bsp_path, mode='ab')
|
||||
prog = open(bootstrap_path, mode='rb')
|
||||
|
||||
padding = bootstrap_offset % 0x1000
|
||||
bsp.write(b'\0' * padding)
|
||||
bootstrap_offset += padding
|
||||
prog_len = 0
|
||||
|
||||
while True:
|
||||
data = prog.read(1024)
|
||||
bsp.write(data)
|
||||
prog_len += len(data)
|
||||
|
||||
if len(data) < 1024:
|
||||
break
|
||||
|
||||
prog.close
|
||||
|
||||
prog_elf = ELF64Image()
|
||||
if prog_elf.load(bootstrap_path) != 0:
|
||||
print('failed to parse bootstrap program')
|
||||
|
||||
for ph in prog_elf.ph_list:
|
||||
print('{}: {}/{} ({}/{} bytes) {}'.format(
|
||||
ph.type,
|
||||
ph.offset, ph.vaddr,
|
||||
ph.filesz, ph.memsz, ph.flags))
|
||||
|
||||
trailer = struct.pack('>IQIQIQQQQQQQ',
|
||||
0xcafebabe,
|
||||
0, bootstrap_offset,
|
||||
bootstrap_offset, prog_len,
|
||||
prog_elf.text.offset, prog_elf.text.vaddr, prog_elf.text.memsz,
|
||||
prog_elf.data.offset, prog_elf.data.vaddr, prog_elf.data.memsz,
|
||||
prog_elf.entry)
|
||||
|
||||
bsp.write(trailer)
|
||||
|
||||
bsp.close()
|
||||
prog.close()
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user