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