2011-05-23 09:31:24 -04:00
/*
* vvar . h : Shared vDSO / kernel variable declarations
* Copyright ( c ) 2011 Andy Lutomirski
* Subject to the GNU General Public License , version 2
*
* A handful of variables are accessible ( read - only ) from userspace
* code in the vsyscall page and the vdso . They are declared here .
* Some other file must define them with DEFINE_VVAR .
*
* In normal kernel code , they are used like any other variable .
* In user code , they are accessed through the VVAR macro .
*
2011-06-05 13:50:19 -04:00
* These variables live in a page of kernel data that has an extra RO
* mapping for userspace . Each variable needs a unique offset within
* that page ; specify that offset with the DECLARE_VVAR macro . ( If
* you mess up , the linker will catch it . )
2011-05-23 09:31:24 -04:00
*/
2011-06-05 13:50:19 -04:00
/* Base address of vvars. This is not ABI. */
# define VVAR_ADDRESS (-10*1024*1024 - 4096)
2011-05-23 09:31:24 -04:00
# if defined(__VVAR_KERNEL_LDS)
/* The kernel linker script defines its own magic to put vvars in the
* right place .
*/
# define DECLARE_VVAR(offset, type, name) \
2011-06-05 13:50:19 -04:00
EMIT_VVAR ( name , offset )
2011-05-23 09:31:24 -04:00
# else
# define DECLARE_VVAR(offset, type, name) \
static type const * const vvaraddr_ # # name = \
2011-06-05 13:50:19 -04:00
( void * ) ( VVAR_ADDRESS + ( offset ) ) ;
2011-05-23 09:31:24 -04:00
# define DEFINE_VVAR(type, name) \
2011-06-05 13:50:19 -04:00
type name \
__attribute__ ( ( section ( " .vvar_ " # name ) , aligned ( 16 ) ) )
2011-05-23 09:31:24 -04:00
# define VVAR(name) (*vvaraddr_ ## name)
# endif
/* DECLARE_VVAR(offset, type, name) */
DECLARE_VVAR ( 0 , volatile unsigned long , jiffies )
2011-06-05 13:50:17 -04:00
DECLARE_VVAR ( 16 , int , vgetcpu_mode )
2011-05-23 09:31:24 -04:00
DECLARE_VVAR ( 128 , struct vsyscall_gtod_data , vsyscall_gtod_data )
# undef DECLARE_VVAR