1 /* 2 * Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp. 3 * <benh@kernel.crashing.org> 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License 7 * as published by the Free Software Foundation; either version 8 * 2 of the License, or (at your option) any later version. 9 */ 10 11 #include <linux/module.h> 12 #include <linux/errno.h> 13 #include <linux/sched.h> 14 #include <linux/kernel.h> 15 #include <linux/mm.h> 16 #include <linux/smp.h> 17 #include <linux/smp_lock.h> 18 #include <linux/stddef.h> 19 #include <linux/unistd.h> 20 #include <linux/slab.h> 21 #include <linux/user.h> 22 #include <linux/elf.h> 23 #include <linux/security.h> 24 #include <linux/bootmem.h> 25 26 #include <asm/pgtable.h> 27 #include <asm/system.h> 28 #include <asm/processor.h> 29 #include <asm/mmu.h> 30 #include <asm/mmu_context.h> 31 #include <asm/lmb.h> 32 #include <asm/machdep.h> 33 #include <asm/cputable.h> 34 #include <asm/sections.h> 35 #include <asm/firmware.h> 36 #include <asm/vdso.h> 37 #include <asm/vdso_datapage.h> 38 39 #include "setup.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 = (vma->vm_mm->task_size > TASK_SIZE_USER32) ? 186 vdso64_kbase : vdso32_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 int rc; 228 229 #ifdef CONFIG_PPC64 230 if (test_thread_flag(TIF_32BIT)) { 231 vdso_pages = vdso32_pages; 232 vdso_base = VDSO32_MBASE; 233 } else { 234 vdso_pages = vdso64_pages; 235 vdso_base = VDSO64_MBASE; 236 } 237 #else 238 vdso_pages = vdso32_pages; 239 vdso_base = VDSO32_MBASE; 240 #endif 241 242 current->mm->context.vdso_base = 0; 243 244 /* vDSO has a problem and was disabled, just don't "enable" it for the 245 * process 246 */ 247 if (vdso_pages == 0) 248 return 0; 249 /* Add a page to the vdso size for the data page */ 250 vdso_pages ++; 251 252 /* 253 * pick a base address for the vDSO in process space. We try to put it 254 * at vdso_base which is the "natural" base for it, but we might fail 255 * and end up putting it elsewhere. 256 */ 257 down_write(&mm->mmap_sem); 258 vdso_base = get_unmapped_area(NULL, vdso_base, 259 vdso_pages << PAGE_SHIFT, 0, 0); 260 if (IS_ERR_VALUE(vdso_base)) { 261 rc = vdso_base; 262 goto fail_mmapsem; 263 } 264 265 266 /* Allocate a VMA structure and fill it up */ 267 vma = kmem_cache_zalloc(vm_area_cachep, GFP_KERNEL); 268 if (vma == NULL) { 269 rc = -ENOMEM; 270 goto fail_mmapsem; 271 } 272 vma->vm_mm = mm; 273 vma->vm_start = 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 /* Insert new VMA */ 292 rc = insert_vm_struct(mm, vma); 293 if (rc) 294 goto fail_vma; 295 296 /* Put vDSO base into mm struct and account for memory usage */ 297 current->mm->context.vdso_base = vdso_base; 298 mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; 299 up_write(&mm->mmap_sem); 300 return 0; 301 302 fail_vma: 303 kmem_cache_free(vm_area_cachep, vma); 304 fail_mmapsem: 305 up_write(&mm->mmap_sem); 306 return rc; 307 } 308 309 const char *arch_vma_name(struct vm_area_struct *vma) 310 { 311 if (vma->vm_mm && vma->vm_start == vma->vm_mm->context.vdso_base) 312 return "[vdso]"; 313 return NULL; 314 } 315 316 317 318 static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname, 319 unsigned long *size) 320 { 321 Elf32_Shdr *sechdrs; 322 unsigned int i; 323 char *secnames; 324 325 /* Grab section headers and strings so we can tell who is who */ 326 sechdrs = (void *)ehdr + ehdr->e_shoff; 327 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 328 329 /* Find the section they want */ 330 for (i = 1; i < ehdr->e_shnum; i++) { 331 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 332 if (size) 333 *size = sechdrs[i].sh_size; 334 return (void *)ehdr + sechdrs[i].sh_offset; 335 } 336 } 337 *size = 0; 338 return NULL; 339 } 340 341 static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib, 342 const char *symname) 343 { 344 unsigned int i; 345 char name[MAX_SYMNAME], *c; 346 347 for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) { 348 if (lib->dynsym[i].st_name == 0) 349 continue; 350 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 351 MAX_SYMNAME); 352 c = strchr(name, '@'); 353 if (c) 354 *c = 0; 355 if (strcmp(symname, name) == 0) 356 return &lib->dynsym[i]; 357 } 358 return NULL; 359 } 360 361 /* Note that we assume the section is .text and the symbol is relative to 362 * the library base 363 */ 364 static unsigned long __init find_function32(struct lib32_elfinfo *lib, 365 const char *symname) 366 { 367 Elf32_Sym *sym = find_symbol32(lib, symname); 368 369 if (sym == NULL) { 370 printk(KERN_WARNING "vDSO32: function %s not found !\n", 371 symname); 372 return 0; 373 } 374 return sym->st_value - VDSO32_LBASE; 375 } 376 377 static int vdso_do_func_patch32(struct lib32_elfinfo *v32, 378 struct lib64_elfinfo *v64, 379 const char *orig, const char *fix) 380 { 381 Elf32_Sym *sym32_gen, *sym32_fix; 382 383 sym32_gen = find_symbol32(v32, orig); 384 if (sym32_gen == NULL) { 385 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig); 386 return -1; 387 } 388 if (fix == NULL) { 389 sym32_gen->st_name = 0; 390 return 0; 391 } 392 sym32_fix = find_symbol32(v32, fix); 393 if (sym32_fix == NULL) { 394 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix); 395 return -1; 396 } 397 sym32_gen->st_value = sym32_fix->st_value; 398 sym32_gen->st_size = sym32_fix->st_size; 399 sym32_gen->st_info = sym32_fix->st_info; 400 sym32_gen->st_other = sym32_fix->st_other; 401 sym32_gen->st_shndx = sym32_fix->st_shndx; 402 403 return 0; 404 } 405 406 407 #ifdef CONFIG_PPC64 408 409 static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname, 410 unsigned long *size) 411 { 412 Elf64_Shdr *sechdrs; 413 unsigned int i; 414 char *secnames; 415 416 /* Grab section headers and strings so we can tell who is who */ 417 sechdrs = (void *)ehdr + ehdr->e_shoff; 418 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 419 420 /* Find the section they want */ 421 for (i = 1; i < ehdr->e_shnum; i++) { 422 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 423 if (size) 424 *size = sechdrs[i].sh_size; 425 return (void *)ehdr + sechdrs[i].sh_offset; 426 } 427 } 428 if (size) 429 *size = 0; 430 return NULL; 431 } 432 433 static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib, 434 const char *symname) 435 { 436 unsigned int i; 437 char name[MAX_SYMNAME], *c; 438 439 for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) { 440 if (lib->dynsym[i].st_name == 0) 441 continue; 442 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 443 MAX_SYMNAME); 444 c = strchr(name, '@'); 445 if (c) 446 *c = 0; 447 if (strcmp(symname, name) == 0) 448 return &lib->dynsym[i]; 449 } 450 return NULL; 451 } 452 453 /* Note that we assume the section is .text and the symbol is relative to 454 * the library base 455 */ 456 static unsigned long __init find_function64(struct lib64_elfinfo *lib, 457 const char *symname) 458 { 459 Elf64_Sym *sym = find_symbol64(lib, symname); 460 461 if (sym == NULL) { 462 printk(KERN_WARNING "vDSO64: function %s not found !\n", 463 symname); 464 return 0; 465 } 466 #ifdef VDS64_HAS_DESCRIPTORS 467 return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) - 468 VDSO64_LBASE; 469 #else 470 return sym->st_value - VDSO64_LBASE; 471 #endif 472 } 473 474 static int vdso_do_func_patch64(struct lib32_elfinfo *v32, 475 struct lib64_elfinfo *v64, 476 const char *orig, const char *fix) 477 { 478 Elf64_Sym *sym64_gen, *sym64_fix; 479 480 sym64_gen = find_symbol64(v64, orig); 481 if (sym64_gen == NULL) { 482 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig); 483 return -1; 484 } 485 if (fix == NULL) { 486 sym64_gen->st_name = 0; 487 return 0; 488 } 489 sym64_fix = find_symbol64(v64, fix); 490 if (sym64_fix == NULL) { 491 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix); 492 return -1; 493 } 494 sym64_gen->st_value = sym64_fix->st_value; 495 sym64_gen->st_size = sym64_fix->st_size; 496 sym64_gen->st_info = sym64_fix->st_info; 497 sym64_gen->st_other = sym64_fix->st_other; 498 sym64_gen->st_shndx = sym64_fix->st_shndx; 499 500 return 0; 501 } 502 503 #endif /* CONFIG_PPC64 */ 504 505 506 static __init int vdso_do_find_sections(struct lib32_elfinfo *v32, 507 struct lib64_elfinfo *v64) 508 { 509 void *sect; 510 511 /* 512 * Locate symbol tables & text section 513 */ 514 515 v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize); 516 v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL); 517 if (v32->dynsym == NULL || v32->dynstr == NULL) { 518 printk(KERN_ERR "vDSO32: required symbol section not found\n"); 519 return -1; 520 } 521 sect = find_section32(v32->hdr, ".text", NULL); 522 if (sect == NULL) { 523 printk(KERN_ERR "vDSO32: the .text section was not found\n"); 524 return -1; 525 } 526 v32->text = sect - vdso32_kbase; 527 528 #ifdef CONFIG_PPC64 529 v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize); 530 v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL); 531 if (v64->dynsym == NULL || v64->dynstr == NULL) { 532 printk(KERN_ERR "vDSO64: required symbol section not found\n"); 533 return -1; 534 } 535 sect = find_section64(v64->hdr, ".text", NULL); 536 if (sect == NULL) { 537 printk(KERN_ERR "vDSO64: the .text section was not found\n"); 538 return -1; 539 } 540 v64->text = sect - vdso64_kbase; 541 #endif /* CONFIG_PPC64 */ 542 543 return 0; 544 } 545 546 static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32, 547 struct lib64_elfinfo *v64) 548 { 549 /* 550 * Find signal trampolines 551 */ 552 553 #ifdef CONFIG_PPC64 554 vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64"); 555 #endif 556 vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32"); 557 vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32"); 558 } 559 560 static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, 561 struct lib64_elfinfo *v64) 562 { 563 Elf32_Sym *sym32; 564 #ifdef CONFIG_PPC64 565 Elf64_Sym *sym64; 566 567 sym64 = find_symbol64(v64, "__kernel_datapage_offset"); 568 if (sym64 == NULL) { 569 printk(KERN_ERR "vDSO64: Can't find symbol " 570 "__kernel_datapage_offset !\n"); 571 return -1; 572 } 573 *((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) = 574 (vdso64_pages << PAGE_SHIFT) - 575 (sym64->st_value - VDSO64_LBASE); 576 #endif /* CONFIG_PPC64 */ 577 578 sym32 = find_symbol32(v32, "__kernel_datapage_offset"); 579 if (sym32 == NULL) { 580 printk(KERN_ERR "vDSO32: Can't find symbol " 581 "__kernel_datapage_offset !\n"); 582 return -1; 583 } 584 *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) = 585 (vdso32_pages << PAGE_SHIFT) - 586 (sym32->st_value - VDSO32_LBASE); 587 588 return 0; 589 } 590 591 592 static __init int vdso_fixup_features(struct lib32_elfinfo *v32, 593 struct lib64_elfinfo *v64) 594 { 595 void *start32; 596 unsigned long size32; 597 598 #ifdef CONFIG_PPC64 599 void *start64; 600 unsigned long size64; 601 602 start64 = find_section64(v64->hdr, "__ftr_fixup", &size64); 603 if (start64) 604 do_feature_fixups(cur_cpu_spec->cpu_features, 605 start64, start64 + size64); 606 607 start64 = find_section64(v64->hdr, "__fw_ftr_fixup", &size64); 608 if (start64) 609 do_feature_fixups(powerpc_firmware_features, 610 start64, start64 + size64); 611 #endif /* CONFIG_PPC64 */ 612 613 start32 = find_section32(v32->hdr, "__ftr_fixup", &size32); 614 if (start32) 615 do_feature_fixups(cur_cpu_spec->cpu_features, 616 start32, start32 + size32); 617 618 #ifdef CONFIG_PPC64 619 start32 = find_section32(v32->hdr, "__fw_ftr_fixup", &size32); 620 if (start32) 621 do_feature_fixups(powerpc_firmware_features, 622 start32, start32 + size32); 623 #endif /* CONFIG_PPC64 */ 624 625 return 0; 626 } 627 628 static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, 629 struct lib64_elfinfo *v64) 630 { 631 int i; 632 633 for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) { 634 struct vdso_patch_def *patch = &vdso_patches[i]; 635 int match = (cur_cpu_spec->cpu_features & patch->ftr_mask) 636 == patch->ftr_value; 637 if (!match) 638 continue; 639 640 DBG("replacing %s with %s...\n", patch->gen_name, 641 patch->fix_name ? "NONE" : patch->fix_name); 642 643 /* 644 * Patch the 32 bits and 64 bits symbols. Note that we do not 645 * patch the "." symbol on 64 bits. 646 * It would be easy to do, but doesn't seem to be necessary, 647 * patching the OPD symbol is enough. 648 */ 649 vdso_do_func_patch32(v32, v64, patch->gen_name, 650 patch->fix_name); 651 #ifdef CONFIG_PPC64 652 vdso_do_func_patch64(v32, v64, patch->gen_name, 653 patch->fix_name); 654 #endif /* CONFIG_PPC64 */ 655 } 656 657 return 0; 658 } 659 660 661 static __init int vdso_setup(void) 662 { 663 struct lib32_elfinfo v32; 664 struct lib64_elfinfo v64; 665 666 v32.hdr = vdso32_kbase; 667 #ifdef CONFIG_PPC64 668 v64.hdr = vdso64_kbase; 669 #endif 670 if (vdso_do_find_sections(&v32, &v64)) 671 return -1; 672 673 if (vdso_fixup_datapage(&v32, &v64)) 674 return -1; 675 676 if (vdso_fixup_features(&v32, &v64)) 677 return -1; 678 679 if (vdso_fixup_alt_funcs(&v32, &v64)) 680 return -1; 681 682 vdso_setup_trampolines(&v32, &v64); 683 684 return 0; 685 } 686 687 /* 688 * Called from setup_arch to initialize the bitmap of available 689 * syscalls in the systemcfg page 690 */ 691 static void __init vdso_setup_syscall_map(void) 692 { 693 unsigned int i; 694 extern unsigned long *sys_call_table; 695 extern unsigned long sys_ni_syscall; 696 697 698 for (i = 0; i < __NR_syscalls; i++) { 699 #ifdef CONFIG_PPC64 700 if (sys_call_table[i*2] != sys_ni_syscall) 701 vdso_data->syscall_map_64[i >> 5] |= 702 0x80000000UL >> (i & 0x1f); 703 if (sys_call_table[i*2+1] != sys_ni_syscall) 704 vdso_data->syscall_map_32[i >> 5] |= 705 0x80000000UL >> (i & 0x1f); 706 #else /* CONFIG_PPC64 */ 707 if (sys_call_table[i] != sys_ni_syscall) 708 vdso_data->syscall_map_32[i >> 5] |= 709 0x80000000UL >> (i & 0x1f); 710 #endif /* CONFIG_PPC64 */ 711 } 712 } 713 714 715 void __init vdso_init(void) 716 { 717 int i; 718 719 #ifdef CONFIG_PPC64 720 /* 721 * Fill up the "systemcfg" stuff for backward compatiblity 722 */ 723 strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64"); 724 vdso_data->version.major = SYSTEMCFG_MAJOR; 725 vdso_data->version.minor = SYSTEMCFG_MINOR; 726 vdso_data->processor = mfspr(SPRN_PVR); 727 /* 728 * Fake the old platform number for pSeries and iSeries and add 729 * in LPAR bit if necessary 730 */ 731 vdso_data->platform = machine_is(iseries) ? 0x200 : 0x100; 732 if (firmware_has_feature(FW_FEATURE_LPAR)) 733 vdso_data->platform |= 1; 734 vdso_data->physicalMemorySize = lmb_phys_mem_size(); 735 vdso_data->dcache_size = ppc64_caches.dsize; 736 vdso_data->dcache_line_size = ppc64_caches.dline_size; 737 vdso_data->icache_size = ppc64_caches.isize; 738 vdso_data->icache_line_size = ppc64_caches.iline_size; 739 740 /* 741 * Calculate the size of the 64 bits vDSO 742 */ 743 vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT; 744 DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages); 745 #endif /* CONFIG_PPC64 */ 746 747 748 /* 749 * Calculate the size of the 32 bits vDSO 750 */ 751 vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT; 752 DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages); 753 754 755 /* 756 * Setup the syscall map in the vDOS 757 */ 758 vdso_setup_syscall_map(); 759 760 /* 761 * Initialize the vDSO images in memory, that is do necessary 762 * fixups of vDSO symbols, locate trampolines, etc... 763 */ 764 if (vdso_setup()) { 765 printk(KERN_ERR "vDSO setup failure, not enabled !\n"); 766 vdso32_pages = 0; 767 #ifdef CONFIG_PPC64 768 vdso64_pages = 0; 769 #endif 770 return; 771 } 772 773 /* Make sure pages are in the correct state */ 774 for (i = 0; i < vdso32_pages; i++) { 775 struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE); 776 ClearPageReserved(pg); 777 get_page(pg); 778 779 } 780 #ifdef CONFIG_PPC64 781 for (i = 0; i < vdso64_pages; i++) { 782 struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE); 783 ClearPageReserved(pg); 784 get_page(pg); 785 } 786 #endif /* CONFIG_PPC64 */ 787 788 get_page(virt_to_page(vdso_data)); 789 } 790 791 int in_gate_area_no_task(unsigned long addr) 792 { 793 return 0; 794 } 795 796 int in_gate_area(struct task_struct *task, unsigned long addr) 797 { 798 return 0; 799 } 800 801 struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 802 { 803 return NULL; 804 } 805 806