diff options
| author | Leah Rowe <leah@libreboot.org> | 2023-05-12 21:53:06 +0100 | 
|---|---|---|
| committer | Leah Rowe <leah@libreboot.org> | 2023-05-12 23:09:39 +0100 | 
| commit | 9eee0fb483e2abf9698ffc3a946304166ec9b1e9 (patch) | |
| tree | 25087a1ee243c4481e45c3b4545fc5d8cc5724e5 /resources/scripts | |
| parent | bceb5f2eb47c9b00d8c0be52adca621588f180d0 (diff) | |
build/boot/roms: split main() to topdown functions
the logic can now more or less be read chronologically
Diffstat (limited to 'resources/scripts')
| -rwxr-xr-x | resources/scripts/build/boot/roms_helper | 504 | 
1 files changed, 283 insertions, 221 deletions
| diff --git a/resources/scripts/build/boot/roms_helper b/resources/scripts/build/boot/roms_helper index c0cf6123..92fc2e4a 100755 --- a/resources/scripts/build/boot/roms_helper +++ b/resources/scripts/build/boot/roms_helper @@ -32,6 +32,7 @@ set -u -e  projectname="$(cat projectname)"  cbcfgdir="resources/coreboot" +boardcfgdir=""  kmapdir="resources/grub/keymap"  displaymodes=""  payloads="" @@ -46,9 +47,9 @@ arch="undefined"  # Disable all payloads by default.  # board.cfg files have to specifically enable [a] payload(s)  payload_grub="n" -payload_grub_wseabios="n" # seabios chainloaded from grub +payload_grub_withseabios="n" # seabios chainloaded from grub  payload_seabios="n" -payload_seabios_wgrub="n" # i386-coreboot grub from SeaBIOS boot menu +payload_seabios_withgrub="n" # i386-coreboot grub from SeaBIOS boot menu  payload_memtest="n"  payload_uboot="n"  uboot_config="undefined" @@ -88,17 +89,37 @@ main()  		printf "build/roms: undefined board. Exiting\n"  		exit 1  	fi -	if [ ! -d "${cbcfgdir}/${board}" ]; then + +	load_config +	build_dependencies +	build_rom_images +} + +load_config() +{ +	boardcfgdir="${cbcfgdir}/${board}" + +	if [ ! -d "${boardcfgdir}" ]; then  		printf "build/roms: Target not defined: %s\n" ${board}  		exit 1  	fi -	if [ ! -f "${cbcfgdir}/${board}/board.cfg" ]; then +	if [ ! -f "${boardcfgdir}/board.cfg" ]; then  		printf "build/roms %s: Missing board.cfg\n" ${board}  		exit 1  	fi -	# Override the above defaults using board.cfg -	. "${cbcfgdir}/${board}/board.cfg" +	. "${boardcfgdir}/board.cfg" + +	if [ "${board}" != "${cbtree}" ]; then +		cbdir="coreboot/${cbtree}" +	else +		cbdir="coreboot/${board}" +	fi + +	romdir="bin/${board}" +	cbfstool="${cbdir}/util/cbfstool/cbfstool" +	seavgabiosrom="payload/seabios/seavgabios.bin" +	corebootrom="${cbdir}/build/coreboot.rom"  	if [ "${grub_scan_disk}" = "undefined" ]; then  		printf "build/roms '%s': grub_scan_disk is undefined. " \ @@ -133,30 +154,16 @@ main()  			[ "${payload_memtest}" != "y" ]; then  		payload_memtest="n"  	fi -	if [ "${payload_grub_wseabios}" = "y" ]; then +	if [ "${payload_grub_withseabios}" = "y" ]; then  		payload_grub="y"  	fi -	if [ "${payload_grub_wseabios}" = "y" ]; then +	if [ "${payload_grub_withseabios}" = "y" ]; then  		payload_seabios="y" -		payload_seabios_wgrub="y" +		payload_seabios_withgrub="y"  	fi -	if [ "${payload_seabios_wgrub}" = "y" ]; then +	if [ "${payload_seabios_withgrub}" = "y" ]; then  		payload_seabios="y"  	fi -	# NOTE: reverse logic must NOT be applied. If SeaBIOS-with-GRUB works, -	# that doesn't mean GRUB-with-SeaBIOS will. For example, the board -	# might have an external GPU, where SeaBIOS should be booted first -	if [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] \ -				&& [ "${payload_uboot}" != "y" ]; then -		for configfile in "${cbcfgdir}/${board}/config/"*; do -			if [ ! -e "${configfile}" ]; then -				continue -			fi -			printf "build/roms %s: Payload undefined. Exiting.\n" \ -					${board} -			exit 1 -		done -	fi  	if [ "${payload_uboot}" != "n" ] && \  			[ "${payload_uboot}" != "y" ]; then  		payload_uboot="n" @@ -165,13 +172,20 @@ main()  			[ "${uboot_config}" = "undefined" ]; then  		uboot_config="default"  	fi + +	load_config_overrides +	die_if_cbconfig_and_nopayload +} + +load_config_overrides() +{  	# Override all payload directives with cmdline args  	if [ ! -z ${payloads} ]; then	  		echo "setting payloads $payloads"  		payload_grub="n" -		payload_grub_wseabios="n" # seabios chainloaded from grub +		payload_grub_withseabios="n" # seabios chainloaded from grub  		payload_seabios="n" -		payload_seabios_wgrub="n" # grub from SeaBIOS menu +		payload_seabios_withgrub="n" # grub from SeaBIOS menu  		payload_uboot="n"  		payload_memtest="n" @@ -179,21 +193,46 @@ main()  			eval "payload_${payload}=y"  		done  	fi  +} -	romdir="bin/${board}" -	cbdir="coreboot/${board}" -	if [ "${board}" != "${cbtree}" ]; then -		cbdir="coreboot/${cbtree}" +die_if_cbconfig_and_nopayload() +{ +	# if a coreboot config exists, and payloads are not +	# defined in the lbmk config, exit with error +	# if no configs exist, this won't fail. this way, cbtrees +	# like "default" can exist which just contain patches +	if [ "${payload_grub}" != "y" ] && [ "${payload_seabios}" != "y" ] \ +				&& [ "${payload_uboot}" != "y" ]; then +		for configfile in "${boardcfgdir}/config/"*; do +			if [ ! -e "${configfile}" ]; then +				continue +			fi +			printf "build/roms %s: Payload undefined. Exiting.\n" \ +					${board} +			exit 1 +		done  	fi -	cbfstool="${cbdir}/util/cbfstool/cbfstool" -	corebootrom="${cbdir}/build/coreboot.rom" -	seavgabiosrom="payload/seabios/seavgabios.bin" +} +build_dependencies() +{  	if [ ! -d "${cbdir}" ]; then  		./download coreboot ${cbtree}  	fi +	if [ ! -f "${cbfstool}" ]; then +		./build module cbutils ${cbtree} || exit 1 +	fi  	cat version > "${cbdir}/.coreboot-version" +	build_dependency_crossgcc + +	build_dependency_seabios +	build_dependency_grub +	build_dependency_uboot +} + +build_dependency_crossgcc() +{  	if [ "${arch}" = "x86_32" ] || [ "${arch}" = "x86_64" ]; then  		if [ ! -d "${cbdir}/util/crossgcc/xgcc/i386-elf/" ]; then  			# Even for 64-bit machines, coreboot builds 32-bit ROM @@ -227,10 +266,10 @@ main()  	fi  	export PATH="$(pwd)/${cbdir}/util/crossgcc/xgcc/bin:$PATH" +} -	if [ ! -f "${cbfstool}" ]; then -		./build module cbutils ${cbtree} || exit 1 -	fi +build_dependency_seabios() +{  	if [ ! -f "${seavgabiosrom}" ] \  			|| [ ! -f payload/seabios/seabios_libgfxinit.elf ] \  			|| [ ! -f payload/seabios/seabios_vgarom.elf ] \ @@ -238,7 +277,7 @@ main()  		if [ "${payload_seabios}" = "y" ]; then  			./build payload seabios  		elif [ "${payload_grub}" = "y" ] \ -				&& [ "${payload_grub_wseabios}" = "y" ] +				&& [ "${payload_grub_withseabios}" = "y" ]  		then  			./build payload seabios  		fi @@ -248,12 +287,13 @@ main()  			./build module memtest86plus  		fi  	fi +} -	[ -d "${romdir}/" ] || mkdir -p "${romdir}/" -	rm -f "${romdir}"/* - +build_dependency_grub() +{  	if [ "${payload_grub}" = "y" ] \ -				|| [ "${payload_seabios_wgrub}" = "y" ]; then +				|| [ "${payload_seabios_withgrub}" = "y" ] +	then  		if [ -f "payload/grub/grub_usqwerty.cfg" ]; then  			sha1cmd="sha1sum resources/grub/config/grub.cfg"  			grubrefchecksum="$(${sha1cmd} | awk '{print $1}')" @@ -287,7 +327,10 @@ main()  			fi  		done  	fi +} +build_dependency_uboot() +{  	if [ "${payload_uboot}" = "y" ]; then  		ubdir=""  		if [ "${uboot_config}" = "default" ]; then @@ -306,32 +349,38 @@ main()  			./build payload u-boot "${board}"  		fi  	fi +} + +build_rom_images() +{ +	[ -d "${romdir}/" ] || mkdir -p "${romdir}/" +	rm -f "${romdir}"/*  	if [ -z ${displaymodes} ]; then  		initmode="libgfxinit"  		for displaymode in corebootfb txtmode; do -			_cbcfg="${cbcfgdir}/${board}/config/${initmode}" +			_cbcfg="${boardcfgdir}/config/${initmode}"  			_cbcfg="${_cbcfg}_${displaymode}"  			mkRoms "${_cbcfg}" "${displaymode}" "${initmode}"  		done  		initmode="vgarom"  		for displaymode in vesafb txtmode; do	 -			_cbcfg="${cbcfgdir}/${board}/config/${initmode}" +			_cbcfg="${boardcfgdir}/config/${initmode}"  			_cbcfg="${_cbcfg}_${displaymode}"  			mkRoms "${_cbcfg}" "${displaymode}" "${initmode}"  		done  		initmode="normal"  		displaymode="txtmode" -		_cbcfg="${cbcfgdir}/${board}/config/${initmode}" +		_cbcfg="${boardcfgdir}/config/${initmode}"  		mkRoms "${_cbcfg}" "${displaymode}" "${initmode}"  	else  		echo "special displaymode defined as $displaymodes"  		for initmode in vgarom libgfxinit; do  			for displaymode in ${displaymodes}; do -				_cbcfg="${cbcfgdir}/${board}/config/" +				_cbcfg="${boardcfgdir}/config/"  				_cbcfg="${_cbcfg}${initmode}_${displaymode}"  				mkRoms "${_cbcfg}" "${displaymode}" \  						"${initmode}" @@ -345,52 +394,76 @@ main()  	)  } -# it is assumed that no other work will be done on the ROM -# after calling this function. therefore this function is "final" -moverom() +# Main ROM building function. This calls all other functions +mkRoms()  { -	rompath="$1" -	_newrom="$2" -	cuttype="$3" +	_cbcfg="${1}" +	displaymode="${2}" +	initmode="${3}" -	printf "\nCreating new ROM image: %s\n" "${_newrom}" +	if [ ! -f "${_cbcfg}" ]; then +		printf "'%s' does not exist. Skipping build for %s %s %s\n" \ +				${_cbcfg} ${board} \ +				${displaymode} ${initmode} +		return 0 +	fi -	if [ "${cuttype}" = "4MiB IFD BIOS region" ]; then -		dd if=${rompath} of=${_newrom} bs=1 \ -				skip=$(($(stat -c %s ${rompath}) - 0x400000)) \ -				count=4194304 -	else -		cp ${rompath} ${_newrom} +	# make coreboot ROM without a payload in it +	mkCoreboot "${cbdir}" "${_cbcfg}" + +	# now add payloads, per user config: + +	if [ "${displaymode}" = "txtmode" ] \ +				&& [ "${payload_memtest}" = "y" ]; then +		"${cbfstool}" "${corebootrom}" add-payload \ +				-f memtest86plus/memtest -n img/memtest \ +				-c lzma || exit 1  	fi -	for romsize in 4 8 16; do -		ifdgbe="descriptors/ich9m/ich9fdgbe_${romsize}m.bin" -		if [ "${cuttype}" = "${romsize}MiB ICH9 IFD NOR flash" ]; then -			if [ ! -f "${ifdgbe}" ]; then -				./build descriptors ich9m +	if [ "${payload_seabios}" = "y" ]; then +		if [ "${payload_seabios_withgrub}" = "n" ]; then +			x=${corebootrom} +			y=${initmode} +			t=$(mkSeabiosRom "$x" "fallback/payload" "$y") + +			_newrom="${romdir}/seabios_${board}_${initmode}.rom" +			if [ "${initmode}" != "normal" ]; then +				_newrom="${_newrom%.rom}_${displaymode}.rom"  			fi -			dd if=${ifdgbe} of=${_newrom} bs=1 count=12k \ -					conv=notrunc + +			# rom image ready to be flashed: +			moverom "${t}" "${_newrom}" "${romtype}" +			rm -f "${t}" +		else +			tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) +			cp "${corebootrom}" "${tmprom}" +			mkRomsWithGrub "${tmprom}" "${initmode}" \ +					"${displaymode}" "seabios_withgrub" +			rm -f "${tmprom}"  		fi -		cmpstr="${romsize}MiB ICH9 IFD NOGBE NOR flash" -		ifdgbe="descriptors/ich9m/ich9fdnogbe_${romsize}m.bin" -		if [ "${cuttype}" = "${cmpstr}" ]; then -			if [ ! -f "${ifdgbe}" ]; then -				./build descriptors ich9m -			fi -			dd if=${ifdgbe} of=${_newrom} bs=1 count=4k \ -					conv=notrunc +	fi + +	if [ "${payload_grub}" = "y" ]; then +		mkRomsWithGrub "${corebootrom}" "${initmode}" \ +				"${displaymode}" "grub" +	fi + +	if [ "${payload_uboot}" = "y" ]; then +		x=${corebootrom} +		y=${uboot_config} +		z=${cbfstool} +		tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")" +		if [ "${initmode}" = "normal" ]; then +			_newrom="${romdir}/uboot_payload_${board}_" +			_newrom="${_newrom}${initmode}.rom" +		else +			_newrom="${romdir}/uboot_payload_${board}_" +			_newrom="${_newrom}${initmode}_${displaymode}.rom"  		fi -	done -	if [ "${cuttype}" = "i945 laptop" ]; then -		dd if=${_newrom} of=top64k.bin bs=1 \ -				skip=$(($(stat -c %s ${_newrom}) - 0x10000)) \ -				count=64k -		dd if=top64k.bin of=${_newrom} bs=1 \ -				seek=$(($(stat -c %s ${_newrom}) - 0x20000)) \ -				count=64k conv=notrunc -		rm -f top64k.bin +		# rom image ready to be flashed: +		moverom "${tmpubootrom}" "${_newrom}" "${romtype}" +		rm -f "${tmpubootrom}"  	fi  } @@ -398,33 +471,37 @@ moverom()  mkCoreboot()  {  	cbdir="${1}" # eg. coreboot/default -	_cbcfg="${2}" # eg. ${cbcfgdir}/e6400nvidia_4mb/config/normal +	_cbcfg="${2}" # eg. resources/coreboot/e6400nvidia_4mb/config/normal +  	if [ ! -f "${_cbcfg}" ]; then  		printf "\nmkCoreboot: coreboot config '%s' does not exist. " \  				${_cbcfg}  		printf "Skipping build.\n"  		return 0  	fi +  	printf "%s-%s\n" "$(cat projectname)" "$(cat version)" \  			> "${cbdir}/.coreboot-version" -	( -		if [ -f "${cbfstool}" ]; then -			mv "${cbfstool}" "${cbdir}/cbfstool" -		fi -		cd "${cbdir}" -		make distclean -		cd - +	( +	if [ -f "${cbfstool}" ]; then +		mv "${cbfstool}" "${cbdir}/cbfstool" +	fi +	cd "${cbdir}" +	make distclean +	cd - -		if [ -f "${cbdir}/cbfstool" ]; then -			mv "${cbdir}/cbfstool" "${cbfstool}" -		fi +	if [ -f "${cbdir}/cbfstool" ]; then +		mv "${cbdir}/cbfstool" "${cbfstool}" +	fi  	) +  	cp "${_cbcfg}" "${cbdir}"/.config  	./build module cbutils ${cbdir#coreboot/} || exit 1 +  	( -		cd "${cbdir}" -		make -j$(nproc) +	cd "${cbdir}" +	make -j$(nproc)  	)  } @@ -468,34 +545,66 @@ mkSeabiosRom()  	printf "%s\n" "${tmprom}"  } -# make a rom in /tmp/ and then print the path of that ROM -mkUbootRom() +# Make separate ROM images with GRUB payload, for each supported keymap +mkRomsWithGrub()  { -	target_cbrom="${1}" # rom to insert u-boot in. it won't be touched -		# (a tmpfile will be made instead) -	target_uboot_cbfs_path="${2}" # e.g. fallback/payload -	target_uboot_config="${3}" -	cbfstool_path="${4}" +	tmprompath="${1}" +	initmode="${2}" +	displaymode="${3}" +	firstpayloadname="${4}" # allow values: grub, seabios, seabios_withgrub -	if [ "${target_uboot_config}" = "default" ]; then -		target_ubdir="payload/u-boot/${board}" -	else -		target_ubdir="payload/u-boot/${board}/${target_uboot_config}" +	x=${tmprompath} +	y=${initmode} +	if [ "${payload_grub_withseabios}" = "y" ] \ +			&& [ "${firstpayloadname}" = "grub" ]; then +		mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}")" \ +				"${tmprompath}" +	elif [ "${payload_seabios_withgrub}" ] \ +			&& [ "${firstpayloadname}" != "grub" ]; then +		mv "$(mkSeabiosRom "${x}" "fallback/payload" "${y}")" \ +				"${tmprompath}"  	fi -	if [ -f "${target_ubdir}/u-boot.elf" ]; then -		target_ubootelf="${target_ubdir}/u-boot.elf" -	elif [ -f "${target_ubdir}/u-boot" ]; then -		target_ubootelf="${target_ubdir}/u-boot" +	keymaps="" +	if [ -z ${keyboard_layouts} ]; then +		for kmapfile in "${kmapdir}"/*; do +			keymaps="${keymaps} ${kmapfile}" +		done +	else +		for keymapname in ${keyboard_layouts}; do +			keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb" +		done  	fi +	for keymapfile in ${keymaps}; do +		if [ ! -f "${keymapfile}" ]; then +			continue +		fi -	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) +		keymap="${keymapfile##*/}" +		keymap="${keymap%.gkb}" -	cp "${target_cbrom}" "${tmprom}" -	"${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \ -			-n ${target_uboot_cbfs_path} -c lzma || exit 1 +		grub_path_in_cbfs="fallback/payload" +		if [ "${firstpayloadname}" != "grub" ]; then +			grub_path_in_cbfs="img/grub2" +		fi -	printf "%s\n" "${tmprom}" +		# evil bofh rfc 2646 compliance hack +		x=${keymap} +		y=${tmprompath} +		z=${grub_path_in_cbfs} +		tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")" + +		_newrom="${romdir}/${firstpayloadname}_${board}_${initmode}_" +		if [ "${initmode}" = "normal" ]; then +			_newrom="${_newrom}${keymap}.rom" +		else +			_newrom="${_newrom}${displaymode}_${keymap}.rom" +		fi + +		# rom image ready to be flashed: +		moverom "${tmpgrubrom}" "${_newrom}" "${romtype}" +		rm -f "${tmpgrubrom}" +	done  }  # make a rom in /tmp/ and then print the path of that ROM @@ -510,6 +619,7 @@ mkGrubRom()  	grubtestcfg="payload/grub/grub_${target_keymap}_test.cfg"  	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) || exit 1 +  	cp "${target_cbrom}" "${tmprom}" || exit 1  	"${cbfstool}" "${tmprom}" add-payload -f "${grubelf}" \ @@ -554,130 +664,82 @@ mkGrubRom()  	printf "%s\n" "${tmprom}"  } -# Make separate ROM images with GRUB payload, for each supported keymap -mkRomsWithGrub() +# make a rom in /tmp/ and then print the path of that ROM +mkUbootRom()  { -	tmprompath="${1}" -	initmode="${2}" -	displaymode="${3}" -	firstpayloadname="${4}" # allow values: grub, seabios, seabios_wgrub - -	x=${tmprompath} -	y=${initmode} -	if [ "${payload_grub_wseabios}" = "y" ] \ -			&& [ "${firstpayloadname}" = "grub" ]; then -		mv "$(mkSeabiosRom "${x}" "seabios.elf" "${y}")" \ -				"${tmprompath}" -	elif [ "${payload_seabios_wgrub}" ] \ -			&& [ "${firstpayloadname}" != "grub" ]; then -		mv "$(mkSeabiosRom "${x}" "fallback/payload" "${y}")" \ -				"${tmprompath}" -	fi	 +	target_cbrom="${1}" # rom to insert u-boot in. it won't be touched +		# (a tmpfile will be made instead) +	target_uboot_cbfs_path="${2}" # e.g. fallback/payload +	target_uboot_config="${3}" +	cbfstool_path="${4}" -	keymaps="" -	if [ -z ${keyboard_layouts} ]; then -		for kmapfile in "${kmapdir}"/*; do -			keymaps="${keymaps} ${kmapfile}" -		done +	if [ "${target_uboot_config}" = "default" ]; then +		target_ubdir="payload/u-boot/${board}"  	else -		for keymapname in ${keyboard_layouts}; do -			keymaps="${keymaps} ${kmapdir}/${keymapname}.gkb" -		done +		target_ubdir="payload/u-boot/${board}/${target_uboot_config}"  	fi -	for keymapfile in ${keymaps}; do -		if [ ! -f "${keymapfile}" ]; then -			continue -		fi -		keymap="${keymapfile##*/}" -		keymap="${keymap%.gkb}" +	if [ -f "${target_ubdir}/u-boot.elf" ]; then +		target_ubootelf="${target_ubdir}/u-boot.elf" +	elif [ -f "${target_ubdir}/u-boot" ]; then +		target_ubootelf="${target_ubdir}/u-boot" +	fi -		grub_path_in_cbfs="fallback/payload" -		if [ "${firstpayloadname}" != "grub" ]; then -			grub_path_in_cbfs="img/grub2" -		fi +	tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) -		# evil bofh rfc 2646 compliance hack -		x=${keymap} -		y=${tmprompath} -		z=${grub_path_in_cbfs} -		tmpgrubrom="$(mkGrubRom "${x}" "${y}" "${z}")" +	cp "${target_cbrom}" "${tmprom}" +	"${cbfstool}" "${tmprom}" add-payload -f "${target_ubootelf}" \ +			-n ${target_uboot_cbfs_path} -c lzma || exit 1 -		_newrom="${romdir}/${firstpayloadname}_${board}_${initmode}_" -		if [ "${initmode}" = "normal" ]; then -			_newrom="${_newrom}${keymap}.rom" -		else -			_newrom="${_newrom}${displaymode}_${keymap}.rom" -		fi -		moverom "${tmpgrubrom}" "${_newrom}" "${romtype}" -		rm -f "${tmpgrubrom}" -	done +	printf "%s\n" "${tmprom}"  } -# Main ROM building function. This calls all other functions -mkRoms() +# it is assumed that no other work will be done on the ROM +# after calling this function. therefore this function is "final" +moverom()  { -	_cbcfg="${1}" -	displaymode="${2}" -	initmode="${3}" - -	if [ ! -f "${_cbcfg}" ]; then -		printf "'%s' does not exist. Skipping build for %s %s %s\n" \ -				${_cbcfg} ${board} \ -				${displaymode} ${initmode} -		return 0 -	fi +	rompath="$1" +	_newrom="$2" +	cuttype="$3" -	mkCoreboot "${cbdir}" "${_cbcfg}" +	printf "\nCreating new ROM image: %s\n" "${_newrom}" -	if [ "${displaymode}" = "txtmode" ] \ -				&& [ "${payload_memtest}" = "y" ]; then -		"${cbfstool}" "${corebootrom}" add-payload \ -				-f memtest86plus/memtest -n img/memtest \ -				-c lzma || exit 1 +	if [ "${cuttype}" = "4MiB IFD BIOS region" ]; then +		dd if=${rompath} of=${_newrom} bs=1 \ +				skip=$(($(stat -c %s ${rompath}) - 0x400000)) \ +				count=4194304 +	else +		cp ${rompath} ${_newrom}  	fi -	if [ "${payload_seabios}" = "y" ]; then -		if [ "${payload_seabios_wgrub}" = "n" ]; then -			x=${corebootrom} -			y=${initmode} -			t=$(mkSeabiosRom "$x" "fallback/payload" "$y") - -			_newrom="${romdir}/seabios_${board}_${initmode}.rom" -			if [ "${initmode}" != "normal" ]; then -				_newrom="${_newrom%.rom}_${displaymode}.rom" +	for romsize in 4 8 16; do +		ifdgbe="descriptors/ich9m/ich9fdgbe_${romsize}m.bin" +		if [ "${cuttype}" = "${romsize}MiB ICH9 IFD NOR flash" ]; then +			if [ ! -f "${ifdgbe}" ]; then +				./build descriptors ich9m  			fi - -			moverom "${t}" "${_newrom}" "${romtype}" -			rm -f "${t}" -		else -			tmprom=$(mktemp -t coreboot_rom.XXXXXXXXXX) -			cp "${corebootrom}" "${tmprom}" -			mkRomsWithGrub "${tmprom}" "${initmode}" \ -					"${displaymode}" "seabios_withgrub" -			rm -f "${tmprom}" +			dd if=${ifdgbe} of=${_newrom} bs=1 count=12k \ +					conv=notrunc  		fi -	fi - -	if [ "${payload_grub}" = "y" ]; then -		mkRomsWithGrub "${corebootrom}" "${initmode}" \ -				"${displaymode}" "grub" -	fi - -	if [ "${payload_uboot}" = "y" ]; then -		x=${corebootrom} -		y=${uboot_config} -		z=${cbfstool} -		tmpubootrom="$(mkUbootRom "$x" "fallback/payload" "$y" "$z")" -		if [ "${initmode}" = "normal" ]; then -			_newrom="${romdir}/uboot_payload_${board}_" -			_newrom="${_newrom}${initmode}.rom" -		else -			_newrom="${romdir}/uboot_payload_${board}_" -			_newrom="${_newrom}${initmode}_${displaymode}.rom" +		cmpstr="${romsize}MiB ICH9 IFD NOGBE NOR flash" +		ifdgbe="descriptors/ich9m/ich9fdnogbe_${romsize}m.bin" +		if [ "${cuttype}" = "${cmpstr}" ]; then +			if [ ! -f "${ifdgbe}" ]; then +				./build descriptors ich9m +			fi +			dd if=${ifdgbe} of=${_newrom} bs=1 count=4k \ +					conv=notrunc  		fi -		moverom "${tmpubootrom}" "${_newrom}" "${romtype}" -		rm -f "${tmpubootrom}" +	done + +	if [ "${cuttype}" = "i945 laptop" ]; then +		dd if=${_newrom} of=top64k.bin bs=1 \ +				skip=$(($(stat -c %s ${_newrom}) - 0x10000)) \ +				count=64k +		dd if=top64k.bin of=${_newrom} bs=1 \ +				seek=$(($(stat -c %s ${_newrom}) - 0x20000)) \ +				count=64k conv=notrunc +		rm -f top64k.bin  	fi  } | 
