diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/git.sh | 2 | ||||
-rw-r--r-- | include/init.sh | 12 | ||||
-rw-r--r-- | include/inject.sh | 146 | ||||
-rw-r--r-- | include/lib.sh | 23 | ||||
-rw-r--r-- | include/mrc.sh | 57 |
5 files changed, 120 insertions, 120 deletions
diff --git a/include/git.sh b/include/git.sh index 9be79527..37f5bbae 100644 --- a/include/git.sh +++ b/include/git.sh @@ -5,7 +5,7 @@ eval "`setvars "" loc url bkup_url subfile subhash subrepo subrepo_bkup \ depend subfile_bkup repofail`" -tmpgit="$xbmkpwd/tmp/gitclone" +tmpgit="$xbmklocal/gitclone" fetch_targets() { diff --git a/include/init.sh b/include/init.sh index b8839921..3f813ea7 100644 --- a/include/init.sh +++ b/include/init.sh @@ -17,11 +17,13 @@ xbmkpath="$PATH" err="err_" eval "`setvars "" _nogit board reinstall versiondate aur_notice configdir \ - datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver`" + datadir version xbmkpwd relname xbmkpwd xbmktmp python pyver xbmklocal`" xbmk_init() { xbmkpwd="`pwd`" || $err "Cannot generate PWD" + xbmklocal="$xbmkpwd/tmp" + export PWD="$xbmkpwd" if [ $# -gt 0 ] && [ "$1" = "dependencies" ]; then @@ -184,6 +186,8 @@ xbmk_git_init() xbmk_create_tmpdir() { + x_ mkdir -p "$xbmklocal" + # unify all temporary files/directories in a single TMPDIR [ -z "${TMPDIR+x}" ] || [ "${TMPDIR%_*}" = "/tmp/xbmk" ] || \ unset TMPDIR @@ -194,6 +198,10 @@ xbmk_create_tmpdir() export TMPDIR="/tmp" export TMPDIR="$(mktemp -d -t xbmk_XXXXXXXX)" xbmktmp="$TMPDIR" + + # /tmp might be a tmpfs, so for large files we use ./tmp, + # not to be confused with xbmktmp (xbmktmp points to /tmp) + remkdir "$xbmktmp" "$xbmklocal" } xbmk_lock() @@ -219,7 +227,7 @@ xbmk_child_exec() { xbmk_rval=0 ( x_ ./mk "$@" ) || xbmk_rval=1 - rm -Rf "$xbmktmp" || xbmk_rval=1 + rm -Rf "$xbmklocal" "$xbmktmp" || xbmk_rval=1 rm -f lock || xbmk_rval=1 exit $xbmk_rval } diff --git a/include/inject.sh b/include/inject.sh index 6b316729..9bfda2db 100644 --- a/include/inject.sh +++ b/include/inject.sh @@ -14,7 +14,7 @@ hashfiles="vendorhashes blobhashes" # blobhashes for backwards compatibility dontflash="!!! AN ERROR OCCURED! Please DO NOT flash if injection failed. !!!" vfix="DO_NOT_FLASH_YET._FIRST,_INJECT_FILES_VIA_INSTRUCTIONS_ON_LIBREBOOT.ORG_" vguide="https://libreboot.org/docs/install/ivy_has_common.html" -tmpromdel="$xbmkpwd/tmp/DO_NOT_FLASH" +tmpromdel="$xbmklocal/DO_NOT_FLASH" nvm="util/nvmutil/nvm" ifdtool="elf/ifdtool/default/ifdtool" @@ -86,6 +86,8 @@ getfiles() "$E6400_VGA_DL_url_bkup" "$E6400_VGA_DL_hash" "$CONFIG_VGA_BIOS_FILE" [ -z "$CONFIG_HAVE_MRC" ] || fetch "mrc" "$MRC_url" "$MRC_url_bkup" \ "$MRC_hash" "$CONFIG_MRC_FILE" + [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && fetch "refcode" "$MRC_url" \ + "$MRC_url_bkup" "$MRC_hash" "$CONFIG_REFCODE_BLOB_FILE" [ -z "$CONFIG_LENOVO_TBFW_BIN" ] || fetch "tbfw" "$TBFW_url" \ "$TBFW_url_bkup" "$TBFW_hash" "$CONFIG_LENOVO_TBFW_BIN" # @@ -93,9 +95,9 @@ getfiles() # therefore, handle them separately, in case one of them is libre; if # one of them was, the path wouldn't be set. # - [ -z "$CONFIG_FSP_M_FILE" ] || fetch "fspm" "$CONFIG_FSP_FD_PATH" \ + [ -z "$CONFIG_FSP_M_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_M_FILE" copy - [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsps" "$CONFIG_FSP_FD_PATH" \ + [ -z "$CONFIG_FSP_S_FILE" ] || fetch "fsp" "$CONFIG_FSP_FD_PATH" \ "$CONFIG_FSP_FD_PATH" "$FSPFD_hash" "$CONFIG_FSP_S_FILE" copy; : } @@ -109,14 +111,12 @@ fetch() [ "$5" = "/dev/null" ] && return 0 _dl="$XBMK_CACHE/file/$dlsum" - if [ "$dl_type" = "fspm" ] || [ "$dl_type" = "fsps" ]; then - # HACK: if grabbing fsp from coreboot, fix the path for lbmk - for _cdl in dl dl_bkup; do - eval "$_cdl=\"\${$_cdl##*../}\"; _cdp=\"\$$_cdl\"" - [ -f "$_cdp" ] || _cdp="$cbdir/$_cdp" - [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\"" - done - fi + # HACK: if grabbing fsp from coreboot, fix the path for lbmk + [ "$dl_type" = "fsp" ] && for _cdl in dl dl_bkup; do + eval "$_cdl=\"\${$_cdl##*../}\"; _cdp=\"\$$_cdl\"" + [ -f "$_cdp" ] || _cdp="$cbdir/$_cdp" + [ -f "$_cdp" ] && eval "$_cdl=\"$_cdp\"" + done; : dlop="curl" && [ $# -gt 5 ] && dlop="$6" xbmkget "$dl" "$dl_bkup" "$_dl" "$dlsum" "$dlop" @@ -140,14 +140,12 @@ extract_intel_me() cdir="$xbmkpwd/$appdir" _me="$xbmkpwd/$_dest" - _metmp="$xbmkpwd/tmp/me.bin" + _metmp="$xbmklocal/me.bin" mfs="" && [ "$ME11bootguard" = "y" ] && mfs="--whitelist MFS" && \ chkvars ME11delta ME11version ME11sku ME11pch [ "$ME11bootguard" = "y" ] && x_ ./mk -f deguard - x_ mkdir -p tmp - extract_intel_me_bruteforce if [ "$ME11bootguard" = "y" ]; then apply_me11_deguard_mod @@ -205,27 +203,14 @@ apply_me11_deguard_mod() extract_archive() { - if [ $# -gt 2 ]; then - if [ "$3" = "fspm" ] || [ "$3" = "fsps" ]; then - decat_fspfd "$1" "$2" - return 0 - fi - fi + [ $# -gt 2 ] && [ "$3" = "fsp" ] && x_ python \ + "$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" split -f "$1" -o "$2" \ + -n "Fsp.fd" && return 0 innoextract "$1" -d "$2" || python "$pfs_extract" "$1" -e || 7z x \ "$1" -o"$2" || unar "$1" -o "$2" || unzip "$1" -d "$2" || return 1 - [ ! -d "${_dl}_extracted" ] || cp -R "${_dl}_extracted" "$2" || \ - $err "!mv '${_dl}_extracted' '$2' - $dontflash"; : -} - -decat_fspfd() -{ - _fspfd="$1" - _fspdir="$2" - _fspsplit="$cbdir/3rdparty/fsp/Tools/SplitFspBin.py" - - x_ $python "$_fspsplit" split -f "$_fspfd" -o "$_fspdir" -n "Fsp.fd" + [ ! -d "${_dl}_extracted" ] || x_ cp -R "${_dl}_extracted" "$2"; : } extract_kbc1126ec() @@ -243,9 +228,7 @@ extract_kbc1126ec() ) || $err "$board: can't extract kbc1126 ec firmware - $dontflash" x_ e "$appdir/ec.bin.fw1" f && x_ e "$appdir/ec.bin.fw2" f - - cp "$appdir/"ec.bin.fw* "${_dest%/*}/" || \ - $err "!cp 1126ec $_dest - $dontflash"; : + x_ cp "$appdir/"ec.bin.fw* "${_dest%/*}/" } extract_e6400vga() @@ -278,35 +261,25 @@ extract_sch5545ec() # https://pcsupport.lenovo.com/us/en/products/laptops-and-netbooks/thinkpad-t-series-laptops/thinkpad-t480-type-20l5-20l6/20l5/solutions/ht508988 extract_tbfw() { - chkvars TBFW_size # size in bytes, matching TBFW's flash IC - x_ mkdir -p tmp - x_ rm -f tmp/tb.bin - find "$appdir" -type f -name "TBT.bin" > "tmp/tb.txt" || \ - $err "extract_tbfw $_dest: Can't extract TBT.bin - $dontflash" - while read -r f; do - [ -f "$f" ] || continue - [ -L "$f" ] && continue - x_ cp "$f" "tmp/tb.bin" - break - done < "tmp/tb.txt" - x_ dd if=/dev/null of=tmp/tb.bin bs=1 seek=$TBFW_size - x_ cp "tmp/tb.bin" "$_dest" + chkvars TBFW_size + fe_ copy_tbfw "$appdir" -type f -name "TBT.bin" + [ -f "$_dest" ] || $err "$board: Could not extract tbfw"; : } -extract_fspm() +copy_tbfw() { - copy_fsp M; : -} + [ -f "$1" ] || return 0 + [ -L "$1" ] && return 0 -extract_fsps() -{ - copy_fsp S; : + x_ dd if=/dev/null of="$1" bs=1 seek=$TBFW_size + x_ mv "$1" "$_dest" + + return 1 } -# this copies the fsp s/m; re-base is handled by ./mk inject -copy_fsp() +extract_fsp() { - x_ cp "$appdir/Fsp_$1.fd" "$_dest" + x_ cp "$appdir/"Fsp_*.fd "${_dest%/*}" } fail_inject() @@ -330,7 +303,7 @@ inject() eval "`setvars "" nukemode new_mac xchanged`" archive="$1"; - new_mac="??:??:??:??:??:??" + new_mac="xx:xx:xx:xx:xx:xx" [ $# -gt 1 ] && case "$2" in nuke) @@ -343,6 +316,9 @@ inject() esac [ "$new_mac" = "keep" ] && new_mac="" + [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ + x_ make -C util/nvmutil clean && x_ make -C util/nvmutil + check_release "$archive" || $err "'$archive' is not a release archive" readcfg && need_files="y" @@ -406,7 +382,7 @@ readcfg() patch_release_roms() { has_hashes="n" - tmpromdir="tmp/DO_NOT_FLASH/bin/$board" + tmpromdir="$xbmklocal/DO_NOT_FLASH/bin/$board" remkdir "${tmpromdir%"/bin/$board"}" x_ tar -xf "$archive" -C "${tmpromdir%"/bin/$board"}" @@ -417,16 +393,8 @@ patch_release_roms() hashfile="$_hashes" && break; : done - x_ mkdir -p "tmp" && [ -L "tmp/rom.list" ] && \ - $err "'$archive' -> tmp/rom.list is a symlink - $dontflash" - - find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" > "tmp/rom.list" \ - || $err "'$archive' -> Can't make tmp/rom.list - $dontflash" - if readkconfig; then - while read -r _xrom ; do - process_release_rom "$_xrom" || break - done < "tmp/rom.list" + fe_ prep_rom "$tmpromdir" -maxdepth 1 -type f -name "*.rom" [ "$nukemode" != "nuke" ] || \ printf "Make sure you inserted vendor files: %s\n" \ "$vguide" > "$tmpromdir/README.md" || : @@ -460,7 +428,7 @@ patch_release_roms() "$archive" || $err "'$archive' -> Can't overwrite - $dontflash"; : } -process_release_rom() +prep_rom() { _xrom="$1" _xromname="${1##*/}" @@ -538,11 +506,10 @@ insert() _offset="" - if [ "$_t" = "fsp" ]; then - [ $# -gt 3 ] && _offset="$4" - else - [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ] && \ - $err "insert $*, $rom: offset given but empty (undefined)" + if [ "$_t" = "fsp" ] && [ $# -gt 3 ]; then + _offset="$4" + elif [ $# -gt 3 ] && _offset="-b $4" && [ -z "$4" ]; then + $err "insert $*, $rom: offset given but empty (undefined)" fi [ "$nukemode" = "nuke" ] || x_ e "$_dest" f @@ -556,11 +523,10 @@ insert() elif [ "$nukemode" = "nuke" ]; then x_ "$cbfstool" "$rom" remove -n "$cbfsname" elif [ "$_t" = "stage" ]; then # the only stage we handle is refcode - x_ mkdir -p tmp - x_ rm -f "tmp/refcode" - "$rmodtool" -i "$_dest" -o "tmp/refcode" || "!reloc refcode" - "$cbfstool" "$rom" add-stage -f "tmp/refcode" -n "$cbfsname" \ - -t stage || $err "$rom: !add ref" + x_ rm -f "$xbmklocal/refcode" + "$rmodtool" -i "$_dest" -o "$xbmklocal/refcode" || "!reloc ref" + "$cbfstool" "$rom" add-stage -f "$xbmklocal/refcode" \ + -n "$cbfsname" -t stage || $err "$rom: !add ref" else "$cbfstool" "$rom" add -f "$_dest" -n "$cbfsname" \ -t $_t $_offset || $err "$rom !add $_t ($_dest)" @@ -572,22 +538,18 @@ modify_mac() { [ -n "$CONFIG_GBE_BIN_PATH" ] || return 1 - x_ mkdir -p tmp && x_ cp "${CONFIG_GBE_BIN_PATH##*../}" tmp/gbe - [ "$new_mac" != "restore" ] && x_ make -C util/nvmutil && \ - x_ "$nvm" tmp/gbe setmac "$new_mac" - - find "$tmpromdir" -maxdepth 1 -type f -name "*.rom" > "tmp/rom.list" \ - || $err "'$archive' -> Can't make tmp/rom.list - $dontflash" + x_ cp "${CONFIG_GBE_BIN_PATH##*../}" "$xbmklocal/gbe" + [ -n "$new_mac" ] && [ "$new_mac" != "restore" ] && \ + x_ "$nvm" "$xbmklocal/gbe" setmac "$new_mac" - while read -r _xrom; do - e "$_xrom" f && xchanged="y" && x_ \ - "$ifdtool" $ifdprefix -i GbE:tmp/gbe "$_xrom" -O "$_xrom" - done < "tmp/rom.list" + fe_ newmac "$tmpromdir" -maxdepth 1 -type f -name "*.rom" printf "\nGbE NVM written to '%s':\n" "$archive" - x_ "$nvm" tmp/gbe dump | grep -v "bytes read from file" || : + x_ "$nvm" "$xbmklocal/gbe" dump | grep -v "bytes read from file" || : +} - [ "$new_mac" = "restore" ] && \ - printf "\nDefault GbE file '%s' written, unmodified.\n" \ - "${CONFIG_GBE_BIN_PATH##*../}"; : +newmac() +{ + e "$1" f && xchanged="y" && x_ \ + "$ifdtool" $ifdprefix -i GbE:"$xbmklocal/gbe" "$1" -O "$1"; : } diff --git a/include/lib.sh b/include/lib.sh index bef2a16f..50813352 100644 --- a/include/lib.sh +++ b/include/lib.sh @@ -128,6 +128,29 @@ setvars() printf "%s\n" "${_setvars% }" } +fe_() +{ + find_ex "x_" "$@" +} + +fx_() +{ + find_ex "" "$@" +} + +find_ex() +{ + errx="$1" && shift 1 + fd="`mktemp`" && x_ rm -f "$fd" && x_ touch "$fd" + xx="$1" && shift 1 + $errx find "$@" 2>/dev/null | sort > "$fd" || \ + $err "!find $(echo "$@") > \"$fd\"" + while read -r fx; do + $xx "$fx" || break; : + done < "$fd" + x_ rm -f "$fd" +} + x_() { [ $# -lt 1 ] || "$@" || $err "Unhandled error for: $(echo "$@")"; : diff --git a/include/mrc.sh b/include/mrc.sh index 6e00292b..eaf39dcb 100644 --- a/include/mrc.sh +++ b/include/mrc.sh @@ -8,35 +8,12 @@ eval "`setvars "" MRC_url MRC_url_bkup MRC_hash MRC_board SHELLBALL`" extract_mrc() { - chkvars "MRC_board" "CONFIG_MRC_FILE" - SHELLBALL="chromeos-firmwareupdate-$MRC_board" - - ( - x_ cd "$appdir" - extract_partition "${MRC_url##*/}" - extract_archive "$SHELLBALL" . - ) || $err "mrc download/extract failure" + extract_shellball "$cbfstool" "$appdir/"bios.bin extract -n mrc.bin \ -f "$_dest" -r RO_SECTION || $err "extract_mrc: !$cbfstool $_dest" - [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode; : -} - -extract_partition() -{ - printf "Extracting ROOT-A partition\n" - ROOTP=$( printf "unit\nB\nprint\nquit\n" | \ - parted "${1%.zip}" 2>/dev/null | grep "ROOT-A" ) - - START=$(( $( echo $ROOTP | cut -f2 -d\ | tr -d "B" ) )) - SIZE=$(( $( echo $ROOTP | cut -f4 -d\ | tr -d "B" ) )) - - dd if="${1%.zip}" of="root-a.ext2" bs=1024 skip=$(( $START / 1024 )) \ - count=$(( $SIZE / 1024 )) || $err "ex dd ${1%.zip}, root-a.ext2" - - printf "cd /usr/sbin\ndump chromeos-firmwareupdate %s\nquit" \ - "$SHELLBALL" | debugfs "root-a.ext2" || $err "!extract shellball" + [ -n "$CONFIG_REFCODE_BLOB_FILE" ] && extract_refcode extra; : } extract_refcode() @@ -44,6 +21,8 @@ extract_refcode() _refdest="${CONFIG_REFCODE_BLOB_FILE##*../}" e "$_refdest" f && return 0 + [ $# -lt 1 ] && extract_shellball + # cbfstool changed the attributes scheme for stage files, # incompatible with older versions before coreboot 4.14, # so we need coreboot 4.13 cbfstool for certain refcode files @@ -57,3 +36,31 @@ extract_refcode() [ -z "$MRC_refcode_gbe" ] || x_ dd if="config/ifd/hp820g2/1.bin" \ of="$_refdest" bs=1 seek=$MRC_refcode_gbe count=1 conv=notrunc; : } + +extract_shellball() +{ + chkvars "MRC_board" "CONFIG_MRC_FILE" + SHELLBALL="chromeos-firmwareupdate-$MRC_board" + + ( + x_ cd "$appdir" + extract_partition "${MRC_url##*/}" + extract_archive "$SHELLBALL" . + ) || $err "mrc download/extract failure"; : +} + +extract_partition() +{ + printf "Extracting ROOT-A partition\n" + ROOTP=$( printf "unit\nB\nprint\nquit\n" | \ + parted "${1%.zip}" 2>/dev/null | grep "ROOT-A" ) + + START=$(( $( echo $ROOTP | cut -f2 -d\ | tr -d "B" ) )) + SIZE=$(( $( echo $ROOTP | cut -f4 -d\ | tr -d "B" ) )) + + dd if="${1%.zip}" of="root-a.ext2" bs=1024 skip=$(( $START / 1024 )) \ + count=$(( $SIZE / 1024 )) || $err "ex dd ${1%.zip}, root-a.ext2" + + printf "cd /usr/sbin\ndump chromeos-firmwareupdate %s\nquit" \ + "$SHELLBALL" | debugfs "root-a.ext2" || $err "!extract shellball" +} |