xref: /kernel/linux/linux-6.6/mm/rodata_test.c (revision 62306a36)
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