.. | .. |
---|
| 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 | } |
---|