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 /* 288 * Make sure the vDSO gets into every core dump. 289 * Dumping its contents makes post-mortem fully interpretable later 290 * without matching up the same kernel and hardware config to see 291 * what PC values meant. 292 */ 293 vma->vm_flags |= VM_ALWAYSDUMP; 294 vma->vm_flags |= mm->def_flags; 295 vma->vm_page_prot = protection_map[vma->vm_flags & 0x7]; 296 vma->vm_ops = &vdso_vmops; 297 298 /* Insert new VMA */ 299 rc = insert_vm_struct(mm, vma); 300 if (rc) 301 goto fail_vma; 302 303 /* Put vDSO base into mm struct and account for memory usage */ 304 current->mm->context.vdso_base = vdso_base; 305 mm->total_vm += (vma->vm_end - vma->vm_start) >> PAGE_SHIFT; 306 up_write(&mm->mmap_sem); 307 return 0; 308 309 fail_vma: 310 kmem_cache_free(vm_area_cachep, vma); 311 fail_mmapsem: 312 up_write(&mm->mmap_sem); 313 return rc; 314 } 315 316 const char *arch_vma_name(struct vm_area_struct *vma) 317 { 318 if (vma->vm_mm && vma->vm_start == vma->vm_mm->context.vdso_base) 319 return "[vdso]"; 320 return NULL; 321 } 322 323 324 325 static void * __init find_section32(Elf32_Ehdr *ehdr, const char *secname, 326 unsigned long *size) 327 { 328 Elf32_Shdr *sechdrs; 329 unsigned int i; 330 char *secnames; 331 332 /* Grab section headers and strings so we can tell who is who */ 333 sechdrs = (void *)ehdr + ehdr->e_shoff; 334 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 335 336 /* Find the section they want */ 337 for (i = 1; i < ehdr->e_shnum; i++) { 338 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 339 if (size) 340 *size = sechdrs[i].sh_size; 341 return (void *)ehdr + sechdrs[i].sh_offset; 342 } 343 } 344 *size = 0; 345 return NULL; 346 } 347 348 static Elf32_Sym * __init find_symbol32(struct lib32_elfinfo *lib, 349 const char *symname) 350 { 351 unsigned int i; 352 char name[MAX_SYMNAME], *c; 353 354 for (i = 0; i < (lib->dynsymsize / sizeof(Elf32_Sym)); i++) { 355 if (lib->dynsym[i].st_name == 0) 356 continue; 357 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 358 MAX_SYMNAME); 359 c = strchr(name, '@'); 360 if (c) 361 *c = 0; 362 if (strcmp(symname, name) == 0) 363 return &lib->dynsym[i]; 364 } 365 return NULL; 366 } 367 368 /* Note that we assume the section is .text and the symbol is relative to 369 * the library base 370 */ 371 static unsigned long __init find_function32(struct lib32_elfinfo *lib, 372 const char *symname) 373 { 374 Elf32_Sym *sym = find_symbol32(lib, symname); 375 376 if (sym == NULL) { 377 printk(KERN_WARNING "vDSO32: function %s not found !\n", 378 symname); 379 return 0; 380 } 381 return sym->st_value - VDSO32_LBASE; 382 } 383 384 static int vdso_do_func_patch32(struct lib32_elfinfo *v32, 385 struct lib64_elfinfo *v64, 386 const char *orig, const char *fix) 387 { 388 Elf32_Sym *sym32_gen, *sym32_fix; 389 390 sym32_gen = find_symbol32(v32, orig); 391 if (sym32_gen == NULL) { 392 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", orig); 393 return -1; 394 } 395 if (fix == NULL) { 396 sym32_gen->st_name = 0; 397 return 0; 398 } 399 sym32_fix = find_symbol32(v32, fix); 400 if (sym32_fix == NULL) { 401 printk(KERN_ERR "vDSO32: Can't find symbol %s !\n", fix); 402 return -1; 403 } 404 sym32_gen->st_value = sym32_fix->st_value; 405 sym32_gen->st_size = sym32_fix->st_size; 406 sym32_gen->st_info = sym32_fix->st_info; 407 sym32_gen->st_other = sym32_fix->st_other; 408 sym32_gen->st_shndx = sym32_fix->st_shndx; 409 410 return 0; 411 } 412 413 414 #ifdef CONFIG_PPC64 415 416 static void * __init find_section64(Elf64_Ehdr *ehdr, const char *secname, 417 unsigned long *size) 418 { 419 Elf64_Shdr *sechdrs; 420 unsigned int i; 421 char *secnames; 422 423 /* Grab section headers and strings so we can tell who is who */ 424 sechdrs = (void *)ehdr + ehdr->e_shoff; 425 secnames = (void *)ehdr + sechdrs[ehdr->e_shstrndx].sh_offset; 426 427 /* Find the section they want */ 428 for (i = 1; i < ehdr->e_shnum; i++) { 429 if (strcmp(secnames+sechdrs[i].sh_name, secname) == 0) { 430 if (size) 431 *size = sechdrs[i].sh_size; 432 return (void *)ehdr + sechdrs[i].sh_offset; 433 } 434 } 435 if (size) 436 *size = 0; 437 return NULL; 438 } 439 440 static Elf64_Sym * __init find_symbol64(struct lib64_elfinfo *lib, 441 const char *symname) 442 { 443 unsigned int i; 444 char name[MAX_SYMNAME], *c; 445 446 for (i = 0; i < (lib->dynsymsize / sizeof(Elf64_Sym)); i++) { 447 if (lib->dynsym[i].st_name == 0) 448 continue; 449 strlcpy(name, lib->dynstr + lib->dynsym[i].st_name, 450 MAX_SYMNAME); 451 c = strchr(name, '@'); 452 if (c) 453 *c = 0; 454 if (strcmp(symname, name) == 0) 455 return &lib->dynsym[i]; 456 } 457 return NULL; 458 } 459 460 /* Note that we assume the section is .text and the symbol is relative to 461 * the library base 462 */ 463 static unsigned long __init find_function64(struct lib64_elfinfo *lib, 464 const char *symname) 465 { 466 Elf64_Sym *sym = find_symbol64(lib, symname); 467 468 if (sym == NULL) { 469 printk(KERN_WARNING "vDSO64: function %s not found !\n", 470 symname); 471 return 0; 472 } 473 #ifdef VDS64_HAS_DESCRIPTORS 474 return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) - 475 VDSO64_LBASE; 476 #else 477 return sym->st_value - VDSO64_LBASE; 478 #endif 479 } 480 481 static int vdso_do_func_patch64(struct lib32_elfinfo *v32, 482 struct lib64_elfinfo *v64, 483 const char *orig, const char *fix) 484 { 485 Elf64_Sym *sym64_gen, *sym64_fix; 486 487 sym64_gen = find_symbol64(v64, orig); 488 if (sym64_gen == NULL) { 489 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", orig); 490 return -1; 491 } 492 if (fix == NULL) { 493 sym64_gen->st_name = 0; 494 return 0; 495 } 496 sym64_fix = find_symbol64(v64, fix); 497 if (sym64_fix == NULL) { 498 printk(KERN_ERR "vDSO64: Can't find symbol %s !\n", fix); 499 return -1; 500 } 501 sym64_gen->st_value = sym64_fix->st_value; 502 sym64_gen->st_size = sym64_fix->st_size; 503 sym64_gen->st_info = sym64_fix->st_info; 504 sym64_gen->st_other = sym64_fix->st_other; 505 sym64_gen->st_shndx = sym64_fix->st_shndx; 506 507 return 0; 508 } 509 510 #endif /* CONFIG_PPC64 */ 511 512 513 static __init int vdso_do_find_sections(struct lib32_elfinfo *v32, 514 struct lib64_elfinfo *v64) 515 { 516 void *sect; 517 518 /* 519 * Locate symbol tables & text section 520 */ 521 522 v32->dynsym = find_section32(v32->hdr, ".dynsym", &v32->dynsymsize); 523 v32->dynstr = find_section32(v32->hdr, ".dynstr", NULL); 524 if (v32->dynsym == NULL || v32->dynstr == NULL) { 525 printk(KERN_ERR "vDSO32: required symbol section not found\n"); 526 return -1; 527 } 528 sect = find_section32(v32->hdr, ".text", NULL); 529 if (sect == NULL) { 530 printk(KERN_ERR "vDSO32: the .text section was not found\n"); 531 return -1; 532 } 533 v32->text = sect - vdso32_kbase; 534 535 #ifdef CONFIG_PPC64 536 v64->dynsym = find_section64(v64->hdr, ".dynsym", &v64->dynsymsize); 537 v64->dynstr = find_section64(v64->hdr, ".dynstr", NULL); 538 if (v64->dynsym == NULL || v64->dynstr == NULL) { 539 printk(KERN_ERR "vDSO64: required symbol section not found\n"); 540 return -1; 541 } 542 sect = find_section64(v64->hdr, ".text", NULL); 543 if (sect == NULL) { 544 printk(KERN_ERR "vDSO64: the .text section was not found\n"); 545 return -1; 546 } 547 v64->text = sect - vdso64_kbase; 548 #endif /* CONFIG_PPC64 */ 549 550 return 0; 551 } 552 553 static __init void vdso_setup_trampolines(struct lib32_elfinfo *v32, 554 struct lib64_elfinfo *v64) 555 { 556 /* 557 * Find signal trampolines 558 */ 559 560 #ifdef CONFIG_PPC64 561 vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64"); 562 #endif 563 vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32"); 564 vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32"); 565 } 566 567 static __init int vdso_fixup_datapage(struct lib32_elfinfo *v32, 568 struct lib64_elfinfo *v64) 569 { 570 Elf32_Sym *sym32; 571 #ifdef CONFIG_PPC64 572 Elf64_Sym *sym64; 573 574 sym64 = find_symbol64(v64, "__kernel_datapage_offset"); 575 if (sym64 == NULL) { 576 printk(KERN_ERR "vDSO64: Can't find symbol " 577 "__kernel_datapage_offset !\n"); 578 return -1; 579 } 580 *((int *)(vdso64_kbase + sym64->st_value - VDSO64_LBASE)) = 581 (vdso64_pages << PAGE_SHIFT) - 582 (sym64->st_value - VDSO64_LBASE); 583 #endif /* CONFIG_PPC64 */ 584 585 sym32 = find_symbol32(v32, "__kernel_datapage_offset"); 586 if (sym32 == NULL) { 587 printk(KERN_ERR "vDSO32: Can't find symbol " 588 "__kernel_datapage_offset !\n"); 589 return -1; 590 } 591 *((int *)(vdso32_kbase + (sym32->st_value - VDSO32_LBASE))) = 592 (vdso32_pages << PAGE_SHIFT) - 593 (sym32->st_value - VDSO32_LBASE); 594 595 return 0; 596 } 597 598 599 static __init int vdso_fixup_features(struct lib32_elfinfo *v32, 600 struct lib64_elfinfo *v64) 601 { 602 void *start32; 603 unsigned long size32; 604 605 #ifdef CONFIG_PPC64 606 void *start64; 607 unsigned long size64; 608 609 start64 = find_section64(v64->hdr, "__ftr_fixup", &size64); 610 if (start64) 611 do_feature_fixups(cur_cpu_spec->cpu_features, 612 start64, start64 + size64); 613 614 start64 = find_section64(v64->hdr, "__fw_ftr_fixup", &size64); 615 if (start64) 616 do_feature_fixups(powerpc_firmware_features, 617 start64, start64 + size64); 618 #endif /* CONFIG_PPC64 */ 619 620 start32 = find_section32(v32->hdr, "__ftr_fixup", &size32); 621 if (start32) 622 do_feature_fixups(cur_cpu_spec->cpu_features, 623 start32, start32 + size32); 624 625 #ifdef CONFIG_PPC64 626 start32 = find_section32(v32->hdr, "__fw_ftr_fixup", &size32); 627 if (start32) 628 do_feature_fixups(powerpc_firmware_features, 629 start32, start32 + size32); 630 #endif /* CONFIG_PPC64 */ 631 632 return 0; 633 } 634 635 static __init int vdso_fixup_alt_funcs(struct lib32_elfinfo *v32, 636 struct lib64_elfinfo *v64) 637 { 638 int i; 639 640 for (i = 0; i < ARRAY_SIZE(vdso_patches); i++) { 641 struct vdso_patch_def *patch = &vdso_patches[i]; 642 int match = (cur_cpu_spec->cpu_features & patch->ftr_mask) 643 == patch->ftr_value; 644 if (!match) 645 continue; 646 647 DBG("replacing %s with %s...\n", patch->gen_name, 648 patch->fix_name ? "NONE" : patch->fix_name); 649 650 /* 651 * Patch the 32 bits and 64 bits symbols. Note that we do not 652 * patch the "." symbol on 64 bits. 653 * It would be easy to do, but doesn't seem to be necessary, 654 * patching the OPD symbol is enough. 655 */ 656 vdso_do_func_patch32(v32, v64, patch->gen_name, 657 patch->fix_name); 658 #ifdef CONFIG_PPC64 659 vdso_do_func_patch64(v32, v64, patch->gen_name, 660 patch->fix_name); 661 #endif /* CONFIG_PPC64 */ 662 } 663 664 return 0; 665 } 666 667 668 static __init int vdso_setup(void) 669 { 670 struct lib32_elfinfo v32; 671 struct lib64_elfinfo v64; 672 673 v32.hdr = vdso32_kbase; 674 #ifdef CONFIG_PPC64 675 v64.hdr = vdso64_kbase; 676 #endif 677 if (vdso_do_find_sections(&v32, &v64)) 678 return -1; 679 680 if (vdso_fixup_datapage(&v32, &v64)) 681 return -1; 682 683 if (vdso_fixup_features(&v32, &v64)) 684 return -1; 685 686 if (vdso_fixup_alt_funcs(&v32, &v64)) 687 return -1; 688 689 vdso_setup_trampolines(&v32, &v64); 690 691 return 0; 692 } 693 694 /* 695 * Called from setup_arch to initialize the bitmap of available 696 * syscalls in the systemcfg page 697 */ 698 static void __init vdso_setup_syscall_map(void) 699 { 700 unsigned int i; 701 extern unsigned long *sys_call_table; 702 extern unsigned long sys_ni_syscall; 703 704 705 for (i = 0; i < __NR_syscalls; i++) { 706 #ifdef CONFIG_PPC64 707 if (sys_call_table[i*2] != sys_ni_syscall) 708 vdso_data->syscall_map_64[i >> 5] |= 709 0x80000000UL >> (i & 0x1f); 710 if (sys_call_table[i*2+1] != sys_ni_syscall) 711 vdso_data->syscall_map_32[i >> 5] |= 712 0x80000000UL >> (i & 0x1f); 713 #else /* CONFIG_PPC64 */ 714 if (sys_call_table[i] != sys_ni_syscall) 715 vdso_data->syscall_map_32[i >> 5] |= 716 0x80000000UL >> (i & 0x1f); 717 #endif /* CONFIG_PPC64 */ 718 } 719 } 720 721 722 void __init vdso_init(void) 723 { 724 int i; 725 726 #ifdef CONFIG_PPC64 727 /* 728 * Fill up the "systemcfg" stuff for backward compatiblity 729 */ 730 strcpy(vdso_data->eye_catcher, "SYSTEMCFG:PPC64"); 731 vdso_data->version.major = SYSTEMCFG_MAJOR; 732 vdso_data->version.minor = SYSTEMCFG_MINOR; 733 vdso_data->processor = mfspr(SPRN_PVR); 734 /* 735 * Fake the old platform number for pSeries and iSeries and add 736 * in LPAR bit if necessary 737 */ 738 vdso_data->platform = machine_is(iseries) ? 0x200 : 0x100; 739 if (firmware_has_feature(FW_FEATURE_LPAR)) 740 vdso_data->platform |= 1; 741 vdso_data->physicalMemorySize = lmb_phys_mem_size(); 742 vdso_data->dcache_size = ppc64_caches.dsize; 743 vdso_data->dcache_line_size = ppc64_caches.dline_size; 744 vdso_data->icache_size = ppc64_caches.isize; 745 vdso_data->icache_line_size = ppc64_caches.iline_size; 746 747 /* 748 * Calculate the size of the 64 bits vDSO 749 */ 750 vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT; 751 DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages); 752 #endif /* CONFIG_PPC64 */ 753 754 755 /* 756 * Calculate the size of the 32 bits vDSO 757 */ 758 vdso32_pages = (&vdso32_end - &vdso32_start) >> PAGE_SHIFT; 759 DBG("vdso32_kbase: %p, 0x%x pages\n", vdso32_kbase, vdso32_pages); 760 761 762 /* 763 * Setup the syscall map in the vDOS 764 */ 765 vdso_setup_syscall_map(); 766 767 /* 768 * Initialize the vDSO images in memory, that is do necessary 769 * fixups of vDSO symbols, locate trampolines, etc... 770 */ 771 if (vdso_setup()) { 772 printk(KERN_ERR "vDSO setup failure, not enabled !\n"); 773 vdso32_pages = 0; 774 #ifdef CONFIG_PPC64 775 vdso64_pages = 0; 776 #endif 777 return; 778 } 779 780 /* Make sure pages are in the correct state */ 781 for (i = 0; i < vdso32_pages; i++) { 782 struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE); 783 ClearPageReserved(pg); 784 get_page(pg); 785 786 } 787 #ifdef CONFIG_PPC64 788 for (i = 0; i < vdso64_pages; i++) { 789 struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE); 790 ClearPageReserved(pg); 791 get_page(pg); 792 } 793 #endif /* CONFIG_PPC64 */ 794 795 get_page(virt_to_page(vdso_data)); 796 } 797 798 int in_gate_area_no_task(unsigned long addr) 799 { 800 return 0; 801 } 802 803 int in_gate_area(struct task_struct *task, unsigned long addr) 804 { 805 return 0; 806 } 807 808 struct vm_area_struct *get_gate_vma(struct task_struct *tsk) 809 { 810 return NULL; 811 } 812 813