forked from torvalds/linux
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mm: add arch-independent testcases for RODATA
This patch makes arch-independent testcases for RODATA. Both x86 and x86_64 already have testcases for RODATA, But they are arch-specific because using inline assembly directly. And cacheflush.h is not a suitable location for rodata-test related things. Since they were in cacheflush.h, If someone change the state of CONFIG_DEBUG_RODATA_TEST, It cause overhead of kernel build. To solve the above issues, write arch-independent testcases and move it to shared location. [[email protected]: fix config dependency] Link: http://lkml.kernel.org/r/20170209131625.GA16954@pjb1027-Latitude-E5410 Link: http://lkml.kernel.org/r/20170129105436.GA9303@pjb1027-Latitude-E5410 Signed-off-by: Jinbum Park <[email protected]> Acked-by: Kees Cook <[email protected]> Cc: Ingo Molnar <[email protected]> Cc: H. Peter Anvin <[email protected]> Cc: Arjan van de Ven <[email protected]> Cc: Laura Abbott <[email protected]> Cc: Russell King <[email protected]> Cc: Valentin Rothberg <[email protected]> Signed-off-by: Andrew Morton <[email protected]> Signed-off-by: Linus Torvalds <[email protected]>
- Loading branch information
Showing
11 changed files
with
90 additions
and
105 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file was deleted.
Oops, something went wrong.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,23 @@ | ||
/* | ||
* rodata_test.h: functional test for mark_rodata_ro function | ||
* | ||
* (C) Copyright 2008 Intel Corporation | ||
* Author: Arjan van de Ven <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
|
||
#ifndef _RODATA_TEST_H | ||
#define _RODATA_TEST_H | ||
|
||
#ifdef CONFIG_DEBUG_RODATA_TEST | ||
extern const int rodata_test_data; | ||
void rodata_test(void); | ||
#else | ||
static inline void rodata_test(void) {} | ||
#endif | ||
|
||
#endif /* _RODATA_TEST_H */ |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,56 @@ | ||
/* | ||
* rodata_test.c: functional test for mark_rodata_ro function | ||
* | ||
* (C) Copyright 2008 Intel Corporation | ||
* Author: Arjan van de Ven <[email protected]> | ||
* | ||
* This program is free software; you can redistribute it and/or | ||
* modify it under the terms of the GNU General Public License | ||
* as published by the Free Software Foundation; version 2 | ||
* of the License. | ||
*/ | ||
#include <linux/uaccess.h> | ||
#include <asm/sections.h> | ||
|
||
const int rodata_test_data = 0xC3; | ||
EXPORT_SYMBOL_GPL(rodata_test_data); | ||
|
||
void rodata_test(void) | ||
{ | ||
unsigned long start, end; | ||
int zero = 0; | ||
|
||
/* test 1: read the value */ | ||
/* If this test fails, some previous testrun has clobbered the state */ | ||
if (!rodata_test_data) { | ||
pr_err("rodata_test: test 1 fails (start data)\n"); | ||
return; | ||
} | ||
|
||
/* test 2: write to the variable; this should fault */ | ||
if (!probe_kernel_write((void *)&rodata_test_data, | ||
(void *)&zero, sizeof(zero))) { | ||
pr_err("rodata_test: test data was not read only\n"); | ||
return; | ||
} | ||
|
||
/* test 3: check the value hasn't changed */ | ||
if (rodata_test_data == zero) { | ||
pr_err("rodata_test: test data was changed\n"); | ||
return; | ||
} | ||
|
||
/* test 4: check if the rodata section is PAGE_SIZE aligned */ | ||
start = (unsigned long)__start_rodata; | ||
end = (unsigned long)__end_rodata; | ||
if (start & (PAGE_SIZE - 1)) { | ||
pr_err("rodata_test: start of .rodata is not page size aligned\n"); | ||
return; | ||
} | ||
if (end & (PAGE_SIZE - 1)) { | ||
pr_err("rodata_test: end of .rodata is not page size aligned\n"); | ||
return; | ||
} | ||
|
||
pr_info("rodata_test: all tests were successful\n"); | ||
} |