1 /* 2 * linux/arch/ppc64/kernel/vdso.c 3 * 4 * Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp. 5 * <benh@kernel.crashing.org> 6 * 7 * This program is free software; you can redistribute it and/or 8 * modify it under the terms of the GNU General Public License 9 * as published by the Free Software Foundation; either version 10 * 2 of the License, or (at your option) any later version. 11 */ 12 13 #include <linux/config.h> 14 #include <linux/module.h> 15 #include <linux/errno.h> 16 #include <linux/sched.h> 17 #include <linux/kernel.h> 18 #include <linux/mm.h> 19 #include <linux/smp.h> 20 #include <linux/smp_lock.h> 21 #include <linux/stddef.h> 22 #include <linux/unistd.h> 23 #include <linux/slab.h> 24 #include <linux/user.h> 25 #include <linux/elf.h> 26 #include <linux/security.h> 27 #include <linux/bootmem.h> 28 29 #include <asm/pgtable.h> 30 #include <asm/system.h> 31 #include <asm/processor.h> 32 #include <asm/mmu.h> 33 #include <asm/mmu_context.h> 34 #include <asm/lmb.h> 35 #include <asm/machdep.h> 36 #include <asm/cputable.h> 37 #include <asm/sections.h> 38 #include <asm/vdso.h> 39 #include <asm/vdso_datapage.h> 40 41 #undef DEBUG 42 43 #ifdef DEBUG 44 #define DBG(fmt...) printk(fmt) 45 #else 46 #define DBG(fmt...) 47 #endif 48 49 /* Max supported size for symbol names */ 50 #define MAX_SYMNAME 64 51 52 extern char vdso32_start, vdso32_end; 53 static void *vdso32_kbase = &vdso32_start; 54 unsigned int vdso32_pages; 55 unsigned long vdso32_sigtramp; 56 unsigned long vdso32_rt_sigtramp; 57 58 #ifdef CONFIG_PPC64 59 extern char vdso64_start, vdso64_end; 60 static void *vdso64_kbase = &vdso64_start; 61 unsigned int vdso64_pages; 62 unsigned long vdso64_rt_sigtramp; 63 #endif /* CONFIG_PPC64 */ 64 65 /* 66 * The vdso data page (aka. systemcfg for old ppc64 fans) is here. 67 * Once the early boot kernel code no longer needs to muck around 68 * with it, it will become dynamically allocated 69 */ 70 static union { 71 struct vdso_data data; 72 u8 page[PAGE_SIZE]; 73 } vdso_data_store __attribute__((__section__(".data.page_aligned"))); 74 struct vdso_data *vdso_data = &vdso_data_store.data; 75 76 /* Format of the patch table */ 77 struct vdso_patch_def 78 { 79 unsigned long ftr_mask, ftr_value; 80 const char *gen_name; 81 const char *fix_name; 82 }; 83 84 /* Table of functions to patch based on the CPU type/revision 85 * 86 * Currently, we only change sync_dicache to do nothing on processors 87 * with a coherent icache 88 */ 89 static struct vdso_patch_def vdso_patches[] = { 90 { 91 CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE, 92 "__kernel_sync_dicache", "__kernel_sync_dicache_p5" 93 }, 94 { 95 CPU_FTR_USE_TB, 0, 96 "__kernel_gettimeofday", NULL 97 }, 98 }; 99 100 /* 101 * Some infos carried around for each of them during parsing at 102 * boot time. 103 */ 104 struct lib32_elfinfo 105 { 106 Elf32_Ehdr *hdr; /* ptr to ELF */ 107 Elf32_Sym *dynsym; /* ptr to .dynsym section */ 108 unsigned long dynsymsize; /* size of .dynsym section */ 109 char *dynstr; /* ptr to .dynstr section */ 110 unsigned long text; /* offset of .text section in .so */ 111 }; 112 113 struct lib64_elfinfo 114 { 115 Elf64_Ehdr *hdr; 116 Elf64_Sym *dynsym; 117 unsigned long dynsymsize; 118 char *dynstr; 119 unsigned long text; 120 }; 121 122 123 #ifdef __DEBUG 124 static void dump_one_vdso_page(struct page *pg, struct page *upg) 125 { 126 printk("kpg: %p (c:%d,f:%08lx)", __va(page_to_pfn(pg) << PAGE_SHIFT), 127 page_count(pg), 128 pg->flags); 129 if (upg/* && pg != upg*/) { 130 printk(" upg: %p (c:%d,f:%08lx)", __va(page_to_pfn(upg) 131 << PAGE_SHIFT), 132 page_count(upg), 133 upg->flags); 134 } 135 printk("\n"); 136 } 137 138 static void dump_vdso_pages(struct vm_area_struct * vma) 139 { 140 int i; 141 142 if (!vma || test_thread_flag(TIF_32BIT)) { 143 printk("vDSO32 @ %016lx:\n", (unsigned long)vdso32_kbase); 144 for (i=0; i<vdso32_pages; i++) { 145 struct page *pg = virt_to_page(vdso32_kbase + 146 i*PAGE_SIZE); 147 struct page *upg = (vma && vma->vm_mm) ? 148 follow_page(vma, vma->vm_start + i*PAGE_SIZE, 0) 149 : NULL; 150 dump_one_vdso_page(pg, upg); 151 } 152 } 153 if (!vma || !test_thread_flag(TIF_32BIT)) { 154 printk("vDSO64 @ %016lx:\n", (unsigned long)vdso64_kbase); 155 for (i=0; i<vdso64_pages; i++) { 156 struct page *pg = virt_to_page(vdso64_kbase + 157 i*PAGE_SIZE); 158 struct page *upg = (vma && vma->vm_mm) ? 159 follow_page(vma, vma->vm_start + i*PAGE_SIZE, 0) 160 : NULL; 161 dump_one_vdso_page(pg, upg); 162 } 163 } 164 } 165 #endif /* DEBUG */ 166 167 /* 168 * Keep a dummy vma_close for now, it will prevent VMA merging. 169 */ 170 static void vdso_vma_close(struct vm_area_struct * vma) 171 { 172 } 173 174 /* 175 * Our nopage() function, maps in the actual vDSO kernel pages, they will 176 * be mapped read-only by do_no_page(), and eventually COW'ed, either 177 * right away for an initial write access, or by do_wp_page(). 178 */ 179 static struct page * vdso_vma_nopage(struct vm_area_struct * vma, 180 unsigned long address, int *type) 181 { 182 unsigned long offset = address - vma->vm_start; 183 struct page *pg; 184 #ifdef CONFIG_PPC64 185 void *vbase = test_thread_flag(TIF_32BIT) ? 186 vdso32_kbase : vdso64_kbase; 187 #else 188 void *vbase = vdso32_kbase; 189 #endif 190 191 DBG("vdso_vma_nopage(current: %s, address: %016lx, off: %lx)\n", 192 current->comm, address, offset); 193 194 if (address < vma->vm_start || address > vma->vm_end) 195 return NOPAGE_SIGBUS; 196 197 /* 198 * Last page is systemcfg. 199 */ 200 if ((vma->vm_end - address) <= PAGE_SIZE) 201 pg = virt_to_page(vdso_data); 202 else 203 pg = virt_to_page(vbase + offset); 204 205 get_page(pg); 206 DBG(" ->page count: %d\n", page_count(pg)); 207 208 return pg; 209 } 210 211 static struct vm_operations_struct vdso_vmops = { 212 .close = vdso_vma_close, 213 .nopage = vdso_vma_nopage, 214 }; 215 216 /* 217 * This is called from binfmt_elf, we create the special vma for the 218 * vDSO and insert it into the mm struct tree 219 */ 220 int arch_setup_additional_pages(struct linux_binprm *bprm, 221 int executable_stack) 222 { 223 struct mm_struct *mm = current->mm; 224 struct vm_area_struct *vma; 225 unsigned long vdso_pages; 226 unsigned long vdso_base; 227 228 #ifdef CONFIG_PPC64 229 if (test_thread_flag(TIF_32BIT)) { 230 vdso_pages = vdso32_pages; 231 vdso_base = VDSO32_MBASE; 232 } else { 233 vdso_pages = vdso64_pages; 234 vdso_base = VDSO64_MBASE; 235 } 236 #else 237 vdso_pages = vdso32_pages; 238 vdso_base = VDSO32_MBASE; 239 #endif 240 241 current->thread.vdso_base = 0; 242 243 /* vDSO has a problem and was disabled, just don't "enable" it for the 244 * process 245 */ 246 if (vdso_pages == 0) 247 return 0; 248 249 vma = kmem_cache_alloc(vm_area_cachep, SLAB_KERNEL); 250 if (vma == NULL) 251 return -ENOMEM; 252 253 memset(vma, 0, sizeof(*vma)); 254 255 /* Add a page to the vdso size for the data page */ 256 vdso_pages ++; 257 258 /* 259 * pick a base address for the vDSO in process space. We try to put it 260 * at vdso_base which is the "natural" base for it, but we might fail 261 * and end up putting it elsewhere. 262 */ 263 vdso_base = get_unmapped_area(NULL, vdso_base, 264 vdso_pages << PAGE_SHIFT, 0, 0); 265 if (vdso_base & ~PAGE_MASK) { 266 kmem_cache_free(vm_area_cachep, vma); 267 return (int)vdso_base; 268 } 269 270 current->thread.vdso_base = vdso_base; 271 272 vma->vm_mm = mm; 273 vma->vm_start = current->thread.vdso_base; 274 vma->vm_end = vma->vm_start + (vdso_pages << PAGE_SHIFT); 275 276 /* 277 * our vma flags don't have VM_WRITE so by default, the process isn't 278 * allowed to write those pages. 279 * gdb can break that with ptrace interface, and thus trigger COW on 280 * those pages but it's then your responsibility to never do that on 281 * the "data" page of the vDSO or you'll stop getting kernel updates 282 * and your nice userland gettimeofday will be totally dead. 283 * It's fine to use that for setting breakpoints in the vDSO code 284 * pages though 285 */ 286 vma->vm_flags = VM_READ | VM_EXEC | VM_MAYREAD | VM_MAYWRITE | VM_MAYEXEC; 287 vma->vm_flags |= mm->def_flags; 288 vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; 289 vma->vm_ops = &vdso_vmops; 290 291 down_write(&mm->mmap_sem); 292 if (insert_vm_struct(mm, vma)) { 293 up_write(&mm->mmap_sem); 294 kmem_cache_free(vm_area_cachep, vma); 295 return -ENOMEM; 296 } 297 mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; 298 up_write(&mm->mmap_sem); 299 300 return 0; 301 } 302 303 static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname, 304 unsigned long *size) 305 { 306 Elf32_Shdr *sechdrs; 307 unsigned int i; 308 char *secnames; 309 310 /* Grab section headers and strings so we can tell who is who */ 311 sechdrs = (void *)ehdr + ehdr->e_shoff; 312 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 313 314 /* Find the section they want */ 315 for (i = 1; i < ehdr->e_shnum; i++) { 316 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 317 if (size) 318 *size = sechdrs[i].sh_size; 319 return (void *)ehdr + sechdrs[i].sh_offset; 320 } 321 } 322 *size = 0; 323 return NULL; 324 } 325 326 static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib, 327 const char *symname) 328 { 329 unsigned int i; 330 char name[MAX_SYMNAME], *c; 331 332 for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) { 333 if (lib->dynsym[i].st_name == 0) 334 continue; 335 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 336 MAX_SYMNAME); 337 c = strchr(name, '@'); 338 if (c) 339 *c = 0; 340 if (strcmp(symname, name) == 0) 341 return &lib->dynsym[i]; 342 } 343 return NULL; 344 } 345 346 /* Note that we assume the section is .text and the symbol is relative to 347 * the library base 348 */ 349 static unsigned long __init find_function32(struct lib32_elfinfo *lib, 350 const char *symname) 351 { 352 Elf32_Sym *sym = find_symbol32(lib, symname); 353 354 if (sym == NULL) { 355 printk(KERN_WARNING "vDSO32: function %s not found !\n", 356 symname); 357 return 0; 358 } 359 return sym->st_value - VDSO32_LBASE; 360 } 361 362 static int vdso_do_func_patch32(struct lib32_elfinfo *v32, 363 struct lib64_elfinfo *v64, 364 const char *orig, const char *fix) 365 { 366 Elf32_Sym *sym32_gen, *sym32_fix; 367 368 sym32_gen = find_symbol32(v32, orig); 369 if (sym32_gen == NULL) { 370 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig); 371 return -1; 372 } 373 if (fix == NULL) { 374 sym32_gen->st_name = 0; 375 return 0; 376 } 377 sym32_fix = find_symbol32(v32, fix); 378 if (sym32_fix == NULL) { 379 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix); 380 return -1; 381 } 382 sym32_gen->st_value = sym32_fix->st_value; 383 sym32_gen->st_size = sym32_fix->st_size; 384 sym32_gen->st_info = sym32_fix->st_info; 385 sym32_gen->st_other = sym32_fix->st_other; 386 sym32_gen->st_shndx = sym32_fix->st_shndx; 387 388 return 0; 389 } 390 391 392 #ifdef CONFIG_PPC64 393 394 static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname, 395 unsigned long *size) 396 { 397 Elf64_Shdr *sechdrs; 398 unsigned int i; 399 char *secnames; 400 401 /* Grab section headers and strings so we can tell who is who */ 402 sechdrs = (void *)ehdr + ehdr->e_shoff; 403 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 404 405 /* Find the section they want */ 406 for (i = 1; i < ehdr->e_shnum; i++) { 407 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 408 if (size) 409 *size = sechdrs[i].sh_size; 410 return (void *)ehdr + sechdrs[i].sh_offset; 411 } 412 } 413 if (size) 414 *size = 0; 415 return NULL; 416 } 417 418 static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib, 419 const char *symname) 420 { 421 unsigned int i; 422 char name[MAX_SYMNAME], *c; 423 424 for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) { 425 if (lib->dynsym[i].st_name == 0) 426 continue; 427 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 428 MAX_SYMNAME); 429 c = strchr(name, '@'); 430 if (c) 431 *c = 0; 432 if (strcmp(symname, name) == 0) 433 return &lib->dynsym[i]; 434 } 435 return NULL; 436 } 437 438 /* Note that we assume the section is .text and the symbol is relative to 439 * the library base 440 */ 441 static unsigned long __init find_function64(struct lib64_elfinfo *lib, 442 const char *symname) 443 { 444 Elf64_Sym *sym = find_symbol64(lib, symname); 445 446 if (sym == NULL) { 447 printk(KERN_WARNING "vDSO64: function %s not found !\n", 448 symname); 449 return 0; 450 } 451 #ifdef VDS64_HAS_DESCRIPTORS 452 return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) - 453 VDSO64_LBASE; 454 #else 455 return sym->st_value - VDSO64_LBASE; 456 #endif 457 } 458 459 static int vdso_do_func_patch64(struct lib32_elfinfo *v32, 460 struct lib64_elfinfo *v64, 461 const char *orig, const char *fix) 462 { 463 Elf64_Sym *sym64_gen, *sym64_fix; 464 465 sym64_gen = find_symbol64(v64, orig); 466 if (sym64_gen == NULL) { 467 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig); 468 return -1; 469 } 470 if (fix == NULL) { 471 sym64_gen->st_name = 0; 472 return 0; 473 } 474 sym64_fix = find_symbol64(v64, fix); 475 if (sym64_fix == NULL) { 476 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix); 477 return -1; 478 } 479 sym64_gen->st_value = sym64_fix->st_value; 480 sym64_gen->st_size = sym64_fix->st_size; 481 sym64_gen->st_info = sym64_fix->st_info; 482 sym64_gen->st_other = sym64_fix->st_other; 483 sym64_gen->st_shndx = sym64_fix->st_shndx; 484 485 return 0; 486 } 487 488 #endif /* CONFIG_PPC64 */ 489 490 491 static __init int vdso_do_find_sections(struct lib32_elfinfo *v32, 492 struct lib64_elfinfo *v64) 493 { 494 void *sect; 495 496 /* 497 * Locate symbol tables & text section 498 */ 499 500 v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize); 501 v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL); 502 if (v32->dynsym == NULL || v32->dynstr == NULL) { 503 printk(KERN_ERR "vDSO32: required symbol section not found\n"); 504 return -1; 505 } 506 sect = find_section32(v32->hdr, ".text", NULL); 507 if (sect == NULL) { 508 printk(KERN_ERR "vDSO32: the .text section was not found\n"); 509 return -1; 510 } 511 v32->text = sect - vdso32_kbase; 512 513 #ifdef CONFIG_PPC64 514 v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize); 515 v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL); 516 if (v64->dynsym == NULL || v64->dynstr == NULL) { 517 printk(KERN_ERR "vDSO64: required symbol section not found\n"); 518 return -1; 519 } 520 sect = find_section64(v64->hdr, ".text", NULL); 521 if (sect == NULL) { 522 printk(KERN_ERR "vDSO64: the .text section was not found\n"); 523 return -1; 524 } 525 v64->text = sect - vdso64_kbase; 526 #endif /* CONFIG_PPC64 */ 527 528 return 0; 529 } 530 531 static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32, 532 struct lib64_elfinfo *v64) 533 { 534 /* 535 * Find signal trampolines 536 */ 537 538 #ifdef CONFIG_PPC64 539 vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64"); 540 #endif 541 vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32"); 542 vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32"); 543 } 544 545 static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, 546 struct lib64_elfinfo *v64) 547 { 548 Elf32_Sym *sym32; 549 #ifdef CONFIG_PPC64 550 Elf64_Sym *sym64; 551 552 sym64 = find_symbol64(v64, "__kernel_datapage_offset"); 553 if (sym64 == NULL) { 554 printk(KERN_ERR "vDSO64: Can't find symbol " 555 "__kernel_datapage_offset !\n"); 556 return -1; 557 } 558 *((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) = 559 (vdso64_pages << PAGE_SHIFT) - 560 (sym64->st_value - VDSO64_LBASE); 561 #endif /* CONFIG_PPC64 */ 562 563 sym32 = find_symbol32(v32, "__kernel_datapage_offset"); 564 if (sym32 == NULL) { 565 printk(KERN_ERR "vDSO32: Can't find symbol " 566 "__kernel_datapage_offset !\n"); 567 return -1; 568 } 569 *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) = 570 (vdso32_pages << PAGE_SHIFT) - 571 (sym32->st_value - VDSO32_LBASE); 572 573 return 0; 574 } 575 576 static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, 577 struct lib64_elfinfo *v64) 578 { 579 int i; 580 581 for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) { 582 struct vdso_patch_def *patch = &vdso_patches[i]; 583 int match = (cur_cpu_spec->cpu_features & patch->ftr_mask) 584 == patch->ftr_value; 585 if (!match) 586 continue; 587 588 DBG("replacing %s with %s...\n", patch->gen_name, 589 patch->fix_name ? "NONE" : patch->fix_name); 590 591 /* 592 * Patch the 32 bits and 64 bits symbols. Note that we do not 593 * patch the "." symbol on 64 bits. 594 * It would be easy to do, but doesn't seem to be necessary, 595 * patching the OPD symbol is enough. 596 */ 597 vdso_do_func_patch32(v32, v64, patch->gen_name, 598 patch->fix_name); 599 #ifdef CONFIG_PPC64 600 vdso_do_func_patch64(v32, v64, patch->gen_name, 601 patch->fix_name); 602 #endif /* CONFIG_PPC64 */ 603 } 604 605 return 0; 606 } 607 608 609 static __init int vdso_setup(void) 610 { 611 struct lib32_elfinfo v32; 612 struct lib64_elfinfo v64; 613 614 v32.hdr = vdso32_kbase; 615 #ifdef CONFIG_PPC64 616 v64.hdr = vdso64_kbase; 617 #endif 618 if (vdso_do_find_sections(&v32, &v64)) 619 return -1; 620 621 if (vdso_fixup_datapage(&v32, &v64)) 622 return -1; 623 624 if (vdso_fixup_alt_funcs(&v32, &v64)) 625 return -1; 626 627 vdso_setup_trampolines(&v32, &v64); 628 629 return 0; 630 } 631 632 /* 633 * Called from setup_arch to initialize the bitmap of available 634 * syscalls in the systemcfg page 635 */ 636 static void __init vdso_setup_syscall_map(void) 637 { 638 unsigned int i; 639 extern unsigned long *sys_call_table; 640 extern unsigned long sys_ni_syscall; 641 642 643 for (i = 0; i < __NR_syscalls; i++) { 644 #ifdef CONFIG_PPC64 645 if (sys_call_table[i*2] != sys_ni_syscall) 646 vdso_data->syscall_map_64[i >> 5] |= 647 0x80000000UL >> (i & 0x1f); 648 if (sys_call_table[i*2+1] != sys_ni_syscall) 649 vdso_data->syscall_map_32[i >> 5] |= 650 0x80000000UL >> (i & 0x1f); 651 #else /* CONFIG_PPC64 */ 652 if (sys_call_table[i] != sys_ni_syscall) 653 vdso_data->syscall_map_32[i >> 5] |= 654 0x80000000UL >> (i & 0x1f); 655 #endif /* CONFIG_PPC64 */ 656 } 657 } 658 659 660 void __init vdso_init(void) 661 { 662 int i; 663 664 #ifdef CONFIG_PPC64 665 /* 666 * Fill up the "systemcfg" stuff for backward compatiblity 667 */ 668 strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64"); 669 vdso_data->version.major = SYSTEMCFG_MAJOR; 670 vdso_data->version.minor = SYSTEMCFG_MINOR; 671 vdso_data->processor = mfspr(SPRN_PVR); 672 vdso_data->platform = _machine; 673 vdso_data->physicalMemorySize = lmb_phys_mem_size(); 674 vdso_data->dcache_size = ppc64_caches.dsize; 675 vdso_data->dcache_line_size = ppc64_caches.dline_size; 676 vdso_data->icache_size = ppc64_caches.isize; 677 vdso_data->icache_line_size = ppc64_caches.iline_size; 678 679 /* 680 * Calculate the size of the 64 bits vDSO 681 */ 682 vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT; 683 DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages); 684 #endif /* CONFIG_PPC64 */ 685 686 687 /* 688 * Calculate the size of the 32 bits vDSO 689 */ 690 vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT; 691 DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages); 692 693 694 /* 695 * Setup the syscall map in the vDOS 696 */ 697 vdso_setup_syscall_map(); 698 /* 699 * Initialize the vDSO images in memory, that is do necessary 700 * fixups of vDSO symbols, locate trampolines, etc... 701 */ 702 if (vdso_setup()) { 703 printk(KERN_ERR "vDSO setup failure, not enabled !\n"); 704 vdso32_pages = 0; 705 #ifdef CONFIG_PPC64 706 vdso64_pages = 0; 707 #endif 708 return; 709 } 710 711 /* Make sure pages are in the correct state */ 712 for (i = 0; i < vdso32_pages; i++) { 713 struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE); 714 ClearPageReserved(pg); 715 get_page(pg); 716 717 } 718 #ifdef CONFIG_PPC64 719 for (i = 0; i < vdso64_pages; i++) { 720 struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE); 721 ClearPageReserved(pg); 722 get_page(pg); 723 } 724 #endif /* CONFIG_PPC64 */ 725 726 get_page(virt_to_page(vdso_data)); 727 } 728 729 int in_gate_area_no_task(unsigned long addr) 730 { 731 return 0; 732 } 733 734 int in_gate_area(struct task_struct *task, unsigned long addr) 735 { 736 return 0; 737 } 738 739 struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 740 { 741 return NULL; 742 } 743 744