cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

prom_init_check.sh (2079B)


      1#!/bin/sh
      2# SPDX-License-Identifier: GPL-2.0-or-later
      3#
      4# Copyright © 2008 IBM Corporation
      5#
      6
      7# This script checks prom_init.o to see what external symbols it
      8# is using, if it finds symbols not in the whitelist it returns
      9# an error. The point of this is to discourage people from
     10# intentionally or accidentally adding new code to prom_init.c
     11# which has side effects on other parts of the kernel.
     12
     13# If you really need to reference something from prom_init.o add
     14# it to the list below:
     15
     16grep "^CONFIG_KASAN=y$" ${KCONFIG_CONFIG} >/dev/null
     17if [ $? -eq 0 ]
     18then
     19	MEM_FUNCS="__memcpy __memset"
     20else
     21	MEM_FUNCS="memcpy memset"
     22fi
     23
     24WHITELIST="add_reloc_offset __bss_start __bss_stop copy_and_flush
     25_end enter_prom $MEM_FUNCS reloc_offset __secondary_hold
     26__secondary_hold_acknowledge __secondary_hold_spinloop __start
     27logo_linux_clut224 btext_prepare_BAT
     28reloc_got2 kernstart_addr memstart_addr linux_banner _stext
     29__prom_init_toc_start __prom_init_toc_end btext_setup_display TOC.
     30relocate"
     31
     32NM="$1"
     33OBJ="$2"
     34
     35ERROR=0
     36
     37check_section()
     38{
     39    file=$1
     40    section=$2
     41    size=$(objdump -h -j $section $file 2>/dev/null | awk "\$2 == \"$section\" {print \$3}")
     42    size=${size:-0}
     43    if [ $size -ne 0 ]; then
     44	ERROR=1
     45	echo "Error: Section $section not empty in prom_init.c" >&2
     46    fi
     47}
     48
     49for UNDEF in $($NM -u $OBJ | awk '{print $2}')
     50do
     51	# On 64-bit nm gives us the function descriptors, which have
     52	# a leading . on the name, so strip it off here.
     53	UNDEF="${UNDEF#.}"
     54
     55	if [ $KBUILD_VERBOSE ]; then
     56		if [ $KBUILD_VERBOSE -ne 0 ]; then
     57			echo "Checking prom_init.o symbol '$UNDEF'"
     58		fi
     59	fi
     60
     61	OK=0
     62	for WHITE in $WHITELIST
     63	do
     64		if [ "$UNDEF" = "$WHITE" ]; then
     65			OK=1
     66			break
     67		fi
     68	done
     69
     70	# ignore register save/restore funcitons
     71	case $UNDEF in
     72	_restgpr_*|_restgpr0_*|_rest32gpr_*)
     73		OK=1
     74		;;
     75	_savegpr_*|_savegpr0_*|_save32gpr_*)
     76		OK=1
     77		;;
     78	esac
     79
     80	if [ $OK -eq 0 ]; then
     81		ERROR=1
     82		echo "Error: External symbol '$UNDEF' referenced" \
     83		     "from prom_init.c" >&2
     84	fi
     85done
     86
     87check_section $OBJ .data
     88check_section $OBJ .bss
     89check_section $OBJ .init.data
     90
     91exit $ERROR