xref: /linux/tools/testing/vma/shared.h (revision 6aacab308a5dfd222b2d23662bbae60c11007cfb)
1*6aacab30SLorenzo Stoakes // SPDX-License-Identifier: GPL-2.0-or-later
2*6aacab30SLorenzo Stoakes 
3*6aacab30SLorenzo Stoakes #pragma once
4*6aacab30SLorenzo Stoakes 
5*6aacab30SLorenzo Stoakes #include <stdbool.h>
6*6aacab30SLorenzo Stoakes #include <stdio.h>
7*6aacab30SLorenzo Stoakes #include <stdlib.h>
8*6aacab30SLorenzo Stoakes 
9*6aacab30SLorenzo Stoakes #include "generated/bit-length.h"
10*6aacab30SLorenzo Stoakes #include "maple-shared.h"
11*6aacab30SLorenzo Stoakes #include "vma_internal.h"
12*6aacab30SLorenzo Stoakes #include "../../../mm/vma.h"
13*6aacab30SLorenzo Stoakes 
14*6aacab30SLorenzo Stoakes /* Simple test runner. Assumes local num_[fail, tests] counters. */
15*6aacab30SLorenzo Stoakes #define TEST(name)							\
16*6aacab30SLorenzo Stoakes 	do {								\
17*6aacab30SLorenzo Stoakes 		(*num_tests)++;						\
18*6aacab30SLorenzo Stoakes 		if (!test_##name()) {					\
19*6aacab30SLorenzo Stoakes 			(*num_fail)++;					\
20*6aacab30SLorenzo Stoakes 			fprintf(stderr, "Test " #name " FAILED\n");	\
21*6aacab30SLorenzo Stoakes 		}							\
22*6aacab30SLorenzo Stoakes 	} while (0)
23*6aacab30SLorenzo Stoakes 
24*6aacab30SLorenzo Stoakes #define ASSERT_TRUE(_expr)						\
25*6aacab30SLorenzo Stoakes 	do {								\
26*6aacab30SLorenzo Stoakes 		if (!(_expr)) {						\
27*6aacab30SLorenzo Stoakes 			fprintf(stderr,					\
28*6aacab30SLorenzo Stoakes 				"Assert FAILED at %s:%d:%s(): %s is FALSE.\n", \
29*6aacab30SLorenzo Stoakes 				__FILE__, __LINE__, __FUNCTION__, #_expr); \
30*6aacab30SLorenzo Stoakes 			return false;					\
31*6aacab30SLorenzo Stoakes 		}							\
32*6aacab30SLorenzo Stoakes 	} while (0)
33*6aacab30SLorenzo Stoakes 
34*6aacab30SLorenzo Stoakes #define ASSERT_FALSE(_expr) ASSERT_TRUE(!(_expr))
35*6aacab30SLorenzo Stoakes #define ASSERT_EQ(_val1, _val2) ASSERT_TRUE((_val1) == (_val2))
36*6aacab30SLorenzo Stoakes #define ASSERT_NE(_val1, _val2) ASSERT_TRUE((_val1) != (_val2))
37*6aacab30SLorenzo Stoakes 
38*6aacab30SLorenzo Stoakes #define IS_SET(_val, _flags) ((_val & _flags) == _flags)
39*6aacab30SLorenzo Stoakes 
40*6aacab30SLorenzo Stoakes extern bool fail_prealloc;
41*6aacab30SLorenzo Stoakes 
42*6aacab30SLorenzo Stoakes /* Override vma_iter_prealloc() so we can choose to fail it. */
43*6aacab30SLorenzo Stoakes #define vma_iter_prealloc(vmi, vma)					\
44*6aacab30SLorenzo Stoakes 	(fail_prealloc ? -ENOMEM : mas_preallocate(&(vmi)->mas, (vma), GFP_KERNEL))
45*6aacab30SLorenzo Stoakes 
46*6aacab30SLorenzo Stoakes #define CONFIG_DEFAULT_MMAP_MIN_ADDR 65536
47*6aacab30SLorenzo Stoakes 
48*6aacab30SLorenzo Stoakes extern unsigned long mmap_min_addr;
49*6aacab30SLorenzo Stoakes extern unsigned long dac_mmap_min_addr;
50*6aacab30SLorenzo Stoakes extern unsigned long stack_guard_gap;
51*6aacab30SLorenzo Stoakes 
52*6aacab30SLorenzo Stoakes extern const struct vm_operations_struct vma_dummy_vm_ops;
53*6aacab30SLorenzo Stoakes extern struct anon_vma dummy_anon_vma;
54*6aacab30SLorenzo Stoakes extern struct task_struct __current;
55*6aacab30SLorenzo Stoakes 
56*6aacab30SLorenzo Stoakes /*
57*6aacab30SLorenzo Stoakes  * Helper function which provides a wrapper around a merge existing VMA
58*6aacab30SLorenzo Stoakes  * operation.
59*6aacab30SLorenzo Stoakes  *
60*6aacab30SLorenzo Stoakes  * Declared in main.c as uses static VMA function.
61*6aacab30SLorenzo Stoakes  */
62*6aacab30SLorenzo Stoakes struct vm_area_struct *merge_existing(struct vma_merge_struct *vmg);
63*6aacab30SLorenzo Stoakes 
64*6aacab30SLorenzo Stoakes /*
65*6aacab30SLorenzo Stoakes  * Helper function to allocate a VMA and link it to the tree.
66*6aacab30SLorenzo Stoakes  *
67*6aacab30SLorenzo Stoakes  * Declared in main.c as uses static VMA function.
68*6aacab30SLorenzo Stoakes  */
69*6aacab30SLorenzo Stoakes int attach_vma(struct mm_struct *mm, struct vm_area_struct *vma);
70*6aacab30SLorenzo Stoakes 
71*6aacab30SLorenzo Stoakes /* Helper function providing a dummy vm_ops->close() method.*/
72*6aacab30SLorenzo Stoakes static inline void dummy_close(struct vm_area_struct *)
73*6aacab30SLorenzo Stoakes {
74*6aacab30SLorenzo Stoakes }
75*6aacab30SLorenzo Stoakes 
76*6aacab30SLorenzo Stoakes /* Helper function to simply allocate a VMA. */
77*6aacab30SLorenzo Stoakes struct vm_area_struct *alloc_vma(struct mm_struct *mm,
78*6aacab30SLorenzo Stoakes 		unsigned long start, unsigned long end,
79*6aacab30SLorenzo Stoakes 		pgoff_t pgoff, vm_flags_t vm_flags);
80*6aacab30SLorenzo Stoakes 
81*6aacab30SLorenzo Stoakes /* Helper function to detach and free a VMA. */
82*6aacab30SLorenzo Stoakes void detach_free_vma(struct vm_area_struct *vma);
83*6aacab30SLorenzo Stoakes 
84*6aacab30SLorenzo Stoakes /* Helper function to allocate a VMA and link it to the tree. */
85*6aacab30SLorenzo Stoakes struct vm_area_struct *alloc_and_link_vma(struct mm_struct *mm,
86*6aacab30SLorenzo Stoakes 		unsigned long start, unsigned long end,
87*6aacab30SLorenzo Stoakes 		pgoff_t pgoff, vm_flags_t vm_flags);
88*6aacab30SLorenzo Stoakes 
89*6aacab30SLorenzo Stoakes /*
90*6aacab30SLorenzo Stoakes  * Helper function to reset the dummy anon_vma to indicate it has not been
91*6aacab30SLorenzo Stoakes  * duplicated.
92*6aacab30SLorenzo Stoakes  */
93*6aacab30SLorenzo Stoakes void reset_dummy_anon_vma(void);
94*6aacab30SLorenzo Stoakes 
95*6aacab30SLorenzo Stoakes /*
96*6aacab30SLorenzo Stoakes  * Helper function to remove all VMAs and destroy the maple tree associated with
97*6aacab30SLorenzo Stoakes  * a virtual address space. Returns a count of VMAs in the tree.
98*6aacab30SLorenzo Stoakes  */
99*6aacab30SLorenzo Stoakes int cleanup_mm(struct mm_struct *mm, struct vma_iterator *vmi);
100*6aacab30SLorenzo Stoakes 
101*6aacab30SLorenzo Stoakes /* Helper function to determine if VMA has had vma_start_write() performed. */
102*6aacab30SLorenzo Stoakes bool vma_write_started(struct vm_area_struct *vma);
103*6aacab30SLorenzo Stoakes 
104*6aacab30SLorenzo Stoakes void __vma_set_dummy_anon_vma(struct vm_area_struct *vma,
105*6aacab30SLorenzo Stoakes 		struct anon_vma_chain *avc, struct anon_vma *anon_vma);
106*6aacab30SLorenzo Stoakes 
107*6aacab30SLorenzo Stoakes /* Provide a simple dummy VMA/anon_vma dummy setup for testing. */
108*6aacab30SLorenzo Stoakes void vma_set_dummy_anon_vma(struct vm_area_struct *vma,
109*6aacab30SLorenzo Stoakes 			    struct anon_vma_chain *avc);
110*6aacab30SLorenzo Stoakes 
111*6aacab30SLorenzo Stoakes /* Helper function to specify a VMA's range. */
112*6aacab30SLorenzo Stoakes void vma_set_range(struct vm_area_struct *vma,
113*6aacab30SLorenzo Stoakes 		   unsigned long start, unsigned long end,
114*6aacab30SLorenzo Stoakes 		   pgoff_t pgoff);
115