| .. | .. |
|---|
| 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); |
|---|