18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * This is for all the tests relating directly to Control Flow Integrity. 48c2ecf20Sopenharmony_ci */ 58c2ecf20Sopenharmony_ci#include "lkdtm.h" 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_cistatic int called_count; 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci/* Function taking one argument, without a return value. */ 108c2ecf20Sopenharmony_cistatic noinline void lkdtm_increment_void(int *counter) 118c2ecf20Sopenharmony_ci{ 128c2ecf20Sopenharmony_ci (*counter)++; 138c2ecf20Sopenharmony_ci} 148c2ecf20Sopenharmony_ci 158c2ecf20Sopenharmony_ci/* Function taking one argument, returning int. */ 168c2ecf20Sopenharmony_cistatic noinline int lkdtm_increment_int(int *counter) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci (*counter)++; 198c2ecf20Sopenharmony_ci 208c2ecf20Sopenharmony_ci return *counter; 218c2ecf20Sopenharmony_ci} 228c2ecf20Sopenharmony_ci/* 238c2ecf20Sopenharmony_ci * This tries to call an indirect function with a mismatched prototype. 248c2ecf20Sopenharmony_ci */ 258c2ecf20Sopenharmony_civoid lkdtm_CFI_FORWARD_PROTO(void) 268c2ecf20Sopenharmony_ci{ 278c2ecf20Sopenharmony_ci /* 288c2ecf20Sopenharmony_ci * Matches lkdtm_increment_void()'s prototype, but not 298c2ecf20Sopenharmony_ci * lkdtm_increment_int()'s prototype. 308c2ecf20Sopenharmony_ci */ 318c2ecf20Sopenharmony_ci void (*func)(int *); 328c2ecf20Sopenharmony_ci 338c2ecf20Sopenharmony_ci pr_info("Calling matched prototype ...\n"); 348c2ecf20Sopenharmony_ci func = lkdtm_increment_void; 358c2ecf20Sopenharmony_ci func(&called_count); 368c2ecf20Sopenharmony_ci 378c2ecf20Sopenharmony_ci pr_info("Calling mismatched prototype ...\n"); 388c2ecf20Sopenharmony_ci func = (void *)lkdtm_increment_int; 398c2ecf20Sopenharmony_ci func(&called_count); 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci pr_info("Fail: survived mismatched prototype function call!\n"); 428c2ecf20Sopenharmony_ci} 43