#!/bin/bash
KERNELVER=$1
CURR_KERNELVER="$(uname -r)"
if [ ! -z $KERNELVER ]; then
KERNEL_VERSION=$KERNELVER
else
KERNEL_VERSION=$CURR_KERNELVER
fi
OUTPUT_FILE=kernel_config.h
SYSTEM_MAP_DIRS=(/lib/modules/${KERNEL_VERSION}/ /usr/lib/debug/boot/ /boot/)
ACRONIS_SYSTEM_MAPS_DIR=/usr/lib/Acronis/SnapAPIFiles/SystemMaps/
SYSTEM_MAP_MINSIZE=1000
function find_system_map()
{
local dir=$1
if [ -e $dir/System.map-${KERNEL_VERSION} ] ;then
SYSTEM_MAP_FILE_TMP=$dir/System.map-${KERNEL_VERSION}
elif [ -e $dir/System.map ] ;then
SYSTEM_MAP_FILE_TMP=$dir/System.map
fi
if [ ! -z ${SYSTEM_MAP_FILE_TMP} ]; then
local size=$(stat -c%s "${SYSTEM_MAP_FILE_TMP}")
if (( $size > ${SYSTEM_MAP_MINSIZE} )); then
SYSTEM_MAP_FILE=${SYSTEM_MAP_FILE_TMP}
fi
fi
}
function get_acronis_system_map
{
boot_cfg_md5=( $(md5sum /boot/config-${KERNEL_VERSION}) )
if [ -e ${ACRONIS_SYSTEM_MAPS_DIR}/System.map-${KERNEL_VERSION}-$boot_cfg_md5 ]; then
SYSTEM_MAP_FILE=${ACRONIS_SYSTEM_MAPS_DIR}/System.map-${KERNEL_VERSION}-$boot_cfg_md5
fi
}
function get_system_map_from_kallsyms()
{
local dir="$(pwd)"
if [ -e /proc/kallsyms -a "$CURR_KERNELVER" = "$KERNELVER" ]; then
local smap="System.map-${KERNEL_VERSION}.tmp"
cat /proc/kallsyms > "${smap}"
local size=$(stat -c%s "${smap}")
if (( $size > ${SYSTEM_MAP_MINSIZE} )); then
SYSTEM_MAP_FILE="${smap}"
fi
fi
}
function get_media_system_map()
{
if [[ "$KERNELVER" == *"Acronis"* ]]; then
if [ -e ../linux/System.map ];then
SYSTEM_MAP_FILE=../linux/System.map
fi
fi
}
for i in "${SYSTEM_MAP_DIRS[@]}"; do
find_system_map $i
if [ ! -z ${SYSTEM_MAP_FILE} ]; then
break
fi
done
if [ -z ${SYSTEM_MAP_FILE} ]; then
get_acronis_system_map
fi
if [ -z ${SYSTEM_MAP_FILE} ]; then
get_system_map_from_kallsyms
fi
if [ -z ${SYSTEM_MAP_FILE} ]; then
get_media_system_map
fi
if [ -z "${SYSTEM_MAP_FILE}" ]; then
echo "Cannot find System.map file."
exit 0
fi
rm -f ${OUTPUT_FILE}
echo "Generate \"${OUTPUT_FILE}\" for kernel \"${KERNEL_VERSION}\" and system map \"${SYSTEM_MAP_FILE}\"."
echo "#ifndef SNAPAPI_KERNEL_CONFIG" >> ${OUTPUT_FILE}
echo "#define SNAPAPI_KERNEL_CONFIG" >> ${OUTPUT_FILE}
if [ -n "${SYSTEM_MAP_FILE}" ]; then
echo "#define SNAPAPI_SYSTEM_MAP \"${SYSTEM_MAP_FILE}\"" >> ${OUTPUT_FILE}
SYMBOLS="printk blk_mq_submit_bio _printk"
for SYMBOL_NAME in ${SYMBOLS}
do
SYMBOL_ADDR=$(grep " ${SYMBOL_NAME}$" "${SYSTEM_MAP_FILE}" | awk '{print $1}')
if [ -z "${SYMBOL_ADDR}" ]
then
echo "Function \"${SYMBOL_NAME}\" not found"
else
MACRO_NAME="$(echo ${SYMBOL_NAME} | awk '{print toupper($0)}')_ADDR"
echo "#define ${MACRO_NAME} 0x${SYMBOL_ADDR}" >> ${OUTPUT_FILE}
echo "Address of the function \"${SYMBOL_NAME}\" was defined"
fi
done
fi
# the end of the config file
echo "#endif" >> ${OUTPUT_FILE}
|