HOME


sh-3ll 1.0
DIR:/usr/src/snapapi26-0.8.20/
Upload File :
Current File : //usr/src/snapapi26-0.8.20/snapapi_genconfig.sh
#!/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}