1 /* 2 * vvar.h: Shared vDSO/kernel variable declarations 3 * Copyright (c) 2011 Andy Lutomirski 4 * Subject to the GNU General Public License, version 2 5 * 6 * A handful of variables are accessible (read-only) from userspace 7 * code in the vsyscall page and the vdso. They are declared here. 8 * Some other file must define them with DEFINE_VVAR. 9 * 10 * In normal kernel code, they are used like any other variable. 11 * In user code, they are accessed through the VVAR macro. 12 * 13 * Each of these variables lives in the vsyscall page, and each 14 * one needs a unique offset within the little piece of the page 15 * reserved for vvars. Specify that offset in DECLARE_VVAR. 16 * (There are 896 bytes available. If you mess up, the linker will 17 * catch it.) 18 */ 19 20 /* Offset of vars within vsyscall page */ 21 #define VSYSCALL_VARS_OFFSET (3072 + 128) 22 23 #if defined(__VVAR_KERNEL_LDS) 24 25 /* The kernel linker script defines its own magic to put vvars in the 26 * right place. 27 */ 28 #define DECLARE_VVAR(offset, type, name) \ 29 EMIT_VVAR(name, VSYSCALL_VARS_OFFSET + offset) 30 31 #else 32 33 #define DECLARE_VVAR(offset, type, name) \ 34 static type const * const vvaraddr_ ## name = \ 35 (void *)(VSYSCALL_START + VSYSCALL_VARS_OFFSET + (offset)); 36 37 #define DEFINE_VVAR(type, name) \ 38 type __vvar_ ## name \ 39 __attribute__((section(".vsyscall_var_" #name), aligned(16))) 40 41 #define VVAR(name) (*vvaraddr_ ## name) 42 43 #endif 44 45 /* DECLARE_VVAR(offset, type, name) */ 46 47 DECLARE_VVAR(0, volatile unsigned long, jiffies) 48 DECLARE_VVAR(8, int, vgetcpu_mode) 49 DECLARE_VVAR(128, struct vsyscall_gtod_data, vsyscall_gtod_data) 50 51 #undef DECLARE_VVAR 52 #undef VSYSCALL_VARS_OFFSET 53