]>
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 <[email protected]> | |
2959a5f7 | 7 | */ |
056b9d8a KC |
8 | #define pr_fmt(fmt) "rodata_test: " fmt |
9 | ||
86f54bb7 | 10 | #include <linux/rodata_test.h> |
2959a5f7 | 11 | #include <linux/uaccess.h> |
679d7f69 | 12 | #include <linux/mm.h> |
2959a5f7 JP |
13 | #include <asm/sections.h> |
14 | ||
a872eb21 | 15 | static const int rodata_test_data = 0xC3; |
2959a5f7 JP |
16 | |
17 | void rodata_test(void) | |
18 | { | |
2959a5f7 JP |
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) { | |
056b9d8a | 24 | pr_err("test 1 fails (start data)\n"); |
2959a5f7 JP |
25 | return; |
26 | } | |
27 | ||
28 | /* test 2: write to the variable; this should fault */ | |
fe557319 | 29 | if (!copy_to_kernel_nofault((void *)&rodata_test_data, |
056b9d8a KC |
30 | (void *)&zero, sizeof(zero))) { |
31 | pr_err("test data was not read only\n"); | |
2959a5f7 JP |
32 | return; |
33 | } | |
34 | ||
35 | /* test 3: check the value hasn't changed */ | |
36 | if (rodata_test_data == zero) { | |
056b9d8a | 37 | pr_err("test data was changed\n"); |
2959a5f7 JP |
38 | return; |
39 | } | |
40 | ||
41 | /* test 4: check if the rodata section is PAGE_SIZE aligned */ | |
679d7f69 | 42 | if (!PAGE_ALIGNED(__start_rodata)) { |
056b9d8a | 43 | pr_err("start of .rodata is not page size aligned\n"); |
2959a5f7 JP |
44 | return; |
45 | } | |
679d7f69 | 46 | if (!PAGE_ALIGNED(__end_rodata)) { |
056b9d8a | 47 | pr_err("end of .rodata is not page size aligned\n"); |
2959a5f7 JP |
48 | return; |
49 | } | |
50 | ||
056b9d8a | 51 | pr_info("all tests were successful\n"); |
2959a5f7 | 52 | } |