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
console
flashmap util/cbfstool: Refine type and signatures 2025-01-12 07:54:27 +00:00
fpt_formats
lz4
lzma
tests
.gitignore
amdcompress.c
cbfs-mkpayload.c
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
cbfs_glue.h
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
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
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
eventlog.c util/cbfstool/eventlog: Add low battery event type 2025-02-10 15:14:13 +00:00
eventlog.h
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
flashrom.h
fmap_from_fmd.c
fmap_from_fmd.h
fmaptool.c
fmd.c
fmd.h
fmd_parser.c_shipped
fmd_parser.h_shipped
fmd_parser.y
fmd_scanner.c_shipped
fmd_scanner.h_shipped
fmd_scanner.l
fv.h
ifittool.c
ifwitool.c
linux.h
linux_trampoline.c
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
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
rmodule.h
xdr.c