hc
2024-11-01 2f529f9b558ca1c1bd74be7437a84e4711743404
kernel/arch/arm64/kernel/vdso.c
....@@ -43,6 +43,8 @@
4343 VVAR_NR_PAGES,
4444 };
4545
46
+#define VPRIV_NR_PAGES __VPRIV_PAGES
47
+
4648 struct vdso_abi_info {
4749 const char *name;
4850 const char *vdso_code_start;
....@@ -123,6 +125,9 @@
123125 vdso_pagelist[i] = pfn_to_page(pfn + i);
124126
125127 vdso_info[abi].cm->pages = vdso_pagelist;
128
+#ifdef CONFIG_GENERIC_CLOCKSOURCE_VDSO
129
+ vdso_data->cs_type_seq = CLOCKSOURCE_VDSO_NONE << 16 | 1;
130
+#endif
126131
127132 return 0;
128133 }
....@@ -243,7 +248,8 @@
243248
244249 vdso_text_len = vdso_info[abi].vdso_pages << PAGE_SHIFT;
245250 /* Be sure to map the data page */
246
- vdso_mapping_len = vdso_text_len + VVAR_NR_PAGES * PAGE_SIZE;
251
+ vdso_mapping_len = vdso_text_len + VVAR_NR_PAGES * PAGE_SIZE
252
+ + VPRIV_NR_PAGES * PAGE_SIZE;
247253
248254 vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0);
249255 if (IS_ERR_VALUE(vdso_base)) {
....@@ -251,6 +257,26 @@
251257 goto up_fail;
252258 }
253259
260
+ /*
261
+ * Install the vDSO mappings we need:
262
+ *
263
+ * +----------------+
264
+ * | vpriv | PAGE_SIZE (private anon page if GENERIC_CLOCKSOURCE_VDSO)
265
+ * |----------------|
266
+ * | vvar | PAGE_SIZE (shared)
267
+ * |----------------|
268
+ * | text | text_pages * PAGE_SIZE (shared)
269
+ * | ... |
270
+ * +----------------+
271
+ */
272
+ if (VPRIV_NR_PAGES > 0 && mmap_region(NULL, vdso_base, PAGE_SIZE,
273
+ VM_READ | VM_WRITE | VM_MAYREAD | VM_MAYWRITE,
274
+ 0, NULL) != vdso_base) {
275
+ ret = ERR_PTR(-EINVAL);
276
+ goto up_fail;
277
+ }
278
+
279
+ vdso_base += VPRIV_NR_PAGES * PAGE_SIZE; /* Skip private area. */
254280 ret = _install_special_mapping(mm, vdso_base, VVAR_NR_PAGES * PAGE_SIZE,
255281 VM_READ|VM_MAYREAD|VM_PFNMAP,
256282 vdso_info[abi].dm);