1 | // SPDX-License-Identifier: GPL-2.0-only |
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> |
7 | */ |
8 | #define pr_fmt(fmt) "rodata_test: " fmt |
9 | |
10 | #include <linux/rodata_test.h> |
11 | #include <linux/uaccess.h> |
12 | #include <linux/mm.h> |
13 | #include <asm/sections.h> |
14 | |
15 | static const int rodata_test_data = 0xC3; |
16 | |
17 | void rodata_test(void) |
18 | { |
19 | int zero = 0; |
20 | |
21 | /* test 1: read the value */ |
22 | /* If this test fails, some previous testrun has clobbered the state */ |
23 | if (!rodata_test_data) { |
24 | pr_err("test 1 fails (start data)\n" ); |
25 | return; |
26 | } |
27 | |
28 | /* test 2: write to the variable; this should fault */ |
29 | if (!copy_to_kernel_nofault(dst: (void *)&rodata_test_data, |
30 | src: (void *)&zero, size: sizeof(zero))) { |
31 | pr_err("test data was not read only\n" ); |
32 | return; |
33 | } |
34 | |
35 | /* test 3: check the value hasn't changed */ |
36 | if (rodata_test_data == zero) { |
37 | pr_err("test data was changed\n" ); |
38 | return; |
39 | } |
40 | |
41 | /* test 4: check if the rodata section is PAGE_SIZE aligned */ |
42 | if (!PAGE_ALIGNED(__start_rodata)) { |
43 | pr_err("start of .rodata is not page size aligned\n" ); |
44 | return; |
45 | } |
46 | if (!PAGE_ALIGNED(__end_rodata)) { |
47 | pr_err("end of .rodata is not page size aligned\n" ); |
48 | return; |
49 | } |
50 | |
51 | pr_info("all tests were successful\n" ); |
52 | } |
53 | |