| #!/bin/bash | |
| # SPDX-License-Identifier: GPL-2.0-only | |
| # | |
| # Copyright 2022 Google LLC | |
| # Author: ramjiyani@google.com (Ramji Jiyani) | |
| # | |
| # | |
| # Generates header file with list of unprotected symbols | |
| # | |
| # Called By: KERNEL_SRC/kernel/Makefile if CONFIG_MODULE_SIG_PROTECT=y | |
| # | |
| # gki_module_unprotected.h: Symbols allowed to _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 | |
| SYMBOL_LIST=$3 | |
| set -e | |
| # | |
| # Common Definitions | |
| # | |
| # Use "make V=1" to debug this script. | |
| case "$KBUILD_VERBOSE" in | |
| *1*) | |
| set -x | |
| ;; | |
| esac | |
| # | |
| # generate_header(): | |
| # Args: $1 = Name of the header file | |
| # $2 = Input symbol list | |
| # $3 = Symbol type ("unprotected") | |
| # | |
| generate_header() { | |
| local header_file=$1 | |
| local symbol_file=$2 | |
| local symbol_type=$3 | |
| if [ -f "${header_file}" ]; then | |
| rm -f -- "${header_file}" | |
| fi | |
| # If symbol_file exist preprocess it and find maximum name length | |
| if [ -s "${symbol_file}" ]; then | |
| # Remove any trailing CR, leading / trailing whitespace, | |
| # line comments, empty lines and symbol list markers. | |
| sed -i ' | |
| s/\r$// | |
| s/^[[:space:]]*// | |
| s/[[:space:]]*$// | |
| /^#/d | |
| /^$/d | |
| /^\[abi_symbol_list\]$/d | |
| ' "${symbol_file}" | |
| # Sort in byte order for kernel binary search at runtime | |
| LC_ALL=C sort -u -o "${symbol_file}" "${symbol_file}" | |
| # Trim white spaces & +1 for null termination | |
| local max_name_len=$(awk ' | |
| { | |
| $1=$1; | |
| if ( length > L ) { | |
| 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 ${symbol_type} | |
| */ | |
| #define NR_$(printf ${symbol_type} | tr [:lower:] [:upper:])_SYMBOLS \\ | |
| $(printf '\t')(ARRAY_SIZE(gki_${symbol_type}_symbols)) | |
| #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 's/^[ \t]*/\t"/;s/[ \t]*$/",/' "${symbol_file}" >> "${header_file}" | |
| fi | |
| # Terminate the file | |
| echo "};" >> "${header_file}" | |
| } | |
| if [ "$(basename "${TARGET}")" = "gki_module_unprotected.h" ]; then | |
| # Union of vendor symbol lists | |
| GKI_VENDOR_SYMBOLS="${SYMBOL_LIST}" | |
| generate_header "${TARGET}" "${GKI_VENDOR_SYMBOLS}" "unprotected" | |
| else | |
| # Sorted list of exported symbols | |
| GKI_EXPORTED_SYMBOLS="include/config/abi_gki_protected_exports" | |
| if [ -z "${SYMBOL_LIST}" ]; then | |
| # Create empty list if ARCH doesn't have protected exports | |
| touch "${GKI_EXPORTED_SYMBOLS}" | |
| else | |
| # Make a temp copy to avoid changing source during pre-processing | |
| cp -f "${SYMBOL_LIST}" "${GKI_EXPORTED_SYMBOLS}" | |
| fi | |
| generate_header "${TARGET}" "${GKI_EXPORTED_SYMBOLS}" "protected_exports" | |
| fi | |