1 // SPDX-License-Identifier: GPL-2.0-only
5 * (started from arm version - for VIPT alias handling)
7 * Copyright (C) 2013 Synopsys, Inc. (www.synopsys.com)
12 #include <linux/mman.h>
13 #include <linux/sched/mm.h>
15 #include <asm/cacheflush.h>
18 * Ensure that shared mappings are correctly aligned to
19 * avoid aliasing issues with VIPT caches.
20 * We need to ensure that
21 * a specific page of an object is always mapped at a multiple of
25 arch_get_unmapped_area(struct file
*filp
, unsigned long addr
,
26 unsigned long len
, unsigned long pgoff
,
27 unsigned long flags
, vm_flags_t vm_flags
)
29 struct mm_struct
*mm
= current
->mm
;
30 struct vm_area_struct
*vma
;
31 struct vm_unmapped_area_info info
= {};
34 * We enforce the MAP_FIXED case.
36 if (flags
& MAP_FIXED
) {
37 if (flags
& MAP_SHARED
&&
38 (addr
- (pgoff
<< PAGE_SHIFT
)) & (SHMLBA
- 1))
47 addr
= PAGE_ALIGN(addr
);
49 vma
= find_vma(mm
, addr
);
50 if (TASK_SIZE
- len
>= addr
&&
51 (!vma
|| addr
+ len
<= vm_start_gap(vma
)))
56 info
.low_limit
= mm
->mmap_base
;
57 info
.high_limit
= TASK_SIZE
;
58 info
.align_offset
= pgoff
<< PAGE_SHIFT
;
59 return vm_unmapped_area(&info
);
62 static const pgprot_t protection_map
[16] = {
63 [VM_NONE
] = PAGE_U_NONE
,
65 [VM_WRITE
] = PAGE_U_R
,
66 [VM_WRITE
| VM_READ
] = PAGE_U_R
,
67 [VM_EXEC
] = PAGE_U_X_R
,
68 [VM_EXEC
| VM_READ
] = PAGE_U_X_R
,
69 [VM_EXEC
| VM_WRITE
] = PAGE_U_X_R
,
70 [VM_EXEC
| VM_WRITE
| VM_READ
] = PAGE_U_X_R
,
71 [VM_SHARED
] = PAGE_U_NONE
,
72 [VM_SHARED
| VM_READ
] = PAGE_U_R
,
73 [VM_SHARED
| VM_WRITE
] = PAGE_U_W_R
,
74 [VM_SHARED
| VM_WRITE
| VM_READ
] = PAGE_U_W_R
,
75 [VM_SHARED
| VM_EXEC
] = PAGE_U_X_R
,
76 [VM_SHARED
| VM_EXEC
| VM_READ
] = PAGE_U_X_R
,
77 [VM_SHARED
| VM_EXEC
| VM_WRITE
] = PAGE_U_X_W_R
,
78 [VM_SHARED
| VM_EXEC
| VM_WRITE
| VM_READ
] = PAGE_U_X_W_R
80 DECLARE_VM_GET_PAGE_PROT