| .. | .. |
|---|
| 1 | +// SPDX-License-Identifier: GPL-2.0-or-later |
|---|
| 1 | 2 | |
|---|
| 2 | 3 | /* |
|---|
| 3 | 4 | * Copyright (C) 2004 Benjamin Herrenschmidt, IBM Corp. |
|---|
| 4 | 5 | * <benh@kernel.crashing.org> |
|---|
| 5 | | - * |
|---|
| 6 | | - * This program is free software; you can redistribute it and/or |
|---|
| 7 | | - * modify it under the terms of the GNU General Public License |
|---|
| 8 | | - * as published by the Free Software Foundation; either version |
|---|
| 9 | | - * 2 of the License, or (at your option) any later version. |
|---|
| 10 | 6 | */ |
|---|
| 11 | 7 | |
|---|
| 12 | 8 | #include <linux/errno.h> |
|---|
| .. | .. |
|---|
| 22 | 18 | #include <linux/security.h> |
|---|
| 23 | 19 | #include <linux/memblock.h> |
|---|
| 24 | 20 | |
|---|
| 25 | | -#include <asm/pgtable.h> |
|---|
| 26 | 21 | #include <asm/processor.h> |
|---|
| 27 | 22 | #include <asm/mmu.h> |
|---|
| 28 | 23 | #include <asm/mmu_context.h> |
|---|
| .. | .. |
|---|
| 98 | 93 | CPU_FTR_COHERENT_ICACHE, CPU_FTR_COHERENT_ICACHE, |
|---|
| 99 | 94 | "__kernel_sync_dicache", "__kernel_sync_dicache_p5" |
|---|
| 100 | 95 | }, |
|---|
| 101 | | -#ifdef CONFIG_PPC32 |
|---|
| 102 | | - { |
|---|
| 103 | | - CPU_FTR_USE_RTC, CPU_FTR_USE_RTC, |
|---|
| 104 | | - "__kernel_gettimeofday", NULL |
|---|
| 105 | | - }, |
|---|
| 106 | | - { |
|---|
| 107 | | - CPU_FTR_USE_RTC, CPU_FTR_USE_RTC, |
|---|
| 108 | | - "__kernel_clock_gettime", NULL |
|---|
| 109 | | - }, |
|---|
| 110 | | - { |
|---|
| 111 | | - CPU_FTR_USE_RTC, CPU_FTR_USE_RTC, |
|---|
| 112 | | - "__kernel_clock_getres", NULL |
|---|
| 113 | | - }, |
|---|
| 114 | | - { |
|---|
| 115 | | - CPU_FTR_USE_RTC, CPU_FTR_USE_RTC, |
|---|
| 116 | | - "__kernel_get_tbfreq", NULL |
|---|
| 117 | | - }, |
|---|
| 118 | | - { |
|---|
| 119 | | - CPU_FTR_USE_RTC, CPU_FTR_USE_RTC, |
|---|
| 120 | | - "__kernel_time", NULL |
|---|
| 121 | | - }, |
|---|
| 122 | | -#endif |
|---|
| 123 | 96 | }; |
|---|
| 124 | 97 | |
|---|
| 125 | 98 | /* |
|---|
| .. | .. |
|---|
| 197 | 170 | * and end up putting it elsewhere. |
|---|
| 198 | 171 | * Add enough to the size so that the result can be aligned. |
|---|
| 199 | 172 | */ |
|---|
| 200 | | - if (down_write_killable(&mm->mmap_sem)) |
|---|
| 173 | + if (mmap_write_lock_killable(mm)) |
|---|
| 201 | 174 | return -EINTR; |
|---|
| 202 | 175 | vdso_base = get_unmapped_area(NULL, vdso_base, |
|---|
| 203 | 176 | (vdso_pages << PAGE_SHIFT) + |
|---|
| .. | .. |
|---|
| 237 | 210 | goto fail_mmapsem; |
|---|
| 238 | 211 | } |
|---|
| 239 | 212 | |
|---|
| 240 | | - up_write(&mm->mmap_sem); |
|---|
| 213 | + mmap_write_unlock(mm); |
|---|
| 241 | 214 | return 0; |
|---|
| 242 | 215 | |
|---|
| 243 | 216 | fail_mmapsem: |
|---|
| 244 | | - up_write(&mm->mmap_sem); |
|---|
| 217 | + mmap_write_unlock(mm); |
|---|
| 245 | 218 | return rc; |
|---|
| 246 | 219 | } |
|---|
| 247 | 220 | |
|---|
| .. | .. |
|---|
| 417 | 390 | symname); |
|---|
| 418 | 391 | return 0; |
|---|
| 419 | 392 | } |
|---|
| 420 | | -#ifdef VDS64_HAS_DESCRIPTORS |
|---|
| 421 | | - return *((u64 *)(vdso64_kbase + sym->st_value - VDSO64_LBASE)) - |
|---|
| 422 | | - VDSO64_LBASE; |
|---|
| 423 | | -#else |
|---|
| 424 | 393 | return sym->st_value - VDSO64_LBASE; |
|---|
| 425 | | -#endif |
|---|
| 426 | 394 | } |
|---|
| 427 | 395 | |
|---|
| 428 | 396 | static int __init vdso_do_func_patch64(struct lib32_elfinfo *v32, |
|---|
| .. | .. |
|---|
| 507 | 475 | */ |
|---|
| 508 | 476 | |
|---|
| 509 | 477 | #ifdef CONFIG_PPC64 |
|---|
| 510 | | - vdso64_rt_sigtramp = find_function64(v64, "__kernel_sigtramp_rt64"); |
|---|
| 478 | + vdso64_rt_sigtramp = find_function64(v64, "__kernel_start_sigtramp_rt64"); |
|---|
| 511 | 479 | #endif |
|---|
| 512 | 480 | vdso32_sigtramp = find_function32(v32, "__kernel_sigtramp32"); |
|---|
| 513 | 481 | vdso32_rt_sigtramp = find_function32(v32, "__kernel_sigtramp_rt32"); |
|---|
| .. | .. |
|---|
| 671 | 639 | { |
|---|
| 672 | 640 | unsigned int i; |
|---|
| 673 | 641 | extern unsigned long *sys_call_table; |
|---|
| 642 | +#ifdef CONFIG_PPC64 |
|---|
| 643 | + extern unsigned long *compat_sys_call_table; |
|---|
| 644 | +#endif |
|---|
| 674 | 645 | extern unsigned long sys_ni_syscall; |
|---|
| 675 | 646 | |
|---|
| 676 | 647 | |
|---|
| 677 | 648 | for (i = 0; i < NR_syscalls; i++) { |
|---|
| 678 | 649 | #ifdef CONFIG_PPC64 |
|---|
| 679 | | - if (sys_call_table[i*2] != sys_ni_syscall) |
|---|
| 650 | + if (sys_call_table[i] != sys_ni_syscall) |
|---|
| 680 | 651 | vdso_data->syscall_map_64[i >> 5] |= |
|---|
| 681 | 652 | 0x80000000UL >> (i & 0x1f); |
|---|
| 682 | | - if (sys_call_table[i*2+1] != sys_ni_syscall) |
|---|
| 653 | + if (IS_ENABLED(CONFIG_COMPAT) && |
|---|
| 654 | + compat_sys_call_table[i] != sys_ni_syscall) |
|---|
| 683 | 655 | vdso_data->syscall_map_32[i >> 5] |= |
|---|
| 684 | 656 | 0x80000000UL >> (i & 0x1f); |
|---|
| 685 | 657 | #else /* CONFIG_PPC64 */ |
|---|
| .. | .. |
|---|
| 751 | 723 | */ |
|---|
| 752 | 724 | vdso64_pages = (&vdso64_end - &vdso64_start) >> PAGE_SHIFT; |
|---|
| 753 | 725 | DBG("vdso64_kbase: %p, 0x%x pages\n", vdso64_kbase, vdso64_pages); |
|---|
| 754 | | -#else |
|---|
| 755 | | - vdso_data->dcache_block_size = L1_CACHE_BYTES; |
|---|
| 756 | | - vdso_data->dcache_log_block_size = L1_CACHE_SHIFT; |
|---|
| 757 | | - vdso_data->icache_block_size = L1_CACHE_BYTES; |
|---|
| 758 | | - vdso_data->icache_log_block_size = L1_CACHE_SHIFT; |
|---|
| 759 | 726 | #endif /* CONFIG_PPC64 */ |
|---|
| 760 | 727 | |
|---|
| 761 | 728 | |
|---|
| .. | .. |
|---|
| 795 | 762 | BUG_ON(vdso32_pagelist == NULL); |
|---|
| 796 | 763 | for (i = 0; i < vdso32_pages; i++) { |
|---|
| 797 | 764 | struct page *pg = virt_to_page(vdso32_kbase + i*PAGE_SIZE); |
|---|
| 798 | | - ClearPageReserved(pg); |
|---|
| 799 | 765 | get_page(pg); |
|---|
| 800 | 766 | vdso32_pagelist[i] = pg; |
|---|
| 801 | 767 | } |
|---|
| .. | .. |
|---|
| 809 | 775 | BUG_ON(vdso64_pagelist == NULL); |
|---|
| 810 | 776 | for (i = 0; i < vdso64_pages; i++) { |
|---|
| 811 | 777 | struct page *pg = virt_to_page(vdso64_kbase + i*PAGE_SIZE); |
|---|
| 812 | | - ClearPageReserved(pg); |
|---|
| 813 | 778 | get_page(pg); |
|---|
| 814 | 779 | vdso64_pagelist[i] = pg; |
|---|
| 815 | 780 | } |
|---|