Skip to content

Commit ae4da39

Browse files
committed
Prove (no VIP) __hyp_attach_page
1 parent cc5c850 commit ae4da39

File tree

5 files changed

+27
-16
lines changed

5 files changed

+27
-16
lines changed

getorder.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
// CP: adding string.h include
3232
//#include <string.h>
3333
long fls64(long x)
34+
/*@ trusted; @*/
3435
{
3536
long flsl(long);
3637
return flsl(x);
@@ -64,4 +65,4 @@ static /*__always_inline __attribute_const__*/ int get_order(unsigned long size)
6465

6566
//#endif /* __ASSEMBLY__ */
6667

67-
//#endif /* __ASM_GENERIC_GETORDER_H */
68+
//#endif /* __ASM_GENERIC_GETORDER_H */

lemmas.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,4 +168,10 @@ lemma bytes_to_struct_list_head(pointer node, // struct list_head *
168168
requires take B = each (u64 i; 0u64 <= i && i < sizeof<struct list_head>) {ByteV(array_shift<char>(node, i), 0u8)};
169169
ensures take Node = Owned<struct list_head>(node);
170170
171+
lemma merge_zero_pages(pointer min, u8 order)
172+
requires
173+
take Z1 = ZeroPage(min, true, order);
174+
take Z2 = ZeroPage(array_shift<char>(min, page_size_of_order(order)), true, order);
175+
ensures
176+
take Z3 = ZeroPage(min, true, order + 1u8);
171177
@*/

minmax.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,4 @@
88

99
/* #define min(x, y) __careful_cmp(x, y, <) */
1010
#define min(x, y) __cmp(x, y, <)
11+
#define max(x, y) __cmp(x, y, >)

page_alloc.c

Lines changed: 15 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ static inline void page_remove_from_list_pool(struct hyp_pool *pool, struct hyp_
230230
/*@ requires HP.vmemmap[p_i].refcount == 0u16; @*/
231231
/*@ ensures take ZP = ZeroPage(virt, true, order); @*/
232232
/*@ ensures take H2 = Hyp_pool_ex1(pool, __hyp_vmemmap, cn_virt_ptr, hyp_physvirt_offset, p_i); @*/
233-
/*@ ensures {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; @*/
233+
/*@ ensures {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; {cn_virt_ptr} unchanged; @*/
234234
/*@ ensures H2.vmemmap == HP.vmemmap; @*/
235235
/*@ ensures H2.pool == {free_area: H2.pool.free_area, ..HP.pool}; @*/
236236
{
@@ -274,10 +274,10 @@ static inline void page_add_to_list(struct hyp_page *p, struct list_head *head)
274274
/*@ requires let prev = (*next).prev; @*/
275275
/*@ requires ptr_eq(prev, next) || !addr_eq(prev, next); @*/
276276
/*@ requires take Node_prev = O_struct_list_head(prev, !addr_eq(prev, next)); @*/
277-
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; p_i < shift_left(1u64, 63u64) / page_size(); @*/
277+
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; @*/
278+
/*@ requires p_i < shift_left(1u64, 63u64) / page_size(); @*/
278279
/*@ requires (mod((u64) hyp_physvirt_offset, page_size())) == 0u64; @*/
279280
/*@ requires phys > (u64) hyp_physvirt_offset; @*/
280-
/*@ requires p >= __hyp_vmemmap; @*/
281281
/*@ ensures {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; {cn_virt_ptr} unchanged; @*/
282282
/*@ ensures take AP1R = AllocatorPage(virt, true, order); @*/
283283
/*@ ensures take Hp2 = Owned(p); @*/
@@ -306,15 +306,14 @@ static inline void page_add_to_list_pool(struct hyp_pool *pool,
306306
/*@ requires has_alloc_id(p); @*/
307307
/*@ requires has_alloc_id(cn_virt_ptr); @*/
308308
/*@ requires (alloc_id) __hyp_vmemmap == (alloc_id) p; @*/
309-
/*@ requires p >= __hyp_vmemmap; @*/
310309
/*@ requires let p_i = cn_hyp_page_to_pfn(__hyp_vmemmap, p); @*/
311310
/*@ requires take HP = Hyp_pool_ex1(pool, __hyp_vmemmap, cn_virt_ptr, hyp_physvirt_offset, p_i); @*/
312311
/*@ requires let free_area_l = member_shift<hyp_pool>(pool, free_area); @*/
313312
/*@ requires let phys = cn_hyp_pfn_to_phys(p_i); @*/
314313
/*@ requires let virt = cn__hyp_va(cn_virt_ptr, hyp_physvirt_offset, phys); @*/
315314
/*@ requires let start_i = cn_hyp_phys_to_pfn(HP.pool.range_start); @*/
316315
/*@ requires let end_i = cn_hyp_phys_to_pfn(HP.pool.range_end); @*/
317-
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; p_i < shift_left(1u64, 63u64) / page_size(); @*/
316+
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; @*/
318317
/*@ requires cellPointer(__hyp_vmemmap, (u64) (sizeof<struct hyp_page>), start_i, end_i, p); @*/
319318
/*@ requires let order = (HP.vmemmap[p_i]).order; @*/
320319
/*@ requires order != (hyp_no_order ()); @*/
@@ -355,11 +354,11 @@ static inline void page_add_to_list_pool_ex1(struct hyp_pool *pool,
355354
/*@ requires let free_area_l = member_shift<hyp_pool>(pool, free_area); @*/
356355
/*@ requires let phys = cn_hyp_pfn_to_phys(p_i); @*/
357356
/*@ requires let virt = cn__hyp_va(cn_virt_ptr, hyp_physvirt_offset, phys); @*/
358-
/*@ requires let start_i = cn_hyp_pfn_to_phys(HP.pool.range_start); @*/
359-
/*@ requires let end_i = cn_hyp_pfn_to_phys(HP.pool.range_end / page_size()); @*/
360-
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; p_i < shift_left(1u64, 63u64) / page_size(); @*/
357+
/*@ requires let start_i = cn_hyp_phys_to_pfn(HP.pool.range_start); @*/
358+
/*@ requires let end_i = cn_hyp_phys_to_pfn(HP.pool.range_end); @*/
359+
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; @*/
361360
/*@ requires cellPointer(__hyp_vmemmap, (u64) (sizeof<struct hyp_page>), start_i, end_i, p); @*/
362-
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i2; p_i2 < shift_left(1u64, 63u64) / page_size(); @*/
361+
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i2; @*/
363362
/*@ requires cellPointer(__hyp_vmemmap, (u64) (sizeof<struct hyp_page>), start_i, end_i, p_ex); @*/
364363
/*@ requires let order = (HP.vmemmap[p_i]).order; @*/
365364
/*@ requires order != hyp_no_order (); @*/
@@ -404,6 +403,7 @@ static inline struct hyp_page *node_to_page(struct list_head *node)
404403
static void __hyp_attach_page(struct hyp_pool *pool,
405404
struct hyp_page *p)
406405
/*@ accesses __hyp_vmemmap; hyp_physvirt_offset; cn_virt_ptr; @*/
406+
/*@ requires has_alloc_id(__hyp_vmemmap); has_alloc_id(p); has_alloc_id(cn_virt_ptr); @*/
407407
/*@ requires (alloc_id) __hyp_vmemmap == (alloc_id) p; @*/
408408
/*@ requires let p_i = cn_hyp_page_to_pfn(__hyp_vmemmap, p); @*/
409409
/*@ requires take H = Hyp_pool_ex1(pool, __hyp_vmemmap, cn_virt_ptr, hyp_physvirt_offset, p_i); @*/
@@ -413,10 +413,11 @@ static void __hyp_attach_page(struct hyp_pool *pool,
413413
/*@ requires (H.vmemmap[p_i]).refcount == 0u16; @*/
414414
/*@ requires ((H.vmemmap[p_i]).order) != (hyp_no_order()); @*/
415415
/*@ requires let i_order = (H.vmemmap[p_i]).order; @*/
416+
/*@ requires (u64) hyp_physvirt_offset / page_size() <= p_i; @*/
416417
/*@ requires (p_i * page_size()) + (page_size_of_order(i_order)) <= (H.pool).range_end; @*/
417418
/*@ requires let ptr_phys_0 = cn__hyp_va(cn_virt_ptr, hyp_physvirt_offset, 0u64); @*/
418419
/*@ requires take P = Page(array_shift<PAGE_SIZE_t>(ptr_phys_0, p_i), true, i_order); @*/
419-
/*@ ensures {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; @*/
420+
/*@ ensures {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; {cn_virt_ptr} unchanged; @*/
420421
/*@ ensures take H2 = Hyp_pool(pool, __hyp_vmemmap, cn_virt_ptr, hyp_physvirt_offset); @*/
421422
/*@ ensures {free_area: H2.pool.free_area, ..H.pool} == H2.pool; @*/
422423
/*@ ensures each (u64 i; p_i < i && i < end_i){(H.vmemmap[i].refcount == 0u16) || (H2.vmemmap[i] == H.vmemmap[i])}; @*/
@@ -445,6 +446,7 @@ static void __hyp_attach_page(struct hyp_pool *pool,
445446
p->order = HYP_NO_ORDER;
446447

447448
for (; (order + 1) < pool->max_order; order++)
449+
/*@ inv has_alloc_id(p); has_alloc_id(cn_virt_ptr); @*/
448450
/*@ inv (alloc_id) __hyp_vmemmap == (alloc_id) p; @*/
449451
/*@ inv let p_i2 = cn_hyp_page_to_pfn(__hyp_vmemmap, p); @*/
450452
/*@ inv let virt = cn__hyp_va(cn_virt_ptr, hyp_physvirt_offset, p_i2 * page_size()); @*/
@@ -463,7 +465,7 @@ static void __hyp_attach_page(struct hyp_pool *pool,
463465
/*@ inv (p_i2 * page_size()) + (page_size_of_order(order)) <= (H_I.pool).range_end; @*/
464466
/*@ inv each (u64 i; p_i < i && i < end_i)
465467
{(H.vmemmap[i].refcount == 0u16) || (H_I.vmemmap[i] == H.vmemmap[i])}; @*/
466-
/*@ inv {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; {pool} unchanged; @*/
468+
/*@ inv {__hyp_vmemmap} unchanged; {hyp_physvirt_offset} unchanged; {pool} unchanged; {cn_virt_ptr} unchanged; @*/
467469
/*@ inv H_I.pool == {free_area: (H_I.pool).free_area, ..H.pool}; @*/
468470
{
469471

@@ -482,7 +484,8 @@ static void __hyp_attach_page(struct hyp_pool *pool,
482484
page_remove_from_list_pool(pool, buddy);
483485

484486
buddy->order = HYP_NO_ORDER;
485-
p = min(p, buddy);
487+
p = min(p,buddy);
488+
/*CN*//*@ apply merge_zero_pages(cn_hyp_page_to_virt(cn_virt_ptr, hyp_physvirt_offset, __hyp_vmemmap, p), order); @*/
486489
}
487490
}
488491

proof.sh

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
#/usr/bin/env bash
22
set -euo pipefail -o noclobber
33

4-
cn verify --no-vip page_alloc.c --solver-logging=solver_logs &> final_results.txt &
5-
tail --pid $! -fn +1 sovler_logs/z3_send_0.smt
6-
cat final_results.txt
4+
cn verify --no-vip page_alloc.c --solver-logging=solver_logs # &> final_results.txt &
5+
# tail --pid $! -fn +1 sovler_logs/z3_send_0.smt
6+
# cat final_results.txt
77

0 commit comments

Comments
 (0)