#!/usr/bin/env python3 # SPDX-License-Identifier: MPL-2.0 """Compile a read-only FunctionFS diagnostic. Does not access a phone.""" import json from pathlib import Path import stat import struct import subprocess import sys from tundra import ROOT, cpio, linker, digest, now, save, kernel_files, checked_source def main(): folder=ROOT/'out/usb-diagnostic';folder.mkdir(parents=True,exist_ok=True) common=['-Os','-ffreestanding','-fno-builtin','-fno-stack-protector','-fno-pie', '-fno-unwind-tables','-fno-asynchronous-unwind-tables','-Wall','-Wextra','-Werror','-nostdlib','-static'] builds={} for arch in ('x86_64','aarch64'): out=folder/arch;out.mkdir(exist_ok=True) cmd=(['gcc','-no-pie','-mgeneral-regs-only'] if arch=='x86_64' else ['clang','--target=aarch64-linux-gnu',f'--ld-path={linker()}']) cmd += common+['-Wl,--build-id=none','-Wl,-e,_start',str(ROOT/'boot/usb-init.c'),'-o',str(out/'init')] subprocess.run(cmd,check=True) data=(out/'init').read_bytes() assert struct.unpack_from('board['partitionSizeBytes']:raise ValueError('Image too large') save(folder/'build.json',{'recordedAt':now(),'sourceSha256':digest(ROOT/'boot/usb-init.c'), 'architectures':builds,'sharedInitSha256':digest(ROOT/'boot/init.c'),'file':image.name,'imageSha256':digest(image),'bytes':image.stat().st_size, 'hardwareTested':False,'flashReady':False,'protocol':'read-only FunctionFS, not ADB', 'blockers':['Real firmware/slot/recovery inventory missing','Sargo UDC initialization not tested','No Gecko or Gaia in this diagnostic']}) print(image) if __name__=='__main__':main()