def sign(self, command, build_dir, bcfg, formats): args = command.args if args.tool_path: command.check_force( shutil.which(args.tool_path), '--tool-path {}: not an executable'.format(args.tool_path)) tool_path = args.tool_path else: tool_path = shutil.which('rimage') if not tool_path: log.die('rimage not found; either install it', 'or provide --tool-path') b = pathlib.Path(build_dir) cache = CMakeCache.from_build_dir(build_dir) board = cache['CACHED_BOARD'] if board != 'up_squared_adsp': log.die('Supported only for up_squared_adsp board') log.inf('Signing with tool {}'.format(tool_path)) bootloader = str(b / 'zephyr' / 'bootloader.elf.mod') kernel = str(b / 'zephyr' / 'zephyr.elf.mod') out_bin = str(b / 'zephyr' / 'zephyr.ri') sign_base = ([tool_path] + args.tool_args + ['-o', out_bin, '-m', 'apl', '-i', '3'] + [bootloader, kernel]) log.inf(quote_sh_list(sign_base)) subprocess.check_call(sign_base)
def sign(self, command, build_dir, bcfg, formats): if not formats: return args = command.args b = pathlib.Path(build_dir) cache = CMakeCache.from_build_dir(build_dir) tool_path = self.find_imgtool(command, args) # The vector table offset is set in Kconfig: vtoff = self.get_cfg(command, bcfg, 'CONFIG_TEXT_SECTION_OFFSET') # Flash device write alignment and the partition's slot size # come from devicetree: flash = self.edt_flash_node(b, cache) align, addr, size = self.edt_flash_params(flash) runner_config = cached_runner_config(build_dir, cache) if 'bin' in formats: in_bin = runner_config.bin_file if not in_bin: log.die("can't find unsigned .bin to sign") else: in_bin = None if 'hex' in formats: in_hex = runner_config.hex_file if not in_hex: log.die("can't find unsigned .hex to sign") else: in_hex = None log.banner('image configuration:') log.inf('partition offset: {0} (0x{0:x})'.format(addr)) log.inf('partition size: {0} (0x{0:x})'.format(size)) log.inf('text section offset: {0} (0x{0:x})'.format(vtoff)) # Base sign command. # # We provide a default --version in case the user is just # messing around and doesn't want to set one. It will be # overridden if there is a --version in args.tool_args. sign_base = [tool_path, 'sign', '--version', '0.0.0+0', '--align', str(align), '--header-size', str(vtoff), '--slot-size', str(size)] sign_base.extend(args.tool_args) log.banner('signed binaries:') if in_bin: out_bin = args.sbin or str(b / 'zephyr' / 'zephyr.signed.bin') sign_bin = sign_base + [in_bin, out_bin] log.inf('bin: {}'.format(out_bin)) log.dbg(quote_sh_list(sign_bin)) subprocess.check_call(sign_bin) if in_hex: out_hex = args.shex or str(b / 'zephyr' / 'zephyr.signed.hex') sign_hex = sign_base + [in_hex, out_hex] log.inf('hex: {}'.format(out_hex)) log.dbg(quote_sh_list(sign_hex)) subprocess.check_call(sign_hex)
def sign(self, command, build_dir, bcfg, formats): args = command.args if args.tool_path: command.check_force( shutil.which(args.tool_path), '--tool-path {}: not an executable'.format(args.tool_path)) tool_path = args.tool_path else: tool_path = shutil.which('rimage') if not tool_path: log.die('rimage not found; either install it', 'or provide --tool-path') b = pathlib.Path(build_dir) cache = CMakeCache.from_build_dir(build_dir) board = cache['CACHED_BOARD'] log.inf('Signing for board ' + board) target = self.edt_get_rimage_target(board) conf = target + '.toml' log.inf('Signing for SOC target ' + target + ' using ' + conf) if not args.quiet: log.inf('Signing with tool {}'.format(tool_path)) bootloader = str(b / 'zephyr' / 'bootloader.elf.mod') kernel = str(b / 'zephyr' / 'zephyr.elf.mod') out_bin = str(b / 'zephyr' / 'zephyr.ri') out_xman = str(b / 'zephyr' / 'zephyr.ri.xman') out_tmp = str(b / 'zephyr' / 'zephyr.rix') conf_path_cmd = [] if cache.get('RIMAGE_CONFIG_PATH') and not args.tool_data: rimage_conf = pathlib.Path(cache['RIMAGE_CONFIG_PATH']) conf_path = str(rimage_conf / conf) conf_path_cmd = ['-c', conf_path] elif args.tool_data: conf_dir = pathlib.Path(args.tool_data) conf_path = str(conf_dir / conf) conf_path_cmd = ['-c', conf_path] else: log.die('Configuration not found') sign_base = ([tool_path] + args.tool_args + ['-o', out_bin] + conf_path_cmd + ['-i', '3', '-e'] + [bootloader, kernel]) if not args.quiet: log.inf(quote_sh_list(sign_base)) subprocess.check_call(sign_base) filenames = [out_xman, out_bin] with open(out_tmp, 'wb') as outfile: for fname in filenames: with open(fname, 'rb') as infile: outfile.write(infile.read()) os.remove(out_bin) os.rename(out_tmp, out_bin)
def _run_pristine(self): _banner('making build dir {} pristine'.format(self.build_dir)) if not is_zephyr_build(self.build_dir): log.die('Refusing to run pristine on a folder that is not a ' 'Zephyr build system') cache = CMakeCache.from_build_dir(self.build_dir) cmake_args = ['-P', cache['ZEPHYR_BASE'] + '/cmake/pristine.cmake'] run_cmake(cmake_args, cwd=self.build_dir, dry_run=self.args.dry_run)
def _run_pristine(self): _banner('making build dir {} pristine'.format(self.build_dir)) if not is_zephyr_build(self.build_dir): log.die('Refusing to run pristine on a folder that is not a ' 'Zephyr build system') cache = CMakeCache.from_build_dir(self.build_dir) app_src_dir = cache.get('APPLICATION_SOURCE_DIR') app_bin_dir = cache.get('APPLICATION_BINARY_DIR') cmake_args = [f'-DBINARY_DIR={app_bin_dir}', f'-DSOURCE_DIR={app_src_dir}', '-P', cache['ZEPHYR_BASE'] + '/cmake/pristine.cmake'] run_cmake(cmake_args, cwd=self.build_dir, dry_run=self.args.dry_run)
def _update_cache(self): try: self.cmake_cache = CMakeCache.from_build_dir(self.build_dir) except FileNotFoundError: pass
def sign(self, command, build_dir, build_conf, formats): args = command.args if args.tool_path: command.check_force( shutil.which(args.tool_path), '--tool-path {}: not an executable'.format(args.tool_path)) tool_path = args.tool_path else: tool_path = shutil.which('rimage') if not tool_path: log.die('rimage not found; either install it', 'or provide --tool-path') b = pathlib.Path(build_dir) cache = CMakeCache.from_build_dir(build_dir) target = cache.get('RIMAGE_TARGET') if not target: log.die('rimage target not defined') conf = target + '.toml' log.inf('Signing for SOC target ' + target + ' using ' + conf) if not args.quiet: log.inf('Signing with tool {}'.format(tool_path)) if target in ('imx8', 'imx8m'): kernel = str(b / 'zephyr' / 'zephyr.elf') out_bin = str(b / 'zephyr' / 'zephyr.ri') out_xman = str(b / 'zephyr' / 'zephyr.ri.xman') out_tmp = str(b / 'zephyr' / 'zephyr.rix') else: bootloader = str(b / 'zephyr' / 'boot.mod') kernel = str(b / 'zephyr' / 'main.mod') out_bin = str(b / 'zephyr' / 'zephyr.ri') out_xman = str(b / 'zephyr' / 'zephyr.ri.xman') out_tmp = str(b / 'zephyr' / 'zephyr.rix') conf_path_cmd = [] if cache.get('RIMAGE_CONFIG_PATH') and not args.tool_data: rimage_conf = pathlib.Path(cache['RIMAGE_CONFIG_PATH']) conf_path = str(rimage_conf / conf) conf_path_cmd = ['-c', conf_path] elif args.tool_data: conf_dir = pathlib.Path(args.tool_data) conf_path = str(conf_dir / conf) conf_path_cmd = ['-c', conf_path] else: log.die('Configuration not found') if '--no-manifest' in args.tool_args: no_manifest = True args.tool_args.remove('--no-manifest') else: no_manifest = False if no_manifest: extra_ri_args = ['-i', '3'] else: extra_ri_args = ['-i', '3', '-e'] components = [] if (target in ('imx8', 'imx8m')) else [bootloader] components += [kernel] sign_base = ([tool_path] + args.tool_args + ['-o', out_bin] + conf_path_cmd + extra_ri_args + components) if not args.quiet: log.inf(quote_sh_list(sign_base)) subprocess.check_call(sign_base) if no_manifest: filenames = [out_bin] else: filenames = [out_xman, out_bin] with open(out_tmp, 'wb') as outfile: for fname in filenames: with open(fname, 'rb') as infile: outfile.write(infile.read()) os.remove(out_bin) os.rename(out_tmp, out_bin)
def sign(self, command, build_dir, build_conf, formats): args = command.args if args.tool_path: command.check_force(shutil.which(args.tool_path), '--tool-path {}: not an executable'. format(args.tool_path)) tool_path = args.tool_path else: tool_path = shutil.which('rimage') if not tool_path: log.die('rimage not found; either install it', 'or provide --tool-path') #### -c sof/rimage/config/signing_schema.toml #### b = pathlib.Path(build_dir) cache = CMakeCache.from_build_dir(build_dir) # warning: RIMAGE_TARGET is a duplicate of CONFIG_RIMAGE_SIGNING_SCHEMA target = cache.get('RIMAGE_TARGET') if not target: log.die('rimage target not defined') cmake_toml = target + '.toml' if not args.quiet: log.inf('Signing with tool {}'.format(tool_path)) if target in ('imx8', 'imx8m'): kernel = str(b / 'zephyr' / 'zephyr.elf') out_bin = str(b / 'zephyr' / 'zephyr.ri') out_xman = str(b / 'zephyr' / 'zephyr.ri.xman') out_tmp = str(b / 'zephyr' / 'zephyr.rix') else: bootloader = str(b / 'zephyr' / 'boot.mod') kernel = str(b / 'zephyr' / 'main.mod') out_bin = str(b / 'zephyr' / 'zephyr.ri') out_xman = str(b / 'zephyr' / 'zephyr.ri.xman') out_tmp = str(b / 'zephyr' / 'zephyr.rix') conf_path_cmd = [] if '-c' in args.tool_args: # Precedence to the -- rimage command line conf_path_cmd = [] if args.tool_data: log.wrn('--tool-data ' + args.tool_data + ' ignored, overridden by -c') # For logging only conf_path = args.tool_args[args.tool_args.index('-c') + 1] elif args.tool_data: conf_dir = pathlib.Path(args.tool_data) conf_path = str(conf_dir / cmake_toml) conf_path_cmd = ['-c', conf_path] elif cache.get('RIMAGE_CONFIG_PATH'): rimage_conf = pathlib.Path(cache['RIMAGE_CONFIG_PATH']) conf_path = str(rimage_conf / cmake_toml) conf_path_cmd = ['-c', conf_path] else: log.die('-c configuration not found') log.inf('Signing for SOC target ' + target + ' using ' + conf_path) if '--no-manifest' in args.tool_args: no_manifest = True args.tool_args.remove('--no-manifest') else: no_manifest = False if no_manifest: extra_ri_args = ['-i', '3'] else: extra_ri_args = ['-i', '3', '-e'] sign_base = [tool_path] # Sub-command arg '-q' takes precedence over west '-v' if not args.quiet and args.verbose: sign_base += ['-v'] * args.verbose components = [ ] if (target in ('imx8', 'imx8m')) else [ bootloader ] components += [ kernel ] sign_base += (args.tool_args + ['-o', out_bin] + conf_path_cmd + extra_ri_args + components) if not args.quiet: log.inf(quote_sh_list(sign_base)) subprocess.check_call(sign_base) if no_manifest: filenames = [out_bin] else: filenames = [out_xman, out_bin] if not args.quiet: log.inf('Prefixing ' + out_bin + ' with manifest ' + out_xman) with open(out_tmp, 'wb') as outfile: for fname in filenames: with open(fname, 'rb') as infile: outfile.write(infile.read()) os.remove(out_bin) os.rename(out_tmp, out_bin)