@@ -176,6 +176,10 @@ function (boolean) vmemmap_wf (u64 page_index,
176
176
&& (page_group_ok(page_index, vmemmap, pool))
177
177
}
178
178
179
+ function (boolean) eq_t(pointer x, pointer y) {
180
+ ptr_eq(x,y) || !addr_eq(x,y)
181
+ }
182
+
179
183
function (boolean) vmemmap_l_wf (u64 page_index, i64 physvirt_offset,
180
184
pointer virt_ptr,
181
185
map <u64, struct hyp_page> vmemmap, map <u64, struct list_head> APs,
@@ -212,7 +216,11 @@ function (boolean) vmemmap_l_wf (u64 page_index, i64 physvirt_offset,
212
216
// there is no self-loop case for this node type, as it is cleared unless it is
213
217
// present in the per-order free list - TODO delete?
214
218
let nonempty_clause = (prev != self_node_pointer) && (next != self_node_pointer);
215
- (prev_clause && next_clause)
219
+ let eq_testable = eq_t(prev, self_node_pointer)
220
+ && eq_t(prev, pool_free_area_pointer)
221
+ && eq_t(next, prev)
222
+ && eq_t(next, pool_free_area_pointer);
223
+ (prev_clause && next_clause && eq_testable)
216
224
}
217
225
218
226
@@ -265,7 +273,7 @@ function (boolean) hyp_pool_wf (pointer pool_pointer, struct hyp_pool pool,
265
273
(range_start < range_end)
266
274
&& (range_end < shift_left(1u64, 52u64))
267
275
&& (physvirt_offset < (i64) range_start) // use '<='
268
- && ( mod((u64) physvirt_offset, ( page_size ())) == 0u64)
276
+ && mod((u64) physvirt_offset, page_size ()) == 0u64
269
277
&& (((range_start / (page_size ())) * (page_size ())) == range_start)
270
278
&& (((range_end / (page_size ())) * (page_size ())) == range_end)
271
279
&& (pool.max_order <= (max_order ()))
@@ -305,9 +313,7 @@ predicate void Page (pointer vbase, boolean guard, u8 order)
305
313
}
306
314
else {
307
315
let length = page_size_of_order(order);
308
- let vbaseI = (u64) vbase;
309
- take Bytes = each (u64 i; (vbaseI <= i) && (i < (vbaseI + length)))
310
- {Byte(array_shift<char>(NULL, i))};
316
+ take Bytes = each (u64 i; 0u64 <= i && i < length) {Byte(array_shift<char>(vbase, i))};
311
317
return;
312
318
}
313
319
}
@@ -318,21 +324,18 @@ predicate void ZeroPage (pointer vbase, boolean guard, u8 order)
318
324
return;
319
325
}
320
326
else {
321
- let length = page_size_of_order(order);
322
- let vbaseI = ((u64) vbase);
323
- take Bytes = each (u64 i; (vbaseI <= i) && (i < (vbaseI + length)))
324
- {ByteV(array_shift<char>(NULL, i), 0u8)};
327
+ let length = sizeof<struct list_head>;
328
+ take B1 = each (u64 i; 0u64 <= i && i < length) {ByteV(array_shift<char>(vbase, i), 0u8)};
329
+ take B2 = each (u64 i; length <= i && i < page_size_of_order(order)) {ByteV(array_shift<char>(vbase, i), 0u8)};
325
330
return;
326
331
}
327
332
}
328
333
329
- predicate void AllocatorPageZeroPart (pointer zero_start , u8 order)
334
+ predicate void AllocatorPageZeroPart (pointer vbase , u8 order)
330
335
{
331
- let start = (u64) zero_start;
332
336
let region_length = page_size_of_order(order);
333
- let length = region_length - sizeof<struct list_head>;
334
- take Bytes = each (u64 i; (start <= i) && (i < (start + length)))
335
- {ByteV(array_shift<char>(NULL, i), 0u8)};
337
+ take Bytes = each (u64 i; sizeof<struct list_head> <= i && i < region_length)
338
+ {ByteV(array_shift<char>(vbase, i), 0u8)};
336
339
return;
337
340
}
338
341
@@ -347,9 +350,8 @@ predicate struct list_head AllocatorPage
347
350
return (todo_default_list_head ());
348
351
}
349
352
else {
350
- let zero_start = array_shift<struct list_head>(vbase, 1u8);
351
- take ZeroPart = AllocatorPageZeroPart (zero_start, order);
352
353
take Node = Owned<struct list_head>(vbase);
354
+ take ZeroPart = AllocatorPageZeroPart (vbase, order);
353
355
return Node;
354
356
}
355
357
}
0 commit comments