x64: refine: remove valid_pde_mappings' for the moment

This commit is contained in:
Joel Beeren 2017-04-06 14:47:26 +10:00
parent 5c574a6da4
commit 431b134b19
5 changed files with 108 additions and 121 deletions

View File

@ -3124,19 +3124,6 @@ lemma cteInsert_valid_irq_handlers'[wp]:
apply (clarsimp simp:modify_map_def split:if_splits)
done
lemma setCTE_valid_mappings'[wp]:
"\<lbrace>valid_pde_mappings'\<rbrace> setCTE x y \<lbrace>\<lambda>rv. valid_pde_mappings'\<rbrace>"
apply (wp valid_pde_mappings_lift' setCTE_typ_at')
apply (simp add: setCTE_def)
apply (rule obj_at_setObject2)
apply (clarsimp simp: updateObject_cte typeError_def in_monad
split: Structures_H.kernel_object.split_asm if_split_asm)
apply assumption
done
crunch pde_mappings' [wp]: cteInsert valid_pde_mappings'
(wp: crunch_wps)
lemma setCTE_irq_states' [wp]:
"\<lbrace>valid_irq_states'\<rbrace> setCTE x y \<lbrace>\<lambda>_. valid_irq_states'\<rbrace>"
apply (rule valid_irq_states_lift')
@ -3255,9 +3242,6 @@ lemma cteInsert_valid_globals [wp]:
crunch arch [wp]: cteInsert "\<lambda>s. P (ksArchState s)"
(wp: crunch_wps simp: cte_wp_at_ctes_of)
crunch pde_mappings' [wp]: cteInsert valid_pde_mappings'
(wp: crunch_wps)
lemma setCTE_ksMachine[wp]:
"\<lbrace>\<lambda>s. P (ksMachineState s)\<rbrace> setCTE x y \<lbrace>\<lambda>_ s. P (ksMachineState s)\<rbrace>"
apply (clarsimp simp: setCTE_def)
@ -4390,8 +4374,6 @@ lemma setupReplyMaster_irq_handlers'[wp]:
crunch irq_states' [wp]: setupReplyMaster valid_irq_states'
crunch irqs_makes' [wp]: setupReplyMaster irqs_masked'
(rule: irqs_masked_lift)
crunch pde_mappings' [wp]: setupReplyMaster valid_pde_mappings'
crunch pred_tcb_at' [wp]: setupReplyMaster "pred_tcb_at' proj P t"
crunch ksMachine[wp]: setupReplyMaster "\<lambda>s. P (ksMachineState s)"

View File

@ -441,7 +441,7 @@ where valid_cap'_def:
| PageTableCap ref mapdata \<Rightarrow>
page_table_at' ref s \<and>
(case mapdata of None \<Rightarrow> True | Some (asid, ref) \<Rightarrow>
0 < asid \<and> asid \<le> 2^asid_bits - 1 \<and> ref < kernelBase)
0 < asid \<and> asid \<le> 2^asid_bits - 1 \<and> ref < pptrBase)
| PageDirectoryCap ref mapdata \<Rightarrow>
page_directory_at' ref s \<and>
(case mapdata of None \<Rightarrow> True | Some (asid, ref) \<Rightarrow> 0 < asid \<and> asid \<le>2^asid_bits-1 \<and> ref < pptrBase)
@ -1107,31 +1107,6 @@ where
definition
"irqs_masked' \<equiv> \<lambda>s. \<forall>irq > maxIRQ. intStateIRQTable (ksInterruptState s) irq = IRQInactive"
definition
pd_asid_slot :: machine_word
where
"pd_asid_slot \<equiv> 0xff0"
(* ideally, all mappings above kernel_base are global and kernel-only, and
of them one particular mapping is clear. at the moment all we can easily say
is that the mapping is clear. *)
definition
valid_pde_mapping_offset' :: "machine_word \<Rightarrow> bool"
where
"valid_pde_mapping_offset' offset \<equiv> offset \<noteq> pd_asid_slot * 4"
definition
valid_pde_mapping' :: "machine_word \<Rightarrow> pde \<Rightarrow> bool"
where
"valid_pde_mapping' offset pde \<equiv> pde = InvalidPDE \<or> valid_pde_mapping_offset' offset"
definition
valid_pde_mappings' :: "kernel_state \<Rightarrow> bool"
where
"valid_pde_mappings' \<equiv> \<lambda>s.
\<forall>x pde. ko_at' pde x s
\<longrightarrow> valid_pde_mapping' (x && mask pdBits) pde"
definition
"valid_irq_masks' table masked \<equiv> \<forall>irq. table irq = IRQInactive \<longrightarrow> masked irq"
@ -1183,7 +1158,6 @@ where
\<and> valid_queues' s
\<and> ct_not_inQ s
\<and> ct_idle_or_in_cur_domain' s
\<and> valid_pde_mappings' s
\<and> pspace_domain_valid s
\<and> ksCurDomain s \<le> maxDomain
\<and> valid_dom_schedule' s
@ -1253,7 +1227,7 @@ abbreviation(input)
\<and> valid_idle' s \<and> valid_global_refs' s \<and> valid_arch_state' s
\<and> valid_irq_node' (irq_node' s) s \<and> valid_irq_handlers' s
\<and> valid_irq_states' s \<and> irqs_masked' s \<and> valid_machine_state' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_idle_or_in_cur_domain' s \<and> valid_pde_mappings' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_idle_or_in_cur_domain' s
\<and> pspace_domain_valid s
\<and> ksCurDomain s \<le> maxDomain
\<and> valid_dom_schedule' s \<and> untyped_ranges_zero' s"
@ -1266,7 +1240,7 @@ abbreviation(input)
\<and> valid_idle' s \<and> valid_global_refs' s \<and> valid_arch_state' s
\<and> valid_irq_node' (irq_node' s) s \<and> valid_irq_handlers' s
\<and> valid_irq_states' s \<and> irqs_masked' s \<and> valid_machine_state' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_idle_or_in_cur_domain' s \<and> valid_pde_mappings' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_idle_or_in_cur_domain' s
\<and> pspace_domain_valid s
\<and> ksCurDomain s \<le> maxDomain
\<and> valid_dom_schedule' s \<and> untyped_ranges_zero' s"
@ -1287,7 +1261,7 @@ definition
\<and> valid_idle' s \<and> valid_global_refs' s \<and> valid_arch_state' s
\<and> valid_irq_node' (irq_node' s) s \<and> valid_irq_handlers' s
\<and> valid_irq_states' s \<and> irqs_masked' s \<and> valid_machine_state' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_not_inQ s \<and> valid_pde_mappings' s
\<and> cur_tcb' s \<and> valid_queues' s \<and> ct_not_inQ s
\<and> pspace_domain_valid s
\<and> ksCurDomain s \<le> maxDomain
\<and> valid_dom_schedule' s \<and> untyped_ranges_zero' s"
@ -1889,14 +1863,6 @@ lemma objBits_cte_conv:
"objBits (cte :: cte) = 5"
by (simp add: objBits_def objBitsKO_def wordSizeCase_def word_size)
lemma valid_pde_mapping'_simps[simp]:
"valid_pde_mapping' offset (InvalidPDE) = True"
"valid_pde_mapping' offset (LargePagePDE ptr a b c d e w x y)
= valid_pde_mapping_offset' offset"
"valid_pde_mapping' offset (PageTablePDE ptr x z'' g h f)
= valid_pde_mapping_offset' offset"
by (clarsimp simp: valid_pde_mapping'_def)+
lemmas valid_irq_states'_def = valid_irq_masks'_def
lemma valid_pspaceI' [intro]:
@ -3036,10 +3002,6 @@ lemma no_0_obj'_update [iff]:
"no_0_obj' (f s) = no_0_obj' s"
by (simp add: no_0_obj'_def pspace)
lemma valid_pde_mappings'_update [iff]:
"valid_pde_mappings' (f s) = valid_pde_mappings' s"
by (simp add: valid_pde_mappings'_def)
lemma pointerInUserData_update[iff]:
"pointerInUserData p (f s) = pointerInUserData p s"
by (simp add: pointerInUserData_def)

View File

@ -2096,33 +2096,6 @@ lemmas set_ntfn_irq_handlers'[wp] = valid_irq_handlers_lift'' [OF set_ntfn_ctes_
lemmas set_ntfn_irq_states' [wp] = valid_irq_states_lift' [OF set_ntfn_ksInterrupt set_ntfn_ksMachine]
lemma valid_pde_mappings'_def2:
"valid_pde_mappings' =
(\<lambda>s. \<forall>x. pde_at' x s \<longrightarrow> obj_at' (valid_pde_mapping' (x && mask pdBits)) x s)"
apply (clarsimp simp: valid_pde_mappings'_def typ_at_to_obj_at_arches)
apply (rule ext, rule iff_allI)
apply (clarsimp simp: obj_at'_def projectKOs)
apply (auto simp add: objBits_simps archObjSize_def)
done
lemma valid_pde_mappings_lift':
assumes x: "\<And>P T p. \<lbrace>\<lambda>s. P (typ_at' T p s)\<rbrace> f \<lbrace>\<lambda>rv s. P (typ_at' T p s)\<rbrace>"
assumes y: "\<And>x. \<lbrace>obj_at' (valid_pde_mapping' (x && mask pdBits)) x\<rbrace>
f \<lbrace>\<lambda>rv. obj_at' (valid_pde_mapping' (x && mask pdBits)) x\<rbrace>"
shows "\<lbrace>valid_pde_mappings'\<rbrace> f \<lbrace>\<lambda>rv. valid_pde_mappings'\<rbrace>"
apply (simp only: valid_pde_mappings'_def2 imp_conv_disj)
apply (rule hoare_vcg_all_lift hoare_vcg_disj_lift x y)+
done
lemma set_ntfn_valid_pde_mappings'[wp]:
"\<lbrace>valid_pde_mappings'\<rbrace> setNotification ptr val \<lbrace>\<lambda>rv. valid_pde_mappings'\<rbrace>"
apply (rule valid_pde_mappings_lift')
apply wp
apply (simp add: setNotification_def)
apply (rule obj_at_setObject2)
apply (clarsimp simp: updateObject_default_def in_monad)
done
lemma set_ntfn_vms'[wp]:
"\<lbrace>valid_machine_state'\<rbrace> setNotification ptr val \<lbrace>\<lambda>rv. valid_machine_state'\<rbrace>"
apply (simp add: setNotification_def valid_machine_state'_def pointerInDeviceData_def pointerInUserData_def)
@ -2321,7 +2294,6 @@ crunch obj_at'[wp]: doMachineOp "\<lambda>s. P (obj_at' P' p s)"
crunch it[wp]: doMachineOp "\<lambda>s. P (ksIdleThread s)"
crunch idle'[wp]: doMachineOp "valid_idle'"
(wp: crunch_wps simp: crunch_simps valid_idle'_pspace_itI)
crunch pde_mappings'[wp]: doMachineOp "valid_pde_mappings'"
lemma setEndpoint_ksMachine:
"\<lbrace>\<lambda>s. P (ksMachineState s)\<rbrace> setEndpoint ptr val \<lbrace>\<lambda>rv s. P (ksMachineState s)\<rbrace>"

View File

@ -1003,19 +1003,9 @@ lemma threadSet_typ_at'[wp]:
lemmas threadSet_typ_at_lifts[wp] = typ_at_lifts [OF threadSet_typ_at']
lemma setObject_tcb_pde_mappings'[wp]:
"\<lbrace>valid_pde_mappings'\<rbrace> setObject p (tcb :: tcb) \<lbrace>\<lambda>rv. valid_pde_mappings'\<rbrace>"
apply (wp valid_pde_mappings_lift' setObject_typ_at')
apply (rule obj_at_setObject2)
apply (auto dest: updateObject_default_result)
done
crunch irq_states' [wp]: threadSet valid_irq_states'
(ignore: setObject getObject)
crunch pde_mappings' [wp]: threadSet valid_pde_mappings'
(ignore: getObject setObject)
crunch pspace_domain_valid [wp]: threadSet "pspace_domain_valid"
(ignore: getObject setObject)
@ -4305,8 +4295,6 @@ lemma sbn_global_reds' [wp]:
crunch irq_states' [wp]: setThreadState, setBoundNotification valid_irq_states'
(simp: unless_def crunch_simps)
crunch pde_mappings' [wp]: setThreadState, setBoundNotification valid_pde_mappings'
(simp: unless_def crunch_simps)
lemma addToBitmap_ksMachine[wp]:
"\<lbrace>\<lambda>s. P (ksMachineState s)\<rbrace> addToBitmap d p \<lbrace>\<lambda>rv s. P (ksMachineState s)\<rbrace>"

View File

@ -1181,11 +1181,6 @@ definition
| X64_A.PageGetAddr ptr \<Rightarrow>
pgi' = PageGetAddr ptr"
(* FIXME x64: is this needed? *)
definition
"valid_pde_slots' m \<equiv> case m of Inl (pte, xs) \<Rightarrow> True
| Inr (pde, xs) \<Rightarrow> \<forall>x \<in> set xs. valid_pde_mapping' (x && mask pdBits) pde"
lemma tl_nat_list_simp:
"tl [a..<b] = [a + 1 ..<b]"
by (induct b,auto)
@ -1615,7 +1610,7 @@ lemma perform_page_table_corres:
subgoal sorry (* FIXME x64: this will be solved by adding "pde_at pd_slot" to valid_pti *)
apply (clarsimp simp: cte_wp_at_ctes_of valid_pti'_def)
apply auto[1]
apply (clarsimp simp:valid_pde_mapping'_def split:X64_H.pde.split)
apply (clarsimp simp: split:X64_H.pde.split)
apply (rename_tac cap a b)
apply (clarsimp simp: page_table_invocation_map_def)
apply (rule_tac F="is_pt_cap cap" in corres_req)
@ -2370,18 +2365,115 @@ lemma setObject_pde_ksDomScheduleIdx [wp]:
"\<lbrace>\<lambda>s. P (ksDomScheduleIdx s)\<rbrace> setObject p (pde::pde) \<lbrace>\<lambda>_. \<lambda>s. P (ksDomScheduleIdx s)\<rbrace>"
by (wp updateObject_default_inv|simp add:setObject_def | wpc)+
crunch ksDomScheduleIdx[wp]: storePTE, storePDE "\<lambda>s. P (ksDomScheduleIdx s)"
lemma storePDPTE_ct_not_inQ[wp]:
"\<lbrace>ct_not_inQ\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>_. ct_not_inQ\<rbrace>"
apply (rule ct_not_inQ_lift [OF storePDPTE_nosch])
apply (simp add: storePDPTE_def)
apply (rule hoare_weaken_pre)
apply (wps setObject_PDPTE_ct)
apply (rule obj_at_setObject2)
apply (clarsimp simp: updateObject_default_def in_monad)+
done
lemma setObject_pdpte_cur_domain[wp]:
"\<lbrace>\<lambda>s. P (ksCurDomain s)\<rbrace> setObject t (v::pdpte) \<lbrace>\<lambda>rv s. P (ksCurDomain s)\<rbrace>"
apply (simp add: setObject_def split_def)
apply (wp updateObject_default_inv | simp)+
done
lemma setObject_pdpte_ksDomSchedule[wp]:
"\<lbrace>\<lambda>s. P (ksDomSchedule s)\<rbrace> setObject t (v::pdpte) \<lbrace>\<lambda>rv s. P (ksDomSchedule s)\<rbrace>"
apply (simp add: setObject_def split_def)
apply (wp updateObject_default_inv | simp)+
done
lemma storePDPTE_cur_domain[wp]:
"\<lbrace>\<lambda>s. P (ksCurDomain s)\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>rv s. P (ksCurDomain s)\<rbrace>"
by (simp add: storePDPTE_def) wp
lemma storePDPTE_ksDomSchedule[wp]:
"\<lbrace>\<lambda>s. P (ksDomSchedule s)\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>rv s. P (ksDomSchedule s)\<rbrace>"
by (simp add: storePDPTE_def) wp
lemma storePDPTE_tcb_obj_at'[wp]:
"\<lbrace>obj_at' (P::tcb \<Rightarrow> bool) t\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>_. obj_at' P t\<rbrace>"
apply (simp add: storePDPTE_def)
apply (rule obj_at_setObject2)
apply (clarsimp simp add: updateObject_default_def in_monad)
done
lemma storePDPTE_tcb_in_cur_domain'[wp]:
"\<lbrace>tcb_in_cur_domain' t\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>_. tcb_in_cur_domain' t\<rbrace>"
by (wp tcb_in_cur_domain'_lift)
lemma storePDPTE_ct_idle_or_in_cur_domain'[wp]:
"\<lbrace>ct_idle_or_in_cur_domain'\<rbrace> storePDPTE p pdpte \<lbrace>\<lambda>_. ct_idle_or_in_cur_domain'\<rbrace>"
by (wp ct_idle_or_in_cur_domain'_lift hoare_vcg_disj_lift)
lemma setObject_pdpte_ksDomScheduleIdx [wp]:
"\<lbrace>\<lambda>s. P (ksDomScheduleIdx s)\<rbrace> setObject p (pdpte::pdpte) \<lbrace>\<lambda>_. \<lambda>s. P (ksDomScheduleIdx s)\<rbrace>"
by (wp updateObject_default_inv|simp add:setObject_def | wpc)+
lemma storePML4E_ct_not_inQ[wp]:
"\<lbrace>ct_not_inQ\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>_. ct_not_inQ\<rbrace>"
apply (rule ct_not_inQ_lift [OF storePML4E_nosch])
apply (simp add: storePML4E_def)
apply (rule hoare_weaken_pre)
apply (wps setObject_PML4E_ct)
apply (rule obj_at_setObject2)
apply (clarsimp simp: updateObject_default_def in_monad)+
done
lemma setObject_pml4e_cur_domain[wp]:
"\<lbrace>\<lambda>s. P (ksCurDomain s)\<rbrace> setObject t (v::pml4e) \<lbrace>\<lambda>rv s. P (ksCurDomain s)\<rbrace>"
apply (simp add: setObject_def split_def)
apply (wp updateObject_default_inv | simp)+
done
lemma setObject_pml4e_ksDomSchedule[wp]:
"\<lbrace>\<lambda>s. P (ksDomSchedule s)\<rbrace> setObject t (v::pml4e) \<lbrace>\<lambda>rv s. P (ksDomSchedule s)\<rbrace>"
apply (simp add: setObject_def split_def)
apply (wp updateObject_default_inv | simp)+
done
lemma storePML4E_cur_domain[wp]:
"\<lbrace>\<lambda>s. P (ksCurDomain s)\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>rv s. P (ksCurDomain s)\<rbrace>"
by (simp add: storePML4E_def) wp
lemma storePML4E_ksDomSchedule[wp]:
"\<lbrace>\<lambda>s. P (ksDomSchedule s)\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>rv s. P (ksDomSchedule s)\<rbrace>"
by (simp add: storePML4E_def) wp
lemma storePML4E_tcb_obj_at'[wp]:
"\<lbrace>obj_at' (P::tcb \<Rightarrow> bool) t\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>_. obj_at' P t\<rbrace>"
apply (simp add: storePML4E_def)
apply (rule obj_at_setObject2)
apply (clarsimp simp add: updateObject_default_def in_monad)
done
lemma storePML4E_tcb_in_cur_domain'[wp]:
"\<lbrace>tcb_in_cur_domain' t\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>_. tcb_in_cur_domain' t\<rbrace>"
by (wp tcb_in_cur_domain'_lift)
lemma storePML4E_ct_idle_or_in_cur_domain'[wp]:
"\<lbrace>ct_idle_or_in_cur_domain'\<rbrace> storePML4E p pml4e \<lbrace>\<lambda>_. ct_idle_or_in_cur_domain'\<rbrace>"
by (wp ct_idle_or_in_cur_domain'_lift hoare_vcg_disj_lift)
lemma setObject_pml4e_ksDomScheduleIdx [wp]:
"\<lbrace>\<lambda>s. P (ksDomScheduleIdx s)\<rbrace> setObject p (pml4e::pml4e) \<lbrace>\<lambda>_. \<lambda>s. P (ksDomScheduleIdx s)\<rbrace>"
by (wp updateObject_default_inv|simp add:setObject_def | wpc)+
crunch ksDomScheduleIdx[wp]: storePTE, storePDE, storePDPTE, storePML4E "\<lambda>s. P (ksDomScheduleIdx s)"
(ignore: getObject setObject)
crunch gsMaxObjectSize[wp]: storePTE, storePDE "\<lambda>s. P (gsMaxObjectSize s)"
crunch gsMaxObjectSize[wp]: storePTE, storePDE, storePDPTE, storePML4E "\<lambda>s. P (gsMaxObjectSize s)"
(ignore: getObject setObject wp: setObject_ksPSpace_only updateObject_default_inv)
crunch gsUntypedZeroRanges[wp]: storePTE, storePDE "\<lambda>s. P (gsUntypedZeroRanges s)"
crunch gsUntypedZeroRanges[wp]: storePTE, storePDE, storePDPTE, storePML4E "\<lambda>s. P (gsUntypedZeroRanges s)"
(ignore: getObject setObject wp: setObject_ksPSpace_only updateObject_default_inv)
lemma storePDE_invs[wp]:
"\<lbrace>invs' and valid_pde' pde
and (\<lambda>s. valid_pde_mapping' (p && mask pdBits) pde)\<rbrace>
"\<lbrace>invs' and valid_pde' pde\<rbrace>
storePDE p pde
\<lbrace>\<lambda>_. invs'\<rbrace>"
apply (simp add: invs'_def valid_state'_def valid_pspace'_def)
@ -2672,13 +2764,6 @@ lemma setASIDPool_irq_states' [wp]:
apply assumption
done
lemma setObject_asidpool_mappings'[wp]:
"\<lbrace>valid_pde_mappings'\<rbrace> setObject p (ap::asidpool) \<lbrace>\<lambda>rv. valid_pde_mappings'\<rbrace>"
apply (wp valid_pde_mappings_lift')
apply (rule obj_at_setObject2)
apply (clarsimp dest!: updateObject_default_result)
apply assumption
done
lemma setASIDPool_vms'[wp]:
"\<lbrace>valid_machine_state'\<rbrace> setObject p (ap::asidpool) \<lbrace>\<lambda>_. valid_machine_state'\<rbrace>"
@ -2853,10 +2938,8 @@ lemma mapM_x_storePTE_invs:
done
lemma mapM_x_storePDE_invs:
"\<lbrace>invs' and valid_pde' pde
and K (\<forall>p \<in> set ps. valid_pde_mapping' (p && mask pdBits) pde)\<rbrace>
"\<lbrace>invs' and valid_pde' pde \<rbrace>
mapM_x (swp storePDE pde) ps \<lbrace>\<lambda>xa. invs'\<rbrace>"
apply (rule hoare_gen_asm)
apply (rule hoare_post_imp)
prefer 2
apply (rule mapM_x_wp[OF _ subset_refl])