aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86_64/kernel/vsyscall.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86_64/kernel/vsyscall.c')
-rw-r--r--arch/x86_64/kernel/vsyscall.c9
1 files changed, 7 insertions, 2 deletions
diff --git a/arch/x86_64/kernel/vsyscall.c b/arch/x86_64/kernel/vsyscall.c
index b43c698cf7d3..d14cbb3e0ebe 100644
--- a/arch/x86_64/kernel/vsyscall.c
+++ b/arch/x86_64/kernel/vsyscall.c
@@ -45,6 +45,11 @@
45 45
46#define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr))) 46#define __vsyscall(nr) __attribute__ ((unused,__section__(".vsyscall_" #nr)))
47#define __syscall_clobber "r11","rcx","memory" 47#define __syscall_clobber "r11","rcx","memory"
48#define __pa_vsymbol(x) \
49 ({unsigned long v; \
50 extern char __vsyscall_0; \
51 asm("" : "=r" (v) : "0" (x)); \
52 ((v - VSYSCALL_FIRST_PAGE) + __pa_symbol(&__vsyscall_0)); })
48 53
49struct vsyscall_gtod_data_t { 54struct vsyscall_gtod_data_t {
50 seqlock_t lock; 55 seqlock_t lock;
@@ -224,10 +229,10 @@ static int vsyscall_sysctl_change(ctl_table *ctl, int write, struct file * filp,
224 return ret; 229 return ret;
225 /* gcc has some trouble with __va(__pa()), so just do it this 230 /* gcc has some trouble with __va(__pa()), so just do it this
226 way. */ 231 way. */
227 map1 = ioremap(__pa_symbol(&vsysc1), 2); 232 map1 = ioremap(__pa_vsymbol(&vsysc1), 2);
228 if (!map1) 233 if (!map1)
229 return -ENOMEM; 234 return -ENOMEM;
230 map2 = ioremap(__pa_symbol(&vsysc2), 2); 235 map2 = ioremap(__pa_vsymbol(&vsysc2), 2);
231 if (!map2) { 236 if (!map2) {
232 ret = -ENOMEM; 237 ret = -ENOMEM;
233 goto out; 238 goto out;