summaryrefslogtreecommitdiff
path: root/resources/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'resources/scripts')
-rwxr-xr-xresources/scripts/blobs/download359
1 files changed, 202 insertions, 157 deletions
diff --git a/resources/scripts/blobs/download b/resources/scripts/blobs/download
index f8b72265..8ee1e3e0 100755
--- a/resources/scripts/blobs/download
+++ b/resources/scripts/blobs/download
@@ -8,13 +8,18 @@
ec_url=""
ec_url_bkup=""
ec_hash=""
-
+dl_hash=""
+dl_url=""
+dl_url_bkup=""
e6400_vga_dl_hash=""
e6400_vga_dl_url=""
e6400_vga_dl_url_bkup=""
e6400_vga_offset=""
e6400_vga_romname=""
+cbdir="coreboot/default"
+cbcfgsdir="resources/coreboot"
+boarddir=""
blobdir="blobs"
dl_path="${blobdir}/vendorupdate"
appdir="${blobdir}/app"
@@ -22,174 +27,196 @@ _7ztest="a"
mecleaner="$(pwd)/me_cleaner/me_cleaner.py"
e6400_unpack="$(pwd)/bios_extract/dell_inspiron_1100_unpacker.py"
me7updateparser="$(pwd)/resources/blobs/me7_update_parser.py"
-kbc1126_ec_dump="$(pwd)/coreboot/default/util/kbc1126/kbc1126_ec_dump"
-board="${1}"
-# A shorthand for each board, to avoid duplicating configs per flash size
-board_short=${board%%_*mb}
-
-set -- "resources/coreboot/${board}/config/*"
-. ${1} 2>/dev/null
-. "resources/coreboot/${board}/board.cfg"
-
-if [ "${CONFIG_HAVE_MRC}" = "y" ]; then
- printf 'haswell board detected, downloading mrc\n'
- needs="${needs} MRC"
-fi
-
-if [ "${CONFIG_HAVE_IFD_BIN}" = "y" ]; then
- printf 'board needs intel firmware descriptor\n'
- needs="${needs} IFD"
-fi
-
-if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
- printf 'board needs intel management engine\n'
- needs="${needs} ME"
-fi
-
-if [ "${CONFIG_HAVE_GBE_BIN}" = "y" ]; then
- printf 'board needs gigabit ethernet firmware\n'
- needs="${needs} GBE"
-fi
-
-if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then
- printf "HP board with KBC1126 EC detected, downloading ec\n"
- needs="${needs} EC"
-fi
-
-if [ "${CONFIG_BOARD_DELL_E6400}" = "y" ] \
+kbc1126_ec_dump="$(pwd)/${cbdir}/util/kbc1126/kbc1126_ec_dump"
+board=""
+_b="" # board shorthand without e.g. _4mb (avoid duplication per flash size)
+
+CONFIG_HAVE_MRC=""
+CONFIG_HAVE_IFD_BIN=""
+CONFIG_HAVE_ME_BIN=""
+CONFIG_HAVE_GBE_BIN=""
+CONFIG_KBC1126_FIRMWARE=""
+CONFIG_BOARD_DELL_E6400=""
+CONFIG_VGA_BIOS_FILE=""
+
+main()
+{
+ board="${1}"
+ boarddir="${cbcfgsdir}/${board}"
+
+ if [ ! -d "${boarddir}" ]; then
+ fail "Target not defined"
+ elif [ ! -f "${boarddir}/board.cfg" ]; then
+ fail "Target missing board.cfg"
+ fi
+
+ detect_firmware || exit 0
+ scan_sources_config
+
+ build_dependencies
+ download_blobs
+}
+
+detect_firmware()
+{
+ set -- "${boarddir}/config/"*
+ . ${1} 2>/dev/null
+ . "${boarddir}/board.cfg"
+
+ if [ "${CONFIG_HAVE_MRC}" = "y" ]; then
+ needs="${needs} MRC"
+ fi
+ if [ "${CONFIG_HAVE_IFD_BIN}" = "y" ]; then
+ needs="${needs} IFD"
+ fi
+ if [ "${CONFIG_HAVE_ME_BIN}" = "y" ]; then
+ needs="${needs} ME"
+ fi
+ if [ "${CONFIG_HAVE_GBE_BIN}" = "y" ]; then
+ needs="${needs} GBE"
+ fi
+ if [ "${CONFIG_KBC1126_FIRMWARE}" = "y" ]; then
+ needs="${needs} EC"
+ fi
+ if [ "${CONFIG_BOARD_DELL_E6400}" = "y" ] \
&& [ "${CONFIG_VGA_BIOS_FILE}" != "" ]; then
- printf "Dell E6400 with Nvidia GPU detected, downloading VGA ROM\n"
- needs="${needs} E6400VGA"
-fi
-
-# Quickly exit without wasting more time if there are no blobs needed (GM45)
-if [ -z ${needs+x} ]; then
- printf 'No binary blobs needed for this board\n'
- exit 0
-fi
-
-while read -r line ; do
- case ${line} in
+ needs="${needs} E6400VGA"
+ fi
+ if [ -z ${needs+x} ]; then
+ printf 'No binary blobs needed for this board\n'
+ return 1
+ fi
+ printf "Firmware needed for board %s: %s\n" ${board} ${needs}
+ return 0
+}
+
+scan_sources_config()
+{
+ # Shorthand (avoid duplicating configs per flash size)
+ _b=${board%%_*mb}
+
+ awkstr=" /\{.*${_b}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }"
+
+ while read -r line ; do
+ case ${line} in
EC_url*)
- set ${line}
- ec_url=${2}
- ;;
+ set ${line}
+ ec_url=${2}
+ ;;
EC_url_bkup*)
- set ${line}
- ec_url_bkup=${2}
- ;;
+ set ${line}
+ ec_url_bkup=${2}
+ ;;
EC_hash*)
- set ${line}
- ec_hash=${2}
- ;;
+ set ${line}
+ ec_hash=${2}
+ ;;
DL_hash*)
- set ${line}
- dl_hash=${2}
- ;;
+ set ${line}
+ dl_hash=${2}
+ ;;
DL_url*)
- set ${line}
- dl_url=${2}
- ;;
+ set ${line}
+ dl_url=${2}
+ ;;
DL_url_bkup*)
- set ${line}
- dl_url_bkup=${2}
- ;;
+ set ${line}
+ dl_url_bkup=${2}
+ ;;
E6400_VGA_DL_hash*)
- set ${line}
- e6400_vga_dl_hash=${2}
- ;;
+ set ${line}
+ e6400_vga_dl_hash=${2}
+ ;;
E6400_VGA_DL_url*)
- set ${line}
- e6400_vga_dl_url=${2}
- ;;
+ set ${line}
+ e6400_vga_dl_url=${2}
+ ;;
E6400_VGA_DL_url_bkup*)
- set ${line}
- e6400_vga_dl_url_bkup=${2}
- ;;
+ set ${line}
+ e6400_vga_dl_url_bkup=${2}
+ ;;
E6400_VGA_offset*)
- set ${line}
- e6400_vga_offset=${2}
- ;;
+ set ${line}
+ e6400_vga_offset=${2}
+ ;;
E6400_VGA_romname*)
- set ${line}
- e6400_vga_romname=${2}
- ;;
- esac
-done << EOF
-$(eval "awk ' /\{.*${board_short}.*}{/ {flag=1;next} /\}/{flag=0} flag { print }' resources/blobs/sources")
+ set ${line}
+ e6400_vga_romname=${2}
+ ;;
+ esac
+ done << EOF
+ $(eval "awk '${awkstr}' resources/blobs/sources")
EOF
-
-Main() {
- Build_deps
- Download_needed
}
-Fail(){
- printf "\nERROR: $@\n"
- exit 1
-}
-
-Build_deps(){
+build_dependencies()
+{
if [ ! -d me_cleaner ]; then
printf "downloading me_cleaner\n"
- ./download me_cleaner || Fail 'could not download me_cleaner'
+ ./download me_cleaner || fail "could not download me_cleaner"
fi
- if [ ! -d coreboot/default ]; then
+ if [ ! -d ${cbdir} ]; then
printf "downloading coreboot\n"
- ./download coreboot default || Fail 'could not download coreboot'
+ ./download coreboot default \
+ || fail "could not download coreboot"
fi
if [ ! -d bios_extract ]; then
printf "downloading bios_extract\n"
- ./download bios_extract || Fail 'could not download bios_extract'
+ ./download bios_extract \
+ || fail "could not download bios_extract"
fi
- if [ ! -f coreboot/default/util/kbc1126/kbc1126_ec_dump ]; then
+ if [ ! -f ${cbdir}/util/kbc1126/kbc1126_ec_dump ]; then
printf "Building kbc1126_ec_dump from coreboot\n"
- make -BC coreboot/default/util/kbc1126 || Fail \
- "could not build kbc1126_ec_dump"
+ make -BC ${cbdir}/util/kbc1126 \
+ || fail "could not build kbc1126_ec_dump"
fi
- if [ ! -f "coreboot/default/util/ifdtool/ifdtool" ]; then
+ if [ ! -f "${cbdir}/util/ifdtool/ifdtool" ]; then
printf "building ifdtool from coreboot\n"
- make -C coreboot/default/util/ifdtool || Fail 'could not build ifdtool'
+ make -C ${cbdir}/util/ifdtool \
+ || fail 'could not build ifdtool'
fi
}
-Download_needed(){
+download_blobs()
+{
for need in ${needs}; do
case ${need} in
- *ME*)
- Download_me || _failed="${_failed} me"
- ;;
- *MRC*)
- ./download mrc || _failed="${_failed} mrc"
- ;;
- *EC*)
- Download_ec || _failed="${_failed} ec"
- ;;
- *E6400VGA*)
- Download_e6400vga || _failed="${_failed} e6400vga"
- ;;
- esac
+ *ME*)
+ download_blob_intel_me || _failed="${_failed} me"
+ ;;
+ *EC*)
+ download_ec || _failed="${_failed} ec"
+ ;;
+ *E6400VGA*)
+ download_e6400vga || _failed="${_failed} e6400vga"
+ ;;
+ *MRC*)
+ ./download mrc || _failed="${_failed} mrc"
+ ;;
+ esac
done
if [ ! -z ${_failed+x} ]; then
- Fail "failed to obtain ${_failed}\nYou may try manually extracting blobs with './blobutil extract'"
+ fail "failed to obtain ${_failed}\nTry manual extraction?"
fi
}
-Download_me() {
+download_blob_intel_me()
+{
printf "Downloading neutered ME for board: %s\n" ${board}
- Fetch_update me || return 1
- Extract_me || return 1
+ fetch_update me || return 1
+ extract_blob_intel_me || return 1
return 0
}
-Extract_me(){
+extract_blob_intel_me()
+{
printf "Extracting neutered ME for ${board}\n"
_me_destination=${CONFIG_ME_BIN_PATH#../../}
@@ -207,20 +234,23 @@ Extract_me(){
return 0
fi
- printf 'extracting and stripping intel management engine\n'
+ printf "Extracting and stripping Intel ME firmware\n"
+
innoextract ${dl_path} -d ${blobdir} \
- || 7z x ${dl_path} -o${appdir} \
- || Fail 'could not extract me executable with innoextract'
+ || 7z x ${dl_path} -o${appdir} \
+ || fail 'Could not extract vendor update'
- Bruteforce_extract_me "$(pwd)/${_me_destination}" "$(pwd)/${appdir}" \
- || return 1
+ bruteforce_extract_blob_intel_me "$(pwd)/${_me_destination}" \
+ "$(pwd)/${appdir}" \
+ || fail "Could not extract Intel ME firmware"
printf "Truncated and cleaned me output to ${_me_destination}\n"
return 0
}
# cursed, carcinogenic code. TODO rewrite it better
-Bruteforce_extract_me() {
+bruteforce_extract_blob_intel_me()
+{
_me_destination="${1}"
cdir="${2}" # must be an absolute path, not relative
@@ -242,19 +272,22 @@ Bruteforce_extract_me() {
# symlinks are a security risk, in this context
continue
elif [ -f "${i}" ]; then
- "${mecleaner}" -r -t -O "${sdir}/vendorfile" -M "${_me_destination}" "${i}" \
+ "${mecleaner}" -r -t -O "${sdir}/vendorfile" \
+ -M "${_me_destination}" "${i}" \
&& break # (we found me.bin)
"${mecleaner}" -r -t -O "${_me_destination}" "${i}" \
&& break # (we found me.bin)
"${me7updateparser}" -O ${_me_destination} "${i}" \
- && break
+ && break # (we found me.bin)
_7ztest="${_7ztest}a"
7z x "${i}" -o${_7ztest} || continue
- Bruteforce_extract_me "${_me_destination}" "${cdir}/${_7ztest}"
+ bruteforce_extract_blob_intel_me "${_me_destination}" \
+ "${cdir}/${_7ztest}"
cdir="${1}"
cd "${cdir}"
elif [ -d "$i" ]; then
- Bruteforce_extract_me "${_me_destination}" "${cdir}/${i}"
+ bruteforce_extract_blob_intel_me "${_me_destination}" \
+ "${cdir}/${i}"
cdir="${1}"
cd "${cdir}"
else
@@ -266,23 +299,25 @@ Bruteforce_extract_me() {
rm -Rf "${sdir}"
if [ ! -f "${_me_destination}" ]; then
- printf "me.bin not found in vendor update for board: %s\n" ${board}
+ printf "me.bin not found in vendor update for: %s\n" ${board}
return 1
else
return 0
fi
}
-Download_ec() {
+download_ec()
+{
printf "Downloading KBC1126 EC firmware for HP laptop\n"
- Fetch_update ec || return 1
- Extract_ec || return 1
+ fetch_update ec || return 1
+ extract_ec || return 1
return 0
}
-Extract_ec() {
+extract_ec()
+{
printf "Extracting KBC1126 EC firmware for board: %s\n" ${board}
_ec_destination=${CONFIG_KBC1126_FW1#../../}
@@ -315,28 +350,31 @@ Extract_ec() {
)
for i in 1 2; do
- if [ ! -f "${appdir}/${dl_path##*/}/ec.bin.fw${i}" ]; then
- printf "Not found: %s/%s/ec.bin.fw%s\n" \
+ if [ -f "${appdir}/${dl_path##*/}/ec.bin.fw${i}" ]; then
+ continue
+ fi
+ printf "Not found: %s/%s/ec.bin.fw%s\n" \
${appdir} ${dl_path##*/} ${i}
- printf "Could not extract EC firmware for board: %s\n" \
+ printf "Could not extract EC firmware for: %s\n" \
${board}
- return 1
- fi
+ return 1
done
cp "${appdir}/${dl_path##*/}"/ec.bin.fw* "${_ec_destination%/*}/"
}
-Download_e6400vga() {
+download_e6400vga()
+{
printf "Downloading Nvidia VGA ROM for Dell Latitude E6400\n"
- Fetch_update e6400vga || return 1
- Extract_e6400vga || return 1
+ fetch_update e6400vga || return 1
+ extract_e6400vga || return 1
return 0
}
-Extract_e6400vga() {
+extract_e6400vga()
+{
printf "Extracting Nvidia VGA ROM for ${board}\n"
_vga_destination=${CONFIG_VGA_BIOS_FILE#../../}
@@ -369,11 +407,11 @@ Extract_e6400vga() {
tail -c +${e6400_vga_offset} "${dl_path##*/}" \
| gunzip > bios.bin
if [ ! -f "bios.bin" ]; then
- Fail 'Could not extract bios.bin from Dell E6400 update'
+ fail 'Could not extract bios.bin from Dell E6400 update'
fi
"${e6400_unpack}" bios.bin || printf "TODO: fix dell extract util\n"
if [ ! -f "${e6400_vga_romname}" ]; then
- Fail 'Could not extract VGA ROM from Dell E6400 BIOS update'
+ fail 'Could not extract VGA ROM from Dell E6400 BIOS update'
fi
)
@@ -383,7 +421,8 @@ Extract_e6400vga() {
return 0
}
-Fetch_update() {
+fetch_update()
+{
printf "Fetching vendor update for board: %s\n" ${board}
fw_type="${1}"
@@ -412,28 +451,34 @@ Fetch_update() {
return 1
fi
- Vendor_checksum ${dlsum} || \
+ vendor_checksum ${dlsum} || \
wget ${dl} -O ${dl_path} || wget ${dl_bkup} -O ${dl_path}
- Vendor_checksum ${dlsum} || Fail \
- "Cannot guarantee intergity of vendor update for board: ${board}"
+ vendor_checksum ${dlsum} || fail \
+ "Cannot guarantee intergity of vendor update for: ${board}"
return 0
}
-Vendor_checksum() {
+vendor_checksum()
+{
sha1=$1
if [ ! -f "${dl_path}" ]; then
- printf "Vendor update not found on disk for board: %s\n" ${board}
+ printf "Vendor update not found on disk for: %s\n" ${board}
return 1
fi
if [ "$(sha1sum ${dl_path} | awk '{print $1}')" != "${sha1}" ]; then
- printf "Bad checksum on vendor update for board: %s\n" ${board}
-# rm ${dl_path}
+ printf "Bad checksum on vendor update for: %s\n" ${board}
return 1
fi
return 0
}
-Main
+fail()
+{
+ printf "\nERROR: $@\n"
+ exit 1
+}
+
+main $@