| #!/bin/bash |
| |
| TARGET=$(basename $1) |
| DIR=lib/tests/module |
| TARGET="$DIR/$TARGET" |
| NUM_SYMS=$2 |
| SCALE_FACTOR=$3 |
| TEST_TYPE=$(echo $TARGET | sed -e 's|lib/tests/module/test_kallsyms_||g') |
| TEST_TYPE=$(echo $TEST_TYPE | sed -e 's|.c||g') |
| FIRST_B_LOOKUP=1 |
| |
| if [[ $NUM_SYMS -gt 2 ]]; then |
| FIRST_B_LOOKUP=$((NUM_SYMS/2)) |
| fi |
| |
| gen_template_module_header() |
| { |
| cat <<____END_MODULE |
| // SPDX-License-Identifier: GPL-2.0-or-later OR copyleft-next-0.3.1 |
| /* |
| * Copyright (C) 2023 Luis Chamberlain <mcgrof@kernel.org> |
| * |
| * Automatically generated code for testing, do not edit manually. |
| */ |
| |
| #define pr_fmt(fmt) KBUILD_MODNAME ": " fmt |
| |
| #include <linux/init.h> |
| #include <linux/module.h> |
| #include <linux/printk.h> |
| |
| ____END_MODULE |
| } |
| |
| gen_num_syms() |
| { |
| PREFIX=$1 |
| NUM=$2 |
| for i in $(seq 1 $NUM); do |
| printf "int auto_test_%s_%010d = 0;\n" $PREFIX $i |
| printf "EXPORT_SYMBOL_GPL(auto_test_%s_%010d);\n" $PREFIX $i |
| done |
| echo |
| } |
| |
| gen_template_module_data_a() |
| { |
| gen_num_syms a $1 |
| cat <<____END_MODULE |
| static int auto_runtime_test(void) |
| { |
| return 0; |
| } |
| |
| ____END_MODULE |
| } |
| |
| gen_template_module_data_b() |
| { |
| printf "\nextern int auto_test_a_%010d;\n\n" $FIRST_B_LOOKUP |
| echo "static int auto_runtime_test(void)" |
| echo "{" |
| printf "\nreturn auto_test_a_%010d;\n" $FIRST_B_LOOKUP |
| echo "}" |
| } |
| |
| gen_template_module_data_c() |
| { |
| gen_num_syms c $1 |
| cat <<____END_MODULE |
| static int auto_runtime_test(void) |
| { |
| return 0; |
| } |
| |
| ____END_MODULE |
| } |
| |
| gen_template_module_data_d() |
| { |
| gen_num_syms d $1 |
| cat <<____END_MODULE |
| static int auto_runtime_test(void) |
| { |
| return 0; |
| } |
| |
| ____END_MODULE |
| } |
| |
| gen_template_module_exit() |
| { |
| cat <<____END_MODULE |
| static int __init auto_test_module_init(void) |
| { |
| return auto_runtime_test(); |
| } |
| module_init(auto_test_module_init); |
| |
| static void __exit auto_test_module_exit(void) |
| { |
| } |
| module_exit(auto_test_module_exit); |
| |
| MODULE_AUTHOR("Luis Chamberlain <mcgrof@kernel.org>"); |
| MODULE_LICENSE("GPL"); |
| MODULE_DESCRIPTION("Test module for kallsyms"); |
| ____END_MODULE |
| } |
| |
| case $TEST_TYPE in |
| a) |
| gen_template_module_header > $TARGET |
| gen_template_module_data_a $NUM_SYMS >> $TARGET |
| gen_template_module_exit >> $TARGET |
| ;; |
| b) |
| gen_template_module_header > $TARGET |
| gen_template_module_data_b >> $TARGET |
| gen_template_module_exit >> $TARGET |
| ;; |
| c) |
| gen_template_module_header > $TARGET |
| gen_template_module_data_c $((NUM_SYMS * SCALE_FACTOR)) >> $TARGET |
| gen_template_module_exit >> $TARGET |
| ;; |
| d) |
| gen_template_module_header > $TARGET |
| gen_template_module_data_d $((NUM_SYMS * SCALE_FACTOR * 2)) >> $TARGET |
| gen_template_module_exit >> $TARGET |
| ;; |
| *) |
| ;; |
| esac |