coreboot/util/cbfstool
Varadarajan Narayanan 0dcea61e7c cbfstool: Add multi ELF support
The current QCOM fixup function qualcomm_find_hash() assumes only one
ELF will be loaded by the primary boot loader and the bootblock is one
of the segments of that ELF.

However, the primary boot loader for QCOM X1P42100 SoC loads multiple
ELFs for QC_SEC, TME Sequencer, TME FW and bootblock. This change
updates the fixup functionality to handle bootblock being a separate
ELF.

If the bootblock offset does not fit within the first ELF, then the
fixup function understands that it is a multi ELF.

Additionally, it ensures the bootblock ELF uses MBN v7 format.

BUG=b:420542130

TEST=1. Create a image.serial.bin and ensure it boots on X1P42100
2. Used the following script to verify the hash
#! /bin/bash

image=/build/bluey/firmware/image-bluey.serial.bin
bin=/tmp/bb.bin
seg=/tmp/bb.seg
hash=/tmp/bb.hash

#
# Bootblock is the final ELF of the multi ELF. Hopefully
# there is no other ELF in ${image}. Get the offset of the
# final ELF in ${image} and get it out
#

bb_offset=`od -Ad -w4 -tx4 ${image} | grep 464c457f | tail -1 | cut -f1 -d ' '`

dd if=${image} of=${bin} skip=1 bs=${bb_offset} &> /dev/null

#
# The last two segments of the bootblock ELF have the actual
# executable and the hash. 'LOAD' is the executable segment and
# the other is the hash segment. Get their offsets and convert
# to decimal.
#
offs=`readelf -lW ${bin} | tail -2 | awk '{print $1" "$2" "$5}'`
offs=(`printf "%s %u %u %s %u %u" ${offs}`)

#
# Get the executable and hash segments
#
if [ ${offs[0]} = "LOAD" ]; then
        first=${seg}
        second=${hash}
else
        first=${hash}
        second=${seg}
fi

dd if=${bin} skip=${offs[1]} bs=1 count=${offs[2]} of=${first} &> /dev/null
dd if=${bin} skip=${offs[4]} bs=1 count=${offs[5]} of=${second} &> /dev/null

#
# Find the SHA384 hash for the executable segment
#
sha=`sha384sum ${seg} | cut -f1 -d ' ' | sed 's/../& /g'`

echo ===================================================
echo Expected hash:
echo
echo ${sha} | fold -w48
echo ===================================================
echo
hexdump -C ${hash} | grep -A4 "`echo ${sha} | cut -f1-4 -d ' '`"


Change-Id: If57ba0cc9a4f08b69d7712f27c215339307e73d4
Signed-off-by: Varadarajan Narayanan <vnarayan@qualcomm.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/88148
Reviewed-by: Kapil Porwal <kapilporwal@google.com>
Reviewed-by: Subrata Banik <subratabanik@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
2025-06-26 16:56:14 +00:00
..
bpdt_formats util: Rename Makefiles from .inc to .mk 2024-01-26 12:43:18 +00:00
console util/cbfstool: Wrap logging macros in do - while 2022-10-13 17:07:02 +00:00
flashmap util/cbfstool: Refine type and signatures 2025-01-12 07:54:27 +00:00
fpt_formats util: Rename Makefiles from .inc to .mk 2024-01-26 12:43:18 +00:00
lz4 util: Add SPDX license headers to Makefiles 2022-11-22 12:47:09 +00:00
lzma
tests
.gitignore
amdcompress.c
cbfs-mkpayload.c cbfs: Remove broken remnants of PAYLOAD_INFO feature 2024-03-13 18:51:11 +00:00
cbfs-mkstage.c util/cbfstool: Deal with how lld organizes loadable segments 2024-11-06 04:54:22 +00:00
cbfs-payload-linux.c util/cbfstool/cbfs-payload-linux: Add error handling 2024-08-20 01:41:59 +00:00
cbfs.h cbfstool: Add printing of legacy stage type 2024-03-27 14:00:56 +00:00
cbfs_glue.h cbfs/vboot: Adapt to new vb2_digest API 2022-09-02 23:51:29 +00:00
cbfs_image.c util/cbfstool: Add missing \n and use __func__ in debug messages 2025-02-27 16:24:53 +00:00
cbfs_image.h util/cbfstool: Fix truncate command error handling and cbfs_image_from_buffer() 2022-08-03 23:24:49 +00:00
cbfs_sections.c
cbfs_sections.h
cbfscomptool.c
cbfstool.c cbfstool: Fix the help text 2025-03-10 05:26:46 +00:00
coff.h
common.c treewide: Work around GCC 15 Werror=unterminated-string-initialization 2025-06-09 07:19:09 +00:00
common.h util/cbfstool/common.h Fix wrong return value doc 2024-08-05 13:10:08 +00:00
compress.c util/cbfstool: fix memory leak in compress.c 2022-11-02 21:40:25 +00:00
cse_fpt.c
cse_fpt.h
cse_helpers.c
cse_helpers.h
cse_serger.c region: Turn region_end() into an inclusive region_last() 2024-08-23 01:08:16 +00:00
cse_serger.h
default-x86.fmd mb/*/*/*.fmd: Start flash at 0 2025-04-09 17:11:43 +00:00
default.fmd mb/*/*/*.fmd: Start flash at 0 2025-04-09 17:11:43 +00:00
description.md
elf.h
elfheaders.c cbfstool: Read XIP stage alignment requirements from ELF 2024-06-20 19:34:14 +00:00
elfparsing.h cbfstool: Read XIP stage alignment requirements from ELF 2024-06-20 19:34:14 +00:00
elogtool.c util/cbfstool/eventlog: Use LocalTime or UTC timestamps 2023-03-02 13:05:35 +00:00
eventlog.c util/cbfstool/eventlog: Add low battery event type 2025-02-10 15:14:13 +00:00
eventlog.h util/cbfstool/eventlog: Use LocalTime or UTC timestamps 2023-03-02 13:05:35 +00:00
EXAMPLE
fdt.h
fit.c util/cbfstool: Add missing \n and use __func__ in debug messages 2025-02-27 16:24:53 +00:00
fit.h util/cbfstool: Add Intel platform boot policy support 2024-10-23 10:29:59 +00:00
flashmap_tests.c
flashrom.c util: Drop flashrom -p host alias which equals to -p internal 2023-09-25 14:06:32 +00:00
flashrom.h
fmap_from_fmd.c
fmap_from_fmd.h
fmaptool.c
fmd.c
fmd.h
fmd_parser.c_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_parser.h_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_parser.y
fmd_scanner.c_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_scanner.h_shipped util/cbfstool: Revise lex/yacc (bison) generation 2023-09-28 21:28:37 +00:00
fmd_scanner.l
fv.h
ifittool.c util/cbfstool: Add usage information about verbose output 2023-03-28 13:28:15 +00:00
ifwitool.c util: Use C99 flexible arrays 2023-08-01 12:51:25 +00:00
linux.h util/cbfstool: Qualify struct e820entry as packed 2023-04-16 14:04:32 +00:00
linux_trampoline.c util/cbfstool/linux_trampoline: Support more e820 entries 2024-02-18 07:50:28 +00:00
linux_trampoline.h
linux_trampoline.S util/cbfstool: Fix linux_trampoline.c generation 2024-06-03 16:54:02 +00:00
Makefile util: Break up spdx identifier text in scripts & makefiles 2024-06-19 17:42:43 +00:00
Makefile.mk util: Rename Makefiles from .inc to .mk 2024-01-26 12:43:18 +00:00
option.h
partitioned_file.c
partitioned_file.h
platform_fixups.c cbfstool: Add multi ELF support 2025-06-26 16:56:14 +00:00
ProcessorBind.h
rmodtool.c
rmodule.c cbfstool: Skip relocation entries pointing to undefined symbol 2023-10-20 14:32:20 +00:00
rmodule.h cbfstool: Make add-stage support multiple loadable segments 2023-09-14 21:01:56 +00:00
xdr.c