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)
|
|
|
|
*)
|
|
|
|
|
|
|
|
theory SEL4GlobalsSwap
|
|
|
|
|
|
|
|
imports "../../tools/asmrefine/GlobalsSwap"
|
|
|
|
"../../tools/asmrefine/FieldAccessors"
|
|
|
|
"../../spec/cspec/Substitute"
|
|
|
|
|
|
|
|
begin
|
|
|
|
|
|
|
|
lemma globals_update_id:
|
|
|
|
"globals_update id = id"
|
|
|
|
by (rule ext, simp)
|
|
|
|
|
|
|
|
lemma globals_update_eq_iff:
|
|
|
|
"(globals_update f s = globals_update g s)
|
|
|
|
= (f (globals s) = g (globals s))"
|
|
|
|
apply (rule iffI)
|
|
|
|
apply (drule_tac f=globals in arg_cong)
|
|
|
|
apply simp
|
|
|
|
apply (rule state.fold_congs, simp+)
|
|
|
|
done
|
|
|
|
|
|
|
|
instance ptr :: (c_type)oneMB_packed ..
|
|
|
|
instance tcb_queue_C :: oneMB_packed ..
|
2014-09-03 07:38:45 +00:00
|
|
|
instance region_C :: oneMB_packed ..
|
2014-07-14 19:32:44 +00:00
|
|
|
|
2014-09-30 06:09:22 +00:00
|
|
|
locale graph_refine_locale = kernel_all_substitute
|
|
|
|
+ assumes globals_list_distinct:
|
|
|
|
"globals_list_distinct domain symbol_table globals_list"
|
|
|
|
assumes globals_list_ok:
|
|
|
|
"\<forall>g \<in> set globals_list. global_data_ok symbol_table g"
|
|
|
|
begin
|
2014-07-14 19:32:44 +00:00
|
|
|
|
|
|
|
lemmas globals_list_def = kernel_all_global_addresses.global_data_list_def
|
|
|
|
lemmas global_data_defs = kernel_all_global_addresses.global_data_defs
|
|
|
|
|
|
|
|
lemma globals_list_valid:
|
2014-09-30 06:09:22 +00:00
|
|
|
"globals_list_valid symbol_table t_hrs_' t_hrs_'_update globals_list"
|
|
|
|
apply (rule globals_list_valid_optimisation[OF _ _ globals_list_ok])
|
2014-07-14 19:32:44 +00:00
|
|
|
apply (simp_all add: globals_list_def globals_list_valid_def
|
|
|
|
global_data_defs
|
|
|
|
del: distinct_prop.simps split del: split_if)
|
|
|
|
apply (simp add: global_data_swappable_def global_data_def)
|
|
|
|
apply (simp_all add: global_data_valid)
|
|
|
|
apply (simp_all add: global_data_valid_def addressed_global_data_def
|
2014-09-30 06:09:22 +00:00
|
|
|
const_global_data_def global_data_ok_def global_data_def
|
2014-07-14 19:32:44 +00:00
|
|
|
to_bytes_p_from_bytes)
|
|
|
|
done
|
|
|
|
|
|
|
|
lemma global_acc_valid:
|
|
|
|
"global_acc_valid t_hrs_' t_hrs_'_update"
|
|
|
|
by (simp add: global_acc_valid_def)
|
|
|
|
|
|
|
|
abbreviation "gswap == globals_swap t_hrs_' t_hrs_'_update symbol_table globals_list"
|
|
|
|
|
|
|
|
lemma globals_swap_twice:
|
|
|
|
"globals_list_distinct D symbol_table globals_list
|
|
|
|
\<Longrightarrow> gswap (gswap gs) = gs"
|
|
|
|
by (intro globals_swap_twice_helper globals_list_valid global_acc_valid)
|
|
|
|
|
2014-09-03 07:38:45 +00:00
|
|
|
lemma ghost'state_update_globals_swap:
|
|
|
|
"gswap (ghost'state_'_update f gs) = ghost'state_'_update f (gswap gs)"
|
|
|
|
apply (simp add: globals_swap_def)
|
|
|
|
apply (rule foldr_update_commutes[symmetric])
|
|
|
|
apply (auto simp: globals_list_def global_data_defs global_swap_def
|
|
|
|
global_data_def const_global_data_def addressed_global_data_def)
|
|
|
|
done
|
|
|
|
|
|
|
|
(* FIXME: this has to be done and should be standardised *)
|
|
|
|
lemma t_hrs_ghost'state_update_globals_swap[simp]:
|
|
|
|
"t_hrs_' (gswap (ghost'state_'_update f gs)) = t_hrs_' (gswap gs)"
|
|
|
|
by (simp add: ghost'state_update_globals_swap)
|
|
|
|
|
2014-07-14 19:32:44 +00:00
|
|
|
end
|
|
|
|
|
|
|
|
end
|
|
|
|
|