SELFOUR-444: Haskell implementation, begin refine.

First attempt at a haskell implementation of preemptible retyping
and the refinement proof to abstract.
This commit is contained in:
Thomas Sewell 2016-05-16 19:45:59 +10:00
parent 63888fa98d
commit d765a64b81
34 changed files with 2067 additions and 2511 deletions

View File

@ -42,9 +42,10 @@ session BaseRefine = AInvs +
"refine/Include"
session AInvs = ASpec +
theories [condition = "SKIP_INVS_PROOFS", quick_and_dirty, skip_proofs]
"invariant-abstract/AInvs"
theories
"invariant-abstract/AInvs"
"invariant-abstract/EmptyFail_AI"
"invariant-abstract/KernelInit_AI"
"invariant-abstract/DetSchedSchedule_AI"

View File

@ -21,6 +21,44 @@ crunch ct[wp]: init_arch_objects "\<lambda>s. P (cur_thread s)" (wp: crunch_wps
crunch st_tcb_at[wp]: init_arch_objects "st_tcb_at Q t" (wp: mapM_x_wp' hoare_unless_wp)
crunch valid_etcbs[wp, DetSchedAux_AI_assms]: init_arch_objects valid_etcbs (wp: valid_etcbs_lift)
crunch ct[wp, DetSchedAux_AI_assms]: invoke_untyped "\<lambda>s. P (cur_thread s)"
(wp: crunch_wps dxo_wp_weak preemption_point_inv mapME_x_inv_wp
simp: crunch_simps do_machine_op_def detype_def mapM_x_defsym unless_def
ignore: freeMemory ignore: retype_region_ext)
crunch ready_queues[wp, DetSchedAux_AI_assms]: invoke_untyped "\<lambda>s. P (ready_queues s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def unless_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch scheduler_action[wp, DetSchedAux_AI_assms]: invoke_untyped "\<lambda>s. P (scheduler_action s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def unless_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch cur_domain[wp, DetSchedAux_AI_assms]: invoke_untyped "\<lambda>s. P (cur_domain s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def unless_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch idle_thread[wp, DetSchedAux_AI_assms]: invoke_untyped "\<lambda>s. P (idle_thread s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv dxo_wp_weak
simp: detype_def detype_ext_def whenE_def unless_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory retype_region_ext)
crunch inv[wp]: get_tcb_queue, ethread_get "\<lambda>s. P s"
lemma tcb_sched_action_valid_idle_etcb:
"\<lbrace>valid_idle_etcb\<rbrace>
tcb_sched_action foo thread
\<lbrace>\<lambda>_. valid_idle_etcb\<rbrace>"
apply (rule valid_idle_etcb_lift)
apply (simp add: tcb_sched_action_def set_tcb_queue_def)
apply (wp | simp)+
done
crunch ekheap[wp]: do_machine_op "\<lambda>s. P (ekheap s)"
lemma delete_objects_etcb_at[wp, DetSchedAux_AI_assms]:
"\<lbrace>\<lambda>s::det_ext state. etcb_at P t s\<rbrace> delete_objects a b \<lbrace>\<lambda>r s. etcb_at P t s\<rbrace>"
apply (simp add: delete_objects_def)
@ -28,16 +66,29 @@ lemma delete_objects_etcb_at[wp, DetSchedAux_AI_assms]:
apply (simp add: detype_def detype_ext_def wrap_ext_det_ext_ext_def etcb_at_def|wp)+
done
crunch etcb_at[wp]: reset_untyped_cap "etcb_at P t"
(wp: preemption_point_inv' mapME_x_inv_wp crunch_wps
simp: unless_def)
crunch valid_etcbs[wp]: reset_untyped_cap "valid_etcbs"
(wp: preemption_point_inv' mapME_x_inv_wp crunch_wps
simp: unless_def)
lemma invoke_untyped_etcb_at [DetSchedAux_AI_assms]:
"\<lbrace>(\<lambda>s :: det_ext state. etcb_at P t s) and valid_etcbs\<rbrace> invoke_untyped ui \<lbrace>\<lambda>r s. st_tcb_at (Not o inactive) t s \<longrightarrow> etcb_at P t s\<rbrace> "
"\<lbrace>(\<lambda>s :: det_ext state. etcb_at P t s) and valid_etcbs\<rbrace> invoke_untyped ui \<lbrace>\<lambda>r s. st_tcb_at (Not o inactive) t s \<longrightarrow> etcb_at P t s\<rbrace>"
apply (cases ui)
apply (simp add: mapM_x_def[symmetric])
apply wp
apply (wp retype_region_etcb_at mapM_x_wp' create_cap_no_pred_tcb_at
hoare_convert_imp typ_at_pred_tcb_at_lift )
apply simp
apply (simp add: mapM_x_def[symmetric] invoke_untyped_def whenE_def
split del: split_if)
apply (rule hoare_pre)
apply (wp retype_region_etcb_at mapM_x_wp'
create_cap_no_pred_tcb_at typ_at_pred_tcb_at_lift
hoare_convert_imp[OF create_cap_no_pred_tcb_at]
hoare_convert_imp[OF _ init_arch_objects_exst]
| simp
| (wp_once hoare_drop_impE_E))+
done
crunch valid_blocked[wp, DetSchedAux_AI_assms]: init_arch_objects valid_blocked
(wp: valid_blocked_lift set_cap_typ_at)
@ -119,6 +170,9 @@ crunch valid_sched[wp]: init_arch_objects valid_sched (wp: valid_sched_lift)
end
lemmas tcb_sched_action_valid_idle_etcb
= ARM.tcb_sched_action_valid_idle_etcb
global_interpretation DetSchedAux_AI_det_ext?: DetSchedAux_AI_det_ext
proof goal_cases
interpret Arch .

View File

@ -34,7 +34,9 @@ crunch valid_list[wp, Deterministic_AI_assms]: cap_recycle valid_list
ignore: without_preemption filterM recycle_cap_ext)
crunch valid_list[wp]: invoke_untyped valid_list
(wp: crunch_wps hoare_unless_wp simp: mapM_x_def_bak)
(wp: crunch_wps preemption_point_inv' hoare_unless_wp mapME_x_wp'
simp: mapM_x_def_bak crunch_simps
ignore: Deterministic_A.OR_choiceE)
crunch valid_list[wp]: invoke_irq_control valid_list

View File

@ -743,7 +743,7 @@ lemma delete_objects_valid_pdpt:
by (rule delete_objects_reduct) (wp detype_valid_pdpt)
crunch valid_pdpt[wp]: reset_untyped_cap "valid_pdpt_objs"
(wp: mapME_x_inv_wp)
(wp: mapME_x_inv_wp crunch_wps simp: crunch_simps unless_def)
lemma invoke_untyped_valid_pdpt[wp]:
"\<lbrace>valid_pdpt_objs and invs and ct_active

View File

@ -149,9 +149,9 @@ locale DetSchedAux_AI_det_ext = DetSchedAux_AI "TYPE(det_ext)" +
invoke_untyped ui
\<lbrace>\<lambda>r s. st_tcb_at (Not o inactive) t s \<longrightarrow> etcb_at P t s\<rbrace> "
assumes init_arch_objects_valid_etcbs[wp]:
"\<And>t r n sz refs dev. \<lbrace>valid_etcbs\<rbrace> init_arch_objects t r n sz refs dev\<lbrace>\<lambda>_. valid_etcbs\<rbrace>"
"\<And>t r n sz refs. \<lbrace>valid_etcbs\<rbrace> init_arch_objects t r n sz refs \<lbrace>\<lambda>_. valid_etcbs\<rbrace>"
assumes init_arch_objects_valid_blocked[wp]:
"\<And>t r n sz refs dev. \<lbrace>valid_blocked\<rbrace> init_arch_objects t r n sz refs dev \<lbrace>\<lambda>_. valid_blocked\<rbrace>"
"\<And>t r n sz refs. \<lbrace>valid_blocked\<rbrace> init_arch_objects t r n sz refs \<lbrace>\<lambda>_. valid_blocked\<rbrace>"
assumes invoke_untyped_cur_domain[wp]:
"\<And>P i. \<lbrace>\<lambda>s. P (cur_domain s)\<rbrace> invoke_untyped i \<lbrace>\<lambda>_ s. P (cur_domain s)\<rbrace>"
assumes invoke_untyped_ready_queues[wp]:
@ -175,7 +175,7 @@ context DetSchedAux_AI_det_ext begin
crunch valid_etcbs[wp]: invoke_untyped "valid_etcbs"
(wp: preemption_point_inv' mapME_x_inv_wp crunch_wps whenE_inv
simp: mapM_x_defsym)
simp: mapM_x_defsym crunch_simps unless_def)
end
@ -220,7 +220,7 @@ context DetSchedAux_AI_det_ext begin
crunch valid_blocked[wp]: invoke_untyped "valid_blocked"
(wp: preemption_point_inv' mapME_x_inv_wp crunch_wps whenE_inv
simp: mapM_x_defsym)
simp: mapM_x_defsym crunch_simps unless_def)
end
@ -317,30 +317,6 @@ lemma valid_sched_tcb_state_preservation:
apply(fastforce simp: valid_idle_def pred_tcb_at_def obj_at_def)
done
crunch ct[wp]: invoke_untyped "\<lambda>s. P (cur_thread s)"
(wp: crunch_wps dxo_wp_weak preemption_point_inv mapME_x_inv_wp
simp: crunch_simps do_machine_op_def detype_def mapM_x_defsym
ignore: freeMemory ignore: retype_region_ext)
crunch ready_queues[wp]: invoke_untyped "\<lambda>s. P (ready_queues s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch scheduler_action[wp]: invoke_untyped "\<lambda>s. P (scheduler_action s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch cur_domain[wp]: invoke_untyped "\<lambda>s. P (cur_domain s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv'
simp: detype_def detype_ext_def whenE_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory)
crunch idle_thread[wp]: invoke_untyped "\<lambda>s. P (idle_thread s)"
(wp: crunch_wps mapME_x_inv_wp preemption_point_inv dxo_wp_weak
simp: detype_def detype_ext_def whenE_def
wrap_ext_det_ext_ext_def mapM_x_defsym
ignore: freeMemory retype_region_ext)
lemma valid_idle_etcb_lift:
assumes "\<And>P t. \<lbrace>\<lambda>s. etcb_at P t s\<rbrace> f \<lbrace>\<lambda>r s. etcb_at P t s\<rbrace>"
shows "\<lbrace>valid_idle_etcb\<rbrace> f \<lbrace>\<lambda>r. valid_idle_etcb\<rbrace>"
@ -348,23 +324,6 @@ lemma valid_idle_etcb_lift:
apply(wp assms)
done
crunch etcb_at[wp]: reset_untyped_cap "etcb_at P t"
(wp: preemption_point_inv' mapME_x_inv_wp)
lemma invoke_untyped_etcb_at:
"\<lbrace>(\<lambda>s :: det_ext state. etcb_at P t s) and valid_etcbs\<rbrace> invoke_untyped ui \<lbrace>\<lambda>r s. st_tcb_at (Not o inactive) t s \<longrightarrow> etcb_at P t s\<rbrace>"
apply (cases ui)
apply (simp add: mapM_x_def[symmetric] invoke_untyped_def whenE_def
split del: split_if)
apply (rule hoare_pre)
apply (wp retype_region_etcb_at mapM_x_wp'
create_cap_no_pred_tcb_at typ_at_pred_tcb_at_lift
hoare_convert_imp[OF create_cap_no_pred_tcb_at]
hoare_convert_imp[OF _ init_arch_objects_exst]
| simp
| (wp_once hoare_drop_impE_E))+
done
context DetSchedAux_AI_det_ext begin
lemma invoke_untyped_valid_sched:

View File

@ -4085,9 +4085,6 @@ global_interpretation retype_region_ext_extended: is_extended "retype_region_ext
apply wp
done
crunch valid_list[wp]: invoke_untyped valid_list
(wp: crunch_wps preemption_point_inv' mapME_x_inv_wp
simp: mapM_x_def_bak whenE_def)
crunch valid_list[wp]: invoke_irq_handler valid_list
crunch valid_list[wp]: attempt_switch_to "valid_list"

View File

@ -2872,8 +2872,8 @@ lemma reset_untyped_cap_invs_etc:
(simp add: cte_wp_at_caps_of_state descendants_range_def)+)
apply (drule caps_of_state_valid_cap | clarify)+
apply (intro conjI; clarify?; blast)[1]
apply (cases "sz < reset_chunk_bits")
apply simp
apply (cases "dev \<or> sz < reset_chunk_bits")
apply (simp add: unless_def)
apply (rule hoare_pre)
apply (wp set_untyped_cap_invs_simple set_cap_cte_wp_at set_cap_no_overlap
hoare_vcg_const_Ball_lift set_cap_cte_cap_wp_to
@ -2882,7 +2882,8 @@ lemma reset_untyped_cap_invs_etc:
apply (rule hoare_lift_Pf2 [where f="interrupt_irq_node"])
apply (wp hoare_vcg_const_Ball_lift hoare_vcg_const_imp_lift
hoare_vcg_ex_lift ct_in_state_thread_state_lift)
apply (clarsimp simp add: bits_of_def field_simps cte_wp_at_caps_of_state)
apply (clarsimp simp add: bits_of_def field_simps cte_wp_at_caps_of_state
empty_descendants_range_in)
apply (cut_tac a=sz and b=reset_chunk_bits and n=idx in upt_mult_lt_prop)
apply (frule caps_of_state_valid_cap, clarsimp+)
apply (simp add: valid_cap_def)
@ -2929,11 +2930,11 @@ lemma reset_untyped_cap_st_tcb_at:
\<lbrace>\<lambda>_. st_tcb_at P t\<rbrace>, \<lbrace>\<lambda>_. st_tcb_at P t\<rbrace>"
apply (simp add: reset_untyped_cap_def)
apply (rule hoare_pre)
apply (wp mapME_x_inv_wp preemption_point_inv | simp)+
apply (wp mapME_x_inv_wp preemption_point_inv | simp add: unless_def)+
apply (simp add: delete_objects_def)
apply (wp get_cap_wp | simp)+
apply (clarsimp simp: cte_wp_at_caps_of_state cap_range_def
bits_of_def split: cap.split_asm)
apply (wp get_cap_wp hoare_vcg_const_imp_lift | simp)+
apply (auto simp: cte_wp_at_caps_of_state cap_range_def
bits_of_def split: cap.split_asm)
done
lemma create_cap_iflive[wp]:

View File

@ -1653,5 +1653,39 @@ lemma loadWordUser_inv :
unfolding loadWordUser_def
by (wp dmo_inv' loadWord_inv stateAssert_wp | simp)+
lemma clearMemory_vms':
"valid_machine_state' s \<Longrightarrow>
\<forall>x\<in>fst (clearMemory ptr bits (ksMachineState s)).
valid_machine_state' (s\<lparr>ksMachineState := snd x\<rparr>)"
apply (clarsimp simp: valid_machine_state'_def
disj_commute[of "pointerInUserData p s" for p s])
apply (drule_tac x=p in spec, simp)
apply (drule_tac P4="\<lambda>m'. underlying_memory m' p = 0"
in use_valid[where P=P and Q="\<lambda>_. P" for P], simp_all)
apply (rule clearMemory_um_eq_0)
done
lemma ct_not_inQ_ksMachineState_update[simp]:
"ct_not_inQ (s\<lparr>ksMachineState := v\<rparr>) = ct_not_inQ s"
by (simp add: ct_not_inQ_def)
lemma ct_in_current_domain_ksMachineState_update[simp]:
"ct_idle_or_in_cur_domain' (s\<lparr>ksMachineState := v\<rparr>) = ct_idle_or_in_cur_domain' s"
by (simp add: ct_idle_or_in_cur_domain'_def tcb_in_cur_domain'_def)
lemma dmo_clearMemory_invs'[wp]:
"\<lbrace>invs'\<rbrace> doMachineOp (clearMemory w sz) \<lbrace>\<lambda>_. invs'\<rbrace>"
apply (simp add: doMachineOp_def split_def)
apply wp
apply (clarsimp simp: invs'_def valid_state'_def)
apply (rule conjI)
apply (simp add: valid_irq_masks'_def, elim allEI, clarsimp)
apply (drule use_valid)
apply (rule no_irq_clearMemory[simplified no_irq_def, rule_format])
apply simp_all
apply (drule clearMemory_vms')
apply fastforce
done
end
end

View File

@ -221,7 +221,7 @@ lemma pac_corres:
apply (wp set_untyped_cap_invs_simple[where sz = pageBits]
set_cap_cte_wp_at
set_cap_caps_no_overlap[where sz = pageBits]
set_cap_no_overlap[where sz = pageBits]
set_cap_no_overlap
set_cap_device_and_range_aligned[where dev = False,simplified]
set_untyped_cap_caps_overlap_reserved[where sz = pageBits] | assumption)+
apply (clarsimp simp: conj_comms obj_bits_api_def arch_kobj_size_def
@ -252,7 +252,8 @@ lemma pac_corres:
apply (clarsimp simp: conj_comms ex_disj_distrib
| strengthen invs_valid_pspace' invs_pspace_aligned'
invs_pspace_distinct')+
apply (wp deleteObjects_invs' deleteObjects_cte_wp_at')
apply (wp deleteObjects_invs' deleteObjects_cte_wp_at'
deleteObjects_descendants)
apply (rule_tac Q= "\<lambda>r s. ct_active' s \<and>
(\<exists>x. (x = capability.UntypedCap False word1 pageBits idx \<and> F r s x))" for F
in hoare_strengthen_post)
@ -271,6 +272,7 @@ lemma pac_corres:
deleteObject_no_overlap deleteObjects_ct_active')
apply (clarsimp simp: is_simple_cap_def valid_cap'_def max_free_index_def is_cap_simps
cong: conj_cong)
apply (strengthen empty_descendants_range_in')
apply (wp deleteObjects_descendants deleteObjects_cte_wp_at' deleteObjects_null_filter)
apply (clarsimp simp:invs_mdb max_free_index_def invs_untyped_children)
apply (subgoal_tac "detype_locale x y sa" for x y)
@ -311,8 +313,6 @@ lemma pac_corres:
apply clarsimp
apply (rule conjI,clarsimp simp:clear_um_def)
apply (simp add:detype_clear_um_independent)
apply (rule conjI,rule pspace_no_overlap_detype[OF caps_of_state_valid])
apply (simp add:invs_psp_aligned invs_valid_objs)+
apply (rule conjI,erule caps_no_overlap_detype[OF descendants_range_caps_no_overlapI])
apply (clarsimp simp:is_aligned_neg_mask_eq cte_wp_at_caps_of_state)
apply (simp add:empty_descendants_range_in)+
@ -322,6 +322,9 @@ lemma pac_corres:
apply fastforce
apply (clarsimp simp: region_in_kernel_window_def valid_cap_def
cap_aligned_def is_aligned_neg_mask_eq detype_def clear_um_def)
apply (rule conjI, rule pspace_no_overlap_subset,
rule pspace_no_overlap_detype[OF caps_of_state_valid])
apply (simp add:invs_psp_aligned invs_valid_objs is_aligned_neg_mask_eq)+
apply (clarsimp simp: detype_def clear_um_def detype_ext_def valid_sched_def valid_etcbs_def
st_tcb_at_kh_def obj_at_kh_def st_tcb_at_def obj_at_def is_etcb_at_def)
apply (simp add: detype_def clear_um_def)
@ -2247,6 +2250,7 @@ lemma performASIDControlInvocation_invs' [wp]:
apply (clarsimp simp:isCap_simps)
apply assumption
apply (clarsimp split del:if_splits simp:valid_cap'_def max_free_index_def)
apply (strengthen empty_descendants_range_in')
apply (wp hoare_vcg_ex_lift deleteObjects_caps_no_overlap''
deleteObjects_cte_wp_at'[where d=False] deleteObjects_null_filter[where d=False]
deleteObject_no_overlap[where d=False] deleteObjects_descendants[where d=False])

View File

@ -574,16 +574,6 @@ declare split_if [split]
text {* Proving desired properties about rec_del/cap_delete *}
lemma preemptionPoint_inv:
assumes "(\<And>f s. P (ksWorkUnitsCompleted_update f s) = P s)"
"irq_state_independent_H P"
shows "\<lbrace>P\<rbrace> preemptionPoint \<lbrace>\<lambda>_. P\<rbrace>" using assms
apply (simp add: preemptionPoint_def setWorkUnits_def getWorkUnits_def modifyWorkUnits_def)
apply (wpc
| wp hoare_whenE_wp hoare_seq_ext [OF _ select_inv] alternative_valid hoare_drop_imps
| simp)+
done
declare of_nat_power [simp del]
(* FIXME: pull up *)
@ -754,47 +744,6 @@ lemma not_recursive_ctes_irq_state_independent[simp, intro!]:
"not_recursive_ctes (s \<lparr> ksMachineState := ksMachineState s \<lparr> irq_state := x \<rparr>\<rparr>) = not_recursive_ctes s"
by (simp add: not_recursive_ctes_def)
lemma ps_clear_irq_state_independent [simp, intro!]:
"ps_clear a b (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ps_clear a b s"
by (simp add: ps_clear_def)
lemma ct_in_state'_irq_state_independent [simp, intro!]:
"ct_in_state' x (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ct_in_state' x s"
by (simp add: ct_in_state'_def irq_state_independent_H_def)+
lemma ex_cte_cap_wp_to'_irq_state_independent [simp, intro!]:
"ex_cte_cap_wp_to' x y (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ex_cte_cap_wp_to' x y s"
by (simp add: ex_cte_cap_wp_to'_def irq_state_independent_H_def)+
lemma invs'_irq_state_independent [simp, intro!]:
"invs' (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
invs' s"
apply (clarsimp simp: irq_state_independent_H_def invs'_def valid_state'_def
valid_pspace'_def sch_act_wf_def
valid_queues_def sym_refs_def state_refs_of'_def
if_live_then_nonz_cap'_def if_unsafe_then_cap'_def
valid_idle'_def valid_global_refs'_def
valid_arch_state'_def valid_irq_node'_def
valid_irq_handlers'_def valid_irq_states'_def
irqs_masked'_def bitmapQ_defs valid_queues_no_bitmap_def
valid_queues'_def valid_pde_mappings'_def
pspace_domain_valid_def cur_tcb'_def
valid_machine_state'_def tcb_in_cur_domain'_def
cong: if_cong option.case_cong)
apply (rule iffI)
apply (clarsimp)
apply (case_tac "ksSchedulerAction s", simp_all)
apply clarsimp
apply (case_tac "ksSchedulerAction s", simp_all)
done
lemma typ_at'_irq_state_independent[simp, intro!]:
"P (typ_at' T p (s \<lparr>ksMachineState := ksMachineState s \<lparr> irq_state := f (irq_state (ksMachineState s)) \<rparr>\<rparr>))
= P (typ_at' T p s)"
@ -6532,18 +6481,6 @@ lemma reduceZombie_invs'':
apply (auto elim: ex_Zombie_to2)
done
lemma invs'_wu [simp, intro!]:
"invs' (ksWorkUnitsCompleted_update f s) = invs' s"
apply (simp add: invs'_def cur_tcb'_def valid_state'_def Invariants_H.valid_queues_def
valid_queues'_def valid_irq_node'_def valid_machine_state'_def
ct_not_inQ_def ct_idle_or_in_cur_domain'_def tcb_in_cur_domain'_def
bitmapQ_defs valid_queues_no_bitmap_def)
done
lemma preemptionPoint_invs [wp]:
"\<lbrace>invs'\<rbrace> preemptionPoint \<lbrace>\<lambda>_. invs'\<rbrace>"
by (wp preemptionPoint_inv | clarsimp)+
lemma preemptionPoint_no_cte_prop [wp]:
"\<lbrace>no_cte_prop P and K (finalise_prop_stuff P)\<rbrace> preemptionPoint \<lbrace>\<lambda>_. no_cte_prop P\<rbrace>"
apply (rule hoare_gen_asm)
@ -7256,34 +7193,6 @@ lemma spec_corres_get_known_cap:
apply (clarsimp dest!: singleton_eqD get_cap_det)
done
lemma work_units_updated_state_relationI[intro!]:
"(s,s') \<in> state_relation \<Longrightarrow>
(work_units_completed_update (\<lambda>_. work_units_completed s + 1) s, s'\<lparr>ksWorkUnitsCompleted := ksWorkUnitsCompleted s' + 1\<rparr>) \<in> state_relation"
apply (simp add: state_relation_def)
done
lemma work_units_and_irq_state_state_relationI [intro!]:
"(s, s') \<in> state_relation \<Longrightarrow>
(s \<lparr> work_units_completed := n, machine_state := machine_state s \<lparr> irq_state := f (irq_state (machine_state s)) \<rparr>\<rparr>,
s' \<lparr> ksWorkUnitsCompleted := n, ksMachineState := ksMachineState s' \<lparr> irq_state := f (irq_state (ksMachineState s')) \<rparr>\<rparr>)
\<in> state_relation"
by (simp add: state_relation_def swp_def)
lemma preemption_corres:
"corres (intr \<oplus> dc) \<top> \<top> preemption_point preemptionPoint"
apply (simp add: preemption_point_def preemptionPoint_def)
by (auto simp: preemption_point_def preemptionPoint_def o_def gets_def liftE_def whenE_def getActiveIRQ_def
corres_underlying_def select_def bind_def get_def bindE_def select_f_def modify_def
alternative_def throwError_def returnOk_def return_def lift_def doMachineOp_def split_def
put_def getWorkUnits_def setWorkUnits_def modifyWorkUnits_def do_machine_op_def
update_work_units_def wrap_ext_bool_det_ext_ext_def work_units_limit_def workUnitsLimit_def
work_units_limit_reached_def OR_choiceE_def reset_work_units_def mk_ef_def
elim: state_relationE)
(* what? *)
(* who says our proofs are not automatic.. *)
lemma cte_map_not_in_cte_wp_at:
"\<lbrakk> \<forall>p\<in>set'. \<exists>a b. p = cte_map (a, b) \<and> cte_wp_at (P a b) (a, b) s; cte_wp_at (op = c) p s;
invs s; \<not> P (fst p) (snd p) c \<rbrakk> \<Longrightarrow> cte_map p \<notin> set'"

View File

@ -3561,15 +3561,20 @@ lemma lsfc_corres:
apply clarsimp
done
(* this helper characterisation of ctes_of
is needed in CNodeInv and Untyped *)
lemma ensureNoChildren_wp:
"\<lbrace>\<lambda>s. Q s \<and> (descendants_of' p (ctes_of s) = {} \<longrightarrow> P () s)\<rbrace> ensureNoChildren p \<lbrace>P\<rbrace>,\<lbrace>\<lambda>_. Q\<rbrace>"
"\<lbrace>\<lambda>s. (descendants_of' p (ctes_of s) \<noteq> {} \<longrightarrow> Q s)
\<and> (descendants_of' p (ctes_of s) = {} \<longrightarrow> P () s)\<rbrace>
ensureNoChildren p
\<lbrace>P\<rbrace>,\<lbrace>\<lambda>_. Q\<rbrace>"
apply (simp add: ensureNoChildren_def whenE_def)
apply (wp getCTE_wp')
apply (clarsimp simp: cte_wp_at_ctes_of nullPointer_def descendants_of'_def)
apply (rule conjI)
apply (intro conjI impI allI)
apply clarsimp
apply (drule spec, erule notE, rule subtree.direct_parent)
apply (simp add:mdb_next_rel_def mdb_next_def)
apply simp
apply (simp add: parentOf_def)
apply clarsimp
apply (erule (4) subtree_no_parent)
apply clarsimp
@ -6351,5 +6356,11 @@ lemma updateFreeIndex_invs':
apply (clarsimp simp:isCap_simps cte_wp_at_ctes_of)+
done
lemma no_fail_getSlotCap:
"no_fail (cte_at' p) (getSlotCap p)"
apply (rule no_fail_pre)
apply (simp add: getSlotCap_def | wp)+
done
end
end

View File

@ -2303,12 +2303,11 @@ lemma createObject_cte_wp_at':
apply (simp add:createObject_def)
apply (rule hoare_pre)
apply (wpc
| wp createWordObjects_orig_cte_wp_at[where sz = "(Types_H.getObjectSize ty us)"]
createObjects_orig_cte_wp_at'[where sz = "(Types_H.getObjectSize ty us)"]
| wp createObjects_orig_cte_wp_at'[where sz = "(Types_H.getObjectSize ty us)"]
threadSet_cte_wp_at'
| simp add: ARM_H.createObject_def createPageObject_def
| simp add: ARM_H.createObject_def placeNewDataObject_def
unless_def placeNewObject_def2 objBitsKO_simps range_cover_full
createPageObject_def curDomain_def pageBits_def ptBits_def
curDomain_def pageBits_def ptBits_def
pdBits_def getObjSize_simps archObjSize_def
apiGetObjectSize_def tcbBlockSizeBits_def
epSizeBits_def ntfnSizeBits_def
@ -3547,7 +3546,7 @@ lemma createObject_setCTE_commute:
apply ((rule monad_commute_guard_imp[OF commute_commute]
, rule monad_commute_split[OF commute_commute[OF return_commute]]
, clarsimp simp: ARM_H.createObject_def
createPageObject_def bind_assoc split
placeNewDataObject_def bind_assoc split
del: if_splits
,(rule monad_commute_split return_commute[THEN commute_commute]
setCTE_modify_gsUserPages_commute[of \<top>]
@ -3831,7 +3830,7 @@ lemma createNewCaps_not_nc:
apply (rule hoare_pre)
apply wpc
apply wp
apply (simp add:Arch_createNewCaps_def)
apply (simp add:Arch_createNewCaps_def split del: split_if)
apply (wpc|wp|clarsimp)+
done
@ -3988,14 +3987,14 @@ lemma createNewCaps_pspace_no_overlap':
ARM_H.toAPIType_def tcbBlockSizeBits_def
ARM_H.getObjectSize_def objBits_simps epSizeBits_def ntfnSizeBits_def
cteSizeBits_def pageBits_def ptBits_def archObjSize_def pdBits_def
createObjects_def createWordObjects_def)
createObjects_def)
apply (rule hoare_pre)
apply wpc
apply (clarsimp simp: apiGetObjectSize_def curDomain_def
ARM_H.toAPIType_def tcbBlockSizeBits_def
ARM_H.getObjectSize_def objBits_simps epSizeBits_def ntfnSizeBits_def
cteSizeBits_def pageBits_def ptBits_def archObjSize_def pdBits_def
createObjects_def createWordObjects_def Arch_createNewCaps_def
createObjects_def Arch_createNewCaps_def
split: apiobject_type.splits
| wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap[where sz = sz]
createObjects'_psp_aligned[where sz = sz] createObjects'_psp_distinct[where sz = sz]
@ -4007,7 +4006,7 @@ lemma createNewCaps_pspace_no_overlap':
ARM_H.toAPIType_def tcbBlockSizeBits_def
ARM_H.getObjectSize_def objBits_simps epSizeBits_def ntfnSizeBits_def
cteSizeBits_def pageBits_def ptBits_def archObjSize_def pdBits_def
createObjects_def createWordObjects_def Arch_createNewCaps_def
createObjects_def Arch_createNewCaps_def
unless_def
split: apiobject_type.splits
| wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap
@ -4040,11 +4039,11 @@ lemma createNewCaps_ret_len:
apply wpc
apply (wp|simp add:Arch_createNewCaps_def ARM_H.toAPIType_def
unat_of_nat_minus_1
[where 'a=32, folded word_bits_def] createWordObjects_def |
[where 'a=32, folded word_bits_def] |
erule hoare_strengthen_post[OF createObjects_ret],clarsimp+ | intro conjI impI)+
apply (rule hoare_pre,
(wp | simp add: Arch_createNewCaps_def toAPIType_def
ARM_H.toAPIType_def unat_of_nat_minus_1 createWordObjects_def
ARM_H.toAPIType_def unat_of_nat_minus_1
| erule hoare_strengthen_post[OF createObjects_ret],clarsimp+
| intro conjI impI)+)+
done
@ -4679,18 +4678,16 @@ lemma createObjects_setDomains_commute:
qed
lemma createObjects'_pspace_no_overlap2:
"gz = (objBitsKO val) + us
\<Longrightarrow> \<lbrace>pspace_no_overlap' (ptr + (1 + of_nat n << gz)) sz and
K (range_cover ptr sz gz (Suc (Suc n)) \<and> ptr \<noteq> 0)\<rbrace>
createObjects' ptr (Suc n) val us
\<lbrace>\<lambda>addrs s. pspace_no_overlap' (ptr + (1 + of_nat n << gz)) sz s\<rbrace>"
"\<lbrace>pspace_no_overlap' (ptr + (1 + of_nat n << gz)) sz
and K (gz = (objBitsKO val) + us)
and K (range_cover ptr sz gz (Suc (Suc n)) \<and> ptr \<noteq> 0)\<rbrace>
createObjects' ptr (Suc n) val us
\<lbrace>\<lambda>addrs s. pspace_no_overlap' (ptr + (1 + of_nat n << gz)) sz s\<rbrace>"
proof -
note blah[simp del] = untyped_range.simps usable_untyped_range.simps atLeastAtMost_iff atLeastatMost_subset_iff atLeastLessThan_iff
Int_atLeastAtMost atLeastatMost_empty_iff split_paired_Ex
assume "gz = (objBitsKO val) + us"
thus ?thesis using assms
apply -
apply (rule hoare_gen_asm)
show ?thesis
apply (rule hoare_gen_asm)+
apply (clarsimp simp:createObjects'_def split_def new_cap_addrs_fold')
apply (subst new_cap_addrs_fold')
apply clarsimp
@ -4880,8 +4877,7 @@ proof -
mapM_def sequence_def Retype_H.createObject_def
ARM_H.toAPIType_def
createObjects_def ARM_H.createObject_def
createPageObject_def Arch_createNewCaps_def
createWordObjects_def comp_def
Arch_createNewCaps_def comp_def
apiGetObjectSize_def shiftl_t2n field_simps
shiftL_nat mapM_x_def sequence_x_def append
fromIntegral_def integral_inv[unfolded Fun.comp_def])
@ -4892,8 +4888,7 @@ proof -
sequence_def Retype_H.createObject_def
ARM_H.toAPIType_def
createObjects_def ARM_H.createObject_def
createPageObject_def Arch_createNewCaps_def
createWordObjects_def comp_def
Arch_createNewCaps_def comp_def
apiGetObjectSize_def shiftl_t2n field_simps
shiftL_nat append mapM_x_append2
fromIntegral_def integral_inv[unfolded Fun.comp_def])+
@ -4965,8 +4960,7 @@ proof -
mapM_def sequence_def Retype_H.createObject_def
ARM_H.toAPIType_def
createObjects_def ARM_H.createObject_def
createPageObject_def Arch_createNewCaps_def
createWordObjects_def comp_def
Arch_createNewCaps_def comp_def
apiGetObjectSize_def shiftl_t2n field_simps
shiftL_nat mapM_x_def sequence_x_def append
fromIntegral_def integral_inv[unfolded Fun.comp_def])+
@ -4980,8 +4974,7 @@ proof -
mapM_def sequence_def Retype_H.createObject_def
ARM_H.toAPIType_def
createObjects_def ARM_H.createObject_def
createPageObject_def Arch_createNewCaps_def
createWordObjects_def comp_def
Arch_createNewCaps_def comp_def
apiGetObjectSize_def shiftl_t2n field_simps
shiftL_nat mapM_x_def sequence_x_def append
fromIntegral_def integral_inv[unfolded Fun.comp_def])+
@ -4999,10 +4992,10 @@ proof -
apply simp
-- "SmallPageObject"
apply (simp add: Arch_createNewCaps_def createWordObjects_def
apply (simp add: Arch_createNewCaps_def
Retype_H.createObject_def createObjects_def bind_assoc
ARM_H.toAPIType_def ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def placeNewDataObject_def)
apply (intro conjI impI)
apply (subst monad_eq, rule createObjects_Cons)
apply (simp_all add: field_simps shiftl_t2n pageBits_def
@ -5030,18 +5023,11 @@ proof -
unless_dmo'_createObjects'_comm
dmo'_createObjects'_comm dmo'_gsUserPages_upd_comm
| simp add: modify_modify_bind o_def)+
apply (rule fun_cong[where x=s])
apply (rule arg_cong2[where f=bind, OF refl ext])+
apply (simp add: bind_assoc[symmetric])
apply (rule arg_cong2[where f=bind, OF _ ext])
apply (simp add: append mapM_x_append mapM_x_singleton)
apply (subst doMachineOp_bind)
apply ((simp add: add.commute unless_def when_def if_bind split del: if_splits)+)[4]
-- "LargePageObject"
apply (simp add: Arch_createNewCaps_def createWordObjects_def
apply (simp add: Arch_createNewCaps_def
Retype_H.createObject_def createObjects_def bind_assoc
ARM_H.toAPIType_def ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def placeNewDataObject_def)
apply (intro conjI impI)
apply (subst monad_eq, rule createObjects_Cons)
apply (simp_all add: field_simps shiftl_t2n pageBits_def
@ -5069,18 +5055,11 @@ proof -
unless_dmo'_createObjects'_comm
dmo'_createObjects'_comm dmo'_gsUserPages_upd_comm
| simp add: modify_modify_bind o_def)+
apply (rule fun_cong[where x=s])
apply (rule arg_cong2[where f=bind, OF refl ext])+
apply (simp add: bind_assoc[symmetric])
apply (rule arg_cong2[where f=bind, OF _ ext])
apply (simp add: append mapM_x_append mapM_x_singleton)
apply (subst doMachineOp_bind)
apply ((simp add: add.commute unless_def when_def if_bind)+)[4]
-- "SectionObject"
apply (simp add: Arch_createNewCaps_def createWordObjects_def
apply (simp add: Arch_createNewCaps_def
Retype_H.createObject_def createObjects_def bind_assoc
toAPIType_def ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def placeNewDataObject_def)
apply (intro conjI impI)
apply (subst monad_eq, rule createObjects_Cons)
apply (simp_all add: field_simps shiftl_t2n pageBits_def
@ -5108,18 +5087,11 @@ proof -
unless_dmo'_createObjects'_comm
dmo'_createObjects'_comm dmo'_gsUserPages_upd_comm
| simp add: modify_modify_bind o_def)+
apply (rule fun_cong[where x=s])
apply (rule arg_cong2[where f=bind, OF refl ext])+
apply (simp add: bind_assoc[symmetric])
apply (rule arg_cong2[where f=bind, OF _ ext])
apply (simp add: append mapM_x_append mapM_x_singleton)
apply (subst doMachineOp_bind)
apply ((simp add: add.commute unless_def if_bind when_def)+)[4]
-- "SuperSectionObject"
apply (simp add: Arch_createNewCaps_def createWordObjects_def
apply (simp add: Arch_createNewCaps_def
Retype_H.createObject_def createObjects_def bind_assoc
toAPIType_def ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def placeNewDataObject_def)
apply (intro conjI impI)
apply (subst monad_eq, rule createObjects_Cons)
apply (simp_all add: field_simps shiftl_t2n pageBits_def
@ -5147,56 +5119,24 @@ proof -
unless_dmo'_createObjects'_comm
dmo'_createObjects'_comm dmo'_gsUserPages_upd_comm
| simp add: modify_modify_bind o_def)+
apply (rule fun_cong[where x=s])
apply (rule arg_cong2[where f=bind, OF refl ext])+
apply (simp add: bind_assoc[symmetric])
apply (rule arg_cong2[where f=bind, OF _ ext])
apply (simp add: append mapM_x_append mapM_x_singleton)
apply (subst doMachineOp_bind)
apply ((simp add: add.commute if_bind unless_def when_def)+)[4]
-- "PageTableObject"
apply (simp add:Arch_createNewCaps_def createWordObjects_def Retype_H.createObject_def
apply (simp add:Arch_createNewCaps_def Retype_H.createObject_def
createObjects_def bind_assoc ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def)
apply (subst monad_eq,rule createObjects_Cons)
apply ((simp add: field_simps shiftl_t2n pageBits_def archObjSize_def
getObjectSize_def ARM_H.getObjectSize_def
objBits_simps ptBits_def)+)[6]
apply (simp add:bind_assoc)
apply (rule monad_eq_split)
apply (rule sym)
apply (subst monad_commute_simple)
apply (rule commute_commute[OF placeNewObject_doMachineOp_commute])
apply assumption
apply (rule monad_eq_split2[where Q = "\<lambda>r. \<top>"])
apply (simp add: cteSizeBits_def pageBits_def field_simps
tcbBlockSizeBits_def epSizeBits_def ntfnSizeBits_def pdBits_def
apply (simp add:bind_assoc placeNewObject_def2)
apply (simp add: pageBits_def field_simps
getObjectSize_def ptBits_def archObjSize_def
ARM_H.getObjectSize_def placeNewObject_def2
objBits_simps mapM_x_def sequence_x_def append)
apply (simp add:append mapM_x_append mapM_x_singleton )
apply (subst doMachineOp_bind)
apply (wp empty_fail_mapM_x empty_fail_cleanCacheRange_PoU)
apply (simp add: cteSizeBits_def pageBits_def field_simps
tcbBlockSizeBits_def epSizeBits_def ntfnSizeBits_def
pdBits_def archObjSize_def ptBits_def shiftL_nat
getObjectSize_def ARM_H.getObjectSize_def
placeNewObject_def2 objBits_simps bind_assoc)
apply (wp createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz]
createObjects'_pspace_no_overlap[where sz =sz]
| clarsimp simp:field_simps
objBits_simps cteSizeBits_def pageBits_def ptBits_def archObjSize_def
tcbBlockSizeBits_def epSizeBits_def ntfnSizeBits_def pdBits_def
getObjectSize_def ARM_H.getObjectSize_def)+
apply (frule range_cover_le[where n = "Suc n" ],simp)
apply (simp add:word_bits_def)
apply (erule aligned_add_aligned)
apply ((simp add:is_aligned_shiftl_self word_bits_def)+)[3]
objBits_simps append)
-- "PageDirectoryObject"
apply (simp add:Arch_createNewCaps_def createWordObjects_def Retype_H.createObject_def
apply (simp add:Arch_createNewCaps_def Retype_H.createObject_def
createObjects_def bind_assoc ARM_H.toAPIType_def
ARM_H.createObject_def createPageObject_def)
ARM_H.createObject_def)
apply (subgoal_tac "distinct (map (\<lambda>n. ptr + (n << 14)) [0.e.((of_nat n)::word32)])")
prefer 2
apply (clarsimp simp:objBits_simps archObjSize_def pdBits_def pageBits_def
@ -5317,6 +5257,30 @@ proof -
done
qed
lemma createObject_def2:
"(RetypeDecls_H.createObject ty ptr us dev >>= (\<lambda>x. return [x])) =
createNewCaps ty ptr (Suc 0) us dev"
apply (clarsimp simp:createObject_def createNewCaps_def placeNewObject_def2)
apply (case_tac ty)
apply (simp_all add: toAPIType_def)
defer
apply ((clarsimp simp: Arch_createNewCaps_def
createObjects_def shiftL_nat
ARM_H.createObject_def placeNewDataObject_def
placeNewObject_def2 objBits_simps bind_assoc
clearMemory_def clearMemoryVM_def fun_upd_def[symmetric]
word_size mapM_x_singleton storeWordVM_def)+)[6]
apply (rename_tac apiobject_type)
apply (case_tac apiobject_type)
apply (clarsimp simp: Arch_createNewCaps_def
createObjects_def shiftL_nat
ARM_H.createObject_def
placeNewObject_def2 objBits_simps bind_assoc
clearMemory_def clearMemoryVM_def
word_size mapM_x_singleton storeWordVM_def)+
done
lemma createNewObjects_def2:
"\<lbrakk>dslots \<noteq> []; length ( dslots ) < 2^word_bits;
cte_wp_at' (\<lambda>c. isUntypedCap (cteCap c)) parent s;
@ -5514,41 +5478,18 @@ lemma ArchCreateObject_pspace_no_overlap':
apply (rule hoare_pre)
apply (clarsimp simp:ARM_H.createObject_def)
apply wpc
apply ((wp doMachineOp_psp_no_overlap unless_doMachineOp_psp_no_overlap[simplified]
apply (wp doMachineOp_psp_no_overlap unless_doMachineOp_psp_no_overlap[simplified]
createObjects'_pspace_no_overlap2 hoare_when_weak_wp
| simp add: createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
copyGlobalMappings_pspace_no_overlap'
createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz]
| simp add: placeNewObject_def2 word_shiftl_add_distrib
| simp add: placeNewObject_def2 word_shiftl_add_distrib
| simp add: placeNewDataObject_def placeNewObject_def2 word_shiftl_add_distrib
field_simps split del: if_splits
| clarsimp simp add: add.assoc[symmetric],wp createObjects'_pspace_no_overlap2[where n =0 and sz = sz,simplified]
| clarsimp simp add: APIType_capBits_def objBits_simps pageBits_def)+
,(wp createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz]))+
apply (wp doMachineOp_psp_no_overlap[where sz =sz]
createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz]
createObjects'_pspace_no_overlap2 copyGlobalMappings_pspace_no_overlap'
| simp add:createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
field_simps)+
apply (rule_tac P="ptSize = 8" in hoare_gen_asm)
apply (simp add:add.assoc[symmetric])
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz ,simplified])
apply (simp add:APIType_capBits_def objBits_simps pageBits_def
archObjSize_def ptBits_def)
apply (wp doMachineOp_psp_no_overlap[where sz =sz]
createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz]
createObjects'_pspace_no_overlap2 copyGlobalMappings_pspace_no_overlap'
| simp add:createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
field_simps)+
apply (simp add:add.assoc[symmetric])
apply (rule_tac P="pdSize = 12" in hoare_gen_asm)
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz,simplified])
apply (simp add: APIType_capBits_def objBits_simps pageBits_def
archObjSize_def ptBits_def pdBits_def)
apply (wp createObjects'_psp_aligned[where sz = sz]
createObjects'_psp_distinct[where sz = sz])[1]
apply wp
apply (clarsimp simp: conj_comms)
apply (frule(1) range_cover_no_0[where p = n])
apply simp
@ -5556,7 +5497,8 @@ lemma ArchCreateObject_pspace_no_overlap':
(APIType_capBits ty userSize) ")
prefer 2
apply (rule aligned_add_aligned[OF range_cover.aligned],assumption)
apply (simp add:is_aligned_shiftl_self range_cover_sz')+
apply (simp add:is_aligned_shiftl_self range_cover_sz')
apply (simp add: APIType_capBits_def)
apply (frule range_cover_offset[rotated,where p = n])
apply simp+
apply (frule range_cover_le[where n = "Suc (Suc 0)"])
@ -5581,6 +5523,10 @@ lemma ArchCreateObject_pspace_no_overlap':
| rule conjI | erule range_cover_le,simp)+
done
lemma to_from_apiTypeD: "toAPIType ty = Some x \<Longrightarrow> ty = fromAPIType x"
by (cases ty) (auto simp add: fromAPIType_def
toAPIType_def)
lemma createObject_pspace_no_overlap':
"\<lbrace>\<lambda>s. pspace_no_overlap'
(ptr + (of_nat n << APIType_capBits ty userSize)) sz s \<and>
@ -5598,44 +5544,32 @@ lemma createObject_pspace_no_overlap':
apply wp
apply (simp add:placeNewObject_def2)
apply (wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap2 unless_doMachineOp_psp_no_overlap[simplified]
| simp add:createPageObject_def placeNewObject_def2 curDomain_def word_shiftl_add_distrib
| simp add: placeNewObject_def2 curDomain_def word_shiftl_add_distrib
field_simps)+
apply (simp add:add.assoc[symmetric])
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz,simplified])
apply (simp add:APIType_capBits_def objBits_simps
pageBits_def ARM_H.toAPIType_def
split:ARM_H.object_type.splits)
apply (simp add:placeNewObject_def2)
apply (wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap2 unless_doMachineOp_psp_no_overlap[simplified]
| simp add:createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
| simp add: placeNewObject_def2 word_shiftl_add_distrib
field_simps)+
apply (simp add:add.assoc[symmetric])
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz,simplified])
apply (simp add:APIType_capBits_def objBits_simps
pageBits_def ARM_H.toAPIType_def
split:ARM_H.object_type.splits)
apply (simp add:placeNewObject_def2)
apply (wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap2 unless_doMachineOp_psp_no_overlap[simplified]
| simp add:createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
| simp add: placeNewObject_def2 word_shiftl_add_distrib
field_simps)+
apply (simp add:add.assoc[symmetric])
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz,simplified])
apply (simp add:APIType_capBits_def objBits_simps
pageBits_def ARM_H.toAPIType_def
split:ARM_H.object_type.splits)
apply (simp add:placeNewObject_def2)
apply (wp doMachineOp_psp_no_overlap createObjects'_pspace_no_overlap2 unless_doMachineOp_psp_no_overlap[simplified]
| simp add:createPageObject_def placeNewObject_def2 word_shiftl_add_distrib
| simp add: placeNewObject_def2 word_shiftl_add_distrib
field_simps)+
apply (simp add:add.assoc[symmetric])
apply (wp createObjects'_pspace_no_overlap2
[where n =0 and sz = sz,simplified])
apply (simp add:APIType_capBits_def objBits_simps
pageBits_def ARM_H.toAPIType_def
split:ARM_H.object_type.splits)
apply clarsimp
apply (frule(1) range_cover_no_0[where p = n])
apply simp
@ -5653,9 +5587,9 @@ lemma createObject_pspace_no_overlap':
apply (simp add:shiftl_t2n field_simps)
apply (frule range_cover_offset[rotated,where p = n])
apply simp+
apply (intro conjI)
apply (clarsimp simp:word_shiftl_add_distrib)+
apply (clarsimp simp:field_simps shiftl_t2n | erule range_cover_le)+
apply (auto simp: word_shiftl_add_distrib field_simps shiftl_t2n elim: range_cover_le,
auto simp add: APIType_capBits_def fromAPIType_def objBits_def
dest!: to_from_apiTypeD)
done
lemma createObject_pspace_aligned_distinct':
@ -5669,11 +5603,11 @@ lemma createObject_pspace_aligned_distinct':
placeNewObject_pspace_distinct'
| simp add:ARM_H.createObject_def
Retype_H.createObject_def objBits_simps
createPageObject_def curDomain_def
curDomain_def placeNewDataObject_def
split del: split_if
| wpc | intro conjI impI)+
apply (auto simp:APIType_capBits_def pdBits_def objBits_simps
pageBits_def word_bits_def archObjSize_def ptBits_def ARM_H.toAPIType_def
split:ARM_H.object_type.splits apiobject_type.splits)
done

View File

@ -3735,40 +3735,6 @@ lemma dmo'_bind_return:
by (clarsimp simp: doMachineOp_def bind_def return_def valid_def select_f_def
split_def)
lemma clearMemory_vms':
"valid_machine_state' s \<Longrightarrow>
\<forall>x\<in>fst (clearMemory ptr bits (ksMachineState s)).
valid_machine_state' (s\<lparr>ksMachineState := snd x\<rparr>)"
apply (clarsimp simp: valid_machine_state'_def
disj_commute[of "pointerInUserData p s" for p s])
apply (drule_tac x=p in spec, simp)
apply (drule_tac P4="\<lambda>m'. underlying_memory m' p = 0"
in use_valid[where P=P and Q="\<lambda>_. P" for P], simp_all)
apply (rule clearMemory_um_eq_0)
done
lemma ct_not_inQ_ksMachineState_update[simp]:
"ct_not_inQ (s\<lparr>ksMachineState := v\<rparr>) = ct_not_inQ s"
by (simp add: ct_not_inQ_def)
lemma ct_in_current_domain_ksMachineState_update[simp]:
"ct_idle_or_in_cur_domain' (s\<lparr>ksMachineState := v\<rparr>) = ct_idle_or_in_cur_domain' s"
by (simp add: ct_idle_or_in_cur_domain'_def tcb_in_cur_domain'_def)
lemma dmo_clearMemory_invs'[wp]:
"\<lbrace>invs'\<rbrace> doMachineOp (clearMemory w sz) \<lbrace>\<lambda>_. invs'\<rbrace>"
apply (simp add: doMachineOp_def split_def)
apply wp
apply (clarsimp simp: invs'_def valid_state'_def)
apply (rule conjI)
apply (simp add: valid_irq_masks'_def, elim allEI, clarsimp)
apply (drule use_valid)
apply (rule no_irq_clearMemory[simplified no_irq_def, rule_format])
apply simp_all
apply (drule clearMemory_vms')
apply fastforce
done
lemma ct_in_current_domain_ArchState_update[simp]:
"ct_idle_or_in_cur_domain' (s\<lparr>ksArchState := v\<rparr>) = ct_idle_or_in_cur_domain' s"
by (simp add: ct_idle_or_in_cur_domain'_def tcb_in_cur_domain'_def)
@ -4457,12 +4423,6 @@ crunch typ_at'[wp]: recycleCap "\<lambda>s. P (typ_at' T p s)"
lemmas recycleCap_typ_at_lifts[wp]
= typ_at_lifts [OF recycleCap_typ_at']
lemma no_fail_getSlotCap:
"no_fail (cte_at' p) (getSlotCap p)"
apply (rule no_fail_pre)
apply (simp add: getSlotCap_def | wp)+
done
crunch idle_thread[wp]: deleteCallerCap "\<lambda>s. P (ksIdleThread s)"
(wp: crunch_wps)
crunch sch_act_simple: deleteCallerCap sch_act_simple

View File

@ -85,5 +85,96 @@ lemma getIRQSlot_cte_at[wp]:
apply (clarsimp simp: real_cte_at')
done
lemma work_units_updated_state_relationI[intro!]:
"(s,s') \<in> state_relation \<Longrightarrow>
(work_units_completed_update (\<lambda>_. work_units_completed s + 1) s, s'\<lparr>ksWorkUnitsCompleted := ksWorkUnitsCompleted s' + 1\<rparr>) \<in> state_relation"
apply (simp add: state_relation_def)
done
lemma work_units_and_irq_state_state_relationI [intro!]:
"(s, s') \<in> state_relation \<Longrightarrow>
(s \<lparr> work_units_completed := n, machine_state := machine_state s \<lparr> irq_state := f (irq_state (machine_state s)) \<rparr>\<rparr>,
s' \<lparr> ksWorkUnitsCompleted := n, ksMachineState := ksMachineState s' \<lparr> irq_state := f (irq_state (ksMachineState s')) \<rparr>\<rparr>)
\<in> state_relation"
by (simp add: state_relation_def swp_def)
lemma preemption_corres:
"corres (intr \<oplus> dc) \<top> \<top> preemption_point preemptionPoint"
apply (simp add: preemption_point_def preemptionPoint_def)
by (auto simp: preemption_point_def preemptionPoint_def o_def gets_def liftE_def whenE_def getActiveIRQ_def
corres_underlying_def select_def bind_def get_def bindE_def select_f_def modify_def
alternative_def throwError_def returnOk_def return_def lift_def doMachineOp_def split_def
put_def getWorkUnits_def setWorkUnits_def modifyWorkUnits_def do_machine_op_def
update_work_units_def wrap_ext_bool_det_ext_ext_def work_units_limit_def workUnitsLimit_def
work_units_limit_reached_def OR_choiceE_def reset_work_units_def mk_ef_def
elim: state_relationE)
(* what? *)
(* who says our proofs are not automatic.. *)
lemma preemptionPoint_inv:
assumes "(\<And>f s. P (ksWorkUnitsCompleted_update f s) = P s)"
"irq_state_independent_H P"
shows "\<lbrace>P\<rbrace> preemptionPoint \<lbrace>\<lambda>_. P\<rbrace>" using assms
apply (simp add: preemptionPoint_def setWorkUnits_def getWorkUnits_def modifyWorkUnits_def)
apply (wpc
| wp hoare_whenE_wp hoare_seq_ext [OF _ select_inv] alternative_valid hoare_drop_imps
| simp)+
done
lemma invs'_wu [simp, intro!]:
"invs' (ksWorkUnitsCompleted_update f s) = invs' s"
apply (simp add: invs'_def cur_tcb'_def valid_state'_def Invariants_H.valid_queues_def
valid_queues'_def valid_irq_node'_def valid_machine_state'_def
ct_not_inQ_def ct_idle_or_in_cur_domain'_def tcb_in_cur_domain'_def
bitmapQ_defs valid_queues_no_bitmap_def)
done
lemma ct_in_state'_irq_state_independent [simp, intro!]:
"ct_in_state' x (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ct_in_state' x s"
by (simp add: ct_in_state'_def irq_state_independent_H_def)+
lemma ex_cte_cap_wp_to'_irq_state_independent [simp, intro!]:
"ex_cte_cap_wp_to' x y (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ex_cte_cap_wp_to' x y s"
by (simp add: ex_cte_cap_wp_to'_def irq_state_independent_H_def)+
lemma ps_clear_irq_state_independent [simp, intro!]:
"ps_clear a b (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
ps_clear a b s"
by (simp add: ps_clear_def)
lemma invs'_irq_state_independent [simp, intro!]:
"invs' (s\<lparr>ksMachineState := ksMachineState s
\<lparr>irq_state := f (irq_state (ksMachineState s))\<rparr>\<rparr>) =
invs' s"
apply (clarsimp simp: irq_state_independent_H_def invs'_def valid_state'_def
valid_pspace'_def sch_act_wf_def
valid_queues_def sym_refs_def state_refs_of'_def
if_live_then_nonz_cap'_def if_unsafe_then_cap'_def
valid_idle'_def valid_global_refs'_def
valid_arch_state'_def valid_irq_node'_def
valid_irq_handlers'_def valid_irq_states'_def
irqs_masked'_def bitmapQ_defs valid_queues_no_bitmap_def
valid_queues'_def valid_pde_mappings'_def
pspace_domain_valid_def cur_tcb'_def
valid_machine_state'_def tcb_in_cur_domain'_def
ct_not_inQ_def ct_idle_or_in_cur_domain'_def
cong: if_cong option.case_cong)
apply (rule iffI[rotated])
apply (clarsimp)
apply (case_tac "ksSchedulerAction s", simp_all)
apply clarsimp
apply (case_tac "ksSchedulerAction s", simp_all)
done
lemma preemptionPoint_invs [wp]:
"\<lbrace>invs'\<rbrace> preemptionPoint \<lbrace>\<lambda>_. invs'\<rbrace>"
by (wp preemptionPoint_inv | clarsimp)+
end
end

View File

@ -1135,16 +1135,6 @@ lemma createObjects_no_orphans [wp]:
apply simp
done
lemma createWordObjects_no_orphans [wp]:
"\<lbrace> \<lambda>s. no_orphans s \<and> pspace_aligned' s \<and> pspace_distinct' s
\<and> pspace_no_overlap' ptr sz s \<and> n \<noteq> 0 \<and> range_cover ptr sz (pageBits + us) n\<rbrace>
createWordObjects ptr n us d
\<lbrace> \<lambda>rv s. no_orphans s \<rbrace>"
unfolding createWordObjects_def
apply (wp hoare_unless_wp | clarsimp simp: projectKO_opt_tcb split del: split_if)+
apply (intro conjI | simp add: objBits_simps)+
done
lemma copyGlobalMappings_no_orphans [wp]:
"\<lbrace> \<lambda>s. no_orphans s \<rbrace>
copyGlobalMappings newPD
@ -1178,7 +1168,10 @@ lemma createNewCaps_no_orphans:
apply (wp mapM_x_wp' threadSet_no_orphans
| clarsimp simp: is_active_thread_state_def makeObject_tcb
projectKO_opt_tcb isRunning_def isRestart_def
APIType_capBits_def objBits_simps Arch_createNewCaps_def
APIType_capBits_def Arch_createNewCaps_def
objBits_if_dev
split del: split_if
| simp add: objBits_simps
| fastforce simp:pageBits_def archObjSize_def ptBits_def pdBits_def)+
done
@ -1192,7 +1185,7 @@ lemma createObject_no_orphans:
apply (simp_all add: createObject_def ARM_H.createObject_def split del: split_if)
apply (rename_tac apiobject_type)
apply (case_tac apiobject_type)
apply (simp_all add: ARM_H.createObject_def createPageObject_def placeNewObject_def2
apply (simp_all add: ARM_H.createObject_def placeNewObject_def2
toAPIType_def split del: split_if)+
apply (wp threadSet_no_orphans | clarsimp)+
apply ((wp createObjects'_wp_subst
@ -1222,7 +1215,7 @@ lemma createObject_no_orphans:
split: option.splits split del: split_if)+)[1]
apply ((wp createObjects'_wp_subst hoare_if
createObjects_no_orphans[where sz = sz] |
clarsimp simp: placeNewObject_def2
clarsimp simp: placeNewObject_def2 placeNewDataObject_def
projectKO_opt_tcb cte_wp_at_ctes_of projectKO_opt_ep
is_active_thread_state_def makeObject_tcb pageBits_def unless_def
projectKO_opt_tcb isRunning_def isRestart_def
@ -1244,7 +1237,7 @@ lemma createObject_no_orphans:
split: option.splits))+
done
lemma createNewObjects_no_orphans :
lemma createNewObjects_no_orphans:
"\<lbrace>\<lambda>s. no_orphans s \<and> invs' s \<and> pspace_no_overlap' ptr sz s
\<and> (\<forall>slot\<in>set slots. cte_wp_at' (\<lambda>c. cteCap c = capability.NullCap) slot s)
\<and> cte_wp_at' (\<lambda>cte. cteCap cte = UntypedCap d (ptr && ~~ mask sz) sz idx) cref s
@ -1296,134 +1289,45 @@ lemma deleteObjects_no_orphans [wp]:
cong: if_cong)
done
lemma invokeUntyped_no_orphans' [wp]:
"ui = Retype cref ptr_base ptr tp us slots d \<Longrightarrow>
\<lbrace> \<lambda>s. no_orphans s \<and> invs' s \<and> valid_untyped_inv' ui s \<and> ct_active' s \<rbrace>
invokeUntyped ui
\<lbrace> \<lambda>reply s. no_orphans s \<rbrace>"
apply (rule hoare_name_pre_state)
apply clarsimp
apply (subgoal_tac "invokeUntyped_proofs s cref ptr tp us slots sz idx d")
prefer 2
apply (simp add:invokeUntyped_proofs_def)
proof -
fix s sz idx d
assume no_orph: "no_orphans s"
assume misc : " (tp = APIObjectType ArchTypes_H.apiobject_type.CapTableObject \<longrightarrow> 0 < us)"
" tp = APIObjectType ArchTypes_H.apiobject_type.Untyped \<longrightarrow> 4 \<le> us \<and> us \<le> 29"
" sch_act_simple s " "ct_active' s"
assume ivk_pf: "invokeUntyped_proofs s cref ptr tp us slots sz idx d"
note blah[simp del] =
atLeastAtMost_iff atLeastatMost_subset_iff atLeastLessThan_iff
Int_atLeastAtMost atLeastatMost_empty_iff split_paired_Ex usableUntypedRange.simps
have capBits_low_bound[simp]:
"4 \<le> APIType_capBits tp us"
using misc
apply (case_tac tp)
apply (simp_all add:APIType_capBits_def objBits_simps ArchTypes_H.apiobject_type.splits)
done
have us_align[simp]:"is_aligned (of_nat (length slots) * 2 ^ APIType_capBits tp us) 4"
apply (rule is_aligned_weaken)
apply (subst mult.commute)
apply (rule is_aligned_shiftl_self[unfolded shiftl_t2n])
apply simp
done
show "\<lbrace>op = s\<rbrace> invokeUntyped (Invocations_H.untyped_invocation.Retype cref (ptr && ~~ mask sz) ptr tp us slots d)
\<lbrace>\<lambda>reply. no_orphans\<rbrace>"
apply (simp add: invokeUntyped_def insertNewCaps_def
split_def bind_assoc zipWithM_x_mapM
cong: capability.case_cong)
apply (case_tac "ptr && ~~ mask sz \<noteq> ptr")
apply (rule hoare_pre)
apply (wp createNewObjects_no_orphans[where sz = sz] getSlotCap_wp
updateFreeIndex_invs' updateFreeIndex_pspace_no_overlap'
hoare_vcg_ball_lift updateCap_weak_cte_wp_at
updateFreeIndex_caps_no_overlap''
updateFreeIndex_caps_overlap_reserved' | clarsimp)+
apply (intro exI)
apply (rule conjI)
apply (rule invokeUntyped_proofs.cte_wp_at'[OF ivk_pf])
using ivk_pf
apply (clarsimp simp:conj_comms invs_valid_pspace'
invokeUntyped_proofs_def no_orph misc)
apply (simp add:getFreeIndex_def add_minus_neg_mask field_simps shiftL_nat
invokeUntyped_proofs.ps_no_overlap'[OF ivk_pf]
invokeUntyped_proofs.not_0_ptr[OF ivk_pf]
invokeUntyped_proofs.usableRange_disjoint[OF ivk_pf]
invokeUntyped_proofs.descendants_range[OF ivk_pf]
invokeUntyped_proofs.slots_invD[OF ivk_pf]
invokeUntyped_proofs.caps_no_overlap'[OF ivk_pf])
apply (intro conjI)
apply (simp add: range_cover_unat range_cover.unat_of_nat_shift field_simps)
apply (rule aligned_add_aligned[OF aligned_after_mask])
apply (erule range_cover.aligned)
apply simp
apply simp
apply (simp add: range_cover_unat range_cover.unat_of_nat_shift field_simps)
apply (drule range_cover.range_cover_compare_bound)
apply simp
apply simp+
apply (rule subset_trans[OF invokeUntyped_proofs.subset_stuff[OF ivk_pf]])
apply (clarsimp simp:blah word_and_le2)
using ivk_pf
apply clarsimp
apply (wp createNewObjects_no_orphans[where sz = sz] getSlotCap_wp
updateFreeIndex_invs_simple' updateFreeIndex_pspace_no_overlap'
hoare_vcg_ball_lift updateCap_weak_cte_wp_at
updateFreeIndex_caps_no_overlap''
updateFreeIndex_caps_overlap_reserved' | clarsimp)+
apply (strengthen invs_pspace_aligned' invs_valid_pspace'
invs_pspace_distinct' invs_arch_state invs_psp_aligned)
apply (clarsimp simp:conj_comms invokeUntyped_proofs.slots_invD[OF ivk_pf])
apply (rule_tac P = "cap = capability.UntypedCap d (ptr && ~~ mask sz) sz idx"
in hoare_gen_asm)
apply (clarsimp simp:misc)
apply (wp deleteObjects_invs'[where idx = idx and p = "cref" and d=d]
deleteObjects_caps_no_overlap''[where idx = idx and slot = "cref" and d=d]
deleteObject_no_overlap[where idx = idx and d=d]
deleteObjects_cte_wp_at'[where idx = idx and ptr = ptr and bits = sz and d=d]
deleteObjects_caps_overlap_reserved'[where idx = idx and slot = "cref" and d=d]
deleteObjects_descendants[where idx = idx and p = "cref" and d=d]
hoare_vcg_ball_lift hoare_drop_imp hoare_vcg_ex_lift
deleteObjects_st_tcb_at'[where p = cref and d=d]
deleteObjects_cte_wp_at'[where idx = idx and ptr = ptr and bits = sz and d=d]
deleteObjects_ct_active'[where idx = idx and cref = cref and d=d])
apply (clarsimp simp: conj_comms)
apply (wp getSlotCap_wp)
using invokeUntyped_proofs.usableRange_disjoint[OF ivk_pf]
invokeUntyped_proofs.descendants_range[OF ivk_pf]
invokeUntyped_proofs.slots_invD[OF ivk_pf]
invokeUntyped_proofs.vc'[OF ivk_pf]
invokeUntyped_proofs.cref_inv[OF ivk_pf]
apply (clarsimp simp:invs_valid_pspace' invokeUntyped_proofs_def
is_aligned_neg_mask_eq' range_cover.aligned
no_orph getFreeIndex_def misc range_cover.sz )
apply (simp add: getFreeIndex_def add_minus_neg_mask field_simps shiftL_nat
invokeUntyped_proofs.not_0_ptr[OF ivk_pf]
descendants_range'_def2 shiftL_nat
range_cover_unat range_cover.unat_of_nat_shift
invokeUntyped_proofs.caps_no_overlap'[OF ivk_pf]
is_aligned_mask[unfolded is_aligned_neg_mask_eq']
invs_pspace_distinct')
apply (intro conjI)
apply (simp add: range_cover_def word_bits_def)
apply simp
apply (simp add:is_aligned_mask[symmetric])
apply (drule range_cover.range_cover_compare_bound)
apply (simp add:is_aligned_mask[unfolded is_aligned_neg_mask_eq'])
apply (rule subset_trans[OF invokeUntyped_proofs.subset_stuff[OF ivk_pf]])
apply (simp add:is_aligned_mask[unfolded is_aligned_neg_mask_eq',symmetric])
lemma no_orphans_ksWorkUnits [simp]:
"no_orphans (ksWorkUnitsCompleted_update f s) = no_orphans s"
unfolding no_orphans_def all_active_tcb_ptrs_def all_queued_tcb_ptrs_def is_active_tcb_ptr_def
apply auto
done
lemma no_orphans_irq_state_independent[intro!, simp]:
"no_orphans (s \<lparr>ksMachineState := ksMachineState s \<lparr> irq_state := f (irq_state (ksMachineState s)) \<rparr> \<rparr>)
= no_orphans s"
by (simp add: no_orphans_def all_active_tcb_ptrs_def
all_queued_tcb_ptrs_def is_active_tcb_ptr_def)
lemma resetUntypedCap_no_orphans [wp]:
"\<lbrace> (\<lambda>s. no_orphans s \<and> pspace_distinct' s \<and> valid_objs' s)
and cte_wp_at' (isUntypedCap o cteCap) slot\<rbrace>
resetUntypedCap slot
\<lbrace> \<lambda>rv s. no_orphans s \<rbrace>"
apply (simp add: resetUntypedCap_def)
apply (rule hoare_pre)
apply (wp mapME_x_inv_wp preemptionPoint_inv getSlotCap_wp
| simp add: getSlotCap_def unless_def
| wp_once hoare_drop_imps)+
apply (clarsimp simp: cte_wp_at_ctes_of)
apply (frule(1) cte_wp_at_valid_objs_valid_cap'[OF ctes_of_cte_wpD])
apply (clarsimp simp: isCap_simps valid_cap_simps' capAligned_def)
done
qed
lemma invokeUntyped_no_orphans [wp]:
"\<lbrace> \<lambda>s. no_orphans s \<and> invs' s \<and> valid_untyped_inv' ui s \<and> ct_active' s \<rbrace>
invokeUntyped ui
\<lbrace> \<lambda>rv s. no_orphans s \<rbrace>"
by (cases ui, erule invokeUntyped_no_orphans')
invokeUntyped ui
\<lbrace> \<lambda>reply s. no_orphans s \<rbrace>"
apply (rule hoare_pre, rule hoare_strengthen_post)
apply (rule invokeUntyped_invs''[where Q=no_orphans])
apply (wp createNewCaps_no_orphans)
apply (clarsimp simp: valid_pspace'_def)
apply (intro conjI, simp_all)[1]
apply (wp | simp)+
apply (cases ui, auto simp: cte_wp_at_ctes_of)[1]
done
lemma setInterruptState_no_orphans [wp]:
"\<lbrace> \<lambda>s. no_orphans s \<rbrace>
@ -1714,12 +1618,6 @@ lemma finaliseCap_no_orphans [wp]:
apply (auto simp: valid_cap'_def dest!: isCapDs)
done
lemma no_orphans_ksWorkUnits [simp]:
"no_orphans (ksWorkUnitsCompleted_update f s) = no_orphans s"
unfolding no_orphans_def all_active_tcb_ptrs_def all_queued_tcb_ptrs_def is_active_tcb_ptr_def
apply auto
done
crunch no_orphans [wp]: cteSwap "no_orphans"
crunch no_orphans [wp]: capSwapForDelete "no_orphans"
@ -1760,12 +1658,6 @@ lemma cteDelete_no_orphans [wp]:
crunch no_orphans [wp]: cteMove "no_orphans"
(wp: crunch_wps)
lemma no_orphans_irq_state_independent[intro!, simp]:
"no_orphans (s \<lparr>ksMachineState := ksMachineState s \<lparr> irq_state := f (irq_state (ksMachineState s)) \<rparr> \<rparr>)
= no_orphans s"
by (simp add: no_orphans_def all_active_tcb_ptrs_def
all_queued_tcb_ptrs_def is_active_tcb_ptr_def)
lemma cteRevoke_no_orphans [wp]:
"\<lbrace> \<lambda>s. no_orphans s \<and> invs' s \<and> sch_act_simple s \<rbrace>
cteRevoke ptr

View File

@ -400,7 +400,7 @@ lemma page_table_at_pte_atD':
apply simp
apply simp
apply (subst (asm) is_aligned_neg_mask_eq[where n = 2])
apply (simp add:aligned_after_mask)
apply (simp add: is_aligned_andI1)
apply (simp add:mask_out_sub_mask)
done
@ -489,7 +489,7 @@ lemma page_directory_at_pde_atD':
apply simp
apply simp
apply (subst (asm) is_aligned_neg_mask_eq[where n = 2])
apply (simp add:aligned_after_mask)
apply (simp add: is_aligned_andI1)
apply (simp add:mask_out_sub_mask)
done
@ -1154,7 +1154,7 @@ lemma createObject_valid_duplicates'[wp]:
apply (simp add:createObject_def)
apply (rule hoare_pre)
apply (wpc | wp| simp add: ARM_H.createObject_def split del: split_if)+
apply (simp add: createPageObject_def placeNewObject_def
apply (simp add: placeNewObject_def placeNewDataObject_def
placeNewObject'_def split_def split del: split_if
| wp hoare_unless_wp[where P="d"] hoare_unless_wp[where Q=\<top>]
| wpc | simp add: alignError_def split del: split_if)+
@ -1430,71 +1430,74 @@ lemma deleteObjects_valid_duplicates'[wp]:
apply simp
done
crunch arch_inv[wp]: deleteObjects "\<lambda>s. P (ksArchState s)"
(simp: crunch_simps wp: hoare_drop_imps hoare_unless_wp ignore:freeMemory)
crunch arch_inv[wp]: resetUntypedCap "\<lambda>s. P (ksArchState s)"
(simp: crunch_simps wp: hoare_drop_imps hoare_unless_wp mapME_x_inv_wp
preemptionPoint_inv
ignore:freeMemory forME_x)
lemma resetUntypedCap_valid_duplicates'[wp]:
"\<lbrace>(\<lambda>s. vs_valid_duplicates' (ksPSpace s))
and valid_objs' and cte_wp_at' (isUntypedCap o cteCap) slot\<rbrace>
resetUntypedCap slot
\<lbrace>\<lambda>r s. vs_valid_duplicates' (ksPSpace s)\<rbrace>"
(is "\<lbrace>?P\<rbrace> ?f \<lbrace>\<lambda>_. ?Q\<rbrace>")
apply (clarsimp simp: resetUntypedCap_def)
apply (rule hoare_pre)
apply (wp | simp add: unless_def)+
apply (wp mapME_x_inv_wp preemptionPoint_inv | simp | wp_once hoare_drop_imps)+
apply (wp getSlotCap_wp)
apply (clarsimp simp: cte_wp_at_ctes_of)
apply (frule cte_wp_at_valid_objs_valid_cap'[OF ctes_of_cte_wpD], clarsimp+)
apply (clarsimp simp add: isCap_simps valid_cap_simps' capAligned_def)
done
lemma is_aligned_armKSGlobalPD:
"valid_arch_state' s
\<Longrightarrow> is_aligned (armKSGlobalPD (ksArchState s)) pdBits"
by (clarsimp simp: valid_arch_state'_def page_directory_at'_def)
lemma new_CapTable_bound:
"range_cover (ptr :: obj_ref) sz (APIType_capBits tp us) n
\<Longrightarrow> tp = APIObjectType ArchTypes_H.apiobject_type.CapTableObject \<longrightarrow> us < 28"
apply (frule range_cover.sz)
apply (drule range_cover.sz(2))
apply (clarsimp simp:APIType_capBits_def objBits_simps word_bits_def)
done
lemma invokeUntyped_valid_duplicates[wp]:
"\<lbrace>invs' and (\<lambda>s. vs_valid_duplicates' (ksPSpace s))
and valid_untyped_inv' ui and ct_active'\<rbrace>
invokeUntyped ui
\<lbrace>\<lambda>rv s. vs_valid_duplicates' (ksPSpace s) \<rbrace>"
apply (simp only: invokeUntyped_def updateCap_def)
apply (rule hoare_name_pre_state)
apply (cases ui)
apply (clarsimp)
apply (rename_tac s cref ptr tp us slots sz idx)
proof -
fix s cref ptr tp us slots sz idx d
assume cte_wp_at': "cte_wp_at' (\<lambda>cte. cteCap cte = capability.UntypedCap d (ptr && ~~ mask sz) sz idx) cref s"
assume cover : "range_cover ptr sz (APIType_capBits tp us) (length (slots::word32 list))"
assume misc : "distinct slots" "idx \<le> unat (ptr && mask sz) \<or> ptr = ptr && ~~ mask sz"
"invs' s" "slots \<noteq> []" "sch_act_simple s" "vs_valid_duplicates' (ksPSpace s)"
"\<forall>slot\<in>set slots. cte_wp_at' (\<lambda>c. cteCap c = capability.NullCap) slot s"
"\<forall>x\<in>set slots. ex_cte_cap_wp_to' (\<lambda>_. True) x s" "ct_active' s"
"tp = APIObjectType ArchTypes_H.apiobject_type.Untyped \<longrightarrow> 4 \<le> us \<and> us \<le> 29"
assume desc_range: "ptr = ptr && ~~ mask sz \<longrightarrow> descendants_range_in' {ptr..ptr + 2 ^ sz - 1} (cref) (ctes_of s)"
have pf: "invokeUntyped_proofs s cref ptr tp us slots sz idx d"
using cte_wp_at' cover misc desc_range
by (simp add:invokeUntyped_proofs_def)
have bound[simp]: "tp = APIObjectType apiobject_type.CapTableObject \<longrightarrow> us < 28"
using cover
apply -
apply (frule range_cover.sz)
apply (drule range_cover.sz(2))
apply (clarsimp simp:APIType_capBits_def objBits_simps word_bits_def)
done
have pd_aligned[simp]:
"armKSGlobalPD (ksArchState s) && ~~ mask pdBits = armKSGlobalPD (ksArchState s)"
using misc
apply -
apply (clarsimp dest!:invs_arch_state' simp:valid_arch_state'_def
page_directory_at'_def is_aligned_neg_mask_eq')
done
show
"\<lbrace>op = s\<rbrace>
invokeUntyped
(Invocations_H.untyped_invocation.Retype cref (ptr && ~~ mask sz) ptr tp us slots d)
\<lbrace>\<lambda>rv s. vs_valid_duplicates' (ksPSpace s)\<rbrace>"
apply (clarsimp simp:invokeUntyped_def updateCap_def)
apply (clarsimp simp only: pred_conj_def valid_untyped_inv_wcap'
Invocations_H.untyped_invocation.simps)
apply (frule(2) invokeUntyped_proofs.intro)
apply (rule hoare_pre)
apply (wp setCTE_pspace_no_overlap'[where sz = sz ]
deleteObjects_invs_derivatives[where idx = idx and p = cref and d=d])
apply (rule_tac P = "cap = capability.UntypedCap d (ptr && ~~ mask sz) sz idx"
in hoare_gen_asm)
apply simp
apply (wp setCTE_pspace_no_overlap')
apply (rule hoare_post_impErr)
apply (rule combine_validE)
apply (rule_tac ui=ui in whenE_reset_resetUntypedCap_invs_etc)
apply (rule hoare_whenE_wp)
apply (rule valid_validE)
apply (rule resetUntypedCap_valid_duplicates')
defer
apply simp
apply (wp getSlotCap_wp hoare_drop_imps
deleteObject_no_overlap deleteObjects_invs_derivatives[where idx = idx and p = cref and d=d])
using cte_wp_at' misc cover desc_range
invokeUntyped_proofs.not_0_ptr[OF pf] invokeUntyped_proofs.vc'[OF pf]
apply (clarsimp simp:cte_wp_at_ctes_of)
apply (rule_tac x = "capability.UntypedCap d (ptr && ~~ mask sz) sz idx" in exI)
apply (clarsimp simp: is_aligned_neg_mask_eq' conj_comms invs_valid_pspace'
invs_pspace_aligned' invs_pspace_distinct'
range_cover.sz[where 'a=32, folded word_bits_def]
invokeUntyped_proofs.ps_no_overlap'[OF pf])
apply (simp add:descendants_range'_def2)
apply (clarsimp simp del: valid_untyped_inv_wcap'.simps
split del: split_if)
apply (rule conjI, assumption)
apply (auto simp: cte_wp_at_ctes_of isCap_simps)[1]
apply (clarsimp simp: cte_wp_at_ctes_of)
apply (frule new_CapTable_bound)
apply (frule invokeUntyped_proofs.not_0_ptr)
apply (strengthen is_aligned_armKSGlobalPD)
apply (frule cte_wp_at_valid_objs_valid_cap'[OF ctes_of_cte_wpD], clarsimp+)
apply (clarsimp simp add: isCap_simps valid_cap_simps' capAligned_def)
apply (auto split: split_if_asm)
done
qed
crunch valid_duplicates'[wp]:
doReplyTransfer "\<lambda>s. vs_valid_duplicates' (ksPSpace s)"

File diff suppressed because it is too large Load Diff

View File

@ -497,15 +497,16 @@ lemma pinv_corres:
(perform_invocation block call i) (performInvocation block call i')"
apply (simp add: performInvocation_def)
apply (case_tac i)
apply (clarsimp simp: o_def liftE_bindE)
apply (clarsimp simp: o_def liftE_bindE)
apply (rule corres_guard_imp)
apply (rule corres_split_norE[OF corres_returnOkTT])
apply simp
apply (rule corres_rel_imp, rule inv_untyped_corres)
apply simp
apply (case_tac x, simp_all)[1]
apply wp
apply simp+
apply (rule corres_guard_imp)
apply (rule corres_split[OF corres_returnOkTT])
apply simp
apply (erule corres_guard_imp [OF inv_untyped_corres])
apply assumption+
apply wp
apply simp+
apply (rule corres_guard_imp)
apply (rule corres_split [OF _ gct_corres])
apply simp
apply (rule corres_split [OF _ send_ipc_corres])
@ -2443,7 +2444,7 @@ lemma retype_pi_IRQInactive:
apply (rule hoare_pre)
apply (wpc |
wp inv_tcb_IRQInactive inv_cnode_IRQInactive inv_irq_IRQInactive
inv_arch_IRQInactive |
inv_untyped_IRQInactive inv_arch_IRQInactive |
simp)+
done

File diff suppressed because it is too large Load Diff

View File

@ -145,9 +145,9 @@ definition
get_free_index :: "obj_ref \<Rightarrow> obj_ref \<Rightarrow> nat" where
"get_free_index base free \<equiv> unat $ (free - base)"
primrec(nonexhaustive) is_device_ut_cap
primrec(nonexhaustive) is_device_untyped_cap
where
"is_device_ut_cap (UntypedCap isd _ _ _) = isd"
"is_device_untyped_cap (UntypedCap isdev _ _ _) = isdev"
text {* Untyped capabilities note a currently free region. Sometimes this
region is reset during a Retype operation. This progressively clears the
@ -161,18 +161,17 @@ where
sz \<leftarrow> returnOk $ bits_of cap;
base \<leftarrow> returnOk $ obj_ref_of cap;
liftE $ delete_objects base sz;
dev \<leftarrow> returnOk $ is_device_untyped_cap cap;
if sz < reset_chunk_bits
if dev \<or> sz < reset_chunk_bits
then liftE $ do
do_machine_op $ clearMemory base (2 ^ sz);
set_cap (UntypedCap (is_device_ut_cap cap)
(obj_ref_of cap) (bits_of cap) 0) src_slot
unless dev $ do_machine_op $ clearMemory base (2 ^ sz);
set_cap (UntypedCap dev base sz 0) src_slot
od
else mapME_x (\<lambda>i. doE
liftE $ do_machine_op $ clearMemory (base + (of_nat i << reset_chunk_bits))
(2 ^ reset_chunk_bits);
liftE $ set_cap (UntypedCap (is_device_ut_cap cap)
(obj_ref_of cap) (bits_of cap)
liftE $ set_cap (UntypedCap dev base sz
(i * 2 ^ reset_chunk_bits)) src_slot;
preemption_point
odE) (rev [i \<leftarrow> [0 ..< 2 ^ (sz - reset_chunk_bits)].

View File

@ -648,6 +648,9 @@ isPhysicalCap :: "arch_capability \<Rightarrow> bool"
consts'
sameObjectAs :: "arch_capability \<Rightarrow> arch_capability \<Rightarrow> bool"
consts'
placeNewDataObject :: "machine_word \<Rightarrow> nat \<Rightarrow> bool \<Rightarrow> unit kernel"
consts'
createObject :: "object_type \<Rightarrow> machine_word \<Rightarrow> nat \<Rightarrow> bool \<Rightarrow> arch_capability kernel"

View File

@ -205,17 +205,10 @@ defs sameObjectAs_def:
else sameRegionAs a b
)"
definition
"createPageObject ptr numPages isDevice \<equiv>
if isDevice then (do
addrs \<leftarrow> placeNewObject ptr UserDataDevice numPages;
return addrs
od)
else (do
addrs \<leftarrow> placeNewObject ptr UserData numPages;
doMachineOp $ initMemory (PPtr $ fromPPtr ptr) (1 `~shiftL~` (pageBits + numPages) );
return addrs
od)"
defs placeNewDataObject_def:
"placeNewDataObject regionBase sz isDevice \<equiv> if isDevice
then placeNewObject regionBase UserDataDevice sz
else placeNewObject regionBase UserData sz"
defs createObject_def:
"createObject t regionBase arg3 isDevice \<equiv>
@ -225,7 +218,7 @@ defs createObject_def:
APIObjectType v2 \<Rightarrow>
haskell_fail []
| SmallPageObject \<Rightarrow> (do
createPageObject regionBase 0 isDevice;
placeNewDataObject regionBase 0 isDevice;
modify (\<lambda> ks. ks \<lparr> gsUserPages :=
funupd (gsUserPages ks)
(fromPPtr regionBase) (Just ARMSmallPage)\<rparr>);
@ -233,7 +226,7 @@ defs createObject_def:
VMReadWrite ARMSmallPage Nothing
od)
| LargePageObject \<Rightarrow> (do
createPageObject regionBase 4 isDevice;
placeNewDataObject regionBase 4 isDevice;
modify (\<lambda> ks. ks \<lparr> gsUserPages :=
funupd (gsUserPages ks)
(fromPPtr regionBase) (Just ARMLargePage)\<rparr>);
@ -241,7 +234,7 @@ defs createObject_def:
VMReadWrite ARMLargePage Nothing
od)
| SectionObject \<Rightarrow> (do
createPageObject regionBase 8 isDevice;
placeNewDataObject regionBase 8 isDevice;
modify (\<lambda> ks. ks \<lparr> gsUserPages :=
funupd (gsUserPages ks)
(fromPPtr regionBase) (Just ARMSection)\<rparr>);
@ -249,7 +242,7 @@ defs createObject_def:
VMReadWrite ARMSection Nothing
od)
| SuperSectionObject \<Rightarrow> (do
createPageObject regionBase 12 isDevice;
placeNewDataObject regionBase 12 isDevice;
modify (\<lambda> ks. ks \<lparr> gsUserPages :=
funupd (gsUserPages ks)
(fromPPtr regionBase) (Just ARMSuperSection)\<rparr>);
@ -258,12 +251,7 @@ defs createObject_def:
od)
| PageTableObject \<Rightarrow> (do
ptSize \<leftarrow> return ( ptBits - objBits (makeObject ::pte));
regionSize \<leftarrow> return ( (1 `~shiftL~` ptBits));
placeNewObject regionBase (makeObject ::pte) ptSize;
doMachineOp $
cleanCacheRange_PoU (VPtr $ fromPPtr regionBase)
(VPtr $ fromPPtr regionBase + regionSize - 1)
(addrFromPPtr regionBase);
return $ PageTableCap (pointerCast regionBase) Nothing
od)
| PageDirectoryObject \<Rightarrow> (do

View File

@ -45,14 +45,6 @@ createNewCaps :: "object_type \<Rightarrow> machine_word \<Rightarrow> nat \<Rig
consts
Arch_createNewCaps :: "object_type \<Rightarrow> machine_word \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> bool \<Rightarrow> arch_capability list kernel"
thm injectKO_defs
definition
"createWordObjects ptr numObjects gs dev\<equiv> (do
gbits \<leftarrow> return (pageBits + gs);
addrs \<leftarrow> createObjects ptr numObjects (if dev then KOUserDataDevice else KOUserData) gs;
unless dev $ doMachineOp $ mapM_x (\<lambda>x. clearMemory (PPtr $ fromPPtr x) ((1::nat) `~shiftL~` gbits)) addrs;
return addrs
od)"
defs insertNewCaps_def:
"insertNewCaps newType srcSlot destSlots regionBase magnitudeBits dev \<equiv> (do
caps \<leftarrow> createNewCaps newType regionBase (length destSlots) magnitudeBits dev ;
@ -61,12 +53,13 @@ od)"
defs (in Arch) Arch_createNewCaps_def:
"Arch_createNewCaps t regionBase numObjects arg4 dev \<equiv>
let pointerCast = PPtr \<circ> fromPPtr
let pointerCast = PPtr \<circ> fromPPtr;
Data = (if dev then KOUserDataDevice else KOUserData)
in (case t of
APIObjectType v5 \<Rightarrow>
haskell_fail []
| SmallPageObject \<Rightarrow> (do
addrs \<leftarrow> createWordObjects regionBase numObjects 0 dev;
addrs \<leftarrow> createObjects regionBase numObjects Data 0;
modify (\<lambda> ks. ks \<lparr> gsUserPages := (\<lambda> addr.
if addr `~elem~` map fromPPtr addrs then Just ARMSmallPage
else gsUserPages ks addr)\<rparr>);
@ -74,7 +67,7 @@ defs (in Arch) Arch_createNewCaps_def:
ARMSmallPage Nothing) addrs
od)
| LargePageObject \<Rightarrow> (do
addrs \<leftarrow> createWordObjects regionBase numObjects 4 dev;
addrs \<leftarrow> createObjects regionBase numObjects Data 4;
modify (\<lambda> ks. ks \<lparr> gsUserPages := (\<lambda> addr.
if addr `~elem~` map fromPPtr addrs then Just ARMLargePage
else gsUserPages ks addr)\<rparr>);
@ -82,7 +75,7 @@ defs (in Arch) Arch_createNewCaps_def:
ARMLargePage Nothing) addrs
od)
| SectionObject \<Rightarrow> (do
addrs \<leftarrow> createWordObjects regionBase numObjects 8 dev;
addrs \<leftarrow> createObjects regionBase numObjects Data 8;
modify (\<lambda> ks. ks \<lparr> gsUserPages := (\<lambda> addr.
if addr `~elem~` map fromPPtr addrs then Just ARMSection
else gsUserPages ks addr)\<rparr>);
@ -90,7 +83,7 @@ defs (in Arch) Arch_createNewCaps_def:
ARMSection Nothing) addrs
od)
| SuperSectionObject \<Rightarrow> (do
addrs \<leftarrow> createWordObjects regionBase numObjects 12 dev;
addrs \<leftarrow> createObjects regionBase numObjects Data 12;
modify (\<lambda> ks. ks \<lparr> gsUserPages := (\<lambda> addr.
if addr `~elem~` map fromPPtr addrs then Just ARMSuperSection
else gsUserPages ks addr)\<rparr>);
@ -102,9 +95,6 @@ defs (in Arch) Arch_createNewCaps_def:
addrs \<leftarrow> createObjects regionBase numObjects (injectKO (makeObject ::pte)) ptSize;
objSize \<leftarrow> return (((1::nat) `~shiftL~` ptBits));
pts \<leftarrow> return ( map pointerCast addrs);
doMachineOp $ mapM_x (flip clearMemoryVM ptBits) pts;
doMachineOp $ mapM_x (\<lambda>x. cleanCacheRange_PoU x (x + (fromIntegral objSize) - 1)
(addrFromPPtr x)) pts;
return $ map (\<lambda> pt. PageTableCap pt Nothing) pts
od)
| PageDirectoryObject \<Rightarrow> (do
@ -112,7 +102,6 @@ defs (in Arch) Arch_createNewCaps_def:
addrs \<leftarrow> createObjects regionBase numObjects (injectKO (makeObject ::pde)) pdSize;
objSize \<leftarrow> return ( ((1::nat) `~shiftL~` pdBits));
pds \<leftarrow> return ( map pointerCast addrs);
doMachineOp $ mapM_x (flip clearMemoryVM pdBits) pds;
mapM_x copyGlobalMappings pds;
doMachineOp $ mapM_x (\<lambda>x. cleanCacheRange_PoU x (x + (fromIntegral objSize) - 1)
(addrFromPPtr x)) pds;

View File

@ -49,5 +49,10 @@ retypeFanOutLimit :: "machine_word"
where
"retypeFanOutLimit \<equiv> 256"
definition
resetChunkBits :: "nat"
where
"resetChunkBits \<equiv> 8"
end

View File

@ -563,82 +563,92 @@ where
| _ \<Rightarrow> False"
datatype untyped_invocation =
Retype machine_word machine_word machine_word object_type nat "machine_word list" bool
Retype machine_word bool machine_word machine_word object_type nat "machine_word list" bool
primrec
retypeSource :: "untyped_invocation \<Rightarrow> machine_word"
where
"retypeSource (Retype v0 v1 v2 v3 v4 v5 v6) = v0"
"retypeSource (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v0"
primrec
retypeNewType :: "untyped_invocation \<Rightarrow> object_type"
where
"retypeNewType (Retype v0 v1 v2 v3 v4 v5 v6) = v3"
"retypeNewType (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v4"
primrec
retypeIsDevice :: "untyped_invocation \<Rightarrow> bool"
where
"retypeIsDevice (Retype v0 v1 v2 v3 v4 v5 v6) = v6"
"retypeIsDevice (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v7"
primrec
retypeRegionBase :: "untyped_invocation \<Rightarrow> machine_word"
where
"retypeRegionBase (Retype v0 v1 v2 v3 v4 v5 v6) = v1"
"retypeRegionBase (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v2"
primrec
retypeSlots :: "untyped_invocation \<Rightarrow> machine_word list"
where
"retypeSlots (Retype v0 v1 v2 v3 v4 v5 v6) = v5"
"retypeSlots (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v6"
primrec
retypeResetUntyped :: "untyped_invocation \<Rightarrow> bool"
where
"retypeResetUntyped (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v1"
primrec
retypeFreeRegionBase :: "untyped_invocation \<Rightarrow> machine_word"
where
"retypeFreeRegionBase (Retype v0 v1 v2 v3 v4 v5 v6) = v2"
"retypeFreeRegionBase (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v3"
primrec
retypeNewSizeBits :: "untyped_invocation \<Rightarrow> nat"
where
"retypeNewSizeBits (Retype v0 v1 v2 v3 v4 v5 v6) = v4"
"retypeNewSizeBits (Retype v0 v1 v2 v3 v4 v5 v6 v7) = v5"
primrec
retypeSource_update :: "(machine_word \<Rightarrow> machine_word) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeSource_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype (f v0) v1 v2 v3 v4 v5 v6"
"retypeSource_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype (f v0) v1 v2 v3 v4 v5 v6 v7"
primrec
retypeNewType_update :: "(object_type \<Rightarrow> object_type) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeNewType_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 v1 v2 (f v3) v4 v5 v6"
"retypeNewType_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 v2 v3 (f v4) v5 v6 v7"
primrec
retypeIsDevice_update :: "(bool \<Rightarrow> bool) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeIsDevice_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 v1 v2 v3 v4 v5 (f v6)"
"retypeIsDevice_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 v2 v3 v4 v5 v6 (f v7)"
primrec
retypeRegionBase_update :: "(machine_word \<Rightarrow> machine_word) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeRegionBase_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 (f v1) v2 v3 v4 v5 v6"
"retypeRegionBase_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 (f v2) v3 v4 v5 v6 v7"
primrec
retypeSlots_update :: "((machine_word list) \<Rightarrow> (machine_word list)) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeSlots_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 v1 v2 v3 v4 (f v5) v6"
"retypeSlots_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 v2 v3 v4 v5 (f v6) v7"
primrec
retypeResetUntyped_update :: "(bool \<Rightarrow> bool) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeResetUntyped_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 (f v1) v2 v3 v4 v5 v6 v7"
primrec
retypeFreeRegionBase_update :: "(machine_word \<Rightarrow> machine_word) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeFreeRegionBase_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 v1 (f v2) v3 v4 v5 v6"
"retypeFreeRegionBase_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 v2 (f v3) v4 v5 v6 v7"
primrec
retypeNewSizeBits_update :: "(nat \<Rightarrow> nat) \<Rightarrow> untyped_invocation \<Rightarrow> untyped_invocation"
where
"retypeNewSizeBits_update f (Retype v0 v1 v2 v3 v4 v5 v6) = Retype v0 v1 v2 v3 (f v4) v5 v6"
"retypeNewSizeBits_update f (Retype v0 v1 v2 v3 v4 v5 v6 v7) = Retype v0 v1 v2 v3 v4 (f v5) v6 v7"
abbreviation (input)
Retype_trans :: "(machine_word) \<Rightarrow> (machine_word) \<Rightarrow> (machine_word) \<Rightarrow> (object_type) \<Rightarrow> (nat) \<Rightarrow> (machine_word list) \<Rightarrow> (bool) \<Rightarrow> untyped_invocation" ("Retype'_ \<lparr> retypeSource= _, retypeRegionBase= _, retypeFreeRegionBase= _, retypeNewType= _, retypeNewSizeBits= _, retypeSlots= _, retypeIsDevice= _ \<rparr>")
Retype_trans :: "(machine_word) \<Rightarrow> (bool) \<Rightarrow> (machine_word) \<Rightarrow> (machine_word) \<Rightarrow> (object_type) \<Rightarrow> (nat) \<Rightarrow> (machine_word list) \<Rightarrow> (bool) \<Rightarrow> untyped_invocation" ("Retype'_ \<lparr> retypeSource= _, retypeResetUntyped= _, retypeRegionBase= _, retypeFreeRegionBase= _, retypeNewType= _, retypeNewSizeBits= _, retypeSlots= _, retypeIsDevice= _ \<rparr>")
where
"Retype_ \<lparr> retypeSource= v0, retypeRegionBase= v1, retypeFreeRegionBase= v2, retypeNewType= v3, retypeNewSizeBits= v4, retypeSlots= v5, retypeIsDevice= v6 \<rparr> == Retype v0 v1 v2 v3 v4 v5 v6"
"Retype_ \<lparr> retypeSource= v0, retypeResetUntyped= v1, retypeRegionBase= v2, retypeFreeRegionBase= v3, retypeNewType= v4, retypeNewSizeBits= v5, retypeSlots= v6, retypeIsDevice= v7 \<rparr> == Retype v0 v1 v2 v3 v4 v5 v6 v7"
lemma retypeSource_retypeSource_update [simp]:
"retypeSource (retypeSource_update f v) = f (retypeSource v)"
@ -660,6 +670,10 @@ lemma retypeSource_retypeSlots_update [simp]:
"retypeSource (retypeSlots_update f v) = retypeSource v"
by (cases v) simp
lemma retypeSource_retypeResetUntyped_update [simp]:
"retypeSource (retypeResetUntyped_update f v) = retypeSource v"
by (cases v) simp
lemma retypeSource_retypeFreeRegionBase_update [simp]:
"retypeSource (retypeFreeRegionBase_update f v) = retypeSource v"
by (cases v) simp
@ -688,6 +702,10 @@ lemma retypeNewType_retypeSlots_update [simp]:
"retypeNewType (retypeSlots_update f v) = retypeNewType v"
by (cases v) simp
lemma retypeNewType_retypeResetUntyped_update [simp]:
"retypeNewType (retypeResetUntyped_update f v) = retypeNewType v"
by (cases v) simp
lemma retypeNewType_retypeFreeRegionBase_update [simp]:
"retypeNewType (retypeFreeRegionBase_update f v) = retypeNewType v"
by (cases v) simp
@ -716,6 +734,10 @@ lemma retypeIsDevice_retypeSlots_update [simp]:
"retypeIsDevice (retypeSlots_update f v) = retypeIsDevice v"
by (cases v) simp
lemma retypeIsDevice_retypeResetUntyped_update [simp]:
"retypeIsDevice (retypeResetUntyped_update f v) = retypeIsDevice v"
by (cases v) simp
lemma retypeIsDevice_retypeFreeRegionBase_update [simp]:
"retypeIsDevice (retypeFreeRegionBase_update f v) = retypeIsDevice v"
by (cases v) simp
@ -744,6 +766,10 @@ lemma retypeRegionBase_retypeSlots_update [simp]:
"retypeRegionBase (retypeSlots_update f v) = retypeRegionBase v"
by (cases v) simp
lemma retypeRegionBase_retypeResetUntyped_update [simp]:
"retypeRegionBase (retypeResetUntyped_update f v) = retypeRegionBase v"
by (cases v) simp
lemma retypeRegionBase_retypeFreeRegionBase_update [simp]:
"retypeRegionBase (retypeFreeRegionBase_update f v) = retypeRegionBase v"
by (cases v) simp
@ -772,6 +798,10 @@ lemma retypeSlots_retypeSlots_update [simp]:
"retypeSlots (retypeSlots_update f v) = f (retypeSlots v)"
by (cases v) simp
lemma retypeSlots_retypeResetUntyped_update [simp]:
"retypeSlots (retypeResetUntyped_update f v) = retypeSlots v"
by (cases v) simp
lemma retypeSlots_retypeFreeRegionBase_update [simp]:
"retypeSlots (retypeFreeRegionBase_update f v) = retypeSlots v"
by (cases v) simp
@ -780,6 +810,38 @@ lemma retypeSlots_retypeNewSizeBits_update [simp]:
"retypeSlots (retypeNewSizeBits_update f v) = retypeSlots v"
by (cases v) simp
lemma retypeResetUntyped_retypeSource_update [simp]:
"retypeResetUntyped (retypeSource_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeNewType_update [simp]:
"retypeResetUntyped (retypeNewType_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeIsDevice_update [simp]:
"retypeResetUntyped (retypeIsDevice_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeRegionBase_update [simp]:
"retypeResetUntyped (retypeRegionBase_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeSlots_update [simp]:
"retypeResetUntyped (retypeSlots_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeResetUntyped_update [simp]:
"retypeResetUntyped (retypeResetUntyped_update f v) = f (retypeResetUntyped v)"
by (cases v) simp
lemma retypeResetUntyped_retypeFreeRegionBase_update [simp]:
"retypeResetUntyped (retypeFreeRegionBase_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeResetUntyped_retypeNewSizeBits_update [simp]:
"retypeResetUntyped (retypeNewSizeBits_update f v) = retypeResetUntyped v"
by (cases v) simp
lemma retypeFreeRegionBase_retypeSource_update [simp]:
"retypeFreeRegionBase (retypeSource_update f v) = retypeFreeRegionBase v"
by (cases v) simp
@ -800,6 +862,10 @@ lemma retypeFreeRegionBase_retypeSlots_update [simp]:
"retypeFreeRegionBase (retypeSlots_update f v) = retypeFreeRegionBase v"
by (cases v) simp
lemma retypeFreeRegionBase_retypeResetUntyped_update [simp]:
"retypeFreeRegionBase (retypeResetUntyped_update f v) = retypeFreeRegionBase v"
by (cases v) simp
lemma retypeFreeRegionBase_retypeFreeRegionBase_update [simp]:
"retypeFreeRegionBase (retypeFreeRegionBase_update f v) = f (retypeFreeRegionBase v)"
by (cases v) simp
@ -828,6 +894,10 @@ lemma retypeNewSizeBits_retypeSlots_update [simp]:
"retypeNewSizeBits (retypeSlots_update f v) = retypeNewSizeBits v"
by (cases v) simp
lemma retypeNewSizeBits_retypeResetUntyped_update [simp]:
"retypeNewSizeBits (retypeResetUntyped_update f v) = retypeNewSizeBits v"
by (cases v) simp
lemma retypeNewSizeBits_retypeFreeRegionBase_update [simp]:
"retypeNewSizeBits (retypeFreeRegionBase_update f v) = retypeNewSizeBits v"
by (cases v) simp

View File

@ -410,7 +410,7 @@ defs decodeInvocation_def:
defs performInvocation_def:
"performInvocation block call x2\<equiv> (case x2 of
(InvokeUntyped invok) \<Rightarrow> (doE
withoutPreemption $ invokeUntyped invok;
invokeUntyped invok;
returnOk $ []
odE)
| (InvokeEndpoint ep badge canGrant) \<Rightarrow>

View File

@ -20,6 +20,7 @@ imports
Invocations_H
InvocationLabels_H
Config_H
"../machine/MachineExports"
begin
consts
@ -78,10 +79,11 @@ where
mapM (locateSlotCap nodeCap)
[nodeOffset .e. nodeOffset+nodeWindow - 1];
mapME_x ensureEmptySlot slots;
freeIndex \<leftarrow> withoutFailure $ constOnFailure (capFreeIndex cap) $ (doE
reset \<leftarrow> withoutFailure $ constOnFailure False $ (doE
ensureNoChildren slot;
returnOk 0
returnOk True
odE);
freeIndex \<leftarrow> returnOk ( if reset then 0 else capFreeIndex cap);
freeRef \<leftarrow> returnOk ( getFreeRef (capPtr cap) freeIndex);
objectSize \<leftarrow> returnOk ( getObjectSize newType userObjSize);
untypedFreeBytes \<leftarrow> returnOk ( (bit (capBlockSize cap)) - freeIndex);
@ -95,6 +97,7 @@ where
alignedFreeRef \<leftarrow> returnOk ( PPtr $ alignUp (fromPPtr freeRef) objectSize);
returnOk $ Retype_ \<lparr>
retypeSource= slot,
retypeResetUntyped= reset,
retypeRegionBase= capPtr cap,
retypeFreeRegionBase= alignedFreeRef,
retypeNewType= newType,
@ -109,22 +112,50 @@ where
)"
definition
invokeUntyped :: "untyped_invocation \<Rightarrow> unit kernel"
resetUntypedCap :: "machine_word \<Rightarrow> unit kernel_p"
where
"resetUntypedCap slot\<equiv> (doE
cap \<leftarrow> withoutPreemption $ getSlotCap slot;
sz \<leftarrow> returnOk ( capBlockSize cap);
withoutPreemption $ deleteObjects (capPtr cap) sz;
if (capIsDevice cap \<or> sz < resetChunkBits)
then withoutPreemption $ (do
unless (capIsDevice cap) $ doMachineOp $
clearMemory (PPtr (fromPPtr (capPtr cap))) (1 `~shiftL~` sz);
updateCap slot (cap \<lparr>capFreeIndex := 0\<rparr>)
od)
else (
forME_x (reverse [capPtr cap, capPtr cap + (1 `~shiftL~` resetChunkBits) .e.
getFreeRef (capPtr cap) (capFreeIndex cap) - 1])
(\<lambda> addr. (doE
withoutPreemption $ doMachineOp $ clearMemory
(PPtr (fromPPtr addr)) (1 `~shiftL~` resetChunkBits);
withoutPreemption $ updateCap slot (cap \<lparr>capFreeIndex
:= getFreeIndex (capPtr cap) addr\<rparr>);
preemptionPoint
odE))
)
odE)"
definition
invokeUntyped :: "untyped_invocation \<Rightarrow> unit kernel_p"
where
"invokeUntyped x0\<equiv> (case x0 of
(Retype srcSlot base freeRegionBase newType userSize destSlots isDevice) \<Rightarrow> (do
cap \<leftarrow> getSlotCap srcSlot;
when (base = freeRegionBase) $
deleteObjects base (capBlockSize cap);
totalObjectSize \<leftarrow> return ( (length destSlots) `~shiftL~` (getObjectSize newType userSize));
stateAssert (\<lambda> x. Not (cNodeOverlap (gsCNodes x)
(\<lambda> x. fromPPtr freeRegionBase \<le> x
\<and> x \<le> fromPPtr freeRegionBase + fromIntegral totalObjectSize - 1)))
[];
freeRef \<leftarrow> return ( freeRegionBase + PPtr (fromIntegral totalObjectSize));
updateCap srcSlot (cap \<lparr>capFreeIndex := getFreeIndex base freeRef\<rparr>);
createNewObjects newType srcSlot destSlots freeRegionBase userSize isDevice
(Retype srcSlot reset base retypeBase newType userSize destSlots isDev) \<Rightarrow> (doE
whenE reset $ resetUntypedCap srcSlot;
withoutPreemption $ (do
cap \<leftarrow> getSlotCap srcSlot;
totalObjectSize \<leftarrow> return ( (length destSlots) `~shiftL~` (getObjectSize newType userSize));
stateAssert (\<lambda> x. Not (cNodeOverlap (gsCNodes x)
(\<lambda> x. fromPPtr retypeBase \<le> x
\<and> x \<le> fromPPtr retypeBase + fromIntegral totalObjectSize - 1)))
[];
freeRef \<leftarrow> return ( retypeBase + PPtr (fromIntegral totalObjectSize));
updateCap srcSlot
(cap \<lparr>capFreeIndex := getFreeIndex base freeRef\<rparr>);
createNewObjects newType srcSlot destSlots retypeBase userSize isDev
od)
odE)
)"

View File

@ -18,6 +18,7 @@ imports
Invocations_H
InvocationLabels_H
Config_H
"../machine/MachineExports"
begin
consts

View File

@ -1,5 +1,95 @@
Built from git repo at /home/matthewb/verification/patch/l4v/spec/haskell by matthewb
Built from git repo at /home/tsewell/dev/verification2/l4v/spec/haskell by tsewell
Generated from changeset:
1c569f1 SELFOUR-276: reworked haskell
af80ffc Invariants proven for preemptible retype.
Warning - uncomitted changes used:
M ../../proof/ROOT
M ../../proof/invariant-abstract/ARM/ArchDetSchedAux_AI.thy
M ../../proof/invariant-abstract/ARM/ArchDeterministic_AI.thy
M ../../proof/invariant-abstract/DetSchedAux_AI.thy
M ../../proof/invariant-abstract/Deterministic_AI.thy
M ../../proof/invariant-abstract/Untyped_AI.thy
M ../../proof/refine/ArchAcc_R.thy
M ../../proof/refine/Arch_R.thy
M ../../proof/refine/CNodeInv_R.thy
M ../../proof/refine/CSpace_R.thy
MM ../../proof/refine/Detype_R.thy
M ../../proof/refine/Finalise_R.thy
M ../../proof/refine/InterruptAcc_R.thy
M ../../proof/refine/Orphanage.thy
M ../../proof/refine/PageTableDuplicates.thy
MM ../../proof/refine/Retype_R.thy
M ../../proof/refine/Syscall_R.thy
MM ../../proof/refine/Untyped_R.thy
M ../abstract/Retype_A.thy
M ../design/ARM/ArchRetypeDecls_H.thy
MM ../design/ARM/ArchRetype_H.thy
MM ../design/ARM/Intermediate_H.thy
M ../design/Config_H.thy
MM ../design/Invocations_H.thy
M ../design/Retype_H.thy
MM ../design/Untyped_H.thy
M ../design/skel/Untyped_H.thy
MM ../design/version
M src/SEL4/API/Invocation.lhs
M src/SEL4/Config.lhs
M src/SEL4/Object/ObjectType.lhs
M src/SEL4/Object/ObjectType/ARM.lhs
M src/SEL4/Object/Untyped.lhs
?? ../../Test.thy
?? ../../camkes/glue-proofs/umm_types.txt
?? ../../lib/Test.thy
?? ../../lib/foo.c
?? ../../patch
?? ../../proof/Ctac.thy
?? ../../proof/Old_Arch.thy
?? ../../proof/Old_Retype_R.thy
?? ../../proof/Old_Untyped_AI.thy
?? ../../proof/Test.thy
?? ../../proof/asmrefine/CFunDump.txt
?? ../../proof/crefine/Test.thy
?? ../../proof/foo
?? ../../proof/invariant-abstract/ARM/ArchVSpaceEntries_AI.thy.orig
?? ../../proof/invariant-abstract/Arch_AI.thy.orig
?? ../../proof/invariant-abstract/BCorres2_AI.thy.orig
?? ../../proof/invariant-abstract/CNodeInv_AI.thy.orig
?? ../../proof/invariant-abstract/CSpace_AI.thy.orig
?? ../../proof/invariant-abstract/DetSchedAux_AI.thy.orig
?? ../../proof/invariant-abstract/Deterministic_AI.thy.orig
?? ../../proof/invariant-abstract/Finalise_AI.thy.orig
?? ../../proof/invariant-abstract/Retype_AI.thy.orig
?? ../../proof/invariant-abstract/Untyped_AI.thy.orig
?? ../../proof/lhs_pars.py
?? ../../proof/refine/.Untyped_R.thy.marks
?? ../../proof/refine/Arch_R.thy.orig
?? ../../proof/refine/Detype_R.thy.orig
?? ../../proof/refine/Orphanage.thy.orig
?? ../../proof/refine/PageTableDuplicates.thy.orig
?? ../../proof/refine/Retype_R.thy.orig
?? ../../proof/refine/Untyped_R.thy.orig
?? ../../proof/switch_glob.c
?? ../../proof/switch_glob.thy
?? ../../proof/untyped.c
?? ../abstract/ARM/ArchRetype_A.thy.orig
?? ../abstract/Decode_A.thy.orig
?? ../abstract/Invocations_A.thy.orig
?? ../abstract/Retype_A.thy.orig
?? ../cspec/c/foo.c
?? ../cspec/c/foo.s
?? ../design/ARM/ArchRetype_H.thy.orig
?? ../design/ARM/Intermediate_H.thy.orig
?? ../design/Invocations_H.thy.orig
?? ../design/Untyped_H.thy.orig
?? ../design/version.orig
?? ../foo.c
?? src/SEL4/API/Invocation.lhs.orig
?? src/SEL4/Object/ObjectType/ARM.lhs.orig
?? src/SEL4/Object/ObjectType/ARM.lhs.rej
?? src/SEL4/Object/Untyped.lhs.orig
?? src/SEL4/Object/Untyped.lhs.rej
?? ../patch
?? ../../tools/autocorres/doc/quickstart/umm_types.txt
?? ../../tools/autocorres/tests/umm_types.txt
?? ../../use-this-isabelle

View File

@ -113,6 +113,7 @@ The following data type defines the parameters expected for invocations of Untyp
> data UntypedInvocation
> = Retype {
> retypeSource :: PPtr CTE,
> retypeResetUntyped :: Bool,
> retypeRegionBase :: PPtr (),
> retypeFreeRegionBase :: PPtr (),
> retypeNewType :: ObjectType,

View File

@ -53,3 +53,8 @@ To limit the impact of "Retype" calls on interrupt latency, there is a fixed max
> retypeFanOutLimit :: Word
> retypeFanOutLimit = 256
Also related to interrupt latency, clearing of memory before "Retype" is done one chunk at a time, with a configurable chunk size. The chunk size must be a power of two, and is represented by a number of bits.
> resetChunkBits :: Int
> resetChunkBits = 8

View File

@ -470,7 +470,7 @@ This function just dispatches invocations to the type-specific invocation functi
> performInvocation :: Bool -> Bool -> Invocation -> KernelP [Word]
>
> performInvocation _ _ (InvokeUntyped invok) = do
> withoutPreemption $ invokeUntyped invok
> invokeUntyped invok
> return $! []
>
> performInvocation block call (InvokeEndpoint ep badge canGrant) =

View File

@ -208,19 +208,13 @@ All other capabilities need no finalisation action.
\subsection{Creating New Capabilities}
Creates a page-sized object that consists of plain words observable to the user.
> createPageObject ptr numPages isDevice =
> if isDevice then do
> addrs <- placeNewObject ptr UserDataDevice numPages
> return addrs
> else do
> addrs <- placeNewObject ptr UserData numPages
> doMachineOp $ initMemory (PPtr $ fromPPtr ptr) (1 `shiftL` (pageBits + numPages) ) -- only write to non-device pages
> return addrs
Create an architecture-specific object.
> placeNewDataObject :: PPtr () -> Int -> Bool -> Kernel ()
> placeNewDataObject regionBase sz isDevice = if isDevice
> then placeNewObject regionBase UserDataDevice sz
> else placeNewObject regionBase UserData sz
> createObject :: ObjectType -> PPtr () -> Int -> Bool -> Kernel ArchCapability
> createObject t regionBase _ isDevice =
> let funupd = (\f x v y -> if y == x then v else f y) in
@ -229,28 +223,28 @@ Create an architecture-specific object.
> Arch.Types.APIObjectType _ ->
> fail "Arch.createObject got an API type"
> Arch.Types.SmallPageObject -> do
> createPageObject regionBase 0 isDevice
> placeNewDataObject regionBase 0 isDevice
> modify (\ks -> ks { gsUserPages =
> funupd (gsUserPages ks)
> (fromPPtr regionBase) (Just ARMSmallPage)})
> return $! PageCap isDevice (pointerCast regionBase)
> VMReadWrite ARMSmallPage Nothing
> Arch.Types.LargePageObject -> do
> createPageObject regionBase 4 isDevice
> placeNewDataObject regionBase 4 isDevice
> modify (\ks -> ks { gsUserPages =
> funupd (gsUserPages ks)
> (fromPPtr regionBase) (Just ARMLargePage)})
> return $! PageCap isDevice (pointerCast regionBase)
> VMReadWrite ARMLargePage Nothing
> Arch.Types.SectionObject -> do
> createPageObject regionBase 8 isDevice
> placeNewDataObject regionBase 8 isDevice
> modify (\ks -> ks { gsUserPages =
> funupd (gsUserPages ks)
> (fromPPtr regionBase) (Just ARMSection)})
> return $! PageCap isDevice (pointerCast regionBase)
> VMReadWrite ARMSection Nothing
> Arch.Types.SuperSectionObject -> do
> createPageObject regionBase 12 isDevice
> placeNewDataObject regionBase 12 isDevice
> modify (\ks -> ks { gsUserPages =
> funupd (gsUserPages ks)
> (fromPPtr regionBase) (Just ARMSuperSection)})
@ -258,12 +252,7 @@ Create an architecture-specific object.
> VMReadWrite ARMSuperSection Nothing
> Arch.Types.PageTableObject -> do
> let ptSize = ptBits - objBits (makeObject :: PTE)
> let regionSize = (1 `shiftL` ptBits)
> placeNewObject regionBase (makeObject :: PTE) ptSize
> doMachineOp $
> cleanCacheRange_PoU (VPtr $ fromPPtr regionBase)
> (VPtr $ fromPPtr regionBase + regionSize - 1)
> (addrFromPPtr regionBase)
> return $! PageTableCap (pointerCast regionBase) Nothing
> Arch.Types.PageDirectoryObject -> do
> let pdSize = pdBits - objBits (makeObject :: PDE)

View File

@ -128,11 +128,15 @@ The destination slots must all be empty. If any of them contains a capability, t
> mapM_ ensureEmptySlot slots
Find out how much free room is available in the Untyped. If we discover that we don't have any children (for instance, they have all been manually deleted), we can just start allocating from the beginning of region again.
If we discover we don't have any children (for instance, they have all been manually deleted), we reset the untyped region, clearing any memory that had been used.
> freeIndex <- withoutFailure $ constOnFailure (capFreeIndex cap) $ do
> reset <- withoutFailure $ constOnFailure False $ do
> ensureNoChildren slot
> return 0
> return True
The memory free for use begins at the current free pointer, unless we are performing a reset, in which case it begins at the start of the region.
> let freeIndex = if reset then 0 else capFreeIndex cap
> let freeRef = getFreeRef (capPtr cap) freeIndex
Ensure that sufficient space is available in the region of memory.
@ -157,6 +161,7 @@ Align up the free region pointer to ensure that created objects are aligned to t
> return $! Retype {
> retypeSource = slot,
> retypeResetUntyped = reset,
> retypeRegionBase = capPtr cap,
> retypeFreeRegionBase = alignedFreeRef,
> retypeNewType = newType,
@ -169,35 +174,57 @@ Align up the free region pointer to ensure that created objects are aligned to t
> then TruncatedMessage
> else IllegalOperation
> invokeUntyped :: UntypedInvocation -> Kernel ()
> invokeUntyped (Retype srcSlot base freeRegionBase newType userSize destSlots isDevice) = do
A Retype operation may begin with a reset of an Untyped cap. This returns the free space pointer to the start of the Untyped region. For large regions this is done preemptibly, one chunk at a time.
> cap <- getSlotCap srcSlot
> resetUntypedCap :: PPtr CTE -> KernelP ()
> resetUntypedCap slot = do
> cap <- withoutPreemption $ getSlotCap slot
> let sz = capBlockSize cap
\begin{impdetails}
The following code removes any existing objects in the physical memory region. This operation is specific to the Haskell physical memory model, in which memory objects are typed; it is not necessary (or possible) when running on real hardware.
> when (base == freeRegionBase) $
> deleteObjects base (capBlockSize cap)
The objects in the Haskell model are removed at this time. This operation is specific to the Haskell physical memory model, in which memory objects are typed; it is not necessary (or possible) when running on real hardware.
> withoutPreemption $ deleteObjects (capPtr cap) sz
\end{impdetails}
Update the untyped capability we are using to create these objects to record that this space now has objects in it.
> if (capIsDevice cap || sz < resetChunkBits)
> then withoutPreemption $ do
> unless (capIsDevice cap) $ doMachineOp $
> clearMemory (PPtr (fromPPtr (capPtr cap))) (1 `shiftL` sz)
> updateCap slot (cap {capFreeIndex = 0})
> else do
> forM_ (reverse [capPtr cap, capPtr cap + (1 `shiftL` resetChunkBits) ..
> getFreeRef (capPtr cap) (capFreeIndex cap) - 1])
> $ \addr -> do
> withoutPreemption $ doMachineOp $ clearMemory
> (PPtr (fromPPtr addr)) (1 `shiftL` resetChunkBits)
> withoutPreemption $ updateCap slot (cap {capFreeIndex
> = getFreeIndex (capPtr cap) addr})
> preemptionPoint
> invokeUntyped :: UntypedInvocation -> KernelP ()
> invokeUntyped (Retype srcSlot reset base retypeBase newType userSize destSlots isDev) = do
> when reset $ resetUntypedCap srcSlot
> withoutPreemption $ do
> cap <- getSlotCap srcSlot
For verification purposes a check is made that the region the objects are created in does not overlap with any existing CNodes.
> let totalObjectSize = (length destSlots) `shiftL` (getObjectSize newType userSize)
> stateAssert (\x -> not (cNodeOverlap (gsCNodes x)
> (\x -> fromPPtr freeRegionBase <= x
> && x <= fromPPtr freeRegionBase + fromIntegral totalObjectSize - 1)))
> "CNodes present in region to be retyped."
> let freeRef = freeRegionBase + PPtr (fromIntegral totalObjectSize)
> updateCap srcSlot (cap {capFreeIndex = getFreeIndex base freeRef})
> let totalObjectSize = (length destSlots) `shiftL` (getObjectSize newType userSize)
> stateAssert (\x -> not (cNodeOverlap (gsCNodes x)
> (\x -> fromPPtr retypeBase <= x
> && x <= fromPPtr retypeBase + fromIntegral totalObjectSize - 1)))
> "CNodes present in region to be retyped."
> let freeRef = retypeBase + PPtr (fromIntegral totalObjectSize)
> updateCap srcSlot
> (cap {capFreeIndex = getFreeIndex base freeRef})
Create the new objects and insert caps to these objects into the destination slots.
> createNewObjects newType srcSlot destSlots freeRegionBase userSize isDevice
> createNewObjects newType srcSlot destSlots retypeBase userSize isDev
This function performs the check that CNodes do not overlap with the retyping region. Its actual definition is provided in the Isabelle translation.
> cNodeOverlap :: (Word -> Maybe Int) -> (Word -> Bool) -> Bool