diff options
Diffstat (limited to 'resources/scripts')
| -rwxr-xr-x | resources/scripts/blobs/download | 359 | 
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 $@ | 
