Commit | Line | Data |
---|---|---|
b886d83c | 1 | // SPDX-License-Identifier: GPL-2.0-only |
2959a5f7 JP |
2 | /* |
3 | * rodata_test.c: functional test for mark_rodata_ro function | |
4 | * | |
5 | * (C) Copyright 2008 Intel Corporation | |
6 | * Author: Arjan van de Ven <arjan@linux.intel.com> | |
2959a5f7 | 7 | */ |
056b9d8a KC |
8 | #define pr_fmt(fmt) "rodata_test: " fmt |
9 | ||
2959a5f7 JP |
10 | #include <linux/uaccess.h> |
11 | #include <asm/sections.h> | |
12 | ||
a872eb21 | 13 | static const int rodata_test_data = 0xC3; |
2959a5f7 JP |
14 | |
15 | void rodata_test(void) | |
16 | { | |
17 | unsigned long start, end; | |
18 | int zero = 0; | |
19 | ||
20 | /* test 1: read the value */ | |
21 | /* If this test fails, some previous testrun has clobbered the state */ | |
22 | if (!rodata_test_data) { | |
056b9d8a | 23 | pr_err("test 1 fails (start data)\n"); |
2959a5f7 JP |
24 | return; |
25 | } | |
26 | ||
27 | /* test 2: write to the variable; this should fault */ | |
28 | if (!probe_kernel_write((void *)&rodata_test_data, | |
056b9d8a KC |
29 | (void *)&zero, sizeof(zero))) { |
30 | pr_err("test data was not read only\n"); | |
2959a5f7 JP |
31 | return; |
32 | } | |
33 | ||
34 | /* test 3: check the value hasn't changed */ | |
35 | if (rodata_test_data == zero) { | |
056b9d8a | 36 | pr_err("test data was changed\n"); |
2959a5f7 JP |
37 | return; |
38 | } | |
39 | ||
40 | /* test 4: check if the rodata section is PAGE_SIZE aligned */ | |
41 | start = (unsigned long)__start_rodata; | |
42 | end = (unsigned long)__end_rodata; | |
43 | if (start & (PAGE_SIZE - 1)) { | |
056b9d8a | 44 | pr_err("start of .rodata is not page size aligned\n"); |
2959a5f7 JP |
45 | return; |
46 | } | |
47 | if (end & (PAGE_SIZE - 1)) { | |
056b9d8a | 48 | pr_err("end of .rodata is not page size aligned\n"); |
2959a5f7 JP |
49 | return; |
50 | } | |
51 | ||
056b9d8a | 52 | pr_info("all tests were successful\n"); |
2959a5f7 | 53 | } |