integrate HAL

Signed-off-by: Daniil Klimuk <daniil.klimuk@3mdeb.com>
This commit is contained in:
Daniil Klimuk
2024-10-14 12:40:24 +02:00
parent d7780f288b
commit 6d53e2cf05
7 changed files with 146 additions and 143 deletions

View File

@@ -13,6 +13,8 @@
source $DTS_ENV
# shellcheck source=../include/dts-functions.sh
source $DTS_FUNCS
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
[ -z "$SYSTEM_VENDOR" ] && error_exit "SYSTEM_VENDOR not given"
[ -z "$SYSTEM_MODEL" ] && error_exit "SYSTEM_MODEL not given"
@@ -447,17 +449,15 @@ backup() {
# No descriptor, probably safe to read everything
FLASHROM_ADD_OPT_READ=""
fi
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r "${FW_BACKUP_DIR}"/rom.bin ${FLASHROM_ADD_OPT_READ} >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$FLASHROM read_firm_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r "${FW_BACKUP_DIR}"/rom.bin ${FLASHROM_ADD_OPT_READ} >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
error_check "Failed to read BIOS firmware backup"
if [ "$HAVE_EC" == "true" ]; then
echo "Checking for Open Source Embedded Controller firmware"
$DASHARO_ECTOOL info >> $ERR_LOG_FILE 2>&1
if [ $? -eq 0 ]; then
if check_for_opensource_firmware; then
echo "Device has already Open Source Embedded Controller firmware, do not backup EC..."
else
echo "Backing up EC firmware..."
$FLASHROM -p "$PROGRAMMER_EC" ${FLASH_CHIP_SELECT} -r "${FW_BACKUP_DIR}"/ec.bin >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$FLASHROM read_firm_mock -p "$PROGRAMMER_EC" ${FLASH_CHIP_SELECT} -r "${FW_BACKUP_DIR}"/ec.bin >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
error_check "Failed to read EC firmware backup"
fi
fi
@@ -471,14 +471,14 @@ backup() {
}
romhole_migration() {
cbfstool $BIOS_UPDATE_FILE layout -w | grep -q "ROMHOLE" || return
$CBFSTOOL layout_mock $BIOS_UPDATE_FILE layout -w | grep -q "ROMHOLE" || return
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/rom.bin --ifd -i bios >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$FLASHROM read_firm_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/rom.bin --ifd -i bios >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
error_check "Failed to read current firmware to migrate MSI ROMHOLE"
if check_if_dasharo; then
cbfstool /tmp/rom.bin layout -w | grep -q "ROMHOLE" || return
$CBFSTOOL layout_mock /tmp/rom.bin layout -w | grep -q "ROMHOLE" || return
# This one is rather unlikely to fail, but just in case print a warning
cbfstool /tmp/rom.bin read -r ROMHOLE -f /tmp/romhole.bin 2> /dev/null
$CBFSTOOL read_romhole_mock /tmp/rom.bin read -r ROMHOLE -f /tmp/romhole.bin 2> /dev/null
if [ $? -ne 0 ]; then
print_warning "Failed to migrate MSI ROMHOLE, your platform's unique SMBIOS/DMI data may be lost"
return
@@ -487,59 +487,59 @@ romhole_migration() {
dd if=/tmp/rom.bin of=/tmp/romhole.bin skip=$((0x17C0000)) bs=128K count=1 iflag=skip_bytes > /dev/null 2>&1
fi
cbfstool "$BIOS_UPDATE_FILE" write -r ROMHOLE -f /tmp/romhole.bin -u 2> /dev/null
$CBFSTOOL "$BIOS_UPDATE_FILE" write -r ROMHOLE -f /tmp/romhole.bin -u 2> /dev/null
}
smbios_migration() {
echo -n "$(dmidecode -s system-uuid)" > $SYSTEM_UUID_FILE
echo -n "$(dmidecode -s baseboard-serial-number)" > $SERIAL_NUMBER_FILE
echo -n "$($DMIDECODE dump_var_mock -s system-uuid)" > $SYSTEM_UUID_FILE
echo -n "$($DMIDECODE dump_var_mock -s baseboard-serial-number)" > $SERIAL_NUMBER_FILE
COREBOOT_SEC=$(cbfstool $BIOS_UPDATE_FILE layout -w | grep "COREBOOT")
FW_MAIN_A_SEC=$(cbfstool $BIOS_UPDATE_FILE layout -w | grep "FW_MAIN_A")
FW_MAIN_B_SEC=$(cbfstool $BIOS_UPDATE_FILE layout -w | grep "FW_MAIN_B")
COREBOOT_SEC=$($CBFSTOOL layout_mock $BIOS_UPDATE_FILE layout -w | grep "COREBOOT")
FW_MAIN_A_SEC=$($CBFSTOOL layout_mock $BIOS_UPDATE_FILE layout -w | grep "FW_MAIN_A")
FW_MAIN_B_SEC=$($CBFSTOOL layout_mock $BIOS_UPDATE_FILE layout -w | grep "FW_MAIN_B")
if [ -n "$COREBOOT_SEC" ]; then
# if the migration can be done there for sure will be COREBOOT section
echo "Beginning SMBIOS migration process..."
echo "Migrate to COREBOOT section."
cbfstool $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r COREBOOT
cbfstool $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r COREBOOT
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r COREBOOT
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r COREBOOT
fi
if [ -n "$FW_MAIN_A_SEC" ]; then
echo "Migrate to FW_MAIN_A section."
cbfstool $BIOS_UPDATE_FILE expand -r FW_MAIN_A
cbfstool $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r FW_MAIN_A
cbfstool $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r FW_MAIN_A
cbfstool $BIOS_UPDATE_FILE truncate -r FW_MAIN_A
$CBFSTOOL $BIOS_UPDATE_FILE expand -r FW_MAIN_A
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r FW_MAIN_A
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r FW_MAIN_A
$CBFSTOOL $BIOS_UPDATE_FILE truncate -r FW_MAIN_A
fi
if [ -n "$FW_MAIN_B_SEC" ]; then
echo "Migrate to FW_MAIN_B section."
cbfstool $BIOS_UPDATE_FILE expand -r FW_MAIN_B
cbfstool $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r FW_MAIN_B
cbfstool $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r FW_MAIN_B
cbfstool $BIOS_UPDATE_FILE truncate -r FW_MAIN_B
$CBFSTOOL $BIOS_UPDATE_FILE expand -r FW_MAIN_B
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SERIAL_NUMBER_FILE -n serial_number -t raw -r FW_MAIN_B
$CBFSTOOL $BIOS_UPDATE_FILE add -f $SYSTEM_UUID_FILE -n system_uuid -t raw -r FW_MAIN_B
$CBFSTOOL $BIOS_UPDATE_FILE truncate -r FW_MAIN_B
fi
}
smmstore_migration() {
echo -n "Backing up firmware configuration... "
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/dasharo_dump.rom ${FLASHROM_ADD_OPT_READ} --fmap -i FMAP -i SMMSTORE >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
cbfstool /tmp/dasharo_dump.rom read -r SMMSTORE -f /tmp/smmstore.bin >> $ERR_LOG_FILE 2>&1 || \
$FLASHROM read_firm_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/dasharo_dump.rom ${FLASHROM_ADD_OPT_READ} --fmap -i FMAP -i SMMSTORE >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$CBFSTOOL read_smmstore_mock /tmp/dasharo_dump.rom read -r SMMSTORE -f /tmp/smmstore.bin >> $ERR_LOG_FILE 2>&1 || \
print_warning "Failed! Default settings will be used."
cbfstool "$BIOS_UPDATE_FILE" write -r SMMSTORE -f /tmp/smmstore.bin -u >> $ERR_LOG_FILE 2>&1 || \
$CBFSTOOL "$BIOS_UPDATE_FILE" write -r SMMSTORE -f /tmp/smmstore.bin -u >> $ERR_LOG_FILE 2>&1 || \
print_warning "Failed! Default settings will be used."
print_ok Done.
}
bootsplash_migration() {
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/dasharo_dump.rom ${FLASHROM_ADD_OPT_READ} --fmap -i FMAP -i BOOTSPLASH >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$FLASHROM read_firm_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} -r /tmp/dasharo_dump.rom ${FLASHROM_ADD_OPT_READ} --fmap -i FMAP -i BOOTSPLASH >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
# If no custom logo, return from bootsplash_migration early and don't show
# unnecessary messages
cbfstool /tmp/dasharo_dump.rom extract -r BOOTSPLASH -n logo.bmp -f /tmp/logo.bmp >> $ERR_LOG_FILE 2>&1 || return 1
$CBFSTOOL /tmp/dasharo_dump.rom extract -r BOOTSPLASH -n logo.bmp -f /tmp/logo.bmp >> $ERR_LOG_FILE 2>&1 || return 1
echo -n "Backing up custom boot logo... "
dcu logo $BIOS_UPDATE_FILE -l /tmp/logo.bmp >> $ERR_LOG_FILE 2>&1 || \
$DCU logo $BIOS_UPDATE_FILE -l /tmp/logo.bmp >> $ERR_LOG_FILE 2>&1 || \
print_warning "Failed! Default boot splash will be used." || return 1
print_ok Done.
}
@@ -560,7 +560,7 @@ check_vboot_keys() {
# No FMAP flashing? Also skip
grep -q "\--fmap" <<< "$FLASHROM_ADD_OPT_UPDATE" || return
BINARY_KEYS=$(CBFSTOOL=$(which cbfstool) futility show $BIOS_UPDATE_FILE| grep -i 'key sha1sum')
BINARY_KEYS=$(CBFSTOOL=$(which cbfstool) $FUTILITY dump_vboot_keys show $BIOS_UPDATE_FILE| grep -i 'key sha1sum')
if [ $BOARD_HAS_FD_REGION -eq 0 ]; then
FLASHROM_ADD_OPT_READ=""
@@ -568,9 +568,9 @@ check_vboot_keys() {
FLASHROM_ADD_OPT_READ="--ifd -i bios"
fi
echo "Checking vboot keys."
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_READ} -r /tmp/bios.bin > /dev/null 2>/dev/null
if [ $? -eq 0 ] && [ -f "/tmp/bios.bin" ]; then
FLASH_KEYS=$(CBFSTOOL=$(which cbfstool) futility show /tmp/bios.bin | grep -i 'key sha1sum')
$FLASHROM read_firm_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_READ} -r $BIOS_DUMP_FILE > /dev/null 2>/dev/null
if [ $? -eq 0 ] && [ -f $BIOS_DUMP_FILE ]; then
FLASH_KEYS=$(CBFSTOOL=$(which cbfstool) $FUTILITY dump_vboot_keys show $BIOS_DUMP_FILE | grep -i 'key sha1sum')
diff <(echo "$BINARY_KEYS") <(echo "$FLASH_KEYS") > /dev/null 2>&1
# If keys are different we must additionally flash at least GBB region as well
if [ $? -ne 0 ]; then
@@ -611,21 +611,21 @@ blob_transmission() {
if [ -n "$SCH5545_FW" ]; then
error_file_check "$SCH5545_FW" "Failed to find SCH5545 EC firmware binary."
echo -n "Adding SCH5545 EC firmware..."
cbfstool "$BIOS_UPDATE_FILE" add -f "$SCH5545_FW" -n sch5545_ecfw.bin -t raw
$CBFSTOOL "$BIOS_UPDATE_FILE" add -f "$SCH5545_FW" -n sch5545_ecfw.bin -t raw
print_ok "Done"
fi
if [ -n "$ACM_BIN" ]; then
error_file_check "$ACM_BIN" "Failed to find BIOS ACM binary."
echo -n "Adding BIOS ACM..."
cbfstool "$BIOS_UPDATE_FILE" add -f "$ACM_BIN" -n txt_bios_acm.bin -t raw
$CBFSTOOL "$BIOS_UPDATE_FILE" add -f "$ACM_BIN" -n txt_bios_acm.bin -t raw
print_ok "Done"
fi
if [ -n "$SINIT_ACM" ]; then
error_file_check "$SINIT_ACM" "Failed to find Intel SINIT ACM binary."
echo -n "Adding SINIT ACM..."
cbfstool "$BIOS_UPDATE_FILE" add -f "$SINIT_ACM" -n txt_sinit_acm.bin -t raw
$CBFSTOOL "$BIOS_UPDATE_FILE" add -f "$SINIT_ACM" -n txt_sinit_acm.bin -t raw
print_ok "Done"
fi
}
@@ -650,7 +650,7 @@ deploy_ec_firmware() {
if [ "$FIRMWARE_VERSION" == "community_cap" ] || [ "$FIRMWARE_VERSION" == "dpp_cap" ]; then
# Linux Kernel driver is responsible for handling UEFI Capsule Updates, so
# the capsule should be fed to a specific device:
cat "$EC_UPDATE_FILE" > "$CAP_UPD_DEVICE"
$CAP_UPD_TOOL "$EC_UPDATE_FILE"
# Return after updating. The below code is for flashrom updates (using
# binaries) only
return 0
@@ -662,13 +662,11 @@ deploy_ec_firmware() {
return 0
elif [ "$_mode" == "install" ]; then
echo "Checking for Open Source Embedded Controller firmware"
$DASHARO_ECTOOL info >> $ERR_LOG_FILE 2>&1
if [ $? -eq 0 ]; then
if check_for_opensource_firmware; then
echo "Device has already Open Source Embedded Controller firmware, do not flash EC..."
else
_ec_fw_version=$($FLASHROM -p "$PROGRAMMER_EC" ${FLASH_CHIP_SELECT} | grep "Mainboard EC Version" | tr -d ' ' | cut -d ':' -f 2)
_ec_fw_version=$($FLASHROM get_ec_firm_version_mock check -p "$PROGRAMMER_EC" ${FLASH_CHIP_SELECT} | grep "Mainboard EC Version" | tr -d ' ' | cut -d ':' -f 2)
if [ "$_ec_fw_version" != "$COMPATIBLE_EC_FW_VERSION" ]; then
echo "Installing EC..."
@@ -692,7 +690,7 @@ firmware_pre_updating_routine(){
check_flash_lock
if [ "$HAVE_EC" == "true" ]; then
$DASHARO_ECTOOL info >> $ERR_LOG_FILE 2>&1
check_for_opensource_firmware
error_check "Device does not have Dasharo EC firmware - cannot continue update!"
fi
@@ -704,7 +702,7 @@ firmware_pre_updating_routine(){
bootsplash_migration
fi
cbfstool "$BIOS_UPDATE_FILE" extract -r COREBOOT -n config -f "$BIOS_UPDATE_CONFIG_FILE"
$CBFSTOOL read_bios_conffile_mock "$BIOS_UPDATE_FILE" extract -r COREBOOT -n config -f "$BIOS_UPDATE_CONFIG_FILE"
grep -q "CONFIG_VBOOT=y" "$BIOS_UPDATE_CONFIG_FILE"
HAVE_VBOOT="$?"
@@ -728,7 +726,7 @@ firmware_pre_installation_routine(){
check_if_me_disabled
set_intel_regions_update_params "-N --ifd -i bios"
cbfstool "$BIOS_UPDATE_FILE" extract -r COREBOOT -n config -f "$BIOS_UPDATE_CONFIG_FILE"
$CBFSTOOL read_bios_conffile_mock "$BIOS_UPDATE_FILE" extract -r COREBOOT -n config -f "$BIOS_UPDATE_CONFIG_FILE"
grep "CONFIG_VBOOT=y" "$BIOS_UPDATE_CONFIG_FILE"
HAVE_VBOOT="$?"
@@ -774,7 +772,7 @@ deploy_firmware(){
if [ "$FIRMWARE_VERSION" == "community_cap" ] || [ "$FIRMWARE_VERSION" == "dpp_cap" ]; then
# Linux Kernel driver is responsible for handling UEFI Capsule Updates, so
# the capsule should be fed to a specific device:
cat "$BIOS_UPDATE_FILE" > "$CAP_UPD_DEVICE"
$CAP_UPD_TOOL "$BIOS_UPDATE_FILE"
# Return after updating. The below code is for flashrom updates (using
# binaries) only.
return 0
@@ -924,7 +922,7 @@ install_workflow() {
it5570_shutdown
else
send_dts_logs
${CMD_REBOOT}
${REBOOT}
fi
}
@@ -961,7 +959,7 @@ update_workflow() {
"$BOARD_MODEL" == "PRO Z690-A (MS-7D25)" || \
"$BOARD_MODEL" == "PRO Z690-A WIFI (MS-7D25)" ) ]]; then
cpu_gen_check=$(lscpu | grep -F "Model name" | grep -E "\-(13|14)[0-9]{3}" | wc -l)
cpu_gen_check=$($LSCPU | grep -F "Model name" | grep -E "\-(13|14)[0-9]{3}" | wc -l)
if [ $cpu_gen_check -ne 0 ]; then
echo "You have a 13th gen or above CPU and are trying to flash Dasharo v1.1.1 on a MSI PRO Z690-A DDR4 or DDR5 board"
@@ -1025,7 +1023,7 @@ update_workflow() {
echo "Rebooting"
sleep 1
send_dts_logs
${CMD_REBOOT}
${REBOOT}
fi
}
@@ -1060,8 +1058,8 @@ restore() {
if [ ! $? -eq 0 ]; then
uuid_string=""
fi
uuid_string="${mac_addr}_$(dmidecode -s system-product-name)"
uuid_string+="_$(dmidecode -s system-manufacturer)"
uuid_string="${mac_addr}_$($DMIDECODE dump_var_mock -s system-product-name)"
uuid_string+="_$($DMIDECODE dump_var_mock -s system-manufacturer)"
uuid="$(uuidgen -n @x500 -N $uuid_string -s)"
case ${OPTION} in
@@ -1127,7 +1125,7 @@ restore() {
check_blobs_in_binary /tmp/logs/rom.bin
check_if_me_disabled
set_intel_regions_update_params "-N --ifd -i bios"
flashrom -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w "/tmp/logs/rom.bin" >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_REGIONS} -w "/tmp/logs/rom.bin" >> $FLASHROM_LOG_FILE 2>> $ERR_LOG_FILE
error_check "Failed to restore BIOS firmware! You can try one more time."
print_ok "Successfully restored firmware"
else
@@ -1165,6 +1163,7 @@ fi
board_config
check_flash_chip
if [ -n "$PLATFORM_SIGN_KEY" ]; then
get_signing_keys
fi

View File

@@ -11,8 +11,13 @@ FUM_EFIVAR="/sys/firmware/efi/efivars/FirmwareUpdateMode-d15b327e-ff2d-4fc1-abf6
export DTS_FUNCS="$SBIN_DIR/dts-functions.sh"
export DTS_ENV="$SBIN_DIR/dts-environment.sh"
export DTS_SUBS="$SBIN_DIR/dts-subscription.sh"
export DTS_HAL="$SBIN_DIR/dts-hal.sh"
export DTS_MOCK_COMMON="$SBIN_DIR/common-mock-func.sh"
export DTS_LOG_FILE="/tmp/dts.log"
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
if [ -f $FUM_EFIVAR ]; then
$SBIN_DIR/dasharo-deploy update fum
else

View File

@@ -8,6 +8,8 @@
source $DTS_ENV
# shellcheck source=../include/dts-functions.sh
source $DTS_FUNCS
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
board_config() {
case "$SYSTEM_VENDOR" in
@@ -46,15 +48,6 @@ board_config() {
esac
}
check_for_opensource_firmware()
{
echo "Checking for opensource firmware"
$DASHARO_ECTOOL info >> /dev/null 2>&1
if [ $? -eq 0 ]; then
error_exit "Device has already Open Source Embedded Controller firmware, aborting..."
fi
}
download_files()
{
wait_for_network_connection
@@ -81,7 +74,7 @@ install() {
error_check "Failed to verify Dasharo firmware"
if [ "$HAVE_EC" == "true" ]; then
_ec_fw_version=$($FLASHROM -p ${PROGRAMMER_EC} | grep "Mainboard EC Version" | tr -d ' ' | cut -d ':' -f 2)
_ec_fw_version=$($FLASHROM get_ec_firm_version_mock -p ${PROGRAMMER_EC} | grep "Mainboard EC Version" | tr -d ' ' | cut -d ':' -f 2)
if [ "$_ec_fw_version" != "$COMPATIBLE_EC_FW_VERSION" ]; then
echo "EC version: $_ec_fw_version is not supported, update required"
@@ -100,7 +93,7 @@ install() {
if [ "$NEED_EC_RESET" = "true" ]; then
it5570_shutdown
else
${CMD_POWEROFF}
${POWEROFF}
fi
}
@@ -115,7 +108,9 @@ ROOT_DIR="/"
[ -z "$SYSTEM_VENDOR" ] && error_exit "SYSTEM_VENDOR not given"
[ -z "$SYSTEM_MODEL" ] && error_exit "SYSTEM_MODEL not given"
check_for_opensource_firmware
if check_for_opensource_firmware; then
error_exit "Device has already Open Source Embedded Controller firmware, aborting..."
fi
board_config
download_files
install