diff options
Diffstat (limited to 'arch/x86_64/kernel/vsyscall.c')
-rw-r--r-- | arch/x86_64/kernel/vsyscall.c | 9 |
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 | ||
49 | struct vsyscall_gtod_data_t { | 54 | struct 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; |