#!/bin/bash # SPDX-License-Identifier: GPL-2.0-only # # Copyright 2021 Google LLC # Author: ramjiyani@google.com (Ramji Jiyani) # # # Generates hearder files for GKI modules symbol and export protections # # Called By: KERNEL_SRC/kernel/Makefile if CONFIG_MODULE_SIG_PROTECT=y # # gki_module_exported.h: Symbols protected from _export_ by unsigned modules # gki_module_protected.h: Symbols protected from _access_ by unsigned modules # # If valid symbol file doesn't exists then still generates valid C header files for # compilation to proceed with no symbols to protect # # Collect arguments from Makefile TARGET=$1 SRCTREE=$2 set -e # # Common Definitions # # # generate_header(): # Args: $1 = Name of the header file # $2 = Input symbol list # $3 = Symbol type (protected/exported) # generate_header() { local header_file=$1 local symbol_file=$2 local symbol_type=$3 echo " GEN ${header_file}" if [ -f "${header_file}" ]; then rm -f -- "${header_file}" fi # Find Maximum symbol name length if valid symbol_file exist if [ -s "${symbol_file}" ]; then # Skip 1st line (symbol header), Trim white spaces & +1 for null termination local max_name_len=$(awk ' { $1=$1; if ( length > L && NR > 1) { L=length } } END { print ++L }' "${symbol_file}") else # Set to 1 to generate valid C header file local max_name_len=1 fi # Header generation cat > "${header_file}" <<- EOT /* * DO NOT EDIT * * Build generated header file with GKI module symbols/exports */ #define NO_OF_$(printf ${symbol_type} | tr [:lower:] [:upper:])_SYMBOLS \\ $(printf '\t')(sizeof(gki_${symbol_type}_symbols) / sizeof(gki_${symbol_type}_symbols[0])) #define MAX_$(printf ${symbol_type} | tr [:lower:] [:upper:])_NAME_LEN (${max_name_len}) static const char gki_${symbol_type}_symbols[][MAX_$(printf ${symbol_type} | tr [:lower:] [:upper:])_NAME_LEN] = { EOT # If a valid symbol_file present add symbols in an array except the 1st line if [ -s "${symbol_file}" ]; then sed -e 1d -e 's/^[ \t]*/\t"/;s/[ \t]*$/",/' "${symbol_file}" >> "${header_file}" fi # Terminate the file echo "};" >> "${header_file}" } if [ "$(basename "${TARGET}")" = "gki_module_protected.h" ]; then # Sorted list of protected symbols GKI_PROTECTED_SYMBOLS="${SRCTREE}/android/abi_gki_modules_protected" generate_header "${TARGET}" "${GKI_PROTECTED_SYMBOLS}" "protected" else # Sorted list of exported symbols GKI_EXPORTED_SYMBOLS="${SRCTREE}/android/abi_gki_modules_exports" generate_header "${TARGET}" "${GKI_EXPORTED_SYMBOLS}" "exported" fi