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

@@ -5,6 +5,8 @@
# SPDX-License-Identifier: Apache-2.0
# shellcheck disable=SC2034
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
# Text colors:
NORMAL='\033[0m'
@@ -50,15 +52,14 @@ VERBOSE_OPT="V"
VERBOSE_OPT_LOW="$(echo $VERBOSE_OPT | awk '{print tolower($0)}')"
# Hardware variables:
SYSTEM_VENDOR="${SYSTEM_VENDOR:-$(dmidecode -s system-manufacturer)}"
SYSTEM_MODEL="${SYSTEM_MODEL:-$(dmidecode -s system-product-name)}"
BOARD_VENDOR="${BOARD_VENDOR:-$(dmidecode -s system-manufacturer)}"
BOARD_MODEL="${BOARD_MODEL:-$(dmidecode -s baseboard-product-name)}"
CPU_VERSION="$(dmidecode -s processor-version)"
SYSTEM_VENDOR="$($DMIDECODE dump_var_mock -s system-manufacturer)"
SYSTEM_MODEL="$($DMIDECODE dump_var_mock -s system-product-name)"
BOARD_MODEL="$($DMIDECODE dump_var_mock -s baseboard-product-name)"
CPU_VERSION="$($DMIDECODE dump_var_mock -s processor-version)"
# Firmware variables
BIOS_VENDOR="${BIOS_VENDOR:-$(dmidecode -s bios-vendor)}"
BIOS_VERSION="${BIOS_VERSION:-$(dmidecode -s bios-version)}"
BIOS_VENDOR="$($DMIDECODE dump_var_mock -s bios-vendor)"
BIOS_VERSION="$($DMIDECODE dump_var_mock -s bios-version)"
DASHARO_VERSION="$(echo $BIOS_VERSION | cut -d ' ' -f 3 | tr -d 'v')"
DASHARO_FLAVOR="$(echo $BIOS_VERSION | cut -d ' ' -f 1,2)"
@@ -66,6 +67,7 @@ DASHARO_FLAVOR="$(echo $BIOS_VERSION | cut -d ' ' -f 1,2)"
# firmware, are used globally for both: updating via binaries and via UEFI
# Capsule Update.
BIOS_UPDATE_FILE="/tmp/biosupdate"
BIOS_DUMP_FILE="/tmp/bios.bin"
EC_UPDATE_FILE="/tmp/ecupdate"
BIOS_HASH_FILE="/tmp/bioshash.sha256"
EC_HASH_FILE="/tmp/echash.sha256"
@@ -91,17 +93,15 @@ FLASH_INFO_FILE="/tmp/flash_info"
OS_VERSION_FILE="/etc/os-release"
KEYS_DIR="/tmp/devkeys"
# Paths to system commands
CMD_POWEROFF="/sbin/poweroff"
CMD_REBOOT="/sbin/reboot"
CMD_SHELL="/bin/bash"
# Paths to system commands:
SHELL="bash"
# Paths to DTS commands:
CMD_DASHARO_HCL_REPORT="/usr/sbin/dasharo-hcl-report"
CMD_NCMENU="/usr/sbin/novacustom_menu"
CMD_DASHARO_DEPLOY="/usr/sbin/dasharo-deploy"
CMD_CLOUD_LIST="/usr/sbin/cloud_list"
CMD_EC_TRANSITION="/usr/sbin/ec_transition"
DASHARO_ECTOOL="${DASHARO_ECTOOL:-dasharo_ectool}"
FLASHROM="${FLASHROM:-flashrom}"
# Configuration variables declaration and default values (see dts-functions.sh/
# board_config function for more inf.):

View File

@@ -9,6 +9,8 @@
source $DTS_ENV
# shellcheck source=../include/dts-subscription.sh
source $DTS_SUBS
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
### Color functions:
function echo_green() {
@@ -53,7 +55,7 @@ check_if_ac() {
fi
while true; do
ac_status=$(cat ${_ac_file})
ac_status=$($FSREAD_TOOL check_if_ac_mock cat ${_ac_file})
if [ "$ac_status" -eq 1 ]; then
echo "AC adapter is connected. Continuing with firmware update."
@@ -121,28 +123,28 @@ it5570_i2ec() {
# TODO: Use /dev/port instead of iotools
# Address high byte
iotools io_write8 0x2e 0x2e
iotools io_write8 0x2f 0x11
iotools io_write8 0x2e 0x2f
iotools io_write8 0x2f $(($2>>8 & 0xff))
$IOTOOLS io_write8 0x2e 0x2e
$IOTOOLS io_write8 0x2f 0x11
$IOTOOLS io_write8 0x2e 0x2f
$IOTOOLS io_write8 0x2f $(($2>>8 & 0xff))
# Address low byte
iotools io_write8 0x2e 0x2e
iotools io_write8 0x2f 0x10
iotools io_write8 0x2e 0x2f
iotools io_write8 0x2f $(($2 & 0xff))
$IOTOOLS io_write8 0x2e 0x2e
$IOTOOLS io_write8 0x2f 0x10
$IOTOOLS io_write8 0x2e 0x2f
$IOTOOLS io_write8 0x2f $(($2 & 0xff))
# Data
iotools io_write8 0x2e 0x2e
iotools io_write8 0x2f 0x12
iotools io_write8 0x2e 0x2f
$IOTOOLS io_write8 0x2e 0x2e
$IOTOOLS io_write8 0x2f 0x12
$IOTOOLS io_write8 0x2e 0x2f
case $1 in
"r")
iotools io_read8 0x2f
$IOTOOLS io_read8 0x2f
;;
"w")
iotools io_write8 0x2f "$3"
$IOTOOLS io_write8 0x2f "$3"
;;
esac
}
@@ -350,11 +352,11 @@ board_config() {
"V54x_6x_TU")
# Dasharo 0.9.0-rc10 and higher have board model in baseboard-version
if check_if_dasharo && compare_versions "$DASHARO_VERSION" 0.9.0-rc10; then
BOARD_MODEL="$(dmidecode -s baseboard-version)"
elif ! dasharo_ectool info 2>/dev/null; then
BOARD_MODEL="$($DMIDECODE dump_var_mock -s baseboard-version)"
elif ! $DASHARO_ECTOOL check_for_opensource_firm_mock info 2>/dev/null; then
ask_for_model V540TU V560TU
else
BOARD_MODEL=$(dasharo_ectool info | grep "board:" |
BOARD_MODEL=$($DASHARO_ECTOOL novacustom_check_sys_model_mock info | grep "board:" |
sed -r 's|.*novacustom/(.*)|\1|' | awk '{print toupper($1)}')
fi
@@ -387,7 +389,7 @@ board_config() {
;;
"V5xTNC_TND_TNE")
if check_if_dasharo; then
BOARD_MODEL="$(dmidecode -s baseboard-version)"
BOARD_MODEL="$($DMIDECODE dump_var_mock -s baseboard-version)"
else
ask_for_model V540TNx V560TNx
fi
@@ -708,7 +710,7 @@ board_config() {
}
check_flash_lock() {
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} > /tmp/check_flash_lock 2> /tmp/check_flash_lock.err
$FLASHROM check_flash_lock_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} > /tmp/check_flash_lock 2> /tmp/check_flash_lock.err
# Check in flashrom output if lock is enabled
grep -q 'PR0: Warning:.* is read-only\|SMM protection is enabled' /tmp/check_flash_lock.err
if [ $? -eq 0 ]; then
@@ -721,22 +723,22 @@ check_flash_lock() {
check_flash_chip() {
echo "Gathering flash chip and chipset information..."
$FLASHROM -p "$PROGRAMMER_BIOS" --flash-name >> "$FLASH_INFO_FILE" 2>> "$ERR_LOG_FILE"
$FLASHROM flash_chip_name_mock -p "$PROGRAMMER_BIOS" --flash-name >> "$FLASH_INFO_FILE" 2>> "$ERR_LOG_FILE"
if [ $? -eq 0 ]; then
echo -n "Flash information: "
tail -n1 "$FLASH_INFO_FILE"
FLASH_CHIP_SIZE=$(($($FLASHROM -p "$PROGRAMMER_BIOS" --flash-size 2>> /dev/null | tail -n1) / 1024 / 1024))
FLASH_CHIP_SIZE=$(($($FLASHROM flash_chip_size_mock -p "$PROGRAMMER_BIOS" --flash-size 2>> /dev/null | tail -n1) / 1024 / 1024))
echo -n "Flash size: "
echo ${FLASH_CHIP_SIZE}M
else
for flash_name in $FLASH_CHIP_LIST
do
$FLASHROM -p "$PROGRAMMER_BIOS" -c "$flash_name" --flash-name >> "$FLASH_INFO_FILE" 2>> "$ERR_LOG_FILE"
$FLASHROM flash_chip_name_mock -p "$PROGRAMMER_BIOS" -c "$flash_name" --flash-name >> "$FLASH_INFO_FILE" 2>> "$ERR_LOG_FILE"
if [ $? -eq 0 ]; then
echo "Chipset found"
tail -n1 "$FLASH_INFO_FILE"
FLASH_CHIP_SELECT="-c ${flash_name}"
FLASH_CHIP_SIZE=$(($($FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} --flash-size 2>> /dev/null | tail -n1) / 1024 / 1024))
FLASH_CHIP_SIZE=$(($($FLASHROM flash_chip_size_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} --flash-size 2>> /dev/null | tail -n1) / 1024 / 1024))
echo "Chipset size"
echo ${FLASH_CHIP_SIZE}M
break
@@ -918,7 +920,7 @@ verify_artifacts() {
check_intel_regions() {
FLASH_REGIONS=$($FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} 2>&1)
FLASH_REGIONS=$($FLASHROM check_intel_regions_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} 2>&1)
BOARD_HAS_FD_REGION=0
BOARD_FD_REGION_RW=0
BOARD_HAS_ME_REGION=0
@@ -946,7 +948,7 @@ check_blobs_in_binary() {
# If there is no descriptor, there is no ME as well, so skip the check
if [ $BOARD_HAS_FD_REGION -ne 0 ]; then
ME_OFFSET=$(ifdtool -d $1 2> /dev/null | grep "Flash Region 2 (Intel ME):" | sed 's/Flash Region 2 (Intel ME)\://' |awk '{print $1;}')
ME_OFFSET=$($IFDTOOL check_blobs_in_binary_mock -d $1 2> /dev/null | grep "Flash Region 2 (Intel ME):" | sed 's/Flash Region 2 (Intel ME)\://' | awk '{print $1;}')
# Check for IFD signature at offset 0 (old descriptors)
if [ "$(tail -c +0 $1|head -c 4|xxd -ps)" == "5aa5f00f" ]; then
BINARY_HAS_FD=1
@@ -976,11 +978,8 @@ check_if_me_disabled() {
return
fi
# Check if HECI present
# FIXME: what if HECI is not device 16.0?
if [ -d /sys/class/pci_bus/0000:00/device/0000:00:16.0 ]; then
# Check ME Current Operation Mode at offset 0x40 bits 19:16
ME_OPMODE="$(setpci -s 00:16.0 42.B 2> /dev/null | cut -c2-)"
if check_if_heci_present; then
ME_OPMODE="$(check_me_op_mode)"
if [ $ME_OPMODE == "0" ]; then
echo "ME is not disabled" >> $ERR_LOG_FILE
return
@@ -1015,8 +1014,8 @@ check_if_me_disabled() {
fi
else
# If we are running coreboot, check for status in logs
cbmem -1 | grep -q "ME is disabled" && ME_DISABLED=1 && return # HECI (soft) disabled
cbmem -1 | grep -q "ME is HAP disabled" && ME_DISABLED=1 && return # HAP disabled
$CBMEM check_if_me_disabled_mock -1 | grep -q "ME is disabled" && ME_DISABLED=1 && return # HECI (soft) disabled
$CBMEM check_if_me_disabled_mock -1 | grep -q "ME is HAP disabled" && ME_DISABLED=1 && return # HAP disabled
# TODO: If proprietary BIOS, then also try to check SMBIOS for ME FWSTS
# BTW we could do the same in coreboot, expose FWSTS in SMBIOS before it
# gets disabled
@@ -1061,10 +1060,10 @@ set_flashrom_update_params() {
# We need to read whole binary (or BIOS region), otherwise cbfstool will
# return different attributes for CBFS regions
echo "Checking flash layout."
$FLASHROM -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE} -r /tmp/bios.bin > /dev/null 2>&1
if [ $? -eq 0 ] && [ -f "/tmp/bios.bin" ]; then
BOARD_FMAP_LAYOUT=$(cbfstool /tmp/bios.bin layout -w 2> /dev/null)
BINARY_FMAP_LAYOUT=$(cbfstool $1 layout -w 2> /dev/null)
$FLASHROM read_flash_layout_mock -p "$PROGRAMMER_BIOS" ${FLASH_CHIP_SELECT} ${FLASHROM_ADD_OPT_UPDATE} -r $BIOS_DUMP_FILE > /dev/null 2>&1
if [ $? -eq 0 ] && [ -f "$BIOS_DUMP_FILE" ]; then
BOARD_FMAP_LAYOUT=$($CBFSTOOL layout_mock $BIOS_DUMP_FILE layout -w 2> /dev/null)
BINARY_FMAP_LAYOUT=$($CBFSTOOL layout_mock $1 layout -w 2> /dev/null)
diff <(echo "$BOARD_FMAP_LAYOUT") <(echo "$BINARY_FMAP_LAYOUT") > /dev/null 2>&1
# If layout is identical, perform standard update using FMAP only
if [ $? -eq 0 ]; then
@@ -1269,7 +1268,7 @@ You can find more info about HCL in docs.dasharo.com/glossary\r"
show_ram_inf() {
# Get the data:
local data=""
data=$(dmidecode)
data=$($DMIDECODE)
# Initialize an empty array to store the extracted values:
local -a memory_devices_array
@@ -1325,7 +1324,7 @@ show_hardsoft_inf() {
echo -e "${BLUE}**${NORMAL} HARDWARE INFORMATION ${NORMAL}"
echo -e "${BLUE}*********************************************************${NORMAL}"
echo -e "${BLUE}**${YELLOW} System Inf.: ${NORMAL}${SYSTEM_VENDOR} ${SYSTEM_MODEL}"
echo -e "${BLUE}**${YELLOW} Baseboard Inf.: ${NORMAL}${BOARD_VENDOR} ${BOARD_MODEL}"
echo -e "${BLUE}**${YELLOW} Baseboard Inf.: ${NORMAL}${SYSTEM_VENDOR} ${BOARD_MODEL}"
echo -e "${BLUE}**${YELLOW} CPU Inf.: ${NORMAL}${CPU_VERSION}"
show_ram_inf
echo -e "${BLUE}*********************************************************${NORMAL}"
@@ -1564,11 +1563,11 @@ footer_options(){
;;
"${POWEROFF_OPT_UP}" | "${POWEROFF_OPT_LOW}")
send_dts_logs
${CMD_POWEROFF}
${POWEROFF}
;;
"${REBOOT_OPT_UP}" | "${REBOOT_OPT_LOW}")
send_dts_logs
${CMD_REBOOT}
${REBOOT}
;;
"${SEND_LOGS_OPT}" | "${SEND_LOGS_OPT_LOW}")
if [ "${SEND_LOGS_ACTIVE}" == "true" ]; then

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
update_result() {
TOOL=$1
@@ -68,32 +70,32 @@ if [ $DEPLOY_REPORT = "false" ]; then
echo "Getting hardware information. It will take a few minutes..."
fi
# echo "Dumping PCI configuration space and topology..."
lspci -nnvvvxxxx > logs/lspci.log 2> logs/lspci.err.log
$LSPCI -nnvvvxxxx > logs/lspci.log 2> logs/lspci.err.log
update_result "PCI configuration space and topology" logs/lspci.err.log
printf '## |\r'
# echo "Dumping USB devices and topology..."
lsusb -vvv > logs/lsusb.log 2> logs/lsusb.err.log
$LSUSB -vvv > logs/lsusb.log 2> logs/lsusb.err.log
update_result "USB devices and topology" logs/lsusb.err.log
printf '#### |\r'
# echo "Dumping Super I/O configuration..."
superiotool -deV > logs/superiotool.log 2> logs/superiotool.err.log
$SUPERIOTOOL -deV > logs/superiotool.log 2> logs/superiotool.err.log
update_result "Super I/O configuration" logs/superiotool.err.log
printf '###### |\r'
# echo "Dumping Embedded Controller configuration (this may take a while if EC is not present)..."
ectool -ip > logs/ectool.log 2> logs/ectool.err.log
$ECTOOL -ip > logs/ectool.log 2> logs/ectool.err.log
update_result "EC configuration" logs/ectool.err.log
printf '######## |\r'
# echo "Dumping MSRs..."
msrtool > logs/msrtool.log 2> logs/msrtool.err.log
$MSRTOOL > logs/msrtool.log 2> logs/msrtool.err.log
update_result "MSRs" logs/msrtool.err.log
printf '########## |\r'
# echo "Dumping SMBIOS tables..."
dmidecode > logs/dmidecode.log 2> logs/dmidecode.err.log
$DMIDECODE > logs/dmidecode.log 2> logs/dmidecode.err.log
update_result "SMBIOS tables" logs/dmidecode.err.log
printf '############ |\r'
@@ -121,12 +123,12 @@ update_result "GPIO configuration C header files" logs/intelp2m.err.log
printf '#################### |\r'
# echo "Dumping kernel dmesg..."
dmesg > logs/dmesg.log 2> logs/dmesg.err.log
$DMESG > logs/dmesg.log 2> logs/dmesg.err.log
update_result "kernel dmesg" logs/dmesg.err.log
printf '###################### |\r'
# echo "Dumping ACPI tables..."
acpidump > logs/acpidump.log 2> logs/acpidump.err.log
$ACPIDUMP > logs/acpidump.log 2> logs/acpidump.err.log
update_result "ACPI tables" logs/acpidump.err.log
printf '######################## |\r'
@@ -190,9 +192,9 @@ if [ $BOARD_HAS_FD_REGION -eq 1 ]; then
# GBE region is present and not locked, read it as well
FLASHROM_ADD_OPT_READ+=" -i gbe"
fi
else
# No descriptor, probably safe to read everything
FLASHROM_ADD_OPT_READ=""
else
# No descriptor, probably safe to read everything
FLASHROM_ADD_OPT_READ=""
fi
$FLASHROM -V -p internal:laptop=force_I_want_a_brick ${FLASH_CHIP_SELECT} -r logs/rom.bin ${FLASHROM_ADD_OPT_READ} > logs/flashrom_read.log 2> logs/flashrom_read.err.log
@@ -233,12 +235,12 @@ update_result "DIMMs information" logs/decode-dimms.err.log
printf '########################################## |\r'
# echo "Getting CBMEM table..."
cbmem > logs/cbmem.log 2> logs/cbmem.err.log
$CBMEM > logs/cbmem.log 2> logs/cbmem.err.log
update_result "CBMEM table information" logs/cbmem.err.log
printf '############################################ |\r'
# echo "Getting CBMEM console..."
cbmem -1 > logs/cbmem_console.log 2> logs/cbmem_console.err.log
$CBMEM -1 > logs/cbmem_console.log 2> logs/cbmem_console.err.log
update_result "CBMEM console" logs/cbmem_console.err.log
printf '############################################## |\r'
@@ -248,12 +250,12 @@ update_result "TPM information" logs/tpm_version.err.log
printf '################################################ |\r'
# echo "Checking AMT..."
mei-amt-check > logs/amt-check.log 2> logs/amt-check.err.log
$MEI_AMT_CHECK > logs/amt-check.log 2> logs/amt-check.err.log
update_result "AMT information" logs/amt-check.err.log
printf '################################################## |\r'
# echo "Checking ME..."
intelmetool -m > logs/intelmetool.log 2> logs/intelmetool.err.log
$INTELMETOOL -m > logs/intelmetool.log 2> logs/intelmetool.err.log
update_result "ME information" logs/intelmetool.err.log
printf '##################################################### |\r'
@@ -287,9 +289,9 @@ if [ $DEPLOY_REPORT = "false" ]; then
fi
# Create name for generated report
filename="$(dmidecode -s system-manufacturer)"
filename+=" $(dmidecode -s system-product-name)"
filename+=" $(dmidecode -s bios-version)"
filename="$($DMIDECODE dump_var_mock -s system-manufacturer)"
filename+=" $($DMIDECODE dump_var_mock -s system-product-name)"
filename+=" $($DMIDECODE dump_var_mock -s bios-version)"
# MAC address of device that is used to connect the internet
# it could return none only when there is no internet connection but
@@ -299,8 +301,8 @@ filename+=" $(dmidecode -s bios-version)"
# shellcheck disable=SC2046
uuid_string="$(cat /sys/class/net/$(ip route show default | head -1 | awk '/default/ {print $5}')/address)"
# next two values are hardware related so they will be always the same
uuid_string+="_$(dmidecode -s system-product-name)"
uuid_string+="_$(dmidecode -s system-manufacturer)"
uuid_string+="_$($DMIDECODE dump_var_mock -s system-product-name)"
uuid_string+="_$($DMIDECODE dump_var_mock -s system-manufacturer)"
# using values from above should generate the same uuid all the time if only
# the MAC address will not change.
@@ -371,7 +373,7 @@ order to participate)\r
read -p "[N/y] "
case ${REPLY} in
yes|y|Y|Yes|YES)
/usr/bin/hw-probe -all -upload
$HW_PROBE -all -upload
if [ $? -eq 0 ]; then
echo "Thank you for contributing to the \"Hardware for Linux\" project!"
else

View File

@@ -7,14 +7,17 @@
# A script to get information on the touchpad devices. Currently supports only
# Clevo devices.
if ! dmesg | grep hid-multitouch | grep "I2C HID" > /dev/null; then
# shellcheck source=../include/hal/dts-hal.sh
source $DTS_HAL
if ! $DMESG i2c_hid_detect_mock | grep hid-multitouch | grep "I2C HID" > /dev/null; then
echo "No I2C touchpads detected. Exiting"
exit 2
fi
devname=$(dmesg | grep hid-multitouch | awk 'NF>1{print $NF}')
hid=$(cat "/sys/bus/i2c/devices/$devname/firmware_node/hid")
path=$(cat "/sys/bus/i2c/devices/$devname/firmware_node/path")
devname=$($DMESG i2c_hid_detect_mock | grep hid-multitouch | awk 'NF>1{print $NF}')
hid=$($FSREAD_TOOL cat "/sys/bus/i2c/devices/$devname/firmware_node/hid")
path=$($FSREAD_TOOL cat "/sys/bus/i2c/devices/$devname/firmware_node/path")
ACPI_CALL_PATH="/proc/acpi/call"

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