blob: 1a01c6bb8424e2529d910de52706286ff45cceaa [file] [log] [blame]
#!/bin/bash
# SPDX-License-Identifier: GPL-2.0
# ./common/common_drivers/scripts/amlogic/compare_text_section --vmlinux_gki <path>/vmlinux --vmlinux_amlogic <path>/vmlinux
function show_help {
echo "USAGE:"
echo
echo " --vmlinux_gki ori vmlinux file, eg: <path>/vmlinux"
echo " --vmlinux_amlogic amlogic vmlinux file, eg: <path>/vmlinux"
echo " --buildtool_dir build tool bin path"
echo " --output output dir, default: ./compare_text_tmp/"
}
for i in "$@"
do
case $i in
--vmlinux_gki)
VM_GKI_FILE=$2
shift
;;
--vmlinux_amlogic)
VM_AMLOGIC_FILE=$2
shift
;;
--buildtool_dir)
BUILDTOOL_DIR=$2
shift
;;
--output)
OUTPUT_DIR=$2
shift
;;
-h|--help)
show_help
exit 0
;;
*)
shift
;;
esac
done
if [[ ! -e ${VM_GKI_FILE} ]]; then
echo "gki vmlinux not exit, --vmlinux_gki ${VM_GKI_FILE}, Failed!"
exit 0
fi
if [[ ! -e ${VM_AMLOGIC_FILE} ]]; then
echo "amlogic vmlinux not exit, --vmlinux_amlogic ${VM_AMLOGIC_FILE}, Failed!"
exit 0
fi
if [[ ! -d ${BUILDTOOL_DIR} ]]; then
DEFAULT_BUILD_CONFIG_CONSTANTS=common/build.config.constants
DEFAULT_BUILD_CONFIG_COMMON=common/build.config.common
[[ -f ${DEFAULT_BUILD_CONFIG_CONSTANTS} ]] && source ${DEFAULT_BUILD_CONFIG_CONSTANTS}
[[ -f ${DEFAULT_BUILD_CONFIG_COMMON} ]] && source ${DEFAULT_BUILD_CONFIG_COMMON}
if [[ ! -d ${CLANG_PREBUILT_BIN} ]]; then
echo "--buildtool_dir not exit, --buildtool_dir ${BUILDTOOL_DIR}, Failed!"
exit 0
else
BUILDTOOL_DIR=${CLANG_PREBUILT_BIN}
fi
fi
if [ -z ${OUTPUT_DIR} ]; then
OUTPUT_DIR=compare_text_tmp
fi
if [ -e ${OUTPUT_DIR} ]
then
rm -rf ${OUTPUT_DIR}
fi
echo "VM_GKI_FILE=${VM_GKI_FILE} VM_AMLOGIC_FILE=${VM_AMLOGIC_FILE} BUILDTOOL_DIR=${BUILDTOOL_DIR} OUTPUT_DIR=${OUTPUT_DIR}"
mkdir -p ${OUTPUT_DIR}
VM_GKI_FILE_NAME=${VM_GKI_FILE##*/}.gki
VM_AMLOGIC_FILE_NAME=${VM_AMLOGIC_FILE##*/}.amlogic
TEXT_GKI_FILE=${VM_GKI_FILE_NAME}.text
TEXT_AMLOGIC_FILE=${VM_AMLOGIC_FILE_NAME}.text
#copy vmlinux to output path
cp ${VM_GKI_FILE} ${OUTPUT_DIR}/${VM_GKI_FILE_NAME}
cp ${VM_AMLOGIC_FILE} ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME}
#objdump .text section
${BUILDTOOL_DIR}/llvm-objdump --section=.text -d ${OUTPUT_DIR}/${VM_GKI_FILE_NAME} > ${OUTPUT_DIR}/${TEXT_GKI_FILE}
${BUILDTOOL_DIR}/llvm-objdump --section=.text -d ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}
#only need compare until cmd column
clang_hash_format=`awk 'NR==7 {print $2}' ${OUTPUT_DIR}/${TEXT_GKI_FILE}`
echo clang_hash_format=${clang_hash_format}
if [ $((16#${clang_hash_format})) -gt $((16#ff)) ]; then
awk '{NF=3}1' ${OUTPUT_DIR}/${TEXT_GKI_FILE} > ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp
awk '{NF=3}1' ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp
else
awk '{NF=6}1' ${OUTPUT_DIR}/${TEXT_GKI_FILE} > ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp
awk '{NF=6}1' ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE} > ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp
fi
diff -y --suppress-common-lines ${OUTPUT_DIR}/${TEXT_AMLOGIC_FILE}.tmp ${OUTPUT_DIR}/${TEXT_GKI_FILE}.tmp > ${OUTPUT_DIR}/diff.log.tmp
#save cmd or address different line
sed -i '/compare_text_tmp/d' ${OUTPUT_DIR}/diff.log.tmp
if [ $((16#${clang_hash_format})) -gt $((16#ff)) ]; then
awk '$1 ~ /:/ && ($1 != $5 || $3 != $7)' ${OUTPUT_DIR}/diff.log.tmp > ${OUTPUT_DIR}/diff.log
else
awk '$1 ~ /:/ && ($1 != $8 || $6 != $13)' ${OUTPUT_DIR}/diff.log.tmp > ${OUTPUT_DIR}/diff.log
fi
#output compare info
if [ -s ${OUTPUT_DIR}/diff.log ]; then
FIRST_ADDRESS=$(awk '{print $1}' ${OUTPUT_DIR}/diff.log | sed -n '1p')
ADDR_INFO=`${BUILDTOOL_DIR}/llvm-addr2line -e ${OUTPUT_DIR}/${VM_AMLOGIC_FILE_NAME} ${FIRST_ADDRESS%%:*}`
echo "Failed, first different with address: ${FIRST_ADDRESS}, info: ${ADDR_INFO}"
echo "More different see the ${OUTPUT_DIR}/diff.log file"
else
echo "Succeed, Check not break"
fi