(* * Copyright 2014, General Dynamics C4 Systems * * This software may be distributed and modified according to the terms of * the GNU General Public License version 2. Note that NO WARRANTY is provided. * See "LICENSE_GPLv2.txt" for details. * * @TAG(GD_GPL) *) (* Top level architecture related proofs. *) theory Arch_AI imports "./$L4V_ARCH/ArchUntyped_AI" "./$L4V_ARCH/ArchFinalise_AI" begin declare detype_arch_state[simp] lemma invs_strgs: "invs s \ valid_pspace s" "invs s \ valid_mdb s" "invs s \ valid_objs s" "invs s \ pspace_aligned s" by auto lemma assocs_dom_comp: "set (map fst (filter (\(x,y). P x \ y = None) (assocs f))) = (- dom f \ Collect P)" apply (clarsimp simp: in_assocs_is_fun) apply (rule set_eqI) apply clarsimp apply (rule iffI, clarsimp) apply (erule conjE) apply (drule not_in_domD) apply (rule_tac x="(x,None)" in image_eqI) apply simp apply simp done lemma assocs_empty_dom_comp: "(- dom f \ Collect P = {}) = null (filter (\(x, y). P x \ y = None) (assocs f))" apply (subst assocs_dom_comp [symmetric]) apply (subst empty_set_is_null) apply (simp add: null_def) done lemma dom_hd_assocsD: fixes P defines "filter_assocs f \ filter (\(x,y). P x \ y = None) (assocs f)" assumes d: "- dom f \ Collect P \ {}" shows "fst (hd (filter_assocs f)) \ dom f \ P (fst (hd (filter_assocs f)))" proof - from d have "\null (filter_assocs f)" unfolding filter_assocs_def by (simp add: assocs_empty_dom_comp) hence "hd (filter_assocs f) \ set (filter_assocs f)" by (clarsimp simp: null_def neq_Nil_conv) thus ?thesis unfolding filter_assocs_def by (clarsimp simp: in_assocs_is_fun) qed lemma ucast_assocs: "len_of TYPE('a) < len_of TYPE('b) \ assocs (fn o (ucast :: ('a :: len) word \ ('b :: len) word)) = map (\(x, y). (ucast x, y)) (filter (\(x, y). x < 2 ^ len_of TYPE('a)) (assocs fn))" apply (simp add: assocs_def enum_word_def split_def filter_map) apply (rule map_cong) apply (simp add: o_def) apply (rule trans [OF _ filter_cong [OF refl]], rule sym, rule filter_to_shorter_upto) apply simp apply (rule iffI) apply (subst word_unat_power, rule of_nat_mono_maybe) apply simp apply assumption apply (simp add: word_less_nat_alt word_unat.Abs_inverse unats_def) apply clarsimp apply (simp add: word_less_nat_alt word_unat.Abs_inverse unats_def) apply (simp add: ucast_of_nat_small) done lemma ucast_le_migrate: fixes x :: "('a :: len) word" fixes y :: "('b :: len) word" shows "\ y < 2 ^ (size x); size x < size y \ \ (ucast x \ y) = (x \ ucast y)" apply (simp add: word_le_def ucast_def) apply (subst word_uint.Abs_inverse) apply (simp add: uints_num word_size) apply (rule order_less_le_trans, rule uint_lt2p) apply simp apply (subst word_uint.Abs_inverse) apply (simp add: uints_num word_size word_less_alt uint_2p_alt) apply simp done lemma obj_at_delete_objects: "\\s. Q (obj_at (P (interrupt_irq_node s) (arch_state s)) r s) \ r \ {ptr..ptr + 2 ^ bits - 1}\ delete_objects ptr bits \\_ s. Q (obj_at (P (interrupt_irq_node s) (arch_state s)) r s)\" apply (simp add: delete_objects_def do_machine_op_def split_def) apply wp apply (simp add: detype_machine_state_update_comm) done (* FIXME: move *) crunch arch [wp]: retype_region "\s. P (arch_state s)" (simp: crunch_simps) lemma set_free_index_final_cap: "\\s. P (is_final_cap' cap s) \ cte_wp_at (op = src_cap) src s\ set_cap (free_index_update f src_cap) src \\rv s. P (is_final_cap' cap s) \" apply (simp add:is_final_cap'_def2) apply (clarsimp simp:valid_def) apply (drule set_cap_caps_of_state_monad) apply (erule subst[rotated]) apply (rule_tac f = P in arg_cong) apply (subgoal_tac "\slot. (cte_wp_at (\c. obj_irq_refs cap \ obj_irq_refs c \ {}) slot s = cte_wp_at (\c. obj_irq_refs cap \ obj_irq_refs c \ {}) slot b)") apply simp apply (clarsimp split:cap.splits simp:cte_wp_at_caps_of_state free_index_update_def obj_irq_refs_def) done lemma set_cap_orth: "\\s. P s \ Q cap' s\ set_cap cap src \\rv s. Q cap' s\ \ \\s. P s \ src\ dest \ (cte_wp_at (op = cap') dest s \ Q cap' s)\ set_cap cap src \\rv s. cte_wp_at (op = cap') dest s \ Q cap' s\" apply (clarsimp simp:valid_def cte_wp_at_caps_of_state) apply (drule_tac x = s in spec) apply (frule set_cap_caps_of_state_monad) apply clarsimp apply (drule(1) bspec) apply clarsimp done lemma set_cap_empty_tables[wp]: "\\s. P (obj_at (empty_table (set (arm_global_pts (arch_state s)))) p s)\ set_cap cap cref \\rv s. P (obj_at (empty_table (set (arm_global_pts (arch_state s)))) p s)\" apply (rule hoare_pre) apply (rule hoare_use_eq [where f=arch_state, OF set_cap_arch]) apply (wp set_cap_obj_at_impossible) apply (clarsimp simp: empty_table_caps_of) done lemma cte_wp_at_eq_to_op_eq: "cte_wp_at (\c. c = cap) = cte_wp_at (op = cap)" by (simp add: cte_wp_at_caps_of_state fun_eq_iff) lemma max_index_upd_caps_overlap_reserved: "\\s. invs s \ S \ untyped_range cap \ descendants_range_in S slot s \ cte_wp_at (op = cap) slot s \ is_untyped_cap cap\ set_cap (max_free_index_update cap) slot \\rv. caps_overlap_reserved S\" apply (rule hoare_name_pre_state) apply (clarsimp simp:is_cap_simps) apply (wp set_untyped_cap_caps_overlap_reserved) apply (auto simp:cte_wp_at_caps_of_state max_free_index_def) done lemma max_index_upd_invs_simple: "\\s. descendants_range_in (untyped_range cap) cref s \ pspace_no_overlap_range_cover (obj_ref_of cap) (cap_bits cap) s \ invs s \ cte_wp_at (op = cap) cref s \ is_untyped_cap cap\ set_cap (max_free_index_update cap) cref \\rv. invs\" apply (rule hoare_name_pre_state) apply (clarsimp simp:is_cap_simps) apply (wp set_untyped_cap_invs_simple) apply (auto simp:cte_wp_at_caps_of_state max_free_index_def) done lemma sts_pspace_no_overlap [wp]: "\pspace_no_overlap S\ set_thread_state t st \\rv. pspace_no_overlap S\" by (wp pspace_no_overlap_typ_at_lift) lemma diminished_cte_wp_at_valid_cap: "cte_wp_at (diminished c) p s \ valid_objs s \ s \ c" apply (drule(1) cte_wp_at_valid_objs_valid_cap) apply (clarsimp simp: diminished_def) done lemma delete_objects_st_tcb_at: "\pred_tcb_at proj P t and invs and K (t \ {ptr .. ptr + 2 ^ bits - 1})\ delete_objects ptr bits \\y. pred_tcb_at proj P t\" by (wp|simp add: delete_objects_def do_machine_op_def split_def)+ end