summaryrefslogtreecommitdiffstats
path: root/arch/mips/kernel
diff options
context:
space:
mode:
authorVincenzo Frascino <vincenzo.frascino@arm.com>2019-06-21 05:52:46 -0400
committerPaul Burton <paul.burton@mips.com>2019-07-26 00:45:05 -0400
commit24640f233b466051ad3a5d2786d2951e43026c9d (patch)
treeca9acaf821110f4d249dd4a250d7a9b740675261 /arch/mips/kernel
parentc2aeaaea175652af6610f97a0de6d7cd07311e18 (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.c37
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. */
25static union mips_vdso_data vdso_data __page_aligned_data; 27static union mips_vdso_data mips_vdso_data __page_aligned_data;
28struct 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}
67subsys_initcall(init_vdso); 70subsys_initcall(init_vdso);
68 71
69void 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
89void 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
97static unsigned long vdso_base(void) 72static 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;