x64: fix word proof in Untyped_AI, re-add set_cap_valid_arch_objs_simple

This commit is contained in:
Joel Beeren 2017-02-13 12:24:47 +11:00
parent 677c82ca11
commit 037d0566e4
2 changed files with 171 additions and 135 deletions

View File

@ -30,7 +30,7 @@ where
"valid_untyped_inv_wcap (Retype slot reset ptr_base ptr ty us slots dev)
= (\<lambda>co s. \<exists>sz idx. (cte_wp_at (\<lambda>c. c = (cap.UntypedCap dev ptr_base sz idx)
\<and> (co = None \<or> co = Some c)) slot s
\<and> range_cover ptr sz (obj_bits_api ty us) (length slots)
\<and> range_cover ptr sz (obj_bits_api ty us) (length slots)
\<and> (idx \<le> unat (ptr - ptr_base) \<or> (reset \<and> ptr = ptr_base))
\<and> (ptr && ~~ mask sz) = ptr_base)
\<and> (reset \<longrightarrow> descendants_of slot (cdt s) = {})
@ -46,7 +46,7 @@ abbreviation
lemma valid_untyped_inv_wcap:
"valid_untyped_inv ui
= (\<lambda>s. \<exists>sz idx. valid_untyped_inv_wcap ui (Some
= (\<lambda>s. \<exists>sz idx. valid_untyped_inv_wcap ui (Some
(case ui of Retype slot reset ptr_base ptr ty us slots dev
\<Rightarrow> UntypedCap dev (ptr && ~~ mask sz) sz idx)) s)"
apply (cases ui)
@ -77,8 +77,8 @@ lemma cnode_cap_bits_range:
apply (drule invs_psp_aligned)
apply (unfold pspace_aligned_def)
apply (frule domI, drule (1) bspec)
apply (clarsimp simp: obj_bits.simps ex_with_length add.commute
cte_level_bits_def
apply (clarsimp simp: obj_bits.simps ex_with_length add.commute
cte_level_bits_def
split: if_split_asm)
done
@ -126,7 +126,7 @@ lemma Suc_length_not_empty:
by (fastforce simp: le_simps)
lemmas Suc_length_not_empty' = Suc_length_not_empty [OF refl]
lemmas Suc_length_not_empty' = Suc_length_not_empty [OF refl]
(* FIXME: hides Invariants_AI.caps_of_state_valid,
@ -154,7 +154,7 @@ lemma compute_free_index_wp:
"\<lbrace>\<top>\<rbrace> const_on_failure idx
(doE y \<leftarrow> ensure_no_children slot;
returnOk (0::nat)
odE)
odE)
\<lbrace>\<lambda>rv s. rv \<le> idx\<rbrace>"
apply (rule hoare_pre)
apply (wp const_on_failure_wp)
@ -170,7 +170,7 @@ lemma dui_inv[wp]:
apply (rule hoare_pre)
apply (simp split del: if_split
| wp_once mapME_x_inv_wp hoare_drop_imps const_on_failure_wp
| assumption
| assumption
| simp add: lookup_target_slot_def
| wpcw)+
done
@ -235,7 +235,7 @@ lemma get_cap_gets:
lemma lookup_cap_gets:
"\<lbrace>valid_objs\<rbrace> lookup_cap t c \<lbrace>\<lambda>rv s. \<exists>cref msk. cte_wp_at (\<lambda>cap. rv = mask_cap msk cap) cref s\<rbrace>,-"
unfolding lookup_cap_def fun_app_def split_def
unfolding lookup_cap_def fun_app_def split_def
apply (rule hoare_pre, wp get_cap_gets)
apply simp
done
@ -269,8 +269,8 @@ locale Untyped_AI_arch =
assumes data_to_obj_type_sp:
"\<And>P x. \<lbrace>P\<rbrace> data_to_obj_type x \<lbrace>\<lambda>ts (s::'state_ext state). ts \<noteq> ArchObject ASIDPoolObj \<and> P s\<rbrace>, -"
assumes dui_inv_wf[wp]:
"\<And>w sz idx slot cs label args dev.\<lbrace>invs and cte_wp_at (op = (cap.UntypedCap dev w sz idx)) slot
and (\<lambda>(s::'state_ext state). \<forall>cap \<in> set cs. is_cnode_cap cap
"\<And>w sz idx slot cs label args dev.\<lbrace>invs and cte_wp_at (op = (cap.UntypedCap dev w sz idx)) slot
and (\<lambda>(s::'state_ext state). \<forall>cap \<in> set cs. is_cnode_cap cap
\<longrightarrow> (\<forall>r\<in>cte_refs cap (interrupt_irq_node s). ex_cte_cap_wp_to is_cnode_cap r s))
and (\<lambda>s. \<forall>x \<in> set cs. s \<turnstile> x)\<rbrace>
decode_untyped_invocation label args slot (cap.UntypedCap dev w sz idx) cs
@ -295,13 +295,13 @@ locale Untyped_AI_arch =
init_arch_objects ty ptr n us y
\<lbrace>\<lambda>rv s. caps_overlap_reserved S s\<rbrace>"
assumes delete_objects_rewrite:
"\<And>sz ptr.\<lbrakk>2\<le> sz; sz\<le> word_bits;ptr && ~~ mask sz = ptr\<rbrakk> \<Longrightarrow> delete_objects ptr sz =
"\<And>sz ptr.\<lbrakk>2\<le> sz; sz\<le> word_bits;ptr && ~~ mask sz = ptr\<rbrakk> \<Longrightarrow> delete_objects ptr sz =
do y \<leftarrow> modify (clear_um {ptr + of_nat k |k. k < 2 ^ sz});
modify ((detype {ptr && ~~ mask sz..ptr + 2 ^ sz - 1})::'state_ext state \<Rightarrow> 'state_ext state)
od"
assumes obj_is_device_vui_eq:
"valid_untyped_inv ui (s :: 'state_ext state)
\<Longrightarrow> case ui of
\<Longrightarrow> case ui of
Retype slot reset ptr_base ptr tp us slots dev
\<Rightarrow> obj_is_device tp dev = dev"
@ -353,7 +353,7 @@ proof -
using cover le
apply -
apply (frule iffD1[OF meta_eq_to_obj_eq[OF range_cover_def]])
apply (clarsimp)
apply (clarsimp)
apply (frule range_cover_le[where n=x])
apply simp
apply (subst word_plus_and_or_coroll2[symmetric,where w = "mask sz"])
@ -386,7 +386,7 @@ lemma range_cover_stuff:
apply (clarsimp simp: range_cover_def)
proof (intro conjI)
assume not_0 : "0<n"
assume bound : "n \<le> unat ((2::machine_word) ^ sz - of_nat rv >> bits)" "rv\<le> 2^sz"
assume bound : "n \<le> unat ((2::machine_word) ^ sz - of_nat rv >> bits)" "rv\<le> 2^sz"
"sz < word_bits"
assume al: "is_aligned w sz"
have space: "(2::machine_word) ^ sz - of_nat rv \<le> 2^ sz"
@ -452,14 +452,14 @@ lemma range_cover_stuff:
apply simp
apply simp
done
show "n + unat (alignUp (w + ((of_nat rv)::machine_word)) bits && mask sz >> bits) \<le> 2 ^ (sz - bits)"
using not_0 bound cmp
apply -
apply (erule le_trans[OF add_le_mono])
apply (rule le_refl)
apply (clarsimp simp: power_sub field_simps td_gal[symmetric])
apply (subst (2) mult.commute)
apply (subst (2) mult.commute)
apply (subst unat_shiftl_absorb)
apply (rule order_trans[OF le_shiftr])
apply (rule word_and_le1)
@ -515,7 +515,7 @@ lemma range_cover_stuff:
done
show "alignUp (w + of_nat rv) bits && ~~ mask sz = w"
using bound not_0 cmp al
apply (clarsimp simp: alignUp_plus[OF is_aligned_weaken]
apply (clarsimp simp: alignUp_plus[OF is_aligned_weaken]
mask_out_add_aligned[symmetric])
apply (clarsimp simp: and_not_mask)
apply (subgoal_tac "alignUp ((of_nat rv)::machine_word) bits >> sz = 0")
@ -712,9 +712,9 @@ lemma of_nat_shiftR:
lemma valid_untypedD:
"\<lbrakk> s \<turnstile> cap.UntypedCap dev ptr bits idx; kheap s p = Some ko; pspace_aligned s\<rbrakk> \<Longrightarrow>
obj_range p ko \<inter> cap_range (cap.UntypedCap dev ptr bits idx) \<noteq> {} \<longrightarrow>
(obj_range p ko \<subseteq> cap_range (cap.UntypedCap dev ptr bits idx)
"\<lbrakk> s \<turnstile> cap.UntypedCap dev ptr bits idx; kheap s p = Some ko; pspace_aligned s\<rbrakk> \<Longrightarrow>
obj_range p ko \<inter> cap_range (cap.UntypedCap dev ptr bits idx) \<noteq> {} \<longrightarrow>
(obj_range p ko \<subseteq> cap_range (cap.UntypedCap dev ptr bits idx)
\<and> obj_range p ko \<inter> usable_untyped_range (cap.UntypedCap dev ptr bits idx) = {})"
by (clarsimp simp: valid_untyped_def valid_cap_def cap_range_def obj_range_def)
@ -727,7 +727,7 @@ lemma pspace_no_overlap_detype':
apply (frule(2) valid_untypedD)
apply (rule ccontr)
apply (clarsimp simp del: atLeastAtMost_iff atLeastatMost_subset_iff atLeastLessThan_iff
Int_atLeastAtMost atLeastatMost_empty_iff is_aligned_neg_mask_eq
Int_atLeastAtMost atLeastatMost_empty_iff is_aligned_neg_mask_eq
simp: valid_cap_def cap_aligned_def obj_range_def cap_range_def is_aligned_neg_mask_eq p_assoc_help)
apply (drule_tac x= x in set_mp)
apply simp+
@ -884,9 +884,9 @@ lemma cs_cap_aligned:
end
lemma untyped_ranges_aligned_disjoing_or_subset:
"\<lbrakk>cap_aligned c1;cap_aligned c2\<rbrakk> \<Longrightarrow>
untyped_range c1 \<subseteq> untyped_range c2
\<or> untyped_range c2 \<subseteq> untyped_range c1
"\<lbrakk>cap_aligned c1;cap_aligned c2\<rbrakk> \<Longrightarrow>
untyped_range c1 \<subseteq> untyped_range c2
\<or> untyped_range c2 \<subseteq> untyped_range c1
\<or> untyped_range c1 \<inter> untyped_range c2 = {}"
apply (simp add: cap_aligned_def)
apply (elim conjE)
@ -900,8 +900,8 @@ lemma untyped_ranges_aligned_disjoing_or_subset:
locale mdb_create_cap = vo_abs + mdb_insert_abs +
fixes cap
assumes c_dest: "cs dest = Some cap.NullCap"
assumes c_src: "cs src = Some cap"
assumes c_dest: "cs dest = Some cap.NullCap"
assumes c_src: "cs src = Some cap"
assumes ut: "is_untyped_cap cap"
begin
lemmas no_dest_mdb [simp] = null_no_mdb [OF c_dest]
@ -922,13 +922,13 @@ lemma subseteq_imp_not_subset: "A \<subseteq> B \<Longrightarrow> \<not> B \<sub
lemma cap_bits_default_untyped_cap:
"is_untyped_cap (default_cap tp oref sz dev) \<Longrightarrow>
cap_bits (default_cap tp oref sz dev) = sz"
cap_bits (default_cap tp oref sz dev) = sz"
by (case_tac tp,simp_all)
lemma untyped_inc':
assumes inc: "untyped_inc m cs"
assumes d: "descendants_range (default_cap tp oref sz dev) src s"
assumes d: "descendants_range (default_cap tp oref sz dev) src s"
assumes r: "untyped_range (default_cap tp oref sz dev) \<subseteq> untyped_range cap"
assumes al: "cap_aligned (default_cap tp oref sz dev)"
assumes noint: "untyped_range (default_cap tp oref sz dev) \<inter> usable_untyped_range cap = {}"
@ -1097,7 +1097,7 @@ lemma inter_non_emptyD:
by blast
lemma cap_class_default_cap:
lemma cap_class_default_cap:
"cap_class (default_cap tp oref sz dev) = PhysicalClass"
apply (case_tac tp)
apply (simp_all add: default_cap_def physical_arch_cap_has_ref aobj_ref_default)
@ -1106,8 +1106,8 @@ lemma cap_class_default_cap:
lemma untyped_incD2:
"\<lbrakk>cs p = Some c; is_untyped_cap c; cs p' = Some c'; is_untyped_cap c'; untyped_inc m cs\<rbrakk>
\<Longrightarrow> untyped_range c \<inter> untyped_range c' \<noteq> {} \<longrightarrow> p \<in> descendants_of p' m \<and> untyped_range c \<subseteq> untyped_range c'
\<or> p' \<in> descendants_of p m \<and> untyped_range c'\<subseteq> untyped_range c
\<Longrightarrow> untyped_range c \<inter> untyped_range c' \<noteq> {} \<longrightarrow> p \<in> descendants_of p' m \<and> untyped_range c \<subseteq> untyped_range c'
\<or> p' \<in> descendants_of p m \<and> untyped_range c'\<subseteq> untyped_range c
\<or> p = p'"
apply (drule(4) untyped_incD)
apply (rule ccontr)
@ -1115,11 +1115,11 @@ lemma untyped_incD2:
apply clarsimp+
done
lemma create_cap_mdb[wp]:
"\<lbrace>valid_mdb
and valid_objs
and cte_wp_at (\<lambda>c. is_untyped_cap c \<and>
and cte_wp_at (\<lambda>c. is_untyped_cap c \<and>
obj_refs (default_cap tp oref sz dev) \<subseteq> untyped_range c \<and>
untyped_range (default_cap tp oref sz dev) \<subseteq> untyped_range c
\<and> untyped_range (default_cap tp oref sz dev) \<inter> usable_untyped_range c = {}) p
@ -1142,7 +1142,7 @@ lemma create_cap_mdb[wp]:
apply (rule mdb_cte_atI)
apply (simp add: is_cap_simps split: if_split_asm)
apply (drule(1) mdb_cte_atD,clarsimp)+
apply (simp add: untyped_mdb_def descendants_of_def mdb_insert_abs.parency
apply (simp add: untyped_mdb_def descendants_of_def mdb_insert_abs.parency
del: split_paired_All)
apply (intro allI conjI impI)
apply (clarsimp simp: is_cap_simps)
@ -1195,7 +1195,7 @@ lemma create_cap_mdb[wp]:
apply (simp add: reply_master_revocable_def del: split_paired_All)
apply (simp add: reply_mdb_def)
apply (subgoal_tac "\<And>t m. default_cap tp oref sz dev \<noteq> cap.ReplyCap t m")
apply (rule conjI)
apply (rule conjI)
apply (fastforce simp: reply_caps_mdb_def descendants_of_def
mdb_insert_abs.parency
simp del: split_paired_All split_paired_Ex
@ -1208,12 +1208,12 @@ lemma create_cap_mdb[wp]:
done
lemma create_cap_descendants_range[wp]:
"\<lbrace>descendants_range c p and
"\<lbrace>descendants_range c p and
K (cap_range c \<inter> cap_range (default_cap tp oref sz dev) = {}) and
cte_wp_at (op \<noteq> cap.NullCap) p and
cte_wp_at (op = cap.NullCap) cref and
valid_mdb\<rbrace>
create_cap tp sz p dev (cref,oref)
cte_wp_at (op = cap.NullCap) cref and
valid_mdb\<rbrace>
create_cap tp sz p dev (cref,oref)
\<lbrace>\<lambda>rv. descendants_range c p\<rbrace>"
apply (simp add: create_cap_def descendants_range_def cte_wp_at_caps_of_state set_cdt_def)
apply (wp set_cap_caps_of_state2 | simp del: fun_upd_apply)+
@ -1249,12 +1249,12 @@ lemma cap_range_inter_emptyD:
done
lemma create_cap_overlap_reserved [wp]:
"\<lbrace>caps_overlap_reserved (untyped_range c) and
"\<lbrace>caps_overlap_reserved (untyped_range c) and
K (cap_range c \<inter> cap_range (default_cap tp oref sz dev) = {}) and
cte_wp_at (op \<noteq> cap.NullCap) p and
cte_wp_at (op = cap.NullCap) cref and
valid_mdb and K (cap_aligned (default_cap tp oref sz dev))\<rbrace>
create_cap tp sz p dev (cref,oref)
cte_wp_at (op = cap.NullCap) cref and
valid_mdb and K (cap_aligned (default_cap tp oref sz dev))\<rbrace>
create_cap tp sz p dev (cref,oref)
\<lbrace>\<lambda>rv s. caps_overlap_reserved (untyped_range c) s\<rbrace>"
apply (simp add: create_cap_def caps_overlap_reserved_def cte_wp_at_caps_of_state set_cdt_def)
apply (wp set_cap_caps_of_state2 | simp del: fun_upd_apply)+
@ -1289,14 +1289,14 @@ lemma retype_region_invs_extras:
and K (ty = CapTableObject \<longrightarrow> 0 < us)
and K (range_cover ptr sz (obj_bits_api ty us) n)\<rbrace>
retype_region ptr n us ty dev\<lbrace>\<lambda>rv. valid_objs\<rbrace>"
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
and caps_overlap_reserved {ptr..ptr + of_nat n * 2 ^ obj_bits_api ty us - 1}
and region_in_kernel_window {ptr..(ptr && ~~ mask sz) + 2 ^ sz - 1}
and (\<lambda>s. \<exists>slot. cte_wp_at (\<lambda>c. {ptr..(ptr && ~~ mask sz) + (2 ^ sz - 1)} \<subseteq> cap_range c \<and> cap_is_device c = dev) slot s)
and K (ty = CapTableObject \<longrightarrow> 0 < us)
and K (range_cover ptr sz (obj_bits_api ty us) n)\<rbrace>
retype_region ptr n us ty dev \<lbrace>\<lambda>rv. pspace_distinct\<rbrace>"
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
and caps_overlap_reserved {ptr..ptr + of_nat n * 2 ^ obj_bits_api ty us - 1}
and region_in_kernel_window {ptr..(ptr && ~~ mask sz) + 2 ^ sz - 1}
and (\<lambda>s. \<exists>slot. cte_wp_at (\<lambda>c. {ptr..(ptr && ~~ mask sz) + (2 ^ sz - 1)} \<subseteq> cap_range c \<and> cap_is_device c = dev) slot s)
@ -1310,7 +1310,7 @@ lemma retype_region_invs_extras:
and K (ty = CapTableObject \<longrightarrow> 0 < us)
and K (range_cover ptr sz (obj_bits_api ty us) n)\<rbrace>
retype_region ptr n us ty dev\<lbrace>\<lambda>rv. valid_global_objs\<rbrace>"
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
"\<lbrace>invs and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz
and caps_overlap_reserved {ptr..ptr + of_nat n * 2 ^ obj_bits_api ty us - 1}
and region_in_kernel_window {ptr..(ptr && ~~ mask sz) + 2 ^ sz - 1}
and (\<lambda>s. \<exists>slot. cte_wp_at (\<lambda>c. {ptr..(ptr && ~~ mask sz) + (2 ^ sz - 1)} \<subseteq> cap_range c \<and> cap_is_device c = dev) slot s)
@ -1350,17 +1350,17 @@ lemma retype_ret_valid_caps:
apply wp
apply (case_tac tp,simp_all)
defer
apply ((clarsimp simp:valid_cap_def default_object_def cap_aligned_def
apply ((clarsimp simp:valid_cap_def default_object_def cap_aligned_def
cte_level_bits_def is_obj_defs well_formed_cnode_n_def empty_cnode_def
dom_def ptr_add_def | rule conjI | intro conjI obj_at_foldr_intro imageI
| rule is_aligned_add_multI[OF _ le_refl],
(simp add:range_cover_def word_bits_def obj_bits_api_def)+)+)[3]
apply (rule_tac ptr=ptr and sz=sz in retype_ret_valid_caps_captable; simp)
apply (rule_tac ptr=ptr and sz=sz in retype_ret_valid_caps_aobj; simp)
apply (clarsimp simp:valid_cap_def default_object_def cap_aligned_def
apply (clarsimp simp:valid_cap_def default_object_def cap_aligned_def
cte_level_bits_def is_obj_defs well_formed_cnode_n_def empty_cnode_def
dom_def ptr_add_def | intro conjI obj_at_foldr_intro
imageI
imageI
| rule is_aligned_add_multI[OF _ le_refl]
| fastforce simp:range_cover_def obj_bits_api_def
word_bits_def a_type_def)+
@ -1570,10 +1570,10 @@ lemma retype_region_ranges':
lemma retype_region_ranges:
"\<lbrace>cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz
\<and> obj_ref_of c = ptr && ~~ mask sz) p and
\<and> obj_ref_of c = ptr && ~~ mask sz) p and
pspace_no_overlap_range_cover ptr sz and
valid_pspace and K (range_cover ptr sz (obj_bits_api tp us) n)
\<rbrace>
\<rbrace>
retype_region ptr n us tp dev
\<lbrace>\<lambda>rv s. \<forall>y\<in>set rv. cte_wp_at
(\<lambda>c. cap_range (default_cap tp y us dev) \<subseteq> untyped_range c )
@ -1599,7 +1599,7 @@ lemma retype_region_ranges:
done
end
lemma map_snd_zip_prefix_help:
lemma map_snd_zip_prefix_help:
"map (\<lambda>tup. cap_range (default_cap tp (snd tup) us dev)) (zip xs ys) \<le>
map (\<lambda>x. cap_range (default_cap tp x us dev)) ys"
apply (induct xs arbitrary: ys)
@ -1608,9 +1608,9 @@ lemma map_snd_zip_prefix_help:
apply auto
done
context Untyped_AI_arch begin
context Untyped_AI_arch begin
lemma retype_region_distinct_sets:
"\<lbrace>K (range_cover ptr sz (obj_bits_api tp us) n)\<rbrace>
"\<lbrace>K (range_cover ptr sz (obj_bits_api tp us) n)\<rbrace>
retype_region ptr n us tp dev
\<lbrace>\<lambda>rv s. distinct_sets (map (\<lambda>tup. cap_range (default_cap tp (snd tup) us dev)) (zip xs rv))\<rbrace>"
apply (simp add: distinct_sets_prop)
@ -1630,8 +1630,8 @@ lemma retype_region_distinct_sets:
apply simp
apply (simp add:range_cover_def)
apply (erule range_cover.range_cover_n_le)
apply (clarsimp simp: add_diff_eq[symmetric]
simp del: Int_atLeastAtMost
apply (clarsimp simp: add_diff_eq[symmetric]
simp del: Int_atLeastAtMost
dest!: less_two_pow_divD)
apply (simp add: obj_bits_api_def ptr_add_def shiftl_t2n[simplified mult.commute, symmetric] del: Int_atLeastAtMost)
apply (rule aligned_neq_into_no_overlap)
@ -1669,8 +1669,8 @@ lemma delete_objects_pspace_no_overlap[wp]:
done
lemma retype_region_descendants_range:
"\<lbrace>\<lambda>s. descendants_range x cref s
\<and> pspace_no_overlap_range_cover ptr sz s \<and> valid_pspace s
"\<lbrace>\<lambda>s. descendants_range x cref s
\<and> pspace_no_overlap_range_cover ptr sz s \<and> valid_pspace s
\<and> range_cover ptr sz (obj_bits_api ty us) n\<rbrace> retype_region ptr n us ty dev
\<lbrace>\<lambda>rv s. descendants_range x cref s\<rbrace>"
apply (simp add:descendants_range_def)
@ -1687,9 +1687,9 @@ lemma cap_range_def2:
context Untyped_AI_arch begin
lemma retype_region_descendants_range_ret:
"\<lbrace>\<lambda>s. (range_cover ptr sz (obj_bits_api ty us) n)
\<and> pspace_no_overlap_range_cover ptr sz s
\<and> valid_pspace s
"\<lbrace>\<lambda>s. (range_cover ptr sz (obj_bits_api ty us) n)
\<and> pspace_no_overlap_range_cover ptr sz s
\<and> valid_pspace s
\<and> range_cover ptr sz (obj_bits_api ty us) n
\<and> descendants_range_in {ptr..ptr + of_nat n * 2^(obj_bits_api ty us) - 1} cref s
\<rbrace>
@ -1708,7 +1708,7 @@ lemma retype_region_descendants_range_ret:
apply (frule(1) range_cover_subset)
apply simp
apply (erule subset_trans[rotated])
apply (subgoal_tac "ptr + of_nat p * 2 ^ obj_bits_api ty us
apply (subgoal_tac "ptr + of_nat p * 2 ^ obj_bits_api ty us
\<le> ptr + of_nat p * 2 ^ obj_bits_api ty us + 2 ^ obj_bits_api ty us - 1")
prefer 2
apply (rule is_aligned_no_overflow)
@ -1718,7 +1718,7 @@ lemma retype_region_descendants_range_ret:
done
end
lemma caps_overlap_reserved_def2:
lemma caps_overlap_reserved_def2:
"caps_overlap_reserved S =
(\<lambda>s. (\<forall>cap \<in> ran (null_filter (caps_of_state s)).
is_untyped_cap cap \<longrightarrow> usable_untyped_range cap \<inter> S = {}))"
@ -1732,7 +1732,7 @@ lemma caps_overlap_reserved_def2:
apply (elim ballE impE)
apply simp
apply simp
apply (clarsimp simp: ran_def null_filter_def is_cap_simps
apply (clarsimp simp: ran_def null_filter_def is_cap_simps
simp del: split_paired_All split_paired_Ex split: if_splits)
apply (drule_tac x = "(a,b)" in spec)
apply simp
@ -1740,7 +1740,7 @@ lemma caps_overlap_reserved_def2:
lemma set_cap_valid_mdb_simple:
"\<lbrace>\<lambda>s. valid_objs s \<and> valid_mdb s \<and> descendants_range_in {ptr .. ptr+2^sz - 1} cref s
"\<lbrace>\<lambda>s. valid_objs s \<and> valid_mdb s \<and> descendants_range_in {ptr .. ptr+2^sz - 1} cref s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz \<and> obj_ref_of c = ptr \<and> cap_is_device c = dev) cref s\<rbrace>
set_cap (cap.UntypedCap dev ptr sz idx) cref
\<lbrace>\<lambda>rv s'. valid_mdb s'\<rbrace>"
@ -1749,7 +1749,7 @@ lemma set_cap_valid_mdb_simple:
apply (wp set_cap_mdb_cte_at)
apply (wps set_cap_rvk_cdt_ct_ms)
apply wp_trace
apply (clarsimp simp: cte_wp_at_caps_of_state is_cap_simps
apply (clarsimp simp: cte_wp_at_caps_of_state is_cap_simps
reply_master_revocable_def irq_revocable_def reply_mdb_def)
unfolding fun_upd_def[symmetric]
apply clarsimp
@ -1877,7 +1877,7 @@ lemma set_cap_valid_mdb_simple:
lemma set_free_index_valid_pspace_simple:
"\<lbrace>\<lambda>s. valid_mdb s \<and> valid_pspace s \<and> pspace_no_overlap_range_cover ptr sz s
\<and> descendants_range_in {ptr .. ptr+2^sz - 1} cref s
\<and> descendants_range_in {ptr .. ptr+2^sz - 1} cref s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz \<and> obj_ref_of c = ptr) cref s
\<and> idx \<le> 2^ sz\<rbrace>
set_cap (cap.UntypedCap dev ptr sz idx) cref
@ -1904,7 +1904,7 @@ lemma set_free_index_valid_pspace_simple:
done
lemma set_untyped_cap_refs_respects_device_simple:
"\<lbrace>K (is_untyped_cap cap) and cte_wp_at (op = cap) cref and cap_refs_respects_device_region \<rbrace> set_cap (UntypedCap (cap_is_device cap) (obj_ref_of cap) (cap_bits cap) idx) cref
"\<lbrace>K (is_untyped_cap cap) and cte_wp_at (op = cap) cref and cap_refs_respects_device_region \<rbrace> set_cap (UntypedCap (cap_is_device cap) (obj_ref_of cap) (cap_bits cap) idx) cref
\<lbrace>\<lambda>rv s. cap_refs_respects_device_region s\<rbrace>"
apply (wp set_cap_cap_refs_respects_device_region)
apply (clarsimp simp del: split_paired_Ex)
@ -1915,13 +1915,13 @@ lemma set_untyped_cap_refs_respects_device_simple:
lemma set_untyped_cap_caps_overlap_reserved:
"\<lbrace>\<lambda>s. invs s \<and> S \<subseteq> {ptr..ptr + 2 ^ sz - 1} \<and>
usable_untyped_range (cap.UntypedCap dev ptr sz idx') \<inter> S = {} \<and>
usable_untyped_range (cap.UntypedCap dev ptr sz idx') \<inter> S = {} \<and>
descendants_range_in S cref s \<and> cte_wp_at (op = (cap.UntypedCap dev ptr sz idx)) cref s\<rbrace>
set_cap (cap.UntypedCap dev ptr sz idx') cref
\<lbrace>\<lambda>rv s. caps_overlap_reserved S s\<rbrace>"
apply (unfold caps_overlap_reserved_def)
apply wp
apply (clarsimp simp: cte_wp_at_caps_of_state caps_overlap_reserved_def
apply (clarsimp simp: cte_wp_at_caps_of_state caps_overlap_reserved_def
simp del: usable_untyped_range.simps split: if_split_asm)
apply (frule invs_mdb)
apply (erule ranE)
@ -1961,7 +1961,7 @@ lemma set_untyped_cap_caps_overlap_reserved:
lemma set_cap_caps_no_overlap:
"\<lbrace>cte_wp_at (\<lambda>c. untyped_range c = untyped_range cap) cref and caps_no_overlap ptr sz\<rbrace> set_cap cap cref
"\<lbrace>cte_wp_at (\<lambda>c. untyped_range c = untyped_range cap) cref and caps_no_overlap ptr sz\<rbrace> set_cap cap cref
\<lbrace>\<lambda>r s. caps_no_overlap ptr sz s\<rbrace>"
apply (simp add: caps_no_overlap_def)
apply wp
@ -2016,11 +2016,11 @@ lemma not_inD:"\<lbrakk>x \<notin> A; y \<in> A\<rbrakk> \<Longrightarrow>x \<no
lemma caps_of_state_no_overlapD:
"\<lbrakk>caps_of_state s slot = Some cap; valid_objs s; pspace_aligned s;
pspace_no_overlap S s\<rbrakk>
pspace_no_overlap S s\<rbrakk>
\<Longrightarrow> (fst slot) \<notin> S"
apply (drule caps_of_state_cteD)
apply (clarsimp simp: cte_wp_at_cases obj_at_def
simp del: atLeastAtMost_iff atLeastatMost_subset_iff
apply (clarsimp simp: cte_wp_at_cases obj_at_def
simp del: atLeastAtMost_iff atLeastatMost_subset_iff
atLeastLessThan_iff Int_atLeastAtMost)
apply (elim disjE)
apply clarify
@ -2030,7 +2030,7 @@ lemma caps_of_state_no_overlapD:
unfolding obj_range_def
apply (drule notemptyI)+
apply (simp add: Int_ac p_assoc_help
del: atLeastAtMost_iff atLeastatMost_subset_iff
del: atLeastAtMost_iff atLeastatMost_subset_iff
atLeastLessThan_iff Int_atLeastAtMost)
apply clarify
apply (frule(2) p_in_obj_range)
@ -2039,7 +2039,7 @@ lemma caps_of_state_no_overlapD:
unfolding obj_range_def
apply (drule notemptyI)+
apply (simp add: Int_ac p_assoc_help add.commute
del: atLeastAtMost_iff atLeastatMost_subset_iff
del: atLeastAtMost_iff atLeastatMost_subset_iff
atLeastLessThan_iff Int_atLeastAtMost)
done
@ -2062,7 +2062,7 @@ lemma descendants_range_in_subseteq:
(* FIXME: move *)
lemma is_aligned_neg_mask_eq':
lemma is_aligned_neg_mask_eq':
"is_aligned ptr sz = (ptr && ~~ mask sz = ptr)"
apply (rule iffI)
apply (erule is_aligned_neg_mask_eq)
@ -2243,7 +2243,7 @@ lemma range_cover_idx_compare:
done
locale invoke_untyped_proofs =
locale invoke_untyped_proofs =
fixes s cref reset ptr_base ptr tp us slots ptr' sz idx dev
assumes vui: "valid_untyped_inv_wcap (Retype cref reset ptr_base ptr tp us slots dev)
(Some (UntypedCap dev (ptr && ~~ mask sz) sz idx)) s"
@ -2354,7 +2354,7 @@ lemma ex_cte_no_overlap:
using cte_wp_at
apply clarsimp
apply (drule ex_cte_cap_to_obj_ref_disj,erule disjE)
using misc
using misc
apply clarsimp
apply (rule_tac ptr' = "(aa,b)" in untyped_children_in_mdbEE[OF invs_untyped_children])
apply simp+
@ -2385,7 +2385,7 @@ lemma cref_inv: "fst cref \<notin> usable_range"
apply simp
done
lemma slots_invD: "\<And>x. x \<in> set slots \<Longrightarrow>
lemma slots_invD: "\<And>x. x \<in> set slots \<Longrightarrow>
x \<noteq> cref \<and> fst x \<notin> usable_range \<and> ex_cte_cap_wp_to (\<lambda>_. True) x s"
using misc cte_wp_at vui
apply (clarsimp simp: cte_wp_at_caps_of_state)
@ -2511,7 +2511,7 @@ lemma valid_untyped_cap_inc:
apply simp
apply simp
apply (erule disjoint_subset[rotated])
apply (frule(1) le_mask_le_2p[OF _
apply (frule(1) le_mask_le_2p[OF _
range_cover.sz(1)[where 'a=machine_word_len, folded word_bits_def]])
apply clarsimp
apply (rule word_plus_mono_right)
@ -2552,7 +2552,7 @@ lemma ex_nonz_cap_to_overlap:
descendants_range cap p s \<rbrakk>
\<Longrightarrow> \<not> t \<in> untyped_range cap"
apply (rule ccontr)
apply (clarsimp simp: ex_nonz_cap_to_def descendants_range_def2
apply (clarsimp simp: ex_nonz_cap_to_def descendants_range_def2
cte_wp_at_caps_of_state caps_no_overlap_def zobj_refs_to_obj_refs)
apply (frule invs_mdb)
apply (clarsimp simp: valid_mdb_def)
@ -2560,7 +2560,7 @@ lemma ex_nonz_cap_to_overlap:
apply simp+
apply blast
apply simp
apply (drule(2) descendants_range_inD)
apply (drule(2) descendants_range_inD)
apply (simp add: cap_range_def)
apply blast
done
@ -2724,7 +2724,7 @@ lemma delete_objects_ex_cte_cap_wp_to:
"\<lbrace>ex_cte_cap_wp_to P slot and invs and
cte_wp_at (\<lambda>cp. is_untyped_cap cp \<and> {ptr_base .. ptr_base + 2 ^ sz - 1} \<subseteq> untyped_range cp)
src_slot and (\<lambda>s. descendants_of src_slot (cdt s) = {})\<rbrace>
delete_objects ptr_base sz
delete_objects ptr_base sz
\<lbrace>\<lambda>rv s. ex_cte_cap_wp_to P slot s\<rbrace>"
apply (simp add: delete_objects_def ex_cte_cap_wp_to_def)
apply (rule hoare_pre)
@ -2740,7 +2740,7 @@ lemma delete_objects_ex_cte_cap_wp_to:
lemma do_machine_op_ex_cte_cap_wp_to[wp]:
"\<lbrace>ex_cte_cap_wp_to P slot\<rbrace>
do_machine_op oper
do_machine_op oper
\<lbrace>\<lambda>rv s. ex_cte_cap_wp_to P slot s\<rbrace>"
apply (simp add: do_machine_op_def split_def)
apply wp
@ -2790,17 +2790,16 @@ lemma caps_of_state_pspace_no_overlapD:
apply (simp add: cte_wp_at_caps_of_state is_aligned_neg_mask_eq)
apply (simp add: is_aligned_neg_mask_eq)
apply (simp add: mask_out_sub_mask)
sorry (* word proof needed for unat_of_nat32
apply (subst unat_of_nat32, erule order_less_le_trans, simp_all)
apply (subst unat_of_nat_eq[where 'a=machine_word_len, unfolded word_bits_len_of],
erule order_less_le_trans, simp_all)
apply (rule word_of_nat_less)
apply (erule order_less_le_trans)
apply simp
done
*)
lemma set_untyped_cap_invs_simple:
"\<lbrace>\<lambda>s. descendants_range_in {ptr .. ptr+2^sz - 1} cref s
\<and> pspace_no_overlap_range_cover ptr sz s \<and> invs s
\<and> pspace_no_overlap_range_cover ptr sz s \<and> invs s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz
\<and> cap_is_device c = dev\<and> obj_ref_of c = ptr) cref s \<and> idx \<le> 2^ sz\<rbrace>
set_cap (cap.UntypedCap dev ptr sz idx) cref
@ -2814,8 +2813,7 @@ lemma set_untyped_cap_invs_simple:
apply wps
apply (wp hoare_vcg_all_lift set_cap_irq_handlers set_cap_arch_objs
set_cap_valid_global_objs set_cap_irq_handlers cap_table_at_lift_valid
set_cap_typ_at set_cap_valid_arch_caps_simple
set_cap_kernel_window_simple
set_cap_typ_at set_cap_valid_arch_caps_simple set_cap_kernel_window_simple
set_cap_cap_refs_respects_device_region)
apply (clarsimp simp del: split_paired_Ex)
apply (strengthen exI[where x=cref])
@ -3050,7 +3048,7 @@ lemma create_cap_valid_global_refs[wp]:
apply (simp add: valid_global_refs_def valid_refs_def
cte_wp_at_caps_of_state create_cap_def pred_conj_def)
apply (simp only: imp_conv_disj)
(* FIXME: wp_cleanup
(* FIXME: wp_cleanup
apply (rule hoare_pre)
apply (wp hoare_vcg_all_lift hoare_vcg_disj_lift
| simp split del: if_split)+
@ -3096,7 +3094,7 @@ lemma create_cap_irq_handlers[wp]:
crunch valid_arch_objs[wp]: create_cap "valid_arch_objs"
(simp: crunch_simps)
locale Untyped_AI_nonempty_table =
locale Untyped_AI_nonempty_table =
fixes state_ext_t :: "('state_ext::state_ext) itself"
fixes nonempty_table :: "machine_word set \<Rightarrow> Structures_A.kernel_object \<Rightarrow> bool"
assumes create_cap_valid_arch_caps[wp]:
@ -3164,7 +3162,7 @@ interpretation create_cap: non_arch_non_mem_op "create_cap tp sz p slot dev"
crunch valid_irq_states[wp]: create_cap "valid_irq_states"
crunch pspace_respects_device_region[wp]: create_cap pspace_respects_device_region
lemma cap_range_subseteq_weaken:
lemma cap_range_subseteq_weaken:
"\<lbrakk>obj_refs c \<subseteq> untyped_range cap; untyped_range c \<subseteq> untyped_range cap\<rbrakk>
\<Longrightarrow> cap_range c \<subseteq> cap_range cap"
by (fastforce simp add: cap_range_def)
@ -3174,7 +3172,7 @@ lemma create_cap_refs_respects_device:
create_cap tp sz p dev (cref, oref) \<lbrace>\<lambda>rv s. cap_refs_respects_device_region s\<rbrace>"
apply (simp add: create_cap_def)
apply (rule hoare_pre)
apply (wp set_cap_cap_refs_respects_device_region hoare_vcg_ex_lift
apply (wp set_cap_cap_refs_respects_device_region hoare_vcg_ex_lift
set_cdt_cte_wp_at | simp del: split_paired_Ex)+
apply (rule_tac x = p in exI)
apply clarsimp
@ -3182,9 +3180,9 @@ lemma create_cap_refs_respects_device:
apply (fastforce simp: is_cap_simps)
done
lemma (in Untyped_AI_nonempty_table) create_cap_invs[wp]:
"\<lbrace>invs
"\<lbrace>invs
and cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_is_device (default_cap tp oref sz dev) = cap_is_device c
\<and> obj_refs (default_cap tp oref sz dev) \<subseteq> untyped_range c \<and>
untyped_range (default_cap tp oref sz dev) \<subseteq> untyped_range c
@ -3237,7 +3235,7 @@ lemma (in Untyped_AI_nonempty_table) create_cap_nonempty_tables[wp]:
apply (clarsimp simp: nonempty_table_caps_of)
done
lemma cap_range_not_untyped:
lemma cap_range_not_untyped:
"\<not> is_untyped_cap c \<Longrightarrow> cap_range c = obj_refs c"
apply (case_tac c)
apply (simp_all add: is_cap_simps cap_range_def)
@ -3260,15 +3258,15 @@ lemma (in Untyped_AI_nonempty_table) create_caps_invs_inv:
and valid_cap (default_cap tp oref sz dev)\<rbrace>
create_cap tp sz p dev (cref,oref) \<lbrace>\<lambda>_. Q \<rbrace>"
shows
"\<lbrace>(\<lambda>s. invs (s::('state_ext::state_ext) state) \<and> Q s
"\<lbrace>(\<lambda>s. invs (s::('state_ext::state_ext) state) \<and> Q s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> obj_is_device tp dev = cap_is_device c) p s
\<and> (\<forall>tup \<in> set ((cref,oref)#list).
\<and> (\<forall>tup \<in> set ((cref,oref)#list).
cte_wp_at (\<lambda>c. cap_range (default_cap tp (snd tup) sz dev) \<subseteq> untyped_range c
\<and> {snd tup .. snd tup + 2 ^ (obj_bits_api tp us) - 1} \<subseteq> untyped_range c
\<and> (untyped_range (default_cap tp (snd tup) sz dev) \<inter> usable_untyped_range c = {})) p s)
\<and> (\<forall>tup \<in> set ((cref,oref)#list).
descendants_range (default_cap tp (snd tup) sz dev) p s)
\<and> distinct_sets (map (\<lambda>tup. cap_range (default_cap tp (snd tup) sz dev)) ((cref,oref)#list))
descendants_range (default_cap tp (snd tup) sz dev) p s)
\<and> distinct_sets (map (\<lambda>tup. cap_range (default_cap tp (snd tup) sz dev)) ((cref,oref)#list))
\<and> (\<forall>tup \<in> set ((cref,oref)#list).
cte_wp_at (op = cap.NullCap) (fst tup) s)
\<and> (\<forall>tup \<in> set ((cref,oref)#list).
@ -3283,10 +3281,10 @@ lemma (in Untyped_AI_nonempty_table) create_caps_invs_inv:
\<and> distinct (p # (map fst ((cref,oref)#list)))
\<and> tp \<noteq> ArchObject ASIDPoolObj) \<rbrace>
create_cap tp sz p dev (cref,oref)
\<lbrace>(\<lambda>r s.
invs s \<and> Q s
\<lbrace>(\<lambda>r s.
invs s \<and> Q s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> obj_is_device tp dev = cap_is_device c) p s
\<and> (\<forall>tup \<in> set list.
\<and> (\<forall>tup \<in> set list.
cte_wp_at (\<lambda>c.
cap_range (default_cap tp (snd tup) sz dev) \<subseteq> untyped_range c
\<and> {snd tup .. snd tup + 2 ^ (obj_bits_api tp us) - 1} \<subseteq> untyped_range c
@ -3339,7 +3337,7 @@ lemma (in Untyped_AI_nonempty_table) create_caps_invs:
shows
"\<lbrace>(\<lambda>s. invs (s::('state_ext::state_ext) state) \<and> (Q::('state_ext::state_ext) state \<Rightarrow> bool) s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> obj_is_device tp dev = cap_is_device c) p s
\<and> (\<forall>tup \<in> set (zip crefs orefs).
\<and> (\<forall>tup \<in> set (zip crefs orefs).
cte_wp_at (\<lambda>c. cap_range (default_cap tp (snd tup) sz dev) \<subseteq> untyped_range c
\<and> {snd tup .. snd tup + 2 ^ (obj_bits_api tp us) - 1} \<subseteq> untyped_range c
\<and> (untyped_range (default_cap tp (snd tup) sz dev) \<inter> usable_untyped_range c = {})) p s)
@ -3369,7 +3367,7 @@ lemma (in Untyped_AI_nonempty_table) create_caps_invs:
apply (induct ("zip crefs orefs"))
apply (simp add: mapM_x_def sequence_x_def)
apply wpsimp
apply (clarsimp simp add: mapM_x_def sequence_x_def)
apply (clarsimp simp add: mapM_x_def sequence_x_def)
apply (rule hoare_seq_ext)
apply assumption
apply (thin_tac "valid a b c" for a b c)
@ -3421,7 +3419,7 @@ lemma retype_region_obj_ref_range:
done
lemma retype_region_not_cte_wp_at:
"\<lbrace>(\<lambda>s. \<not> cte_wp_at P p s) and valid_pspace and
"\<lbrace>(\<lambda>s. \<not> cte_wp_at P p s) and valid_pspace and
caps_overlap_reserved {ptr..ptr + of_nat n * 2 ^ obj_bits_api tp us - 1} and
valid_mdb and pspace_no_overlap_range_cover ptr sz and caps_no_overlap ptr sz and
(\<lambda>s. \<exists>cref. cte_wp_at (\<lambda>c. up_aligned_area ptr sz \<subseteq> cap_range c \<and> cap_is_device c = dev) cref s) and
@ -3557,7 +3555,7 @@ lemma ex_cte_cap_wp_to_def_msu[simp]:
by (simp add: ex_cte_cap_wp_to_def)
lemma (in Untyped_AI_arch) retype_region_caps_reserved:
"\<lbrace>cte_wp_at (is_untyped_cap) p and caps_overlap_reserved {ptr..ptr + of_nat (n * 2 ^ obj_bits_api tp us) - 1}
"\<lbrace>cte_wp_at (is_untyped_cap) p and caps_overlap_reserved {ptr..ptr + of_nat (n * 2 ^ obj_bits_api tp us) - 1}
and K (range_cover ptr sz (obj_bits_api tp us) n) and pspace_no_overlap_range_cover ptr sz and valid_pspace \<rbrace>
retype_region ptr n us tp dev
\<lbrace>\<lambda>rv (s::('state_ext::state_ext) state). \<forall>y\<in>set rv. cte_wp_at (\<lambda>a. untyped_range (default_cap tp y us dev) \<inter> usable_untyped_range a = {}) p s\<rbrace>"
@ -3597,15 +3595,15 @@ lemma ex_cte_cap_wp_to_clear_um[simp]:
by (clarsimp simp: ex_cte_cap_wp_to_def clear_um_def)
locale Untyped_AI =
locale Untyped_AI =
Untyped_AI_of_bl_nat_to_cref +
Untyped_AI_arch state_ext_t +
Untyped_AI_arch state_ext_t +
Untyped_AI_nonempty_table state_ext_t nonempty_table
for state_ext_t :: "'state_ext :: state_ext itself"
and nonempty_table
lemma set_cap_device_and_range:
"\<lbrace>\<top>\<rbrace> set_cap (UntypedCap dev (ptr && ~~ mask sz) sz idx) aref
"\<lbrace>\<top>\<rbrace> set_cap (UntypedCap dev (ptr && ~~ mask sz) sz idx) aref
\<lbrace>\<lambda>rv s. (\<exists>slot. cte_wp_at (\<lambda>c. cap_is_device c = dev \<and> up_aligned_area ptr sz \<subseteq> cap_range c) slot s)\<rbrace>"
apply (rule hoare_pre)
apply (clarsimp simp: cte_wp_at_caps_of_state simp del: split_paired_All split_paired_Ex)
@ -3622,7 +3620,7 @@ lemma set_free_index_invs_UntypedCap:
\<and> is_untyped_cap cap \<and> idx \<le> 2^cap_bits cap
\<and> free_index_update (\<lambda>_. idx) cap = UntypedCap dev ptr sz idx
\<and> cte_wp_at (op = cap) cref s)\<rbrace>
set_cap (UntypedCap dev ptr sz idx) cref
set_cap (UntypedCap dev ptr sz idx) cref
\<lbrace>\<lambda>rv s'. invs s'\<rbrace>"
apply (rule hoare_name_pre_state)
apply clarsimp
@ -3683,10 +3681,10 @@ lemma distinct_map_fst_zip:
lemma retype_region_ranges_obj_bits_api:
"\<lbrace>cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz
\<and> obj_ref_of c = ptr && ~~ mask sz) p and
\<and> obj_ref_of c = ptr && ~~ mask sz) p and
pspace_no_overlap_range_cover ptr sz and
valid_pspace and K (range_cover ptr sz (obj_bits_api tp us) n)
\<rbrace>
\<rbrace>
retype_region ptr n us tp dev
\<lbrace>\<lambda>rv s. \<forall>y\<in>set rv. cte_wp_at
(\<lambda>c. {y .. y + 2 ^ (obj_bits_api tp us) - 1} \<subseteq> untyped_range c )
@ -3731,7 +3729,7 @@ lemma invoke_untyp_invs':
\<and> caps_no_overlap ptr sz s \<rbrace>
retype_region ptr (length slots) us tp dev \<lbrace>\<lambda>_.Q\<rbrace>"
assumes set_cap_Q[wp]: "\<And>ptr sz idx cref dev.
\<lbrace>\<lambda>s. Q s \<and> invs s
\<lbrace>\<lambda>s. Q s \<and> invs s
\<and> cte_wp_at (\<lambda>c. is_untyped_cap c \<and> cap_bits c = sz \<and> obj_ref_of c = ptr) cref s
\<and> (case ui of Invocations_A.Retype slot reset ptr' ptr tp us slots dev'
\<Rightarrow> cref = slot \<and> dev' = dev)
@ -3817,14 +3815,14 @@ lemma invoke_untyp_invs':
apply (simp add: cte_wp_at_conj ball_conj_distrib
split del: if_split
| wp hoare_vcg_const_Ball_lift set_tuple_pick
retype_region_ex_cte_cap_to [where sz = sz]
retype_region_ex_cte_cap_to [where sz = sz]
retype_region_obj_ref_range [where sz = sz]
hoare_vcg_all_lift
[of _ _ "%a _ p. \<forall>b. ~ cte_wp_at P (a,b) p" for P]
hoare_vcg_all_lift
[of _ _ "%b _ p. ~ cte_wp_at P (a,b) p" for P a]
retype_region_not_cte_wp_at [where sz = sz]
init_arch_objects_invs_from_restricted
init_arch_objects_invs_from_restricted
retype_ret_valid_caps [where sz = sz]
retype_region_global_refs_disjoint [where sz = sz]
retype_region_post_retype_invs [where sz = sz]
@ -3944,7 +3942,7 @@ lemma invoke_untyp_invs':
done
qed
lemmas invoke_untyp_invs[wp] =
lemmas invoke_untyp_invs[wp] =
invoke_untyp_invs'[where Q=\<top> and Q'=\<top>, simplified,
simplified hoare_post_taut, simplified]

View File

@ -64,7 +64,7 @@ lemma copy_obj_refs [CSpace_AI_assms]:
split: if_split_asm cap.splits arch_cap.splits)
done
lemma weak_derived_cap_class[simp, CSpace_AI_assms]:
lemma weak_derived_cap_class[simp, CSpace_AI_assms]:
"weak_derived cap src_cap \<Longrightarrow> cap_class cap = cap_class src_cap"
apply (simp add:weak_derived_def)
apply (auto simp:copy_of_def same_object_as_def is_cap_simps cap_asid_base_def
@ -73,20 +73,20 @@ lemma weak_derived_cap_class[simp, CSpace_AI_assms]:
lemma weak_derived_obj_refs [CSpace_AI_assms]:
"weak_derived dcap cap \<Longrightarrow> obj_refs dcap = obj_refs cap"
by (cases dcap, auto simp: is_cap_simps weak_derived_def copy_of_def
by (cases dcap, auto simp: is_cap_simps weak_derived_def copy_of_def
same_object_as_def aobj_ref_cases
split: if_split_asm cap.splits arch_cap.splits)
lemma weak_derived_obj_ref_of [CSpace_AI_assms]:
"weak_derived dcap cap \<Longrightarrow> obj_ref_of dcap = obj_ref_of cap"
by (cases dcap, auto simp: is_cap_simps weak_derived_def copy_of_def
by (cases dcap, auto simp: is_cap_simps weak_derived_def copy_of_def
same_object_as_def aobj_ref_cases
split: if_split_asm cap.splits arch_cap.splits)
lemma set_free_index_invs [CSpace_AI_assms]:
"\<lbrace>\<lambda>s. (free_index_of cap \<le> idx \<and> is_untyped_cap cap \<and> idx \<le> 2^cap_bits cap) \<and>
invs s \<and> cte_wp_at (op = cap ) cref s\<rbrace>
set_cap (free_index_update (\<lambda>_. idx) cap) cref
set_cap (free_index_update (\<lambda>_. idx) cap) cref
\<lbrace>\<lambda>rv s'. invs s'\<rbrace>"
apply (rule hoare_grab_asm)+
apply (simp add:invs_def valid_state_def)
@ -128,7 +128,7 @@ lemma set_free_index_invs [CSpace_AI_assms]:
lemma set_untyped_cap_as_full_valid_arch_caps [CSpace_AI_assms]:
"\<lbrace>valid_arch_caps and cte_wp_at (op = src_cap) src\<rbrace>
set_untyped_cap_as_full src_cap cap src
set_untyped_cap_as_full src_cap cap src
\<lbrace>\<lambda>ya. valid_arch_caps\<rbrace>"
apply (clarsimp simp:valid_arch_caps_def set_untyped_cap_as_full_def)
apply (intro conjI impI)
@ -146,20 +146,20 @@ lemma set_untyped_cap_as_full_valid_arch_caps [CSpace_AI_assms]:
lemma set_untyped_cap_as_full[wp, CSpace_AI_assms]:
"\<lbrace>\<lambda>s. no_cap_to_obj_with_diff_ref a b s \<and> cte_wp_at (op = src_cap) src s\<rbrace>
set_untyped_cap_as_full src_cap cap src
set_untyped_cap_as_full src_cap cap src
\<lbrace>\<lambda>rv s. no_cap_to_obj_with_diff_ref a b s\<rbrace>"
apply (clarsimp simp:no_cap_to_obj_with_diff_ref_def)
apply (wp hoare_vcg_ball_lift set_untyped_cap_as_full_cte_wp_at_neg)
apply (clarsimp simp:cte_wp_at_caps_of_state)
apply (drule_tac x=src in bspec, simp)
apply (erule_tac x=src_cap in allE)
apply (auto simp: table_cap_ref_def masked_as_full_def
split: Structures_A.cap.splits arch_cap.splits option.splits
apply (auto simp: table_cap_ref_def masked_as_full_def
split: Structures_A.cap.splits arch_cap.splits option.splits
vmpage_size.splits)
done
lemma is_derived_is_cap:
"is_derived m p cap cap' \<Longrightarrow>
"is_derived m p cap cap' \<Longrightarrow>
(is_pg_cap cap = is_pg_cap cap')
\<and> (is_pt_cap cap = is_pt_cap cap')
\<and> (is_pd_cap cap = is_pd_cap cap')
@ -332,7 +332,7 @@ lemma cap_insert_valid_arch_caps [CSpace_AI_assms]:
apply (frule is_derived_is_same_vspace_table_type)
apply (frule is_derived_obj_refs)
apply (frule is_derived_cap_asid_issues)
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
is_derived_def is_derived_arch_def)
apply (drule_tac ptr = src and ptr' = "(x,xa)" in unique_table_capsD)
apply (simp add:is_cap_simps)+
@ -340,7 +340,7 @@ lemma cap_insert_valid_arch_caps [CSpace_AI_assms]:
apply (frule is_derived_is_same_vspace_table_type)
apply (frule is_derived_obj_refs)
apply (frule is_derived_cap_asid_issues)
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
is_derived_def is_derived_arch_def)
apply (drule_tac ptr = src and ptr' = "(x,xa)" in unique_table_capsD)
apply (simp add:is_cap_simps)+
@ -348,7 +348,7 @@ lemma cap_insert_valid_arch_caps [CSpace_AI_assms]:
apply (frule is_derived_is_same_vspace_table_type)
apply (frule is_derived_obj_refs)
apply (frule is_derived_cap_asid_issues)
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
is_derived_def is_derived_arch_def)
apply (drule_tac ptr = src and ptr' = "(x,xa)" in unique_table_capsD)
apply (simp add:is_cap_simps)+
@ -356,7 +356,7 @@ lemma cap_insert_valid_arch_caps [CSpace_AI_assms]:
apply (frule is_derived_is_same_vspace_table_type)
apply (frule is_derived_obj_refs)
apply (frule is_derived_cap_asid_issues)
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
apply (clarsimp simp: is_cap_simps valid_arch_caps_def cap_master_cap_def
is_derived_def is_derived_arch_def)
apply (drule_tac ptr = src and ptr' = "(x,xa)" in unique_table_capsD)
apply (simp add:is_cap_simps)+
@ -564,15 +564,15 @@ lemma cap_insert_simple_invs:
"\<lbrace>invs and valid_cap cap and tcb_cap_valid cap dest and
ex_cte_cap_wp_to (appropriate_cte_cap cap) dest and
cte_wp_at (\<lambda>c. is_untyped_cap c \<longrightarrow> usable_untyped_range c = {}) src and
cte_wp_at (\<lambda>c. c = cap.NullCap) dest and
cte_wp_at (\<lambda>c. c = cap.NullCap) dest and
no_cap_to_obj_with_diff_ref cap {dest} and
(\<lambda>s. cte_wp_at (safe_parent_for (cdt s) src cap) src s) and
K (is_simple_cap cap \<and> \<not>is_ap_cap cap) and (\<lambda>s. \<forall>irq \<in> cap_irqs cap. irq_issued irq s)\<rbrace>
cap_insert cap src dest \<lbrace>\<lambda>rv. invs\<rbrace>"
apply (simp add: invs_def valid_state_def valid_pspace_def)
apply (rule hoare_pre)
apply (wp cap_insert_simple_mdb cap_insert_iflive
cap_insert_zombies cap_insert_ifunsafe
apply (wp cap_insert_simple_mdb cap_insert_iflive
cap_insert_zombies cap_insert_ifunsafe
cap_insert_valid_global_refs cap_insert_idle
valid_irq_node_typ cap_insert_simple_arch_caps_no_ap)
apply (clarsimp simp: is_simple_cap_def cte_wp_at_caps_of_state)
@ -592,4 +592,42 @@ lemmas is_derived_def = is_derived_def[simplified is_derived_arch_def]
end
(* FIXME x64: these needs to be available globally but uses Arch facts *)
lemma set_cap_valid_arch_caps_simple:
"\<lbrace>\<lambda>s. valid_arch_caps s
\<and> valid_objs s
\<and> cte_wp_at (Not o is_arch_cap) ptr s
\<and> (obj_refs cap \<noteq> {} \<longrightarrow> s \<turnstile> cap)
\<and> \<not> (is_arch_cap cap)\<rbrace>
set_cap cap ptr
\<lbrace>\<lambda>rv. valid_arch_caps\<rbrace>"
apply (wp X64.set_cap_valid_arch_caps)
apply (clarsimp simp: cte_wp_at_caps_of_state)
apply (frule(1) caps_of_state_valid_cap)
apply (rename_tac cap')
apply (subgoal_tac "\<forall>x \<in> {cap, cap'}. \<not> X64.is_pt_cap x \<and> \<not> X64.is_pd_cap x \<and> \<not> X64.is_pdpt_cap x \<and> \<not> X64.is_pml4_cap x")
apply simp
apply (rule conjI)
apply (clarsimp simp: X64.vs_cap_ref_def is_cap_simps)
apply (erule impCE)
apply (clarsimp simp: no_cap_to_obj_with_diff_ref_def
cte_wp_at_caps_of_state
X64.obj_ref_none_no_asid)
apply (rule X64.no_cap_to_obj_with_diff_ref_triv, simp_all)
apply (rule ccontr, clarsimp simp: X64.table_cap_ref_def is_cap_simps)
apply (auto simp: X64.is_cap_simps)
done
lemma set_cap_kernel_window_simple:
"\<lbrace>\<lambda>s. cap_refs_in_kernel_window s
\<and> cte_wp_at (\<lambda>cap'. cap_range cap' = cap_range cap) ptr s\<rbrace>
set_cap cap ptr
\<lbrace>\<lambda>rv. cap_refs_in_kernel_window\<rbrace>"
apply (wp X64.set_cap_cap_refs_in_kernel_window)
apply (clarsimp simp: cte_wp_at_caps_of_state
X64.cap_refs_in_kernel_windowD)
done
end