(* * 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) *) theory Bits_AI imports "./$L4V_ARCH/ArchBits_AI" begin lemmas crunch_wps = hoare_drop_imps mapM_wp' mapM_x_wp' lemmas crunch_simps = split_def whenE_def unlessE_def Let_def if_fun_split assertE_def zipWithM_mapM zipWithM_x_mapM lemma in_set_object: "(rv, s') \ fst (set_object ptr obj s) \ s' = s \ kheap := kheap s (ptr \ obj) \" by (clarsimp simp: set_object_def get_object_def in_monad) definition intr :: "ExceptionTypes_A.interrupt \ irq \ bool" where "intr x y \ (x = Interrupted y)" lemma intr_simp[simp]: "intr (Interrupted x) y = (x = y)" by (simp add: intr_def) lemma cap_fault_injection: "cap_fault_on_failure addr b = injection_handler (ExceptionTypes_A.CapFault addr b)" apply (rule ext) apply (simp add: cap_fault_on_failure_def injection_handler_def o_def) done lemma lookup_error_injection: "lookup_error_on_failure b = injection_handler (ExceptionTypes_A.FailedLookup b)" apply (rule ext) apply (simp add: lookup_error_on_failure_def injection_handler_def o_def) done ML \Thm.consolidate @{thms lookup_error_injection}\ lemmas cap_fault_wp[wp] = injection_wp[OF cap_fault_injection] lemmas cap_fault_wp_E[wp] = injection_wp_E[OF cap_fault_injection] lemmas cap_fault_bindE = injection_bindE[OF cap_fault_injection cap_fault_injection] lemmas cap_fault_liftE[simp] = injection_liftE[OF cap_fault_injection] lemmas lookup_error_wp[wp] = injection_wp[OF lookup_error_injection] lemmas lookup_error_wp_E[wp] = injection_wp_E[OF lookup_error_injection] lemmas lookup_error_bindE = injection_bindE[OF lookup_error_injection lookup_error_injection] lemmas lookup_error_liftE[simp] = injection_liftE[OF lookup_error_injection] lemma unify_failure_injection: "unify_failure = injection_handler (\x. ())" by (intro ext, simp add: unify_failure_def injection_handler_def) lemmas unify_failure_wp[wp] = injection_wp [OF unify_failure_injection] lemmas unify_failure_wp_E[wp] = injection_wp_E [OF unify_failure_injection] lemma ep_cases_weak_wp: assumes "\P_A\ a \Q\" assumes "\q. \P_B\ b q \Q\" assumes "\q. \P_C\ c q \Q\" shows "\P_A and P_B and P_C\ case ts of Structures_A.IdleEP \ a | Structures_A.SendEP q \ b q | Structures_A.RecvEP q \ c q \Q\" apply (cases ts) apply (simp, rule hoare_weaken_pre, rule assms, simp)+ done lemma ntfn_cases_weak_wp: assumes "\P_A\ a \Q\" assumes "\q. \P_B\ b q \Q\" assumes "\bdg msg. \P_C\ c bdg msg \Q\" shows "\P_A and P_B and P_C\ case ts of Structures_A.IdleNtfn \ a | Structures_A.WaitingNtfn q \ b q | Structures_A.ActiveNtfn bdg \ c bdg msg \Q\" apply (cases ts) apply (simp, rule hoare_weaken_pre, rule assms, simp)+ done lemma NullCap_valid [simp]: "s \ cap.NullCap" by (simp add: valid_cap_def) lemma empty_on_failure_wp[wp]: "\P\ m \Q\,\\rv. Q []\ \ \P\ empty_on_failure m \Q\" by (simp add: empty_on_failure_def) wp end