2014-07-14 19:32:44 +00:00
|
|
|
(*
|
|
|
|
* Copyright 2014, NICTA
|
|
|
|
*
|
|
|
|
* 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(NICTA_GPL)
|
|
|
|
*)
|
|
|
|
|
|
|
|
(*
|
|
|
|
* Object predicates.
|
|
|
|
*
|
|
|
|
* This file contains the definitions of the state of the objects created
|
|
|
|
* by the initialiser - when they are empty, initialised and the states in between.
|
|
|
|
* It also contains the decompositions of these predicates.
|
|
|
|
*)
|
|
|
|
|
|
|
|
theory ObjectInitialised_SI
|
|
|
|
imports WellFormed_SI
|
|
|
|
begin
|
|
|
|
|
|
|
|
(************************************************************
|
|
|
|
* Definitions about the state of objects,
|
|
|
|
* when an object is newly created, completely set up, etc.
|
|
|
|
* Non-separation style definitions are labeled "classical".
|
|
|
|
************************************************************)
|
|
|
|
|
|
|
|
(* Translates the object_ids in a cap for a given transformation.
|
|
|
|
* If the object_id is not in the mapping, it is transformed to undefined.
|
|
|
|
*)
|
|
|
|
definition
|
|
|
|
cap_transform :: "(cdl_object_id \<rightharpoonup> cdl_object_id) \<Rightarrow> cdl_cap \<Rightarrow> cdl_cap"
|
|
|
|
where
|
|
|
|
"cap_transform t cap \<equiv>
|
|
|
|
let
|
|
|
|
t' = \<lambda> obj. case t obj of None \<Rightarrow> undefined | Some obj' \<Rightarrow> obj'
|
|
|
|
in
|
|
|
|
if is_untyped_cap cap
|
|
|
|
then update_cap_objects (t' ` (cap_objects cap)) cap
|
|
|
|
else update_cap_object (t' (cap_object cap)) cap"
|
|
|
|
|
|
|
|
(* Translates the object_ids in an object for a given transformation.
|
|
|
|
* This does *not* translate the cdl_tcb_fault_endpoint.
|
|
|
|
* The cdl_tcb_fault_endpoint specifies a cap pointer,
|
|
|
|
* which should be the same in the spec and the kernel
|
|
|
|
* (as both are looked up in the same way).
|
|
|
|
*)
|
|
|
|
definition
|
|
|
|
spec2s :: "(cdl_object_id \<rightharpoonup> cdl_object_id) \<Rightarrow> cdl_object \<Rightarrow> cdl_object"
|
|
|
|
where
|
|
|
|
"spec2s t object \<equiv> update_slots (cap_transform t \<circ>\<^sub>M object_slots object) object"
|
|
|
|
|
|
|
|
(* This is used to define object_empty, object_initialised (and others).
|
|
|
|
* Since we pass in the spec object cap transformation, we can specify
|
|
|
|
* objects with no caps, all their caps (or anything else).
|
|
|
|
*)
|
|
|
|
definition
|
|
|
|
object_initialised_general :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow>
|
|
|
|
(cdl_object \<Rightarrow> cdl_object) \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object \<Rightarrow> sep_pred) \<Rightarrow>
|
|
|
|
cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_initialised_general spec t obj_trans arrow spec_object_id \<equiv> \<lambda>s.
|
|
|
|
let spec_objects = cdl_objects spec
|
|
|
|
in
|
|
|
|
\<exists>kernel_object_id. \<exists>spec_object.
|
|
|
|
t spec_object_id = Some kernel_object_id \<and>
|
|
|
|
(arrow kernel_object_id (obj_trans spec_object)) s \<and>
|
|
|
|
spec_objects spec_object_id = Some spec_object"
|
|
|
|
|
|
|
|
(* The object is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
object_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t) sep_map_o spec_object_id"
|
|
|
|
|
|
|
|
(* The object is created and in it's default state. *)
|
|
|
|
definition
|
|
|
|
object_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_empty spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t object_default_state sep_map_o spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
objects_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"objects_initialised spec t obj_ids \<equiv> \<And>* obj_id \<in> obj_ids. object_initialised spec t obj_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
objects_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"objects_empty spec t obj_ids \<equiv> \<And>* obj_id \<in> obj_ids. object_empty spec t obj_id"
|
|
|
|
|
|
|
|
(* The object's fields are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
object_fields_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_fields_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t) sep_map_f spec_object_id"
|
|
|
|
|
|
|
|
(* The object's slots are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
object_slots_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_slots_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t) sep_map_S spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
object_empty_slots_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_empty_slots_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t) sep_map_E spec_object_id"
|
|
|
|
|
|
|
|
(* A particular slot of an object is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
object_slot_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_slot_initialised spec t spec_object_id slot \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t) (\<lambda>p. sep_map_s (p, slot)) spec_object_id"
|
|
|
|
|
|
|
|
(* The object's fields are in their default state. *)
|
|
|
|
definition
|
|
|
|
object_fields_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_fields_empty spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t object_default_state sep_map_f spec_object_id"
|
|
|
|
|
|
|
|
(* The object's slots are in their default state. *)
|
|
|
|
definition
|
|
|
|
object_slots_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_slots_empty spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t object_default_state sep_map_S spec_object_id"
|
|
|
|
|
|
|
|
(* A particular slot of an object is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
object_slot_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_slot_empty spec t spec_object_id slot \<equiv>
|
|
|
|
object_initialised_general spec t object_default_state (\<lambda>p. sep_map_s (p, slot)) spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
object_empty_slots_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"object_empty_slots_empty spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t object_default_state sep_map_E spec_object_id"
|
|
|
|
|
|
|
|
|
|
|
|
(**********************************************
|
|
|
|
* Predicates about CNodes being initialised. *
|
|
|
|
**********************************************)
|
|
|
|
|
|
|
|
(* A cnode that has the original caps in it set to NullCap *)
|
|
|
|
definition
|
|
|
|
cnode_half :: "cdl_state \<Rightarrow> cdl_object_id \<Rightarrow> cdl_object \<Rightarrow> cdl_object"
|
|
|
|
where
|
|
|
|
"cnode_half spec obj_id obj = update_slots (\<lambda>slot.
|
|
|
|
if original_cap_at (obj_id,slot) spec \<and> object_slots obj slot \<noteq> None
|
|
|
|
then Some NullCap else object_slots obj slot) obj"
|
|
|
|
|
|
|
|
definition
|
|
|
|
cnode_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnode_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec spec_object_id) sep_map_o spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
cnodes_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnodes_half_initialised spec t obj_ids \<equiv> \<And>* obj_id \<in> obj_ids. cnode_half_initialised spec t obj_id"
|
|
|
|
|
|
|
|
(* The cnode's fields are half done (as per the spec). *)
|
|
|
|
definition
|
|
|
|
cnode_fields_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnode_fields_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec spec_object_id) sep_map_f spec_object_id"
|
|
|
|
|
|
|
|
(* The cnode's slots are half done (as per the spec). *)
|
|
|
|
definition
|
|
|
|
cnode_slots_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnode_slots_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec spec_object_id) sep_map_S spec_object_id"
|
|
|
|
|
|
|
|
(* A particular slot of an object is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
cnode_slot_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnode_slot_half_initialised spec t spec_object_id slot \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec spec_object_id) (\<lambda>p. sep_map_s (p, slot)) spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
cnode_empty_slots_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"cnode_empty_slots_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec spec_object_id) sep_map_E spec_object_id"
|
|
|
|
|
|
|
|
|
2014-09-17 07:07:22 +00:00
|
|
|
(**********************************************
|
|
|
|
* Predicates about CNodes being initialised. *
|
|
|
|
**********************************************)
|
|
|
|
|
|
|
|
(* A TCB that isn't set to be schedulable. *)
|
|
|
|
definition
|
|
|
|
tcb_half :: "cdl_state \<Rightarrow> cdl_object \<Rightarrow> cdl_object"
|
|
|
|
where
|
|
|
|
"tcb_half spec obj = update_slots (\<lambda>slot.
|
2015-11-02 00:00:32 +00:00
|
|
|
if (slot = tcb_pending_op_slot \<or> slot = tcb_replycap_slot \<or> slot = tcb_boundntfn_slot) \<and>
|
2014-09-17 07:07:22 +00:00
|
|
|
object_slots obj slot \<noteq> None
|
|
|
|
then Some NullCap else object_slots obj slot) obj"
|
|
|
|
|
|
|
|
definition
|
|
|
|
tcb_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcb_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> tcb_half spec) sep_map_o spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
tcbs_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcbs_half_initialised spec t obj_ids \<equiv> \<And>* obj_id \<in> obj_ids. tcb_half_initialised spec t obj_id"
|
|
|
|
|
|
|
|
(* The cnode's fields are half done (as per the spec). *)
|
|
|
|
definition
|
|
|
|
tcb_fields_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcb_fields_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> tcb_half spec) sep_map_f spec_object_id"
|
|
|
|
|
|
|
|
(* The cnode's slots are half done (as per the spec). *)
|
|
|
|
definition
|
|
|
|
tcb_slots_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcb_slots_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> tcb_half spec) sep_map_S spec_object_id"
|
|
|
|
|
|
|
|
(* A particular slot of an object is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
tcb_slot_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcb_slot_half_initialised spec t spec_object_id slot \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> tcb_half spec) (\<lambda>p. sep_map_s (p, slot)) spec_object_id"
|
|
|
|
|
|
|
|
definition
|
|
|
|
tcb_empty_slots_half_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_object_id \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"tcb_empty_slots_half_initialised spec t spec_object_id \<equiv>
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> tcb_half spec) sep_map_E spec_object_id"
|
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
(********************************************
|
|
|
|
* Predicates about IRQs being initialised. *
|
|
|
|
********************************************)
|
|
|
|
|
|
|
|
definition
|
|
|
|
irq_initialised_general :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow>
|
|
|
|
(cdl_object \<Rightarrow> cdl_object) \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object \<Rightarrow> sep_pred) \<Rightarrow>
|
|
|
|
cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_initialised_general spec t obj_trans arrow irq \<equiv> \<lambda>s.
|
|
|
|
\<exists>kernel_irq_id spec_irq_node spec_irq_id.
|
|
|
|
t spec_irq_id = Some kernel_irq_id \<and>
|
|
|
|
(irq \<mapsto>irq kernel_irq_id \<and>*
|
|
|
|
arrow kernel_irq_id (obj_trans spec_irq_node)) s \<and>
|
|
|
|
cdl_irq_node spec irq = spec_irq_id \<and>
|
|
|
|
cdl_objects spec spec_irq_id = Some spec_irq_node"
|
|
|
|
|
|
|
|
lemma irq_initialised_general_def2:
|
|
|
|
"irq_initialised_general spec t obj_trans arrow irq s =
|
|
|
|
(\<exists>kernel_irq_id spec_irq_id.
|
|
|
|
(object_initialised_general spec t obj_trans arrow spec_irq_id \<and>*
|
|
|
|
irq \<mapsto>irq kernel_irq_id) s \<and>
|
|
|
|
cdl_irq_node spec irq = spec_irq_id \<and>
|
|
|
|
t spec_irq_id = Some kernel_irq_id)"
|
|
|
|
by (fastforce simp: irq_initialised_general_def object_initialised_general_def
|
|
|
|
sep_conj_exists sep_conj_ac)
|
|
|
|
|
|
|
|
(* The irq is set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
irq_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_initialised spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t (spec2s t) sep_map_o irq"
|
|
|
|
|
|
|
|
(* The irq is created and in it's default state. *)
|
|
|
|
definition
|
|
|
|
irq_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_empty spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t object_default_state sep_map_o irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irqs_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irqs_initialised spec t irqs \<equiv> \<And>* irq \<in> irqs. irq_initialised spec t irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irqs_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq set \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irqs_empty spec t irqs \<equiv> \<And>* irq \<in> irqs. irq_empty spec t irq"
|
|
|
|
|
|
|
|
(* The object's fields are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
irq_fields_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_fields_initialised spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t (spec2s t) sep_map_f irq"
|
|
|
|
|
|
|
|
(* The object's slots are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
irq_slots_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_slots_initialised spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t (spec2s t) sep_map_S irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irq_slot_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_slot_initialised spec t irq slot \<equiv>
|
|
|
|
irq_initialised_general spec t (spec2s t) (\<lambda>p. sep_map_s (p, slot)) irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irq_empty_slots_initialised :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_empty_slots_initialised spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t (spec2s t) sep_map_E irq"
|
|
|
|
|
|
|
|
(* The object's fields are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
irq_fields_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_fields_empty spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t object_default_state sep_map_f irq"
|
|
|
|
|
|
|
|
(* The object's slots are set up (as per the spec). *)
|
|
|
|
definition
|
|
|
|
irq_slots_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_slots_empty spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t object_default_state sep_map_S irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irq_slot_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> cdl_cnode_index \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_slot_empty spec t irq slot \<equiv>
|
|
|
|
irq_initialised_general spec t object_default_state (\<lambda>p. sep_map_s (p, slot)) irq"
|
|
|
|
|
|
|
|
definition
|
|
|
|
irq_empty_slots_empty :: "cdl_state \<Rightarrow> (cdl_object_id \<Rightarrow> cdl_object_id option) \<Rightarrow> cdl_irq \<Rightarrow> sep_pred"
|
|
|
|
where
|
|
|
|
"irq_empty_slots_empty spec t irq \<equiv>
|
|
|
|
irq_initialised_general spec t object_default_state sep_map_E irq"
|
|
|
|
|
|
|
|
(*********************************************************************
|
|
|
|
* Introduction, destruction, and elimination rules for object_initialised. *
|
|
|
|
*********************************************************************)
|
|
|
|
|
|
|
|
|
|
|
|
lemma object_slot_initialisedI:
|
|
|
|
"\<lbrakk>t obj_id = Some kernel_object_id; cdl_objects spec obj_id = Some spec_object;
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (spec2s t spec_object)) s\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slot_initialised spec t obj_id slot s"
|
|
|
|
by (fastforce simp: object_slot_initialised_def object_initialised_general_def)
|
|
|
|
|
|
|
|
lemma object_slot_emptyI:
|
|
|
|
"\<lbrakk>well_formed spec; t obj_id = Some kernel_object_id;
|
|
|
|
cdl_objects spec obj_id = Some spec_object;
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (object_default_state spec_object)) s\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slot_empty spec t obj_id slot s"
|
|
|
|
apply (drule (1) well_formed_object_slots)
|
|
|
|
apply (fastforce simp: object_slot_empty_def object_initialised_general_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slot_initialisedD:
|
|
|
|
"object_slot_initialised spec t obj_id slot s \<Longrightarrow>
|
|
|
|
\<exists>kernel_object_id spec_object.
|
|
|
|
t obj_id = Some kernel_object_id \<and>
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (spec2s t spec_object)) s \<and>
|
|
|
|
cdl_objects spec obj_id = Some spec_object"
|
|
|
|
by (clarsimp simp: object_slot_initialised_def object_initialised_general_def)
|
|
|
|
|
|
|
|
lemma object_slot_emptyD:
|
|
|
|
"object_slot_empty spec t obj_id slot s \<Longrightarrow>
|
|
|
|
\<exists>kernel_object_id kernel_object spec_object.
|
|
|
|
t obj_id = Some kernel_object_id \<and>
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (object_default_state spec_object)) s \<and>
|
|
|
|
cdl_objects spec obj_id = Some spec_object"
|
|
|
|
by (clarsimp simp: object_slot_empty_def object_initialised_general_def)
|
|
|
|
|
|
|
|
lemma object_slot_initialisedE:
|
|
|
|
"\<lbrakk>object_slot_initialised spec t obj_id slot s;
|
|
|
|
\<And>kernel_object_id spec_object.
|
|
|
|
\<lbrakk>t obj_id = Some kernel_object_id \<and>
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (spec2s t spec_object)) s \<and>
|
|
|
|
cdl_objects spec obj_id = Some spec_object\<rbrakk> \<Longrightarrow> X\<rbrakk> \<Longrightarrow> X"
|
|
|
|
by (fastforce simp: object_slot_initialised_def object_initialised_general_def)
|
|
|
|
|
|
|
|
lemma object_slot_emptyE:
|
|
|
|
"\<lbrakk>object_slot_empty spec t obj_id slot s;
|
|
|
|
\<And>kernel_object_id spec_object.
|
|
|
|
\<lbrakk>t obj_id = Some kernel_object_id \<and>
|
|
|
|
((kernel_object_id, slot) \<mapsto>s (object_default_state spec_object)) s \<and>
|
|
|
|
cdl_objects spec obj_id = Some spec_object\<rbrakk> \<Longrightarrow> X\<rbrakk> \<Longrightarrow> X"
|
|
|
|
by (fastforce simp: object_slot_empty_def object_initialised_general_def)
|
|
|
|
|
|
|
|
(********************************************
|
|
|
|
* Decomposition of object_initialised into parts. *
|
|
|
|
********************************************)
|
|
|
|
|
|
|
|
lemma spec2s_objects [simp]:
|
|
|
|
"spec2s t Untyped = Untyped"
|
|
|
|
"spec2s t Endpoint = Endpoint"
|
2015-11-02 00:00:32 +00:00
|
|
|
"spec2s t Notification = Notification"
|
2014-07-14 19:32:44 +00:00
|
|
|
"spec2s t (Frame f) = Frame f"
|
|
|
|
by (clarsimp simp: spec2s_def update_slots_def)+
|
|
|
|
|
|
|
|
lemma object_initialised_general_decomp:
|
|
|
|
"\<forall>p v. ((arrowL p v) \<and>* (arrowR p v)) = (arrow p v)
|
|
|
|
\<Longrightarrow> object_initialised_general spec t obj_trans arrow spec_object_id
|
|
|
|
= (object_initialised_general spec t obj_trans arrowL spec_object_id \<and>*
|
|
|
|
object_initialised_general spec t obj_trans arrowR spec_object_id)"
|
|
|
|
by (fastforce simp: object_initialised_general_def sep_conj_exists)
|
|
|
|
|
|
|
|
(* This is slightly different, as irq_initialised consumes ownership of the IRQ mapping. *)
|
|
|
|
lemma irq_initialised_general_decomp:
|
|
|
|
"\<forall>p v. ((arrowL p v) \<and>* (arrowR p v)) = (arrow p v)
|
|
|
|
\<Longrightarrow> irq_initialised_general spec t obj_trans arrow irq
|
|
|
|
= (irq_initialised_general spec t obj_trans arrowL irq \<and>*
|
|
|
|
object_initialised_general spec t obj_trans arrowR (cdl_irq_node spec irq))"
|
|
|
|
by (fastforce simp: irq_initialised_general_def object_initialised_general_def
|
|
|
|
sep_conj_exists sep_conj_assoc)
|
|
|
|
|
|
|
|
lemma cap_transform_nullcap [simp]:
|
|
|
|
"cap_transform t NullCap = NullCap"
|
|
|
|
by (clarsimp simp: cap_transform_def cap_has_object_def
|
|
|
|
update_cap_object_def)
|
|
|
|
|
|
|
|
lemma cap_type_cap_transform [simp]:
|
|
|
|
"cap_type (cap_transform t cap) = cap_type cap"
|
|
|
|
by (clarsimp simp: cap_transform_def cap_has_object_def)
|
|
|
|
|
|
|
|
lemma cap_has_object_cap_transform [simp]:
|
|
|
|
"cap_has_object (cap_transform t cap) = cap_has_object cap"
|
|
|
|
by (clarsimp simp: cap_transform_def)
|
|
|
|
|
|
|
|
lemma well_formed_cap_cap_transform [simp]:
|
|
|
|
"well_formed_cap (cap_transform t cap) = well_formed_cap cap"
|
|
|
|
by (clarsimp simp: cap_transform_def)
|
|
|
|
|
|
|
|
lemma is_default_cap_cap_transform [simp]:
|
|
|
|
"well_formed_cap cap \<Longrightarrow> is_default_cap (cap_transform t cap) = is_default_cap cap"
|
|
|
|
apply (clarsimp simp: is_default_cap_def well_formed_cap_def cap_type_def default_cap_def
|
|
|
|
cap_transform_def cap_has_object_def)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (cases cap, simp_all add: cap_object_simps update_cap_object_def cnode_cap_size_def)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma default_cap_cap_transform:
|
|
|
|
"\<lbrakk>is_default_cap cap; well_formed_cap cap; t (cap_object cap) = Some obj_id;
|
2014-09-09 04:07:24 +00:00
|
|
|
cap_type cap = Some type; type \<noteq> IRQNodeType\<rbrakk>
|
2016-09-22 09:23:19 +00:00
|
|
|
\<Longrightarrow> default_cap type {obj_id} (cnode_cap_size cap) (is_device_cap cap) = cap_transform t cap"
|
2014-07-14 19:32:44 +00:00
|
|
|
by (clarsimp simp: is_default_cap_def default_cap_def cap_transform_def cap_type_def
|
|
|
|
well_formed_cap_def cap_has_object_def
|
2014-09-09 04:07:24 +00:00
|
|
|
update_cap_object_def split: cdl_cap.splits)+
|
2014-07-14 19:32:44 +00:00
|
|
|
|
|
|
|
lemma cap_transform_update_cap_object:
|
|
|
|
"\<lbrakk>t obj_id = Some k_obj_id; cap_object cap = obj_id; cap_type cap \<noteq> Some UntypedType\<rbrakk>
|
|
|
|
\<Longrightarrow> cap_transform t cap = update_cap_object k_obj_id cap"
|
|
|
|
by (clarsimp simp: update_cap_object_def cap_transform_def
|
|
|
|
cap_object_def cap_has_object_def
|
|
|
|
split: cdl_cap.splits)
|
|
|
|
|
2016-09-22 09:23:19 +00:00
|
|
|
lemma is_default_cap_def2:
|
|
|
|
"is_default_cap cap =
|
|
|
|
((\<exists>type. cap_type cap = Some type \<and> cap = default_cap type (cap_objects cap) (cnode_cap_size cap) (is_device_cap cap)) \<or>
|
|
|
|
is_irqhandler_cap cap)"
|
|
|
|
apply (clarsimp simp:is_default_cap_def)
|
|
|
|
apply (case_tac cap)
|
2016-09-22 02:05:17 +00:00
|
|
|
apply (auto simp: default_cap_def cap_type_def)
|
2016-09-22 09:23:19 +00:00
|
|
|
done
|
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
lemma default_cap_update_cap_object:
|
|
|
|
"\<lbrakk>is_default_cap cap; cap_type cap = Some type; cnode_cap_size cap \<le> 32;
|
2014-09-09 04:07:24 +00:00
|
|
|
type \<noteq> UntypedType; type \<noteq> AsidPoolType; type \<noteq> IRQNodeType\<rbrakk>
|
2016-09-22 09:23:19 +00:00
|
|
|
\<Longrightarrow> default_cap type {obj_id} (cnode_cap_size cap) (is_device_cap cap) = update_cap_object obj_id cap"
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (subst default_cap_cap_transform, simp_all)
|
|
|
|
apply (frule (1) default_cap_well_formed_cap2 [where obj_ids="cap_objects cap"
|
2016-09-22 09:23:19 +00:00
|
|
|
and sz = "(cnode_cap_size cap)" and dev = "is_device_cap cap"], simp+)
|
|
|
|
apply (fastforce simp: is_default_cap_def2)
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (subst cap_transform_update_cap_object, simp_all)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma default_cap_update_cap_object_pd:
|
|
|
|
"\<lbrakk>is_pd_cap cap; \<not> vm_cap_has_asid cap; \<not> is_fake_vm_cap cap\<rbrakk>
|
2016-09-22 09:23:19 +00:00
|
|
|
\<Longrightarrow> default_cap PageDirectoryType {obj_id} (cnode_cap_size cap) dev = update_cap_object obj_id cap"
|
2014-07-14 19:32:44 +00:00
|
|
|
by (clarsimp simp: default_cap_def update_cap_object_def cap_type_def
|
|
|
|
vm_cap_has_asid_def is_fake_vm_cap_def not_Some_eq_tuple
|
|
|
|
split: cdl_cap.splits cdl_frame_cap_type.splits)
|
|
|
|
|
|
|
|
lemma object_type_spec2s [simp]:
|
|
|
|
"object_type (spec2s t obj) = object_type obj"
|
|
|
|
by (clarsimp simp: spec2s_def)
|
|
|
|
|
|
|
|
lemma dom_object_slots_spec2s [simp]:
|
|
|
|
"dom (object_slots (spec2s t spec_object)) = dom (object_slots spec_object)"
|
|
|
|
by (fastforce simp: spec2s_def update_slots_def object_slots_def
|
|
|
|
split: cdl_object.splits option.splits)
|
|
|
|
|
|
|
|
lemma object_slots_spec2s:
|
|
|
|
"\<lbrakk>has_slots obj; object_slots obj slot = Some cap;
|
|
|
|
t (cap_object cap) = Some cap_object_id;
|
|
|
|
cap_has_object cap; \<not>is_untyped_cap cap\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots (spec2s t obj) slot = Some (update_cap_object cap_object_id cap)"
|
|
|
|
apply (clarsimp simp: spec2s_def)
|
|
|
|
apply (clarsimp simp: cap_transform_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_spec2s':
|
|
|
|
"object_slots obj slot = Some spec_cap
|
|
|
|
\<Longrightarrow> object_slots (spec2s t obj) slot = Some (cap_transform t spec_cap)"
|
|
|
|
by (auto simp: spec2s_def object_slots_def update_slots_def
|
|
|
|
split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma object_slots_spec2s_NullCap [simp]:
|
|
|
|
"object_slots obj slot = Some NullCap
|
|
|
|
\<Longrightarrow> object_slots (spec2s t obj) slot = Some NullCap"
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply (clarsimp simp: spec2s_def)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma update_cap_object_irqhandler_cap [simp]:
|
|
|
|
"is_irqhandler_cap cap \<Longrightarrow> update_cap_object obj_id cap = cap"
|
2014-09-09 04:07:24 +00:00
|
|
|
by (clarsimp simp: update_cap_object_def cap_type_def split: cdl_cap.splits)
|
2014-07-14 19:32:44 +00:00
|
|
|
|
|
|
|
lemma cap_transform_irqhandler_cap [simp]:
|
|
|
|
"is_irqhandler_cap cap \<Longrightarrow> cap_transform t cap = cap"
|
|
|
|
by (clarsimp simp: cap_transform_def)
|
|
|
|
|
|
|
|
lemma object_slots_spec2s_irqhandler_cap [simp]:
|
|
|
|
"\<lbrakk>object_slots obj slot = Some cap; is_irqhandler_cap cap\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots (spec2s t obj) slot = Some cap"
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply (clarsimp simp: spec2s_def)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma update_slots_empty_spec2s [simp]:
|
|
|
|
"update_slots empty (spec2s t obj)
|
|
|
|
= update_slots empty obj"
|
|
|
|
by (clarsimp simp: spec2s_def)
|
|
|
|
|
2014-07-22 04:37:37 +00:00
|
|
|
lemma object_to_sep_state_fields_spec2s [simp]:
|
|
|
|
"object_to_sep_state obj_id (spec2s t obj) {Fields}
|
|
|
|
= object_to_sep_state obj_id obj {Fields}"
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (rule ext)
|
2014-07-22 04:37:37 +00:00
|
|
|
apply (clarsimp simp: object_to_sep_state_def object_project_def object_clean_def
|
2014-07-17 16:22:50 +00:00
|
|
|
asid_reset_def spec2s_def object_wipe_slots_def)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_spec2s [simp]:
|
|
|
|
"obj_id \<mapsto>f spec2s t obj = obj_id \<mapsto>f obj"
|
|
|
|
by (auto simp: sep_map_f_def sep_map_general_def)
|
|
|
|
|
|
|
|
lemma object_type_cnode_half [simp]:
|
|
|
|
"object_type (cnode_half spec obj_id obj) = object_type obj"
|
|
|
|
by (clarsimp simp: cnode_half_def)
|
|
|
|
|
2014-09-17 07:07:22 +00:00
|
|
|
lemma object_type_tcb_half [simp]:
|
|
|
|
"object_type (tcb_half spec tcb) = object_type tcb"
|
|
|
|
by (simp add: tcb_half_def)
|
|
|
|
|
|
|
|
lemma dom_object_slots_cnode_half [simp]:
|
2014-07-14 19:32:44 +00:00
|
|
|
"dom (object_slots (cnode_half spec obj_id obj)) = dom (object_slots obj)"
|
|
|
|
apply (clarsimp simp: cnode_half_def)
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply (auto simp: dom_def)
|
|
|
|
done
|
|
|
|
|
2014-09-17 07:07:22 +00:00
|
|
|
lemma dom_object_slots_tcb_half [simp]:
|
|
|
|
"dom (object_slots (tcb_half spec tcb)) =
|
|
|
|
dom (object_slots tcb)"
|
|
|
|
apply (clarsimp simp: tcb_half_def)
|
|
|
|
apply (case_tac "has_slots tcb")
|
|
|
|
apply (auto simp: dom_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_tcb_half:
|
|
|
|
"object_slots (tcb_half spec obj) =
|
2015-11-02 00:00:32 +00:00
|
|
|
(\<lambda>slot. if (slot = tcb_pending_op_slot \<or> slot = tcb_replycap_slot \<or> slot = tcb_boundntfn_slot) \<and> object_slots obj slot \<noteq> None
|
2014-09-17 07:07:22 +00:00
|
|
|
then Some NullCap else object_slots obj slot)"
|
2016-10-25 06:01:30 +00:00
|
|
|
by (case_tac "has_slots obj", auto simp: tcb_half_def split: if_split_asm)
|
2014-09-17 07:07:22 +00:00
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
lemma intent_reset_object_type:
|
|
|
|
"intent_reset obj = intent_reset obj' \<Longrightarrow> object_type obj = object_type obj'"
|
|
|
|
by (clarsimp simp: intent_reset_def object_type_def split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma intent_reset_object_slots:
|
|
|
|
"intent_reset obj = intent_reset obj' \<Longrightarrow> object_slots obj = object_slots obj'"
|
|
|
|
by (clarsimp simp: intent_reset_def object_slots_def cdl_tcb.splits split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma intent_reset_object_size_bits:
|
|
|
|
"intent_reset obj = intent_reset obj' \<Longrightarrow> object_size_bits obj = object_size_bits obj'"
|
|
|
|
by (clarsimp simp: intent_reset_def object_size_bits_def split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma intent_reset_cnode:
|
|
|
|
"\<lbrakk>intent_reset obj = intent_reset obj'; object_type obj = CNodeType\<rbrakk>
|
|
|
|
\<Longrightarrow> obj = obj'"
|
|
|
|
by (clarsimp simp: intent_reset_def object_type_def split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma intent_reset_object_slots_NullCap:
|
|
|
|
"\<lbrakk>intent_reset (object_default_state obj) = intent_reset obj';
|
|
|
|
slot < 2 ^ object_size_bits obj; has_slots obj\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots obj' slot = Some NullCap"
|
|
|
|
apply (frule intent_reset_object_slots [THEN sym])
|
|
|
|
apply (clarsimp simp: object_default_state_def2 object_type_def has_slots_def
|
|
|
|
object_size_bits_def object_slots_def default_tcb_def
|
2014-09-09 04:07:24 +00:00
|
|
|
empty_cnode_def empty_irq_node_def empty_cap_map_def pt_size_def pd_size_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_object_default_state_NullCap':
|
|
|
|
"\<lbrakk>slot < 2 ^ object_size_bits obj; has_slots obj\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots (object_default_state obj) slot = Some NullCap"
|
|
|
|
by (clarsimp simp: object_default_state_def2 object_type_def has_slots_def
|
|
|
|
object_size_bits_def object_slots_def default_tcb_def
|
2014-09-09 04:07:24 +00:00
|
|
|
empty_cnode_def empty_irq_node_def empty_cap_map_def pt_size_def pd_size_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)
|
|
|
|
|
|
|
|
lemma dom_range_upper:
|
|
|
|
"\<lbrakk>dom f = {0..<n}; f x = Some y\<rbrakk> \<Longrightarrow> x < n"
|
|
|
|
by fastforce
|
|
|
|
|
|
|
|
lemma object_slots_object_default_state_NullCap:
|
|
|
|
"\<lbrakk>well_formed spec; \<not>tcb_at obj_id spec; opt_cap (obj_id, slot) spec = Some cap;
|
|
|
|
cdl_objects spec obj_id = Some spec_object\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots (object_default_state spec_object) slot = Some NullCap"
|
|
|
|
apply (drule (1) well_formed_object_slots)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (clarsimp simp: object_default_state_def2
|
|
|
|
split: cdl_object.splits,
|
|
|
|
(fastforce simp: object_at_def is_cnode_def object_size_bits_def object_slots_def
|
|
|
|
empty_cnode_def empty_irq_node_def empty_cap_map_def
|
|
|
|
opt_cap_def slots_of_def opt_object_def
|
|
|
|
dest!: dom_range_upper)+)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma intent_reset_remove:
|
|
|
|
"obj = obj' \<Longrightarrow> intent_reset obj = intent_reset obj'"
|
|
|
|
by (rule arg_cong)
|
|
|
|
|
|
|
|
lemma sep_map_E_eq:
|
|
|
|
"\<lbrakk>object_type obj = object_type obj'; dom (object_slots obj) = dom (object_slots obj')\<rbrakk>
|
|
|
|
\<Longrightarrow> (p \<mapsto>E obj) = (p \<mapsto>E obj')"
|
|
|
|
apply (clarsimp simp: sep_map_E_def sep_map_S'_def sep_map_general_def)
|
|
|
|
apply (rule ext)
|
2014-07-22 04:37:37 +00:00
|
|
|
apply (subgoal_tac "object_to_sep_state p obj (Slot ` (UNIV - dom (object_slots obj')))
|
|
|
|
= object_to_sep_state p obj' (Slot ` (UNIV - dom (object_slots obj')))")
|
2014-07-14 19:32:44 +00:00
|
|
|
apply simp
|
2014-07-22 04:37:37 +00:00
|
|
|
apply (fastforce simp: object_to_sep_state_def split_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_project_def object_slots_object_clean
|
2014-07-14 19:32:44 +00:00
|
|
|
split: option.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_E_object_default_state:
|
|
|
|
"dom (object_slots (object_default_state obj)) = dom (object_slots obj)
|
|
|
|
\<Longrightarrow> (p \<mapsto>E object_default_state obj) = (p \<mapsto>E obj)"
|
|
|
|
using sep_map_E_eq [where obj="object_default_state obj" and obj'=obj]
|
|
|
|
by simp
|
|
|
|
|
|
|
|
lemma sep_map_E_intent_reset:
|
|
|
|
"\<lbrakk>intent_reset obj = intent_reset obj'\<rbrakk>
|
|
|
|
\<Longrightarrow> (p \<mapsto>E obj) = (p \<mapsto>E obj')"
|
|
|
|
apply (cut_tac obj=obj and obj'=obj' in sep_map_E_eq)
|
|
|
|
apply (erule intent_reset_object_type)
|
|
|
|
apply (drule intent_reset_object_slots, simp)
|
|
|
|
apply simp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_E_spec2s [simp]:
|
|
|
|
"(p \<mapsto>E spec2s t obj) = (p \<mapsto>E obj)"
|
|
|
|
apply (cut_tac obj="spec2s t obj" and obj'=obj in sep_map_E_eq, simp)
|
|
|
|
apply (clarsimp simp: spec2s_def)
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply simp+
|
|
|
|
done
|
|
|
|
|
2014-09-17 07:07:22 +00:00
|
|
|
lemma sep_map_E_tcb_half [simp]:
|
|
|
|
"obj_id \<mapsto>E tcb_half spec tcb = obj_id \<mapsto>E tcb"
|
|
|
|
by (rule sep_map_E_eq, simp+)
|
|
|
|
|
2014-07-22 04:37:37 +00:00
|
|
|
lemma object_to_sep_state_fields_tcb_eq:
|
2014-07-14 19:32:44 +00:00
|
|
|
"\<lbrakk>cdl_tcb_fault_endpoint tcb = cdl_tcb_fault_endpoint tcb';
|
|
|
|
cdl_tcb_has_fault tcb = cdl_tcb_has_fault tcb';
|
|
|
|
cdl_tcb_domain tcb = cdl_tcb_domain tcb'\<rbrakk>
|
2014-07-22 04:37:37 +00:00
|
|
|
\<Longrightarrow> object_to_sep_state obj_id (Tcb tcb) {Fields}
|
|
|
|
= object_to_sep_state obj_id (Tcb tcb') {Fields}"
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (rule ext)
|
2014-07-22 04:37:37 +00:00
|
|
|
apply (clarsimp simp: object_to_sep_state_def object_project_def object_clean_def
|
2014-07-17 16:22:50 +00:00
|
|
|
asid_reset_def spec2s_def object_wipe_slots_def
|
|
|
|
update_slots_def intent_reset_def cdl_tcb.splits)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_eq_tcb:
|
|
|
|
"\<lbrakk>cdl_tcb_fault_endpoint tcb = cdl_tcb_fault_endpoint tcb';
|
|
|
|
cdl_tcb_has_fault tcb = cdl_tcb_has_fault tcb';
|
|
|
|
cdl_tcb_domain tcb = cdl_tcb_domain tcb'\<rbrakk>
|
|
|
|
\<Longrightarrow> obj_id \<mapsto>f Tcb tcb = obj_id \<mapsto>f Tcb tcb'"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def object_slots_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_clean_def intent_reset_def asid_reset_def update_slots_def)
|
2014-07-22 04:37:37 +00:00
|
|
|
apply (subst object_to_sep_state_fields_tcb_eq [where tcb'=tcb'], simp_all)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_intent_reset_cnode:
|
|
|
|
"\<lbrakk>object_type obj = CNodeType; intent_reset obj = intent_reset obj'\<rbrakk>
|
|
|
|
\<Longrightarrow> obj_id \<mapsto>f obj = obj_id \<mapsto>f obj'"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
2014-07-17 16:22:50 +00:00
|
|
|
apply (clarsimp simp: intent_reset_def object_type_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_empty_cnode:
|
|
|
|
"obj_id \<mapsto>f CNode (empty_cnode sz) =
|
|
|
|
obj_id \<mapsto>f CNode \<lparr>cdl_cnode_caps = Map.empty, cdl_cnode_size_bits = sz\<rparr>"
|
|
|
|
apply (rule ext, rename_tac s)
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (intro iffI ext |
|
2014-07-22 04:37:37 +00:00
|
|
|
clarsimp simp: object_to_sep_state_def object_clean_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_project_def object_slots_object_clean asid_reset_def
|
|
|
|
intent_reset_def object_wipe_slots_def
|
2014-07-14 19:32:44 +00:00
|
|
|
update_slots_def empty_cnode_def)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma empty_cnode_object_size_bits:
|
|
|
|
"object_type obj = CNodeType \<Longrightarrow> obj_id \<mapsto>f CNode (empty_cnode (object_size_bits obj)) = obj_id \<mapsto>f obj"
|
|
|
|
apply (subst sep_map_f_empty_cnode)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (intro iffI ext |
|
2014-07-17 16:22:50 +00:00
|
|
|
clarsimp simp: object_type_def object_size_bits_def
|
|
|
|
object_clean_def reset_cap_asid_def asid_reset_def
|
2014-07-22 04:37:37 +00:00
|
|
|
object_to_sep_state_def object_project_def intent_reset_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_wipe_slots_def update_slots_def cdl_cnode.splits
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_object_size_bits_cnode:
|
|
|
|
"\<lbrakk>object_type obj = CNodeType; object_type obj' = CNodeType;
|
|
|
|
object_size_bits obj = object_size_bits obj'\<rbrakk>
|
|
|
|
\<Longrightarrow> obj_id \<mapsto>f obj = obj_id \<mapsto>f obj'"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (intro iffI ext |
|
2014-07-17 16:22:50 +00:00
|
|
|
clarsimp simp: object_type_def object_size_bits_def
|
2014-07-22 04:37:37 +00:00
|
|
|
object_to_sep_state_def object_project_def intent_reset_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_wipe_slots_def update_slots_def
|
|
|
|
cdl_cnode.splits object_clean_def asid_reset_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_object_size_bits_pt:
|
|
|
|
"\<lbrakk>object_type obj = PageTableType; object_type obj' = PageTableType\<rbrakk>
|
|
|
|
\<Longrightarrow> obj_id \<mapsto>f obj = obj_id \<mapsto>f obj'"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (intro iffI ext |
|
2014-07-17 16:22:50 +00:00
|
|
|
clarsimp simp: object_type_def object_size_bits_def
|
2014-07-22 04:37:37 +00:00
|
|
|
object_to_sep_state_def object_project_def intent_reset_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_wipe_slots_def update_slots_def object_clean_def asid_reset_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_object_size_bits_pd:
|
|
|
|
"\<lbrakk>object_type obj = PageDirectoryType; object_type obj' = PageDirectoryType\<rbrakk>
|
|
|
|
\<Longrightarrow> obj_id \<mapsto>f obj = obj_id \<mapsto>f obj'"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (intro iffI ext |
|
2014-07-17 16:22:50 +00:00
|
|
|
clarsimp simp: object_type_def object_size_bits_def
|
2014-07-22 04:37:37 +00:00
|
|
|
object_to_sep_state_def object_project_def intent_reset_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_wipe_slots_def update_slots_def object_clean_def asid_reset_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)+
|
|
|
|
done
|
|
|
|
|
|
|
|
(********************************************************
|
|
|
|
* Object done, and other such predicate decompositions *
|
|
|
|
********************************************************)
|
|
|
|
|
|
|
|
lemma object_initialised_decomp:
|
|
|
|
"object_initialised spec t spec_object_id =
|
|
|
|
(object_fields_initialised spec t spec_object_id \<and>*
|
|
|
|
object_slots_initialised spec t spec_object_id)"
|
|
|
|
apply (clarsimp simp: object_initialised_def object_fields_initialised_def object_slots_initialised_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_o_decomp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_empty_decomp:
|
|
|
|
"object_empty spec t spec_object_id =
|
|
|
|
(object_fields_empty spec t spec_object_id \<and>*
|
|
|
|
object_slots_empty spec t spec_object_id)"
|
|
|
|
apply (clarsimp simp: object_empty_def object_fields_empty_def object_slots_empty_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_o_decomp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_half_initialised_decomp:
|
|
|
|
"cnode_half_initialised spec t spec_object_id =
|
|
|
|
(cnode_fields_half_initialised spec t spec_object_id \<and>*
|
|
|
|
cnode_slots_half_initialised spec t spec_object_id)"
|
|
|
|
apply (clarsimp simp: cnode_half_initialised_def cnode_fields_half_initialised_def cnode_slots_half_initialised_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_o_decomp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_initialised_decomp:
|
|
|
|
"irq_initialised spec t irq =
|
|
|
|
(irq_slots_initialised spec t irq \<and>*
|
|
|
|
object_fields_initialised spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (clarsimp simp: irq_initialised_def object_fields_initialised_def irq_slots_initialised_def)
|
|
|
|
apply (rule irq_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_o_decomp sep_conj_ac)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_empty_decomp:
|
|
|
|
"irq_empty spec t irq =
|
|
|
|
(irq_slots_empty spec t irq \<and>*
|
|
|
|
object_fields_empty spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (clarsimp simp: irq_empty_def object_fields_empty_def irq_slots_empty_def)
|
|
|
|
apply (rule irq_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_o_decomp sep_conj_ac)
|
|
|
|
done
|
|
|
|
|
|
|
|
(************************************
|
|
|
|
* object_slots_initialised rewrite rules. *
|
|
|
|
************************************)
|
|
|
|
|
|
|
|
lemma object_slot_initialised_eq:
|
|
|
|
"\<lbrakk>t obj_id = Some kernel_object_id; cdl_objects spec obj_id = Some spec_object\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slot_initialised spec t obj_id slot
|
|
|
|
= (kernel_object_id, slot) \<mapsto>s (spec2s t spec_object)"
|
|
|
|
apply (rule ext, rename_tac s)
|
|
|
|
apply (fastforce simp: object_slot_initialised_def object_initialised_general_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slot_empty_eq:
|
|
|
|
"\<lbrakk>well_formed spec; t obj_id = Some kernel_object_id;
|
|
|
|
cdl_objects spec obj_id = Some spec_object\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slot_empty spec t obj_id slot
|
|
|
|
= (kernel_object_id, slot) \<mapsto>s (object_default_state spec_object)"
|
|
|
|
apply (rule ext, rename_tac s)
|
|
|
|
apply (drule (1) well_formed_object_slots)
|
|
|
|
apply (fastforce simp: object_slot_empty_def object_initialised_general_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
(****************************************************************************
|
|
|
|
* Lemmas decomposing object_slots_initialised. *
|
|
|
|
* These show that initialising an objects slots can be done slot by slot. *
|
|
|
|
****************************************************************************)
|
|
|
|
|
|
|
|
lemma object_slots_initialised_decomp_helper:
|
|
|
|
"\<lbrakk>slots \<noteq> {}; slots \<noteq> UNIV\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots_initialised spec t obj_id =
|
|
|
|
(object_initialised_general spec t (spec2s t) (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id \<and>*
|
|
|
|
object_initialised_general spec t (spec2s t) (\<lambda>obj_id. sep_map_S' (obj_id, UNIV-slots)) obj_id)"
|
|
|
|
apply (clarsimp simp: object_slots_initialised_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_S_decomp')
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_empty_decomp_helper:
|
|
|
|
"\<lbrakk>slots \<noteq> {}; slots \<noteq> UNIV\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots_empty spec t obj_id =
|
|
|
|
(object_initialised_general spec t object_default_state (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id \<and>*
|
|
|
|
object_initialised_general spec t object_default_state (\<lambda>obj_id. sep_map_S' (obj_id, UNIV-slots)) obj_id)"
|
|
|
|
apply (clarsimp simp: object_slots_empty_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_S_decomp')
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_slots_half_initialised_decomp_helper:
|
|
|
|
"\<lbrakk>slots \<noteq> {}; slots \<noteq> UNIV\<rbrakk>
|
|
|
|
\<Longrightarrow> cnode_slots_half_initialised spec t obj_id =
|
|
|
|
(object_initialised_general spec t (spec2s t \<circ> cnode_half spec obj_id) (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id \<and>*
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec obj_id) (\<lambda>obj_id. sep_map_S' (obj_id, UNIV-slots)) obj_id)"
|
|
|
|
apply (clarsimp simp: cnode_slots_half_initialised_def)
|
|
|
|
apply (rule object_initialised_general_decomp)
|
|
|
|
apply (clarsimp simp: sep_map_S_decomp')
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_exists_rewrite':
|
|
|
|
"\<lbrakk>((obj_id, slots) \<mapsto>S' obj') s; intent_reset obj' = intent_reset obj\<rbrakk>
|
|
|
|
\<Longrightarrow> ((obj_id, slots) \<mapsto>S' obj) s"
|
|
|
|
apply (clarsimp simp: intent_reset_def sep_map_S'_def sep_map_general_def
|
|
|
|
split: cdl_object.splits)
|
2015-05-14 16:43:29 +00:00
|
|
|
apply (rename_tac cdl_tcb cdl_tcb')
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (rule ext)
|
2014-07-17 16:22:50 +00:00
|
|
|
apply (clarsimp simp: sep_map_S'_def sep_map_general_def intent_reset_def
|
2014-07-22 04:37:37 +00:00
|
|
|
object_slots_object_clean object_to_sep_state_def object_project_def
|
2016-10-25 06:01:30 +00:00
|
|
|
split: if_split_asm)
|
2015-05-14 16:43:29 +00:00
|
|
|
apply (case_tac cdl_tcb,clarsimp)
|
|
|
|
apply (case_tac cdl_tcb',clarsimp simp:object_slots_def)
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (intro conjI |
|
2014-07-17 16:22:50 +00:00
|
|
|
clarsimp simp: object_slots_object_clean |
|
2014-07-14 19:32:44 +00:00
|
|
|
clarsimp simp: object_slots_def)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_exists_rewrite:
|
|
|
|
"(\<lambda>s. \<exists>obj'. ((obj_id, slots) \<mapsto>S' obj') s \<and> intent_reset obj = intent_reset obj') =
|
|
|
|
(obj_id, slots) \<mapsto>S' obj"
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply clarsimp
|
|
|
|
apply (erule sep_map_exists_rewrite', simp)
|
|
|
|
apply fastforce
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_general_decomp_list:
|
|
|
|
"\<lbrakk>distinct slots; slots \<noteq> []\<rbrakk>
|
|
|
|
\<Longrightarrow> (object_initialised_general spec t obj_trans (\<lambda>obj_id. sep_map_S' (obj_id, set slots)) obj_id) =
|
|
|
|
(\<And>* map (\<lambda>slot. object_initialised_general spec t obj_trans (\<lambda>p. sep_map_s (p, slot)) obj_id) slots)"
|
|
|
|
apply (induct slots)
|
|
|
|
apply clarsimp
|
|
|
|
apply (atomize)
|
|
|
|
apply (case_tac "slots = []")
|
|
|
|
apply (clarsimp simp: object_initialised_general_def sep_map_S'_def sep_map_s_def)
|
|
|
|
apply (clarsimp simp: object_initialised_general_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply clarsimp
|
|
|
|
apply (drule_tac obj_id=kernel_object_id and obj="obj_trans spec_object" in sep_map_S'_decomp', simp)
|
|
|
|
apply (fastforce simp: sep_conj_exists sep_conj_ac)
|
|
|
|
apply (clarsimp simp: sep_conj_exists)
|
|
|
|
apply (drule_tac obj_id=kernel_object_id and obj="obj_trans spec_object" in sep_map_S'_decomp', simp)
|
|
|
|
apply (fastforce simp: sep_conj_exists sep_conj_ac)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_general_decomp_set:
|
|
|
|
"\<lbrakk>finite slots; slots \<noteq> {}\<rbrakk>
|
|
|
|
\<Longrightarrow> (object_initialised_general spec t obj_trans (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id) =
|
|
|
|
(\<And>* slot \<in> slots. object_initialised_general spec t obj_trans (\<lambda>p. sep_map_s (p, slot)) obj_id)"
|
|
|
|
apply (drule sep_map_set_conj_sep_list_conj [where
|
|
|
|
P="\<lambda>slot. object_initialised_general spec t obj_trans (\<lambda>p. sep_map_s (p, slot)) obj_id"])
|
|
|
|
apply (elim exE conjE)
|
|
|
|
apply simp
|
|
|
|
apply (subst object_slots_general_decomp_list [symmetric], clarsimp+)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_initialised_decomp':
|
|
|
|
"\<lbrakk>finite slots; slots \<noteq> {}\<rbrakk>
|
|
|
|
\<Longrightarrow> (object_initialised_general spec t (spec2s t) (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id) =
|
|
|
|
(\<And>* slot \<in> slots. object_slot_initialised spec t obj_id slot)"
|
|
|
|
apply (clarsimp simp: object_slot_initialised_def [abs_def])
|
|
|
|
apply (erule (1) object_slots_general_decomp_set)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_empty_decomp':
|
|
|
|
"\<lbrakk>finite slots; slots \<noteq> {}\<rbrakk>
|
|
|
|
\<Longrightarrow> (object_initialised_general spec t object_default_state (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id) =
|
|
|
|
(\<And>* slot \<in> slots. object_slot_empty spec t obj_id slot)"
|
|
|
|
apply (clarsimp simp: object_slot_empty_def [abs_def])
|
|
|
|
apply (erule (1) object_slots_general_decomp_set)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_slots_half_initialised_decomp':
|
|
|
|
"\<lbrakk>finite slots; slots \<noteq> {}\<rbrakk>
|
|
|
|
\<Longrightarrow> (object_initialised_general spec t (spec2s t \<circ> cnode_half spec obj_id) (\<lambda>obj_id. sep_map_S' (obj_id, slots)) obj_id) =
|
|
|
|
(\<And>* slot \<in> slots. cnode_slot_half_initialised spec t obj_id slot)"
|
|
|
|
apply (clarsimp simp: cnode_slot_half_initialised_def [abs_def])
|
|
|
|
apply (erule (1) object_slots_general_decomp_set)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma empty_slots_object_slots_initialised_object_empty_slots_initialised:
|
|
|
|
"dom (slots_of obj_id spec) = {} \<Longrightarrow> object_empty_slots_initialised spec t obj_id = object_slots_initialised spec t obj_id"
|
|
|
|
apply (rule ext, rename_tac s)
|
|
|
|
apply (clarsimp simp: object_slots_initialised_def object_empty_slots_initialised_def object_initialised_general_def)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: sep_map_S_def sep_map_S'_def sep_map_E_def slots_of_def opt_object_def
|
|
|
|
split: option.splits)
|
|
|
|
apply (fastforce simp: intent_reset_def spec2s_def object_slots_def cdl_tcb.splits
|
|
|
|
split: cdl_object.splits)
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: sep_map_S_def sep_map_S'_def sep_map_E_def slots_of_def opt_object_def
|
|
|
|
split: option.splits)
|
|
|
|
apply (fastforce simp: intent_reset_def spec2s_def object_slots_def cdl_tcb.splits
|
|
|
|
split: cdl_object.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_empty_slots_initialised_def2:
|
|
|
|
"object_empty_slots_initialised spec t obj_id =
|
|
|
|
object_initialised_general spec t (spec2s t) (\<lambda>obj_id'. sep_map_S' (obj_id', UNIV - dom (slots_of obj_id spec))) obj_id"
|
|
|
|
apply (clarsimp simp: object_empty_slots_initialised_def object_initialised_general_def sep_map_E_def)
|
|
|
|
apply (fastforce simp: slots_of_def opt_object_def
|
|
|
|
split: option.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_initialised_decomp:
|
|
|
|
"well_formed spec \<Longrightarrow>
|
|
|
|
object_slots_initialised spec t obj_id =
|
|
|
|
((\<And>* slot \<in> dom (slots_of obj_id spec). (object_slot_initialised spec t obj_id) slot) \<and>*
|
|
|
|
object_empty_slots_initialised spec t obj_id)"
|
|
|
|
apply (drule well_formed_finite [where obj_id=obj_id])
|
|
|
|
apply (case_tac "dom (slots_of obj_id spec) = {}")
|
|
|
|
apply clarsimp
|
|
|
|
apply (rule empty_slots_object_slots_initialised_object_empty_slots_initialised [THEN sym], simp)
|
|
|
|
apply (subst object_slots_initialised_decomp_helper, assumption)
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: object_empty_slots_initialised_def2)
|
|
|
|
apply (drule_tac obj_id=obj_id and spec=spec and t=t in object_slots_initialised_decomp', simp)
|
|
|
|
apply clarsimp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_initialised_decomp_total:
|
|
|
|
"\<lbrakk>well_formed spec\<rbrakk>
|
|
|
|
\<Longrightarrow> object_initialised spec t obj_id =
|
|
|
|
(object_fields_initialised spec t obj_id \<and>*
|
|
|
|
(\<And>* slot \<in> dom (slots_of obj_id spec). object_slot_initialised spec t obj_id slot) \<and>*
|
|
|
|
object_empty_slots_initialised spec t obj_id)"
|
|
|
|
by (clarsimp simp: object_initialised_decomp object_slots_initialised_decomp sep_conj_assoc)
|
|
|
|
|
|
|
|
lemma object_slot_empty_initialised_NullCap:
|
|
|
|
"\<lbrakk>well_formed spec; \<not>tcb_at obj_id spec; opt_cap (obj_id, slot) spec = Some NullCap\<rbrakk> \<Longrightarrow>
|
|
|
|
object_slot_empty spec t obj_id slot = object_slot_initialised spec t obj_id slot"
|
|
|
|
apply (clarsimp simp: object_slot_empty_def object_slot_initialised_def object_initialised_general_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply (clarsimp simp: sep_conj_exists)
|
|
|
|
apply (cut_tac obj="object_default_state spec_object" and obj_id=kernel_object_id and
|
|
|
|
obj'="spec2s t spec_object" and slot=slot
|
|
|
|
in sep_map_s_object_slots_equal)
|
|
|
|
apply (clarsimp simp: object_slots_opt_cap)
|
|
|
|
apply (drule (3) object_slots_object_default_state_NullCap, simp)
|
|
|
|
apply clarsimp
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: sep_conj_exists)
|
|
|
|
apply (cut_tac obj="spec2s t spec_object" and obj_id=kernel_object_id and
|
|
|
|
obj'="object_default_state spec_object" and slot=slot
|
|
|
|
in sep_map_s_object_slots_equal)
|
|
|
|
apply (drule (3) object_slots_object_default_state_NullCap)
|
|
|
|
apply (clarsimp simp: object_slots_opt_cap)
|
|
|
|
apply clarsimp
|
|
|
|
apply clarsimp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_empty_slots_empty_initialised:
|
|
|
|
"well_formed spec
|
|
|
|
\<Longrightarrow> object_empty_slots_empty spec t spec_object_id =
|
|
|
|
object_empty_slots_initialised spec t spec_object_id"
|
|
|
|
apply (clarsimp simp: object_empty_slots_initialised_def object_empty_slots_empty_def
|
|
|
|
object_initialised_general_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply clarsimp
|
|
|
|
apply (frule (1) well_formed_object_slots)
|
|
|
|
apply (clarsimp simp: well_formed_def)
|
|
|
|
apply (erule_tac x=spec_object_id in allE)
|
|
|
|
apply (clarsimp simp: opt_object_def sep_map_E_object_default_state
|
|
|
|
split: option.splits)
|
|
|
|
apply (clarsimp simp: well_formed_def)
|
|
|
|
apply (erule_tac x=spec_object_id in allE)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (drule_tac obj=spec_object and p=kernel_object_id in sep_map_E_object_default_state, simp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_empty_slots_half_initialised_object_empty_slots_initialised:
|
|
|
|
"cnode_empty_slots_half_initialised spec t spec_object_id =
|
|
|
|
object_empty_slots_initialised spec t spec_object_id"
|
|
|
|
apply (clarsimp simp: object_empty_slots_initialised_def cnode_empty_slots_half_initialised_def
|
|
|
|
object_initialised_general_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (cut_tac p=kernel_object_id and obj=spec_object and
|
|
|
|
obj'="cnode_half spec spec_object_id spec_object" in
|
|
|
|
sep_map_E_eq [OF sym], simp+)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (cut_tac p=kernel_object_id and obj="cnode_half spec spec_object_id spec_object" and
|
|
|
|
obj'="spec_object" in
|
|
|
|
sep_map_E_eq [OF sym], simp+)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_default_state_has_slots_not_empty:
|
|
|
|
"has_slots obj \<Longrightarrow> dom (object_slots (object_default_state obj)) \<noteq> {}"
|
|
|
|
apply (clarsimp simp: object_default_state_def2 has_slots_def object_slots_def
|
|
|
|
default_tcb_def tcb_pending_op_slot_def
|
2014-09-09 04:07:24 +00:00
|
|
|
empty_cnode_def empty_irq_node_def empty_cap_map_def
|
2014-07-14 19:32:44 +00:00
|
|
|
split: cdl_object.splits)
|
|
|
|
apply (clarsimp simp: fun_eq_iff, erule_tac x=0 in allE, simp)+
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma well_formed_has_slots:
|
|
|
|
"\<lbrakk>well_formed spec; cdl_objects spec obj_id = Some obj; object_slots obj = empty; has_slots obj \<rbrakk> \<Longrightarrow> False"
|
|
|
|
apply (clarsimp simp: well_formed_def)
|
|
|
|
apply (erule_tac x=obj_id in allE)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (drule object_default_state_has_slots_not_empty, simp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_S_object_default_state_no_slots:
|
|
|
|
"\<not> has_slots obj \<Longrightarrow> (obj_id \<mapsto>S object_default_state obj) = (obj_id \<mapsto>S obj)"
|
|
|
|
apply (clarsimp simp: sep_map_S_def sep_map_general_def)
|
|
|
|
apply (intro ext conjI iffI |
|
2014-07-22 04:37:37 +00:00
|
|
|
clarsimp simp: object_to_sep_state_def object_project_def
|
2014-07-14 19:32:44 +00:00
|
|
|
update_slots_def empty_cnode_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_slots_object_clean
|
2014-07-14 19:32:44 +00:00
|
|
|
object_default_state_def default_object_def
|
|
|
|
object_type_def has_slots_def
|
2014-07-22 04:37:37 +00:00
|
|
|
split: cdl_component_id.splits option.splits cdl_object.splits)+
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_s_object_default_state_no_slots:
|
|
|
|
"\<not> has_slots obj \<Longrightarrow> (obj_id, slot) \<mapsto>s object_default_state obj = (obj_id, slot) \<mapsto>s obj"
|
|
|
|
apply (clarsimp simp: sep_map_s_def sep_map_general_def)
|
|
|
|
apply (intro ext conjI iffI |
|
2014-07-22 04:37:37 +00:00
|
|
|
clarsimp simp: object_to_sep_state_def object_project_def
|
2014-07-14 19:32:44 +00:00
|
|
|
update_slots_def empty_cnode_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_slots_object_clean
|
2014-07-14 19:32:44 +00:00
|
|
|
object_default_state_def default_object_def
|
|
|
|
object_type_def has_slots_def
|
2014-07-22 04:37:37 +00:00
|
|
|
split: cdl_component_id.splits option.splits cdl_object.splits)+
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_empty_initialised_no_slots:
|
|
|
|
"\<lbrakk>well_formed spec; slots_of obj_id spec = empty\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots_empty spec t obj_id = object_slots_initialised spec t obj_id"
|
|
|
|
apply (clarsimp simp: slots_of_def opt_object_def split: option.splits)
|
|
|
|
apply (clarsimp simp: object_slots_empty_def object_slots_initialised_def object_initialised_general_def)
|
|
|
|
apply (rename_tac obj)
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply (drule (3) well_formed_has_slots, simp)
|
|
|
|
apply (frule (1) well_formed_object_slots)
|
|
|
|
apply (clarsimp simp: object_slots_empty_def object_slots_initialised_def object_initialised_general_def)
|
|
|
|
apply (rule ext, rule iffI)
|
|
|
|
apply (clarsimp simp: spec2s_def)
|
|
|
|
apply (drule_tac obj_id=kernel_object_id in sep_map_S_object_default_state_no_slots, simp)
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: spec2s_def)
|
|
|
|
apply (drule_tac obj_id=kernel_object_id in sep_map_S_object_default_state_no_slots, simp)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_empty_slots_empty_def2:
|
|
|
|
"well_formed spec
|
|
|
|
\<Longrightarrow> object_empty_slots_empty spec t obj_id =
|
|
|
|
object_initialised_general spec t object_default_state (\<lambda>obj_id'. sep_map_S' (obj_id', UNIV - dom (slots_of obj_id spec))) obj_id"
|
|
|
|
apply (clarsimp simp: object_empty_slots_empty_def object_initialised_general_def sep_map_E_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply (clarsimp simp: well_formed_def)
|
|
|
|
apply (erule_tac x=obj_id in allE)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (fastforce simp: slots_of_def opt_object_def split: option.splits)
|
|
|
|
apply (clarsimp simp: well_formed_def)
|
|
|
|
apply (erule_tac x=obj_id in allE)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (fastforce simp: slots_of_def opt_object_def split: option.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_empty_slots_half_initialised_def2:
|
|
|
|
"cnode_empty_slots_half_initialised spec t obj_id =
|
|
|
|
object_initialised_general spec t (spec2s t \<circ> cnode_half spec obj_id)
|
|
|
|
(\<lambda>obj_id'. sep_map_S' (obj_id', UNIV - dom (slots_of obj_id spec))) obj_id"
|
|
|
|
apply (clarsimp simp: object_empty_slots_initialised_def cnode_empty_slots_half_initialised_def
|
|
|
|
object_initialised_general_def)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (rule iffI)
|
|
|
|
apply (clarsimp simp: opt_object_def split: option.splits)
|
|
|
|
apply (cut_tac p=kernel_object_id and
|
|
|
|
obj="cnode_half spec obj_id spec_object" and
|
|
|
|
obj'="spec2s t (cnode_half spec obj_id spec_object)" in
|
|
|
|
sep_map_E_eq, simp, simp)
|
|
|
|
apply (clarsimp simp: sep_map_E_def slots_of_def opt_object_def split: option.splits)
|
|
|
|
apply clarsimp
|
|
|
|
apply (cut_tac p=kernel_object_id and
|
|
|
|
obj="spec2s t (cnode_half spec obj_id spec_object)" and
|
|
|
|
obj'="cnode_half spec obj_id spec_object" in
|
|
|
|
sep_map_E_eq, simp, simp)
|
|
|
|
apply (clarsimp simp: sep_map_E_def slots_of_def opt_object_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma object_slots_empty_decomp:
|
|
|
|
"\<lbrakk>well_formed spec\<rbrakk>
|
|
|
|
\<Longrightarrow> object_slots_empty spec t obj_id =
|
|
|
|
((\<And>* slot \<in> dom (slots_of obj_id spec). object_slot_empty spec t obj_id slot) \<and>*
|
|
|
|
object_empty_slots_empty spec t obj_id)"
|
|
|
|
apply (frule well_formed_finite [where obj_id=obj_id])
|
|
|
|
apply (case_tac "dom (slots_of obj_id spec) = {}")
|
|
|
|
apply clarsimp
|
|
|
|
apply (subst object_empty_slots_empty_initialised, simp)
|
|
|
|
apply (subst empty_slots_object_slots_initialised_object_empty_slots_initialised, simp)
|
|
|
|
apply (clarsimp simp: object_slots_empty_initialised_no_slots)
|
|
|
|
apply (subst object_slots_empty_decomp_helper, assumption)
|
|
|
|
apply clarsimp
|
|
|
|
apply (clarsimp simp: object_empty_slots_empty_def2)
|
|
|
|
apply (drule_tac obj_id=obj_id and spec=spec and t=t in object_slots_empty_decomp', simp)
|
|
|
|
apply clarsimp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma well_formed_cnode_not_empty:
|
|
|
|
"\<lbrakk>well_formed spec; slots_of obj_id spec = empty; cnode_at obj_id spec\<rbrakk> \<Longrightarrow> P"
|
|
|
|
apply (clarsimp simp: slots_of_def opt_object_def object_at_def
|
|
|
|
split: option.splits)
|
|
|
|
apply (rename_tac obj)
|
|
|
|
apply (case_tac "has_slots obj")
|
|
|
|
apply (drule (3) well_formed_has_slots, simp)
|
|
|
|
apply (clarsimp simp: is_cnode_def has_slots_def split: cdl_object.splits)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma cnode_slots_half_initialised_decomp:
|
|
|
|
"\<lbrakk>well_formed spec; cnode_at obj_id spec\<rbrakk>
|
|
|
|
\<Longrightarrow> cnode_slots_half_initialised spec t obj_id =
|
|
|
|
((\<And>* slot \<in> dom (slots_of obj_id spec). cnode_slot_half_initialised spec t obj_id slot) \<and>*
|
|
|
|
cnode_empty_slots_half_initialised spec t obj_id)"
|
|
|
|
apply (frule well_formed_finite [where obj_id=obj_id])
|
|
|
|
apply (case_tac "dom (slots_of obj_id spec) = {}")
|
|
|
|
apply clarsimp
|
|
|
|
apply (erule (2) well_formed_cnode_not_empty)
|
|
|
|
apply (subst cnode_slots_half_initialised_decomp_helper, assumption)
|
|
|
|
apply clarsimp
|
|
|
|
apply (drule_tac obj_id=obj_id in well_formed_finite, clarsimp)
|
|
|
|
apply (subst cnode_slots_half_initialised_decomp', simp+)
|
|
|
|
apply (clarsimp simp: cnode_empty_slots_half_initialised_def2)
|
|
|
|
done
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lemma distinct_singleton_set:
|
|
|
|
"\<lbrakk>distinct xs; set xs = {x}\<rbrakk> \<Longrightarrow> xs = [x]"
|
2014-09-12 07:48:39 +00:00
|
|
|
by (metis set_simps(2) distinct.simps(2) distinct_singleton
|
2014-07-14 19:32:44 +00:00
|
|
|
insert_iff insert_not_empty list.exhaust set_empty2)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
lemma irq_slots_initialised_decomp_helper:
|
|
|
|
"well_formed spec
|
|
|
|
\<Longrightarrow> irq_slots_initialised spec t irq =
|
|
|
|
((\<And>* slot \<in> dom (slots_of (cdl_irq_node spec irq) spec). irq_slot_initialised spec t irq slot) \<and>*
|
|
|
|
object_empty_slots_initialised spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (clarsimp simp: irq_slots_initialised_def irq_slot_initialised_def [abs_def]
|
|
|
|
irq_initialised_general_def [abs_def]
|
|
|
|
object_empty_slots_initialised_def object_initialised_general_def
|
|
|
|
sep_conj_exists slots_of_def opt_object_def
|
|
|
|
split: option.splits)
|
|
|
|
apply (subst sep_map_S_decomp, simp+)
|
|
|
|
apply (erule (1) well_formed_finite_object_slots)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (subst well_formed_object_slots_irq_node, assumption+)+
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (fastforce simp: sep_conj_ac)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_slots_empty_decomp_helper:
|
|
|
|
"well_formed spec
|
|
|
|
\<Longrightarrow> irq_slots_empty spec t irq =
|
|
|
|
((\<And>* slot \<in> dom (slots_of (cdl_irq_node spec irq) spec). irq_slot_empty spec t irq slot) \<and>*
|
|
|
|
object_empty_slots_empty spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (clarsimp simp: irq_slots_empty_def irq_slot_empty_def [abs_def]
|
|
|
|
irq_initialised_general_def [abs_def]
|
|
|
|
object_empty_slots_empty_def object_initialised_general_def
|
|
|
|
sep_conj_exists slots_of_def opt_object_def
|
|
|
|
split: option.splits)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (frule (1) well_formed_object_slots_default_irq_node)
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (subst sep_map_S_decomp, simp+)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (subst well_formed_object_slots_irq_node, assumption+)+
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (fastforce simp: sep_conj_ac)
|
|
|
|
done
|
|
|
|
|
|
|
|
(* This rule uses object_empty_slots_initialised, to make it easier to cancel. *)
|
|
|
|
lemma irq_slots_initialised_decomp:
|
|
|
|
"\<lbrakk>well_formed spec; irq \<in> used_irqs spec\<rbrakk>
|
|
|
|
\<Longrightarrow> irq_slots_initialised spec t irq = (irq_slot_initialised spec t irq 0 \<and>* object_empty_slots_initialised spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (subst irq_slots_initialised_decomp_helper, assumption)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (subst well_formed_slots_of_used_irq_node, assumption+)
|
2014-07-14 19:32:44 +00:00
|
|
|
apply clarsimp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_slots_empty_decomp:
|
|
|
|
"\<lbrakk>well_formed spec; irq \<in> used_irqs spec\<rbrakk>
|
|
|
|
\<Longrightarrow> irq_slots_empty spec t irq = (irq_slot_empty spec t irq 0 \<and>* object_empty_slots_initialised spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (subst irq_slots_empty_decomp_helper, assumption)
|
2014-09-09 04:07:24 +00:00
|
|
|
apply (subst well_formed_slots_of_used_irq_node, assumption+)
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (subst object_empty_slots_empty_initialised, assumption)
|
|
|
|
apply clarsimp
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_initialised_decomp_total:
|
|
|
|
"\<lbrakk>well_formed spec; irq \<in> used_irqs spec\<rbrakk>
|
|
|
|
\<Longrightarrow> irq_initialised spec t irq =
|
|
|
|
(irq_slot_initialised spec t irq 0 \<and>*
|
|
|
|
object_empty_slots_initialised spec t (cdl_irq_node spec irq) \<and>*
|
|
|
|
object_fields_initialised spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (subst irq_initialised_decomp)
|
|
|
|
apply (subst irq_slots_initialised_decomp, assumption+)
|
|
|
|
apply (clarsimp simp: sep_conj_assoc)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma irq_empty_decomp_total:
|
|
|
|
"\<lbrakk>well_formed spec; irq \<in> used_irqs spec\<rbrakk>
|
|
|
|
\<Longrightarrow> irq_empty spec t irq =
|
|
|
|
(irq_slot_empty spec t irq 0 \<and>*
|
|
|
|
object_empty_slots_initialised spec t (cdl_irq_node spec irq) \<and>*
|
|
|
|
object_fields_empty spec t (cdl_irq_node spec irq))"
|
|
|
|
apply (subst irq_empty_decomp)
|
|
|
|
apply (subst irq_slots_empty_decomp, assumption+)
|
|
|
|
apply (clarsimp simp: sep_conj_assoc)
|
|
|
|
done
|
|
|
|
|
|
|
|
(****************************************************************************
|
|
|
|
* Lemmas proving equality between object_fields predicates. *
|
|
|
|
* These show that the fields of a CNode are already initialised correctly. *
|
|
|
|
****************************************************************************)
|
|
|
|
|
|
|
|
lemma sep_map_f_object_default_state_cnode [simp]:
|
|
|
|
"object_type obj = CNodeType \<Longrightarrow> obj_id \<mapsto>f object_default_state obj = obj_id \<mapsto>f obj"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (clarsimp simp: object_type_def split: cdl_object.splits)
|
|
|
|
apply (intro ext conjI iffI |
|
2014-07-22 04:37:37 +00:00
|
|
|
clarsimp simp: object_to_sep_state_def object_project_def
|
2014-07-17 16:22:50 +00:00
|
|
|
intent_reset_def object_wipe_slots_def
|
2014-07-14 19:32:44 +00:00
|
|
|
object_default_state_def default_object_def
|
|
|
|
asid_reset_def object_type_def update_slots_def
|
2014-07-17 16:22:50 +00:00
|
|
|
empty_cnode_def object_size_bits_def object_clean_def)+
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
2014-09-09 04:07:24 +00:00
|
|
|
lemma sep_map_f_object_default_state_irq_node [simp]:
|
|
|
|
"object_type obj = IRQNodeType \<Longrightarrow> obj_id \<mapsto>f object_default_state obj = obj_id \<mapsto>f obj"
|
|
|
|
apply (clarsimp simp: sep_map_f_def sep_map_general_def split: sep_state.splits)
|
|
|
|
apply (rule ext)
|
|
|
|
apply (clarsimp simp: object_type_def split: cdl_object.splits)
|
|
|
|
apply (intro ext conjI iffI |
|
|
|
|
clarsimp simp: object_to_sep_state_def object_project_def
|
|
|
|
intent_reset_def object_wipe_slots_def
|
|
|
|
object_default_state_def default_object_def
|
|
|
|
asid_reset_def object_type_def update_slots_def
|
|
|
|
empty_cnode_def object_size_bits_def object_clean_def)+
|
|
|
|
done
|
|
|
|
|
2014-07-22 04:37:37 +00:00
|
|
|
lemma object_to_sep_state_fields[simp]:
|
|
|
|
"object_to_sep_state obj_id (update_slots slot obj) {Fields} = object_to_sep_state obj_id obj {Fields}"
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (rule ext)
|
|
|
|
apply (case_tac obj,
|
2014-07-22 04:37:37 +00:00
|
|
|
simp_all add:object_to_sep_state_def update_slots_def split_def
|
2014-07-17 16:22:50 +00:00
|
|
|
object_project_def object_clean_def asid_reset_def
|
|
|
|
object_wipe_slots_def intent_reset_def object_slots_def)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
|
|
|
lemma sep_map_f_cnode_half [simp]:
|
|
|
|
"obj_id \<mapsto>f cnode_half spec obj_id' obj = obj_id \<mapsto>f obj "
|
|
|
|
apply (rule ext)
|
2014-07-17 16:22:50 +00:00
|
|
|
apply (clarsimp simp: cnode_half_def sep_map_f_def sep_map_general_def)
|
2014-07-14 19:32:44 +00:00
|
|
|
done
|
|
|
|
|
2014-09-17 07:07:22 +00:00
|
|
|
lemma sep_map_f_tcb_half [simp]:
|
|
|
|
"obj_id \<mapsto>f tcb_half spec tcb = obj_id \<mapsto>f tcb"
|
|
|
|
by (clarsimp simp: tcb_half_def sep_map_f_def sep_map_general_def)
|
|
|
|
|
2014-09-09 04:07:24 +00:00
|
|
|
lemma irq_node_fields_empty_initialised:
|
|
|
|
"irq_node_at obj_id spec
|
|
|
|
\<Longrightarrow> object_fields_empty spec spec2s_ids obj_id = object_fields_initialised spec spec2s_ids obj_id"
|
|
|
|
by (clarsimp simp: object_fields_empty_def object_fields_initialised_def
|
|
|
|
object_initialised_general_def object_at_def object_type_is_object)
|
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
lemma cnode_fields_empty_initialised:
|
|
|
|
"cnode_at obj_id spec
|
|
|
|
\<Longrightarrow> object_fields_empty spec t obj_id = object_fields_initialised spec t obj_id"
|
2014-09-09 04:07:24 +00:00
|
|
|
by (clarsimp simp: object_fields_empty_def object_fields_initialised_def
|
2014-07-14 19:32:44 +00:00
|
|
|
object_initialised_general_def object_at_def object_type_is_object)
|
2014-09-09 04:07:24 +00:00
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
|
|
|
|
lemma cnode_fields_half_initialised_object_fields_initialised:
|
|
|
|
"cnode_at obj_id spec
|
|
|
|
\<Longrightarrow> cnode_fields_half_initialised spec t obj_id = object_fields_initialised spec t obj_id"
|
2014-09-09 04:07:24 +00:00
|
|
|
by (clarsimp simp: cnode_fields_half_initialised_def object_fields_initialised_def object_initialised_general_def)
|
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
|
|
|
|
lemma object_fields_empty_half_initialised:
|
|
|
|
"cnode_at obj_id spec
|
|
|
|
\<Longrightarrow> cnode_fields_half_initialised spec t obj_id = object_fields_empty spec t obj_id"
|
|
|
|
by (clarsimp simp: cnode_fields_half_initialised_object_fields_initialised cnode_fields_empty_initialised)
|
|
|
|
|
|
|
|
end
|