@@ -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)
404403static 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
0 commit comments