18c2ecf20Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 28c2ecf20Sopenharmony_ci/* 38c2ecf20Sopenharmony_ci * rodata_test.c: functional test for mark_rodata_ro function 48c2ecf20Sopenharmony_ci * 58c2ecf20Sopenharmony_ci * (C) Copyright 2008 Intel Corporation 68c2ecf20Sopenharmony_ci * Author: Arjan van de Ven <arjan@linux.intel.com> 78c2ecf20Sopenharmony_ci */ 88c2ecf20Sopenharmony_ci#define pr_fmt(fmt) "rodata_test: " fmt 98c2ecf20Sopenharmony_ci 108c2ecf20Sopenharmony_ci#include <linux/rodata_test.h> 118c2ecf20Sopenharmony_ci#include <linux/uaccess.h> 128c2ecf20Sopenharmony_ci#include <asm/sections.h> 138c2ecf20Sopenharmony_ci 148c2ecf20Sopenharmony_cistatic const int rodata_test_data = 0xC3; 158c2ecf20Sopenharmony_ci 168c2ecf20Sopenharmony_civoid rodata_test(void) 178c2ecf20Sopenharmony_ci{ 188c2ecf20Sopenharmony_ci unsigned long start, end; 198c2ecf20Sopenharmony_ci int zero = 0; 208c2ecf20Sopenharmony_ci 218c2ecf20Sopenharmony_ci /* test 1: read the value */ 228c2ecf20Sopenharmony_ci /* If this test fails, some previous testrun has clobbered the state */ 238c2ecf20Sopenharmony_ci if (!rodata_test_data) { 248c2ecf20Sopenharmony_ci pr_err("test 1 fails (start data)\n"); 258c2ecf20Sopenharmony_ci return; 268c2ecf20Sopenharmony_ci } 278c2ecf20Sopenharmony_ci 288c2ecf20Sopenharmony_ci /* test 2: write to the variable; this should fault */ 298c2ecf20Sopenharmony_ci if (!copy_to_kernel_nofault((void *)&rodata_test_data, 308c2ecf20Sopenharmony_ci (void *)&zero, sizeof(zero))) { 318c2ecf20Sopenharmony_ci pr_err("test data was not read only\n"); 328c2ecf20Sopenharmony_ci return; 338c2ecf20Sopenharmony_ci } 348c2ecf20Sopenharmony_ci 358c2ecf20Sopenharmony_ci /* test 3: check the value hasn't changed */ 368c2ecf20Sopenharmony_ci if (rodata_test_data == zero) { 378c2ecf20Sopenharmony_ci pr_err("test data was changed\n"); 388c2ecf20Sopenharmony_ci return; 398c2ecf20Sopenharmony_ci } 408c2ecf20Sopenharmony_ci 418c2ecf20Sopenharmony_ci /* test 4: check if the rodata section is PAGE_SIZE aligned */ 428c2ecf20Sopenharmony_ci start = (unsigned long)__start_rodata; 438c2ecf20Sopenharmony_ci end = (unsigned long)__end_rodata; 448c2ecf20Sopenharmony_ci if (start & (PAGE_SIZE - 1)) { 458c2ecf20Sopenharmony_ci pr_err("start of .rodata is not page size aligned\n"); 468c2ecf20Sopenharmony_ci return; 478c2ecf20Sopenharmony_ci } 488c2ecf20Sopenharmony_ci if (end & (PAGE_SIZE - 1)) { 498c2ecf20Sopenharmony_ci pr_err("end of .rodata is not page size aligned\n"); 508c2ecf20Sopenharmony_ci return; 518c2ecf20Sopenharmony_ci } 528c2ecf20Sopenharmony_ci 538c2ecf20Sopenharmony_ci pr_info("all tests were successful\n"); 548c2ecf20Sopenharmony_ci} 55