blob: 081d909bc495426e576b5f07924db12590c7756d [file] [log] [blame]
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -04001/*
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 *
Andy Lutomirski9fd67b42011-06-05 13:50:19 -040013 * These variables live in a page of kernel data that has an extra RO
14 * mapping for userspace. Each variable needs a unique offset within
15 * that page; specify that offset with the DECLARE_VVAR macro. (If
16 * you mess up, the linker will catch it.)
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040017 */
18
Stefani Seibold7c031562014-03-17 23:22:10 +010019#ifndef _ASM_X86_VVAR_H
20#define _ASM_X86_VVAR_H
21
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040022#if defined(__VVAR_KERNEL_LDS)
23
24/* The kernel linker script defines its own magic to put vvars in the
25 * right place.
26 */
27#define DECLARE_VVAR(offset, type, name) \
Andy Lutomirski9fd67b42011-06-05 13:50:19 -040028 EMIT_VVAR(name, offset)
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040029
30#else
31
Stefani Seiboldef721982014-03-17 23:22:07 +010032#ifdef BUILD_VDSO32
33
34#define DECLARE_VVAR(offset, type, name) \
35 extern type vvar_ ## name __attribute__((visibility("hidden")));
36
37#define VVAR(name) (vvar_ ## name)
38
39#else
40
Stefani Seiboldd2312e32014-03-17 23:22:01 +010041extern char __vvar_page;
42
43/* Base address of vvars. This is not ABI. */
44#ifdef CONFIG_X86_64
45#define VVAR_ADDRESS (-10*1024*1024 - 4096)
46#else
47#define VVAR_ADDRESS (&__vvar_page)
48#endif
49
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040050#define DECLARE_VVAR(offset, type, name) \
51 static type const * const vvaraddr_ ## name = \
Andy Lutomirski9fd67b42011-06-05 13:50:19 -040052 (void *)(VVAR_ADDRESS + (offset));
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040053
Stefani Seiboldef721982014-03-17 23:22:07 +010054#define VVAR(name) (*vvaraddr_ ## name)
55#endif
56
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040057#define DEFINE_VVAR(type, name) \
Andy Lutomirski9fd67b42011-06-05 13:50:19 -040058 type name \
Andi Kleen28596b62013-08-05 15:02:50 -070059 __attribute__((section(".vvar_" #name), aligned(16))) __visible
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040060
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040061#endif
62
63/* DECLARE_VVAR(offset, type, name) */
64
65DECLARE_VVAR(0, volatile unsigned long, jiffies)
Andy Lutomirski6879eb22011-06-05 13:50:17 -040066DECLARE_VVAR(16, int, vgetcpu_mode)
Andy Lutomirski8c49d9a2011-05-23 09:31:24 -040067DECLARE_VVAR(128, struct vsyscall_gtod_data, vsyscall_gtod_data)
68
69#undef DECLARE_VVAR
Stefani Seibold7c031562014-03-17 23:22:10 +010070
71#endif