.. | .. |
---|
43 | 43 | VVAR_NR_PAGES, |
---|
44 | 44 | }; |
---|
45 | 45 | |
---|
| 46 | +#define VPRIV_NR_PAGES __VPRIV_PAGES |
---|
| 47 | + |
---|
46 | 48 | struct vdso_abi_info { |
---|
47 | 49 | const char *name; |
---|
48 | 50 | const char *vdso_code_start; |
---|
.. | .. |
---|
123 | 125 | vdso_pagelist[i] = pfn_to_page(pfn + i); |
---|
124 | 126 | |
---|
125 | 127 | 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 |
---|
126 | 131 | |
---|
127 | 132 | return 0; |
---|
128 | 133 | } |
---|
.. | .. |
---|
243 | 248 | |
---|
244 | 249 | vdso_text_len = vdso_info[abi].vdso_pages << PAGE_SHIFT; |
---|
245 | 250 | /* 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; |
---|
247 | 253 | |
---|
248 | 254 | vdso_base = get_unmapped_area(NULL, 0, vdso_mapping_len, 0, 0); |
---|
249 | 255 | if (IS_ERR_VALUE(vdso_base)) { |
---|
.. | .. |
---|
251 | 257 | goto up_fail; |
---|
252 | 258 | } |
---|
253 | 259 | |
---|
| 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. */ |
---|
254 | 280 | ret = _install_special_mapping(mm, vdso_base, VVAR_NR_PAGES * PAGE_SIZE, |
---|
255 | 281 | VM_READ|VM_MAYREAD|VM_PFNMAP, |
---|
256 | 282 | vdso_info[abi].dm); |
---|