diff options
author | Vincenzo Frascino <vincenzo.frascino@arm.com> | 2019-06-21 05:52:46 -0400 |
---|---|---|
committer | Paul Burton <paul.burton@mips.com> | 2019-07-26 00:45:05 -0400 |
commit | 24640f233b466051ad3a5d2786d2951e43026c9d (patch) | |
tree | ca9acaf821110f4d249dd4a250d7a9b740675261 /arch/mips/kernel | |
parent | c2aeaaea175652af6610f97a0de6d7cd07311e18 (diff) |
mips: Add support for generic vDSO
The mips vDSO library requires some adaptations to take advantage of the
newly introduced generic vDSO library.
Introduce the following changes:
- Modification of vdso.c to be compliant with the common vdso datapage
- Use of lib/vdso for gettimeofday
Cc: Ralf Baechle <ralf@linux-mips.org>
Cc: Paul Burton <paul.burton@mips.com>
Signed-off-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
[paul.burton@mips.com: Prepend $(src) to config-n32-o32-env.c path.]
Signed-off-by: Paul Burton <paul.burton@mips.com>
Diffstat (limited to 'arch/mips/kernel')
-rw-r--r-- | arch/mips/kernel/vdso.c | 37 |
1 files changed, 6 insertions, 31 deletions
diff --git a/arch/mips/kernel/vdso.c b/arch/mips/kernel/vdso.c index 3a372686ffca..bc35f8499111 100644 --- a/arch/mips/kernel/vdso.c +++ b/arch/mips/kernel/vdso.c | |||
@@ -20,9 +20,12 @@ | |||
20 | #include <asm/mips-cps.h> | 20 | #include <asm/mips-cps.h> |
21 | #include <asm/page.h> | 21 | #include <asm/page.h> |
22 | #include <asm/vdso.h> | 22 | #include <asm/vdso.h> |
23 | #include <vdso/helpers.h> | ||
24 | #include <vdso/vsyscall.h> | ||
23 | 25 | ||
24 | /* Kernel-provided data used by the VDSO. */ | 26 | /* Kernel-provided data used by the VDSO. */ |
25 | static union mips_vdso_data vdso_data __page_aligned_data; | 27 | static union mips_vdso_data mips_vdso_data __page_aligned_data; |
28 | struct vdso_data *vdso_data = mips_vdso_data.data; | ||
26 | 29 | ||
27 | /* | 30 | /* |
28 | * Mapping for the VDSO data/GIC pages. The real pages are mapped manually, as | 31 | * Mapping for the VDSO data/GIC pages. The real pages are mapped manually, as |
@@ -66,34 +69,6 @@ static int __init init_vdso(void) | |||
66 | } | 69 | } |
67 | subsys_initcall(init_vdso); | 70 | subsys_initcall(init_vdso); |
68 | 71 | ||
69 | void update_vsyscall(struct timekeeper *tk) | ||
70 | { | ||
71 | vdso_data_write_begin(&vdso_data); | ||
72 | |||
73 | vdso_data.xtime_sec = tk->xtime_sec; | ||
74 | vdso_data.xtime_nsec = tk->tkr_mono.xtime_nsec; | ||
75 | vdso_data.wall_to_mono_sec = tk->wall_to_monotonic.tv_sec; | ||
76 | vdso_data.wall_to_mono_nsec = tk->wall_to_monotonic.tv_nsec; | ||
77 | vdso_data.cs_shift = tk->tkr_mono.shift; | ||
78 | |||
79 | vdso_data.clock_mode = tk->tkr_mono.clock->archdata.vdso_clock_mode; | ||
80 | if (vdso_data.clock_mode != VDSO_CLOCK_NONE) { | ||
81 | vdso_data.cs_mult = tk->tkr_mono.mult; | ||
82 | vdso_data.cs_cycle_last = tk->tkr_mono.cycle_last; | ||
83 | vdso_data.cs_mask = tk->tkr_mono.mask; | ||
84 | } | ||
85 | |||
86 | vdso_data_write_end(&vdso_data); | ||
87 | } | ||
88 | |||
89 | void update_vsyscall_tz(void) | ||
90 | { | ||
91 | if (vdso_data.clock_mode != VDSO_CLOCK_NONE) { | ||
92 | vdso_data.tz_minuteswest = sys_tz.tz_minuteswest; | ||
93 | vdso_data.tz_dsttime = sys_tz.tz_dsttime; | ||
94 | } | ||
95 | } | ||
96 | |||
97 | static unsigned long vdso_base(void) | 72 | static unsigned long vdso_base(void) |
98 | { | 73 | { |
99 | unsigned long base; | 74 | unsigned long base; |
@@ -163,7 +138,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
163 | */ | 138 | */ |
164 | if (cpu_has_dc_aliases) { | 139 | if (cpu_has_dc_aliases) { |
165 | base = __ALIGN_MASK(base, shm_align_mask); | 140 | base = __ALIGN_MASK(base, shm_align_mask); |
166 | base += ((unsigned long)&vdso_data - gic_size) & shm_align_mask; | 141 | base += ((unsigned long)vdso_data - gic_size) & shm_align_mask; |
167 | } | 142 | } |
168 | 143 | ||
169 | data_addr = base + gic_size; | 144 | data_addr = base + gic_size; |
@@ -189,7 +164,7 @@ int arch_setup_additional_pages(struct linux_binprm *bprm, int uses_interp) | |||
189 | 164 | ||
190 | /* Map data page. */ | 165 | /* Map data page. */ |
191 | ret = remap_pfn_range(vma, data_addr, | 166 | ret = remap_pfn_range(vma, data_addr, |
192 | virt_to_phys(&vdso_data) >> PAGE_SHIFT, | 167 | virt_to_phys(vdso_data) >> PAGE_SHIFT, |
193 | PAGE_SIZE, PAGE_READONLY); | 168 | PAGE_SIZE, PAGE_READONLY); |
194 | if (ret) | 169 | if (ret) |
195 | goto out; | 170 | goto out; |