Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1// SPDX-License-Identifier: GPL-2.0-or-later
2
3#include "shared.h"
4
5
6bool fail_prealloc;
7unsigned long mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR;
8unsigned long dac_mmap_min_addr = CONFIG_DEFAULT_MMAP_MIN_ADDR;
9unsigned long stack_guard_gap = 256UL<<PAGE_SHIFT;
10
11const struct vm_operations_struct vma_dummy_vm_ops;
12struct anon_vma dummy_anon_vma;
13struct task_struct __current;
14
15struct vm_area_struct *alloc_vma(struct mm_struct *mm,
16 unsigned long start, unsigned long end,
17 pgoff_t pgoff, vma_flags_t vma_flags)
18{
19 struct vm_area_struct *vma = vm_area_alloc(mm);
20
21 if (vma == NULL)
22 return NULL;
23
24 vma->vm_start = start;
25 vma->vm_end = end;
26 vma->vm_pgoff = pgoff;
27 vma->flags = vma_flags;
28 vma_assert_detached(vma);
29
30 return vma;
31}
32
33void detach_free_vma(struct vm_area_struct *vma)
34{
35 vma_mark_detached(vma);
36 vm_area_free(vma);
37}
38
39struct vm_area_struct *alloc_and_link_vma(struct mm_struct *mm,
40 unsigned long start, unsigned long end,
41 pgoff_t pgoff, vma_flags_t vma_flags)
42{
43 struct vm_area_struct *vma = alloc_vma(mm, start, end, pgoff, vma_flags);
44
45 if (vma == NULL)
46 return NULL;
47
48 if (attach_vma(mm, vma)) {
49 detach_free_vma(vma);
50 return NULL;
51 }
52
53 /*
54 * Reset this counter which we use to track whether writes have
55 * begun. Linking to the tree will have caused this to be incremented,
56 * which means we will get a false positive otherwise.
57 */
58 vma->vm_lock_seq = UINT_MAX;
59
60 return vma;
61}
62
63void reset_dummy_anon_vma(void)
64{
65 dummy_anon_vma.was_cloned = false;
66 dummy_anon_vma.was_unlinked = false;
67}
68
69int cleanup_mm(struct mm_struct *mm, struct vma_iterator *vmi)
70{
71 struct vm_area_struct *vma;
72 int count = 0;
73
74 fail_prealloc = false;
75 reset_dummy_anon_vma();
76
77 vma_iter_set(vmi, 0);
78 for_each_vma(*vmi, vma) {
79 detach_free_vma(vma);
80 count++;
81 }
82
83 mtree_destroy(&mm->mm_mt);
84 mm->map_count = 0;
85 return count;
86}
87
88bool vma_write_started(struct vm_area_struct *vma)
89{
90 int seq = vma->vm_lock_seq;
91
92 /* We reset after each check. */
93 vma->vm_lock_seq = UINT_MAX;
94
95 /* The vma_start_write() stub simply increments this value. */
96 return seq > -1;
97}
98
99void __vma_set_dummy_anon_vma(struct vm_area_struct *vma,
100 struct anon_vma_chain *avc, struct anon_vma *anon_vma)
101{
102 vma->anon_vma = anon_vma;
103 INIT_LIST_HEAD(&vma->anon_vma_chain);
104 list_add(&avc->same_vma, &vma->anon_vma_chain);
105 avc->anon_vma = vma->anon_vma;
106}
107
108void vma_set_dummy_anon_vma(struct vm_area_struct *vma,
109 struct anon_vma_chain *avc)
110{
111 __vma_set_dummy_anon_vma(vma, avc, &dummy_anon_vma);
112}
113
114struct task_struct *get_current(void)
115{
116 return &__current;
117}
118
119unsigned long rlimit(unsigned int limit)
120{
121 return (unsigned long)-1;
122}
123
124void vma_set_range(struct vm_area_struct *vma,
125 unsigned long start, unsigned long end,
126 pgoff_t pgoff)
127{
128 vma->vm_start = start;
129 vma->vm_end = end;
130 vma->vm_pgoff = pgoff;
131}