1 : /*
2 : * Copyright 2008 The Native Client Authors. All rights reserved.
3 : * Use of this source code is governed by a BSD-style license that can
4 : * be found in the LICENSE file.
5 : */
6 :
7 : #include "native_client/src/include/nacl_platform.h"
8 : #include "native_client/src/trusted/service_runtime/sel_mem.h"
9 : #include "native_client/src/shared/platform/nacl_log.h"
10 : #include "gtest/gtest.h"
11 :
12 : #include "native_client/src/trusted/service_runtime/include/bits/mman.h"
13 :
14 8 : class SelMemTest : public testing::Test {
15 : protected:
16 : virtual void SetUp();
17 : virtual void TearDown();
18 : };
19 :
20 4 : void SelMemTest::SetUp() {
21 4 : NaClLogModuleInit();
22 4 : }
23 :
24 4 : void SelMemTest::TearDown() {
25 4 : NaClLogModuleFini();
26 4 : }
27 :
28 5 : TEST_F(SelMemTest, AddTest) {
29 : struct NaClVmmap mem_map;
30 1 : int start_page_num = 32;
31 : int ret_code;
32 :
33 1 : ret_code = NaClVmmapCtor(&mem_map);
34 1 : EXPECT_EQ(1, ret_code);
35 :
36 6 : for (int i = 1; i <= 5; ++i) {
37 : NaClVmmapAdd(&mem_map,
38 : start_page_num*i,
39 : i,
40 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
41 : NACL_ABI_MAP_PRIVATE,
42 : NULL,
43 : 0,
44 5 : 0);
45 5 : EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
46 5 : EXPECT_EQ(5, static_cast<int>(mem_map.size));
47 : }
48 :
49 : // no checks for start_page_num ..
50 : NaClVmmapAdd(&mem_map,
51 : start_page_num,
52 : 2,
53 : NACL_ABI_PROT_READ,
54 : NACL_ABI_MAP_PRIVATE,
55 : NULL,
56 : 0,
57 1 : 0);
58 1 : EXPECT_EQ(6, static_cast<int>(mem_map.nvalid));
59 1 : EXPECT_EQ(10, static_cast<int>(mem_map.size));
60 :
61 1 : NaClVmmapDtor(&mem_map);
62 1 : }
63 :
64 5 : TEST_F(SelMemTest, UpdateTest) {
65 : struct NaClVmmap mem_map;
66 :
67 1 : EXPECT_EQ(1, NaClVmmapCtor(&mem_map));
68 :
69 : // 1st region
70 : NaClVmmapAddWithOverwrite(&mem_map,
71 : 32,
72 : 12,
73 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
74 : NACL_ABI_MAP_PRIVATE,
75 : NULL,
76 : 0,
77 1 : 0);
78 1 : EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
79 :
80 : // no overlap
81 : NaClVmmapAddWithOverwrite(&mem_map,
82 : 64,
83 : 10,
84 : NACL_ABI_PROT_READ,
85 : NACL_ABI_MAP_PRIVATE,
86 : NULL,
87 : 0,
88 1 : 0);
89 : // vmmap is [32, 44], [64, 74]
90 1 : EXPECT_EQ(2, static_cast<int>(mem_map.nvalid));
91 :
92 : // new mapping overlaps end and start of existing mappings
93 : NaClVmmapAddWithOverwrite(&mem_map,
94 : 42,
95 : 24,
96 : NACL_ABI_PROT_READ,
97 : NACL_ABI_MAP_PRIVATE,
98 : NULL,
99 : 0,
100 1 : 0);
101 : // vmmap is [32, 41], [42, 66], [67, 74]
102 1 : EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
103 :
104 : // new mapping is in the middle of existing mapping
105 : NaClVmmapAddWithOverwrite(&mem_map,
106 : 36,
107 : 2,
108 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
109 : NACL_ABI_MAP_PRIVATE,
110 : NULL,
111 : 0,
112 1 : 0);
113 : // vmmap is [32, 35], [34, 36], [37, 41], [42, 66], [67, 74]
114 1 : EXPECT_EQ(5, static_cast<int>(mem_map.nvalid));
115 :
116 : // new mapping covers all of the existing mapping
117 : NaClVmmapAddWithOverwrite(&mem_map,
118 : 32,
119 : 6,
120 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
121 : NACL_ABI_MAP_PRIVATE,
122 : NULL,
123 : 0,
124 1 : 0);
125 : // vmmap is [32, 36], [37, 41], [42, 66], [67, 74]
126 1 : EXPECT_EQ(4, static_cast<int>(mem_map.nvalid));
127 :
128 : // remove existing mappings
129 : NaClVmmapRemove(&mem_map,
130 : 40,
131 1 : 30);
132 : // vmmap is [32, 36], [37, 39], [71, 74]
133 1 : EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
134 :
135 1 : NaClVmmapDtor(&mem_map);
136 1 : }
137 :
138 5 : TEST_F(SelMemTest, FindPageTest) {
139 : struct NaClVmmap mem_map;
140 : int ret_code;
141 :
142 1 : ret_code = NaClVmmapCtor(&mem_map);
143 1 : EXPECT_EQ(1, ret_code);
144 :
145 : struct NaClVmmapEntry const *entry;
146 1 : entry = NaClVmmapFindPage(&mem_map, 32);
147 1 : EXPECT_TRUE(NULL == entry);
148 :
149 1 : int start_page_num = 32;
150 7 : for (int i = 1; i <= 6; ++i) {
151 : NaClVmmapAdd(&mem_map,
152 : start_page_num*i,
153 : 2*i,
154 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
155 : NACL_ABI_MAP_PRIVATE,
156 : NULL,
157 : 0,
158 6 : 0);
159 6 : EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
160 : }
161 : // vmmap is [32, 34], [64, 68], [96, 102], [128, 136],
162 : // [160, 170], [192, 204]
163 :
164 1 : entry = NaClVmmapFindPage(&mem_map, 16);
165 1 : EXPECT_TRUE(NULL == entry);
166 :
167 1 : entry = NaClVmmapFindPage(&mem_map, 32);
168 1 : EXPECT_TRUE(NULL != entry);
169 :
170 1 : entry = NaClVmmapFindPage(&mem_map, 34);
171 1 : EXPECT_TRUE(NULL == entry);
172 :
173 1 : entry = NaClVmmapFindPage(&mem_map, 202);
174 1 : EXPECT_TRUE(NULL != entry);
175 :
176 1 : NaClVmmapDtor(&mem_map);
177 1 : }
178 :
179 5 : TEST_F(SelMemTest, FindSpaceTest) {
180 : struct NaClVmmap mem_map;
181 : uintptr_t ret_code;
182 :
183 1 : ret_code = NaClVmmapCtor(&mem_map);
184 1 : EXPECT_EQ(1U, ret_code);
185 :
186 : // no entry
187 1 : ret_code = NaClVmmapFindSpace(&mem_map, 32);
188 1 : EXPECT_EQ(0U, ret_code);
189 :
190 : NaClVmmapAdd(&mem_map,
191 : 32,
192 : 10,
193 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
194 : NACL_ABI_MAP_PRIVATE,
195 : NULL,
196 : 0,
197 1 : 0);
198 1 : EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
199 : // one entry only
200 1 : ret_code = NaClVmmapFindSpace(&mem_map, 2);
201 1 : EXPECT_EQ(0U, ret_code);
202 :
203 : NaClVmmapAdd(&mem_map,
204 : 64,
205 : 10,
206 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
207 : NACL_ABI_MAP_PRIVATE,
208 : NULL,
209 : 0,
210 1 : 0);
211 1 : EXPECT_EQ(2U, mem_map.nvalid);
212 :
213 : // the space is [32, 42], [64, 74]
214 1 : ret_code = NaClVmmapFindSpace(&mem_map, 32);
215 1 : EXPECT_EQ(0U, ret_code);
216 :
217 1 : ret_code = NaClVmmapFindSpace(&mem_map, 2);
218 1 : EXPECT_EQ(62U, ret_code);
219 :
220 : NaClVmmapAdd(&mem_map,
221 : 96,
222 : 10,
223 : NACL_ABI_PROT_READ | NACL_ABI_PROT_EXEC,
224 : NACL_ABI_MAP_PRIVATE,
225 : NULL,
226 : 0,
227 1 : 0);
228 1 : EXPECT_EQ(3U, mem_map.nvalid);
229 :
230 : // vmmap is [32, 42], [64, 74], [96, 106]
231 : // the search is from high address down
232 1 : ret_code = NaClVmmapFindSpace(&mem_map, 22);
233 1 : EXPECT_EQ(74U, ret_code);
234 :
235 1 : NaClVmmapDtor(&mem_map);
236 4 : }
|