mirror of
https://codeberg.org/libreboot/lbmk.git
synced 2026-07-11 05:52:36 +02:00
1153bc3b6c
the shellball (for extracting the coreboot rom, to get at mrc.bin) contains lines that are not posix-friendly. specifically, the "local" command is used, and this is not defined for posix sh. the shellball is essentially just a bunch of shell functions that compress/decompress the zip file, containing the firmware update. you can modify the files and re-run the shellball to recompress, though lbmk just uses the decompress function. as pointed out by Nicholas Chin, it is possible to just run "unzip" directly on the update, to get at bios.bin. we don't really need all the extra checks performed by the shellball, so let's just bypass it altogether. Signed-off-by: Leah Rowe <leah@libreboot.org>
64 lines
1.7 KiB
Bash
Executable File
64 lines
1.7 KiB
Bash
Executable File
# SPDX-License-Identifier: GPL-2.0-only
|
|
|
|
# Logic based on util/chromeos/crosfirmware.sh in coreboot cfc26ce278.
|
|
# Modifications in this version are Copyright 2021 and 2023 Leah Rowe.
|
|
# Original copyright detailed in repo: https://review.coreboot.org/coreboot/
|
|
|
|
eval "$(setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board ROOTFS SHELLBALL)"
|
|
|
|
extract_mrc()
|
|
{
|
|
[ -z "${MRC_board}" ] && err "extract_mrc $MRC_hash: MRC_board not set"
|
|
[ -z "${CONFIG_MRC_FILE}" ] && \
|
|
err "extract_mrc $MRC_hash: CONFIG_MRC_FILE not set"
|
|
|
|
ROOTFS="root-a.ext2"
|
|
SHELLBALL="chromeos-firmwareupdate-${MRC_board}"
|
|
|
|
(
|
|
x_ cd "${appdir}"
|
|
extract_partition
|
|
extract_shellball
|
|
extract_coreboot
|
|
) || err "mrc download/extract failure"
|
|
|
|
"${cbfstool}" "${appdir}/"bios.bin extract -n mrc.bin \
|
|
-f "${_dest}" -r RO_SECTION || err "extract_mrc: cbfstool ${_dest}"
|
|
}
|
|
|
|
extract_partition()
|
|
{
|
|
NAME="ROOT-A"
|
|
FILE="${MRC_url##*/}"
|
|
FILE="${FILE%.zip}"
|
|
_bs=1024
|
|
|
|
printf "Extracting ROOT-A partition\n"
|
|
ROOTP=$( printf "unit\nB\nprint\nquit\n" | \
|
|
parted "${FILE}" 2>/dev/null | grep "${NAME}" )
|
|
|
|
START=$(( $( echo ${ROOTP} | cut -f2 -d\ | tr -d "B" ) ))
|
|
SIZE=$(( $( echo ${ROOTP} | cut -f4 -d\ | tr -d "B" ) ))
|
|
|
|
dd if="${FILE}" of="${ROOTFS}" bs=${_bs} \
|
|
skip=$(( ${START} / ${_bs} )) count=$(( ${SIZE} / ${_bs} )) || \
|
|
err "extract_partition, dd ${FILE}, ${ROOTFS}"
|
|
}
|
|
|
|
extract_shellball()
|
|
{
|
|
printf "Extracting chromeos-firmwareupdate\n"
|
|
printf "cd /usr/sbin\ndump chromeos-firmwareupdate ${SHELLBALL}\nquit" \
|
|
| debugfs "${ROOTFS}" || err "extract_shellball: debugfs"
|
|
}
|
|
|
|
extract_coreboot()
|
|
{
|
|
_unpacked=$( mktemp -d )
|
|
|
|
printf "Extracting coreboot image\n"
|
|
[ -f "${SHELLBALL}" ] || \
|
|
err "extract_coreboot: shellball missing in google cros image"
|
|
x_ unzip "${SHELLBALL}"
|
|
}
|