2008-01-30 13:34:08 +01:00
/*
* test_rodata . c : functional test for mark_rodata_ro function
*
* ( C ) Copyright 2008 Intel Corporation
* Author : Arjan van de Ven < arjan @ linux . intel . com >
*
* 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 .
*/
2008-02-12 12:12:01 -08:00
# include <asm/cacheflush.h>
2008-01-30 13:34:08 +01:00
# include <asm/sections.h>
2012-04-20 12:19:50 -07:00
# include <asm/asm.h>
2008-01-30 13:34:08 +01:00
int rodata_test ( void )
{
unsigned long result ;
unsigned long start , end ;
/* test 1: read the value */
/* If this test fails, some previous testrun has clobbered the state */
if ( ! rodata_test_data ) {
printk ( KERN_ERR " rodata_test: test 1 fails (start data) \n " ) ;
return - ENODEV ;
}
/* test 2: write to the variable; this should fault */
/*
* If this test fails , we managed to overwrite the data
*
* This is written in assembly to be able to catch the
* exception that is supposed to happen in the correct
* case
*/
result = 1 ;
asm volatile (
" 0: mov %[zero],(%[rodata_test]) \n "
" mov %[zero], %[rslt] \n "
" 1: \n "
" .section .fixup, \" ax \" \n "
" 2: jmp 1b \n "
" .previous \n "
2012-04-20 12:19:50 -07:00
_ASM_EXTABLE ( 0 b , 2 b )
2008-01-30 13:34:08 +01:00
: [ rslt ] " =r " ( result )
: [ rodata_test ] " r " ( & rodata_test_data ) , [ zero ] " r " ( 0UL )
) ;
if ( ! result ) {
printk ( KERN_ERR " rodata_test: test data was not read only \n " ) ;
return - ENODEV ;
}
/* test 3: check the value hasn't changed */
/* If this test fails, we managed to overwrite the data */
if ( ! rodata_test_data ) {
2015-02-27 23:52:31 +09:00
printk ( KERN_ERR " rodata_test: Test 3 fails (end data) \n " ) ;
2008-01-30 13:34:08 +01:00
return - ENODEV ;
}
/* test 4: check if the rodata section is 4Kb aligned */
start = ( unsigned long ) __start_rodata ;
end = ( unsigned long ) __end_rodata ;
if ( start & ( PAGE_SIZE - 1 ) ) {
printk ( KERN_ERR " rodata_test: .rodata is not 4k aligned \n " ) ;
return - ENODEV ;
}
if ( end & ( PAGE_SIZE - 1 ) ) {
printk ( KERN_ERR " rodata_test: .rodata end is not 4k aligned \n " ) ;
return - ENODEV ;
}
return 0 ;
}