162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only 262306a36Sopenharmony_ci/* 362306a36Sopenharmony_ci * rodata_test.c: functional test for mark_rodata_ro function 462306a36Sopenharmony_ci * 562306a36Sopenharmony_ci * (C) Copyright 2008 Intel Corporation 662306a36Sopenharmony_ci * Author: Arjan van de Ven <arjan@linux.intel.com> 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci#define pr_fmt(fmt) "rodata_test: " fmt 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ci#include <linux/rodata_test.h> 1162306a36Sopenharmony_ci#include <linux/uaccess.h> 1262306a36Sopenharmony_ci#include <linux/mm.h> 1362306a36Sopenharmony_ci#include <asm/sections.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistatic const int rodata_test_data = 0xC3; 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_civoid rodata_test(void) 1862306a36Sopenharmony_ci{ 1962306a36Sopenharmony_ci int zero = 0; 2062306a36Sopenharmony_ci 2162306a36Sopenharmony_ci /* test 1: read the value */ 2262306a36Sopenharmony_ci /* If this test fails, some previous testrun has clobbered the state */ 2362306a36Sopenharmony_ci if (!rodata_test_data) { 2462306a36Sopenharmony_ci pr_err("test 1 fails (start data)\n"); 2562306a36Sopenharmony_ci return; 2662306a36Sopenharmony_ci } 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci /* test 2: write to the variable; this should fault */ 2962306a36Sopenharmony_ci if (!copy_to_kernel_nofault((void *)&rodata_test_data, 3062306a36Sopenharmony_ci (void *)&zero, sizeof(zero))) { 3162306a36Sopenharmony_ci pr_err("test data was not read only\n"); 3262306a36Sopenharmony_ci return; 3362306a36Sopenharmony_ci } 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci /* test 3: check the value hasn't changed */ 3662306a36Sopenharmony_ci if (rodata_test_data == zero) { 3762306a36Sopenharmony_ci pr_err("test data was changed\n"); 3862306a36Sopenharmony_ci return; 3962306a36Sopenharmony_ci } 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci /* test 4: check if the rodata section is PAGE_SIZE aligned */ 4262306a36Sopenharmony_ci if (!PAGE_ALIGNED(__start_rodata)) { 4362306a36Sopenharmony_ci pr_err("start of .rodata is not page size aligned\n"); 4462306a36Sopenharmony_ci return; 4562306a36Sopenharmony_ci } 4662306a36Sopenharmony_ci if (!PAGE_ALIGNED(__end_rodata)) { 4762306a36Sopenharmony_ci pr_err("end of .rodata is not page size aligned\n"); 4862306a36Sopenharmony_ci return; 4962306a36Sopenharmony_ci } 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ci pr_info("all tests were successful\n"); 5262306a36Sopenharmony_ci} 53