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 : void SelMemTest::SetUp() {
21 4 : NaClLogModuleInit();
22 4 : }
23 :
24 : void SelMemTest::TearDown() {
25 4 : NaClLogModuleFini();
26 4 : }
27 :
28 8 : TEST_F(SelMemTest, AddTest) {
29 1 : struct NaClVmmap mem_map;
30 1 : int start_page_num = 32;
31 1 : int ret_code;
32 :
33 1 : ret_code = NaClVmmapCtor(&mem_map);
34 4 : EXPECT_EQ(1, ret_code);
35 :
36 12 : for (int i = 1; i <= 5; ++i) {
37 5 : 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 : 0);
45 20 : EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
46 20 : EXPECT_EQ(5, static_cast<int>(mem_map.size));
47 5 : }
48 :
49 : // no checks for start_page_num ..
50 1 : NaClVmmapAdd(&mem_map,
51 : start_page_num,
52 : 2,
53 : NACL_ABI_PROT_READ,
54 : NACL_ABI_MAP_PRIVATE,
55 : NULL,
56 : 0,
57 : 0);
58 4 : EXPECT_EQ(6, static_cast<int>(mem_map.nvalid));
59 4 : EXPECT_EQ(10, static_cast<int>(mem_map.size));
60 :
61 1 : NaClVmmapDtor(&mem_map);
62 1 : }
63 :
64 8 : TEST_F(SelMemTest, UpdateTest) {
65 1 : struct NaClVmmap mem_map;
66 :
67 4 : EXPECT_EQ(1, NaClVmmapCtor(&mem_map));
68 :
69 : // 1st region
70 1 : 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 : 0);
78 4 : EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
79 :
80 : // no overlap
81 1 : NaClVmmapAddWithOverwrite(&mem_map,
82 : 64,
83 : 10,
84 : NACL_ABI_PROT_READ,
85 : NACL_ABI_MAP_PRIVATE,
86 : NULL,
87 : 0,
88 : 0);
89 : // vmmap is [32, 44], [64, 74]
90 4 : EXPECT_EQ(2, static_cast<int>(mem_map.nvalid));
91 :
92 : // new mapping overlaps end and start of existing mappings
93 1 : NaClVmmapAddWithOverwrite(&mem_map,
94 : 42,
95 : 24,
96 : NACL_ABI_PROT_READ,
97 : NACL_ABI_MAP_PRIVATE,
98 : NULL,
99 : 0,
100 : 0);
101 : // vmmap is [32, 41], [42, 66], [67, 74]
102 4 : EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
103 :
104 : // new mapping is in the middle of existing mapping
105 1 : 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 : 0);
113 : // vmmap is [32, 35], [34, 36], [37, 41], [42, 66], [67, 74]
114 4 : EXPECT_EQ(5, static_cast<int>(mem_map.nvalid));
115 :
116 : // new mapping covers all of the existing mapping
117 1 : 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 : 0);
125 : // vmmap is [32, 36], [37, 41], [42, 66], [67, 74]
126 4 : EXPECT_EQ(4, static_cast<int>(mem_map.nvalid));
127 :
128 : // remove existing mappings
129 1 : NaClVmmapRemove(&mem_map,
130 : 40,
131 : 30);
132 : // vmmap is [32, 36], [37, 39], [71, 74]
133 4 : EXPECT_EQ(3, static_cast<int>(mem_map.nvalid));
134 :
135 1 : NaClVmmapDtor(&mem_map);
136 1 : }
137 :
138 8 : TEST_F(SelMemTest, FindPageTest) {
139 1 : struct NaClVmmap mem_map;
140 1 : int ret_code;
141 :
142 1 : ret_code = NaClVmmapCtor(&mem_map);
143 4 : EXPECT_EQ(1, ret_code);
144 :
145 1 : struct NaClVmmapEntry const *entry;
146 1 : entry = NaClVmmapFindPage(&mem_map, 32);
147 4 : EXPECT_TRUE(NULL == entry);
148 :
149 1 : int start_page_num = 32;
150 14 : for (int i = 1; i <= 6; ++i) {
151 6 : 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 : 0);
159 24 : EXPECT_EQ(i, static_cast<int>(mem_map.nvalid));
160 6 : }
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 4 : EXPECT_TRUE(NULL == entry);
166 :
167 1 : entry = NaClVmmapFindPage(&mem_map, 32);
168 4 : EXPECT_TRUE(NULL != entry);
169 :
170 1 : entry = NaClVmmapFindPage(&mem_map, 34);
171 4 : EXPECT_TRUE(NULL == entry);
172 :
173 1 : entry = NaClVmmapFindPage(&mem_map, 202);
174 4 : EXPECT_TRUE(NULL != entry);
175 :
176 1 : NaClVmmapDtor(&mem_map);
177 1 : }
178 :
179 8 : TEST_F(SelMemTest, FindSpaceTest) {
180 1 : struct NaClVmmap mem_map;
181 1 : uintptr_t ret_code;
182 :
183 1 : ret_code = NaClVmmapCtor(&mem_map);
184 4 : EXPECT_EQ(1U, ret_code);
185 :
186 : // no entry
187 1 : ret_code = NaClVmmapFindSpace(&mem_map, 32);
188 4 : EXPECT_EQ(0U, ret_code);
189 :
190 1 : 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 : 0);
198 4 : EXPECT_EQ(1, static_cast<int>(mem_map.nvalid));
199 : // one entry only
200 1 : ret_code = NaClVmmapFindSpace(&mem_map, 2);
201 4 : EXPECT_EQ(0U, ret_code);
202 :
203 1 : 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 : 0);
211 4 : EXPECT_EQ(2U, mem_map.nvalid);
212 :
213 : // the space is [32, 42], [64, 74]
214 1 : ret_code = NaClVmmapFindSpace(&mem_map, 32);
215 4 : EXPECT_EQ(0U, ret_code);
216 :
217 1 : ret_code = NaClVmmapFindSpace(&mem_map, 2);
218 4 : EXPECT_EQ(62U, ret_code);
219 :
220 1 : 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 : 0);
228 4 : 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 4 : EXPECT_EQ(74U, ret_code);
234 :
235 1 : NaClVmmapDtor(&mem_map);
236 1 : }
|