theory Syscall_DR

lemma handle_invocation_corres:
  "dcorres (dc \<oplus> dc) \<top>
      (invs and ct_running and valid_pdpt_objs and valid_etcbs)
      (Syscall_D.handle_invocation call block)
      (Syscall_A.handle_invocation call block)" apply (simp add: Syscall_A.handle_invocation_def Syscall_D.handle_invocation_def liftE_bindE) apply (clarsimp simp:gets_the_def gets_def bind_assoc) apply (rule dcorres_absorb_get_l) apply (rule dcorres_absorb_get_r) apply (clarsimp, frule ct_running_not_idle_etc,simp+) apply (clarsimp simp: cdl_current_thread transform_current_thread_def not_idle_thread_def assert_opt_def) apply (simp add:get_message_info_def select_f_get_register bind_assoc liftM_def get_thread_def) apply (rule dcorres_gets_the) apply (clarsimp, frule(1) valid_etcbs_get_tcb_get_etcb) prefer 2 apply (clarsimp, frule(1) valid_etcbs_get_tcb_get_etcb) apply (clarsimp simp:opt_object_tcb transform_tcb_def)+ apply (rule dcorres_absorb_gets_the) apply (clarsimp simp:Syscall_D.syscall_def Syscall_A.syscall_def liftE_bindE handle_elseE_def) apply (rule corres_guard_imp) apply (rule_tac P' = "(=) s'a" and P=\<top> and Q' = "(=) s'a" and Q=\<top> and
                    rr = "\<lambda>(cap,slot,extra) (slot',cap',extra',buffer).
                              cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot'
                            \<and> extra = transform_cap_list extra'" in  corres_split_bind_case_sum) apply (rule_tac Q = "\<lambda>x. \<top>" and Q'="\<lambda>x. (=) s'a" in corres_initial_splitE) apply (clarsimp simp: transform_full_intent_def Let_def) apply (rule corres_guard_imp[OF dcorres_lookup_cap_and_slot[simplified]]) apply (clarsimp simp: word_bits_def not_idle_thread_def invs_def valid_state_def)+ apply (rule dcorres_symb_exec_r_evalMonad) apply wp apply (rule corres_guard_imp) apply (rule corres_splitEE) apply (rule dcorres_lookup_extra_caps; clarsimp simp:not_idle_thread_def) apply (rule dcorres_returnOk) apply simp apply (wp|clarsimp)+ apply (simp add:empty_when_fail_lookup_ipc_buffer weak_det_spec_lookup_ipc_buffer)+ apply (wp lookup_cap_and_slot_inv)+ apply (simp add:liftE_bindE) apply (rule corres_when,simp) apply (rule handle_fault_corres) apply (rule corres_split_bind_case_sum) apply (rule decode_invocation_corres') apply (simp add: split_def)+ apply (rule dcorres_when_r) apply (rule corres_dummy_return_r) apply (rule corres_guard_imp[OF corres_split[OF dcorres_reply_from_kernel]]) apply (simp add:when_def) apply (rule dcorres_set_intent_error) apply (wp rfk_invs reply_from_kernel_error | simp add:not_idle_thread_def)+ apply (rule dcorres_dummy_corrupt_ipc_buffer) apply (rule corres_split[OF dcorres_set_thread_state_Restart2]) apply (rule corres_splitEE[where r' = dc]) apply (rule perform_invocation_corres,simp) apply (simp add: whenE_def bind_assoc) apply (rule dcorres_reply_from_syscall) apply wp+ apply (simp add: not_idle_thread_def) apply (strengthen invs_valid_idle) apply wp+ apply (simp add:conj_comms not_idle_thread_def split_def) apply (wp sts_Restart_invs set_thread_state_ct_active)+ apply (simp add:conj_comms split_def msg_from_syscall_error_simp) apply (wp | simp add:split_def)+ apply (rule_tac Q'="\<lambda>r s. s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation r s \<and>
                                invocation_duplicates_valid r s"
                      in hoare_post_imp_R) apply (simp add:split_def liftE_bindE[symmetric]) apply (wp decode_inv_wf) apply (clarsimp simp:ct_in_state_def st_tcb_at_def obj_at_def not_idle_thread_def)+ apply (rule wp_post_tautE) apply clarsimp apply wp apply (simp add:split_def liftE_bindE[symmetric]) apply (wp | simp add: split_def liftE_bindE[symmetric])+ apply (rule_tac Q="\<lambda>r s. s = s'a \<and>
                               evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some r \<and>
                               cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and>
                               cte_wp_at ((=) (fst x)) (snd x) s \<and>
                               real_cte_at (snd x) s \<and>
                               s \<turnstile> fst x \<and>
                               ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and>
                               (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and>
                               (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to \<top> r s)"
                      in hoare_strengthen_post) apply (wp evalMonad_wp) apply (simp add: empty_when_fail_lookup_ipc_buffer  weak_det_spec_lookup_ipc_buffer)+ apply wp apply (clarsimp simp: invs_def valid_state_def valid_pspace_def valid_idle_def st_tcb_ex_cap
                            ct_in_state_def pred_tcb_at_def not_idle_thread_def obj_at_def
                     dest!: get_tcb_SomeD) apply (wp)+ apply (clarsimp simp:invs_def valid_state_def not_idle_thread_def pred_tcb_at_def obj_at_def) apply simp_all done

(* Proof state trace *)
proof (prove)
goal (1 subgoal):
 1. dcorres (dc \<oplus> dc) (\<lambda>_. True) (invs and ct_running and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs) (Syscall_D.handle_invocation call block) (Syscall_A.handle_invocation call block) proof (prove)
goal (1 subgoal):
 1. dcorres (dc \<oplus> dc) (\<lambda>_. True) (invs and ct_running and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs) (do thread_ptr <- gets_the cdl_current_thread;
thread <- get_thread thread_ptr;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot thread_ptr (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps thread_ptr (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer thread_ptr True;
when call (mark_tcb_intent_error thread_ptr True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap thread_ptr;
whenE restart (liftE (do y <- corrupt_ipc_buffer thread_ptr True;
y <- when call (mark_tcb_intent_error thread_ptr False);
KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do thread <- gets cur_thread;
info <- get_message_info thread;
ptr <- liftM to_bl (as_user thread (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot thread ptr);
do buffer <- lookup_ipc_buffer False thread;
doE extracaps <- Ipc_A.lookup_extra_caps thread buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault thread fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs thread buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel thread (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state thread Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state thread >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel thread (0, reply));
set_thread_state thread Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. dcorres (dc \<oplus> dc) (\<lambda>_. True) (invs and ct_running and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs) (do x <- get;
thread_ptr <- assert_opt (cdl_current_thread x);
thread <- get_thread thread_ptr;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot thread_ptr (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps thread_ptr (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer thread_ptr True;
when call (mark_tcb_intent_error thread_ptr True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap thread_ptr;
whenE restart (liftE (do y <- corrupt_ipc_buffer thread_ptr True;
y <- when call (mark_tcb_intent_error thread_ptr False);
KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do s <- get;
info <- get_message_info (cur_thread s);
ptr <- liftM to_bl (as_user (cur_thread s) (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot (cur_thread s) ptr);
do buffer <- lookup_ipc_buffer False (cur_thread s);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s) buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s) buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s) (0, reply));
set_thread_state (cur_thread s) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s'. \<lbrakk>True; (invs and ct_running and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs) s'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s')) ((=) s') (do thread_ptr <- assert_opt (cdl_current_thread (transform s'));
thread <- get_thread thread_ptr;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot thread_ptr (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps thread_ptr (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer thread_ptr True;
when call (mark_tcb_intent_error thread_ptr True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap thread_ptr;
whenE restart (liftE (do y <- corrupt_ipc_buffer thread_ptr True;
y <- when call (mark_tcb_intent_error thread_ptr False);
KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do s <- get;
info <- get_message_info (cur_thread s);
ptr <- liftM to_bl (as_user (cur_thread s) (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot (cur_thread s) ptr);
do buffer <- lookup_ipc_buffer False (cur_thread s);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s) buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s) buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s) (0, reply));
set_thread_state (cur_thread s) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s' s'a. \<lbrakk>True; (invs and ct_running and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs) s'; transform s' = transform s'a; s' = s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (do thread_ptr <- assert_opt (cdl_current_thread (transform s'));
thread <- get_thread thread_ptr;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot thread_ptr (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps thread_ptr (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer thread_ptr True;
when call (mark_tcb_intent_error thread_ptr True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap thread_ptr;
whenE restart (liftE (do y <- corrupt_ipc_buffer thread_ptr True;
y <- when call (mark_tcb_intent_error thread_ptr False);
KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do info <- get_message_info (cur_thread s'a);
ptr <- liftM to_bl (as_user (cur_thread s'a) (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) ptr);
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s'a) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s'a) buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; not_idle_thread (cur_thread s'a) s'a \<and> thread_is_running (cur_thread s'a) s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (do thread_ptr <- assert_opt (cdl_current_thread (transform s'a));
thread <- get_thread thread_ptr;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot thread_ptr (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps thread_ptr (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer thread_ptr True;
when call (mark_tcb_intent_error thread_ptr True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap thread_ptr;
whenE restart (liftE (do y <- corrupt_ipc_buffer thread_ptr True;
y <- when call (mark_tcb_intent_error thread_ptr False);
KHeap_D.set_cap (thread_ptr, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do info <- get_message_info (cur_thread s'a);
ptr <- liftM to_bl (as_user (cur_thread s'a) (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) ptr);
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s'a) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s'a) buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (do thread <- get_thread (cur_thread s'a);
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do info <- get_message_info (cur_thread s'a);
ptr <- liftM to_bl (as_user (cur_thread s'a) (getRegister cap_register));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (of_bl ptr) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) ptr);
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer info;
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s'a) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s'a) buffer info;
Decode_A.decode_invocation (mi_label info) args ptr slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (do x <- KHeap_D.get_object (cur_thread s'a);
thread <- case x of Tcb x \<Rightarrow> return x | _ \<Rightarrow> fail;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do tcb <- gets_the (get_tcb (cur_thread s'a));
tcba <- gets_the (get_tcb (cur_thread s'a));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcba) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch tcba) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch tcb) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s'a) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch tcb) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch tcb) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcba) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (2 subgoals):
 1. \<And>s'a s s' obj obj'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; s = transform s'; transform s'a = s; s'a = s'; get_tcb (cur_thread s'a) s' = Some obj'; cdl_objects s (cur_thread s'a) = Some obj\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) s) ((=) s') (do thread <- case obj of Tcb x \<Rightarrow> return x | _ \<Rightarrow> fail;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do tcb <- gets_the (get_tcb (cur_thread s'a));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcb) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s'a) fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od)
 2. \<And>s'a s s'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; s = transform s'; transform s'a = s; s'a = s'; get_tcb (cur_thread s'a) s' \<noteq> None\<rbrakk> \<Longrightarrow> cdl_objects s (cur_thread s'a) \<noteq> None proof (prove)
goal (2 subgoals):
 1. \<And>s' obj obj'. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some obj'; cdl_objects (transform s') (cur_thread s') = Some obj; \<exists>etcb. get_etcb (cur_thread s') s' = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s')) ((=) s') (do thread <- case obj of Tcb x \<Rightarrow> return x | _ \<Rightarrow> fail;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s') (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s') (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s') True;
when call (mark_tcb_intent_error (cur_thread s') True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s');
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s') True;
y <- when call (mark_tcb_intent_error (cur_thread s') False);
KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do tcb <- gets_the (get_tcb (cur_thread s'));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcb) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s') (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s');
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s') fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s') (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s') Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s') >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s') (0, reply));
set_thread_state (cur_thread s') Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od)
 2. \<And>s'a s s'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; s = transform s'; transform s'a = s; s'a = s'; get_tcb (cur_thread s'a) s' \<noteq> None\<rbrakk> \<Longrightarrow> cdl_objects s (cur_thread s'a) \<noteq> None proof (prove)
goal (2 subgoals):
 1. \<And>s'a s s'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; s = transform s'; transform s'a = s; s'a = s'; get_tcb (cur_thread s'a) s' \<noteq> None\<rbrakk> \<Longrightarrow> cdl_objects s (cur_thread s'a) \<noteq> None
 2. \<And>s' obj obj'. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some obj'; cdl_objects (transform s') (cur_thread s') = Some obj; \<exists>etcb. get_etcb (cur_thread s') s' = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s')) ((=) s') (do thread <- case obj of Tcb x \<Rightarrow> return x | _ \<Rightarrow> fail;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s') (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s') (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s') True;
when call (mark_tcb_intent_error (cur_thread s') True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s');
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s') True;
y <- when call (mark_tcb_intent_error (cur_thread s') False);
KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do tcb <- gets_the (get_tcb (cur_thread s'));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcb) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s') (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s');
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s') fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s') (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s') Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s') >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s') (0, reply));
set_thread_state (cur_thread s') Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (2 subgoals):
 1. \<And>s' y. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some y; \<exists>etcb. get_etcb (cur_thread s') s' = Some etcb\<rbrakk> \<Longrightarrow> \<exists>y. cdl_objects (transform s') (cur_thread s') = Some y
 2. \<And>s' obj obj'. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some obj'; cdl_objects (transform s') (cur_thread s') = Some obj; \<exists>etcb. get_etcb (cur_thread s') s' = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s')) ((=) s') (do thread <- case obj of Tcb x \<Rightarrow> return x | _ \<Rightarrow> fail;
Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s') (cdl_intent_cap (cdl_tcb_intent thread));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s') (cdl_intent_extras (cdl_tcb_intent thread));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (cdl_tcb_intent thread) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s') True;
when call (mark_tcb_intent_error (cur_thread s') True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s');
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s') True;
y <- when call (mark_tcb_intent_error (cur_thread s') False);
KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RunningCap
od))
od
odE
od)
od) (do tcb <- gets_the (get_tcb (cur_thread s'));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcb) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s') (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s');
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s') fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s') (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s') Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s') >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s') (0, reply));
set_thread_state (cur_thread s') Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s' obj' etcb. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some obj'; get_etcb (cur_thread s') s' = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s')) ((=) s') (Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s') (cdl_intent_cap (transform_full_intent (machine_state s') (cur_thread s') obj'));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s') (cdl_intent_extras (transform_full_intent (machine_state s') (cur_thread s') obj'));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (transform_full_intent (machine_state s') (cur_thread s') obj') of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s') True;
when call (mark_tcb_intent_error (cur_thread s') True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s');
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s') True;
y <- when call (mark_tcb_intent_error (cur_thread s') False);
KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RunningCap
od))
od
odE
od)) (do tcb <- gets_the (get_tcb (cur_thread s'));
Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch tcb) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s') (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s');
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s') fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch tcb) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s') (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s') Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s') >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s') (0, reply));
set_thread_state (cur_thread s') Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
od) proof (prove)
goal (1 subgoal):
 1. \<And>s' obj' etcb s'a obj'a. \<lbrakk>invs s'; ct_running s'; \<forall>x\<in>ran (kheap s'). obj_valid_pdpt x; valid_etcbs s'; cur_thread s' \<noteq> idle_thread s'; thread_is_running (cur_thread s') s'; get_tcb (cur_thread s') s' = Some obj'; get_etcb (cur_thread s') s' = Some etcb; s' = s'a; get_tcb (cur_thread s') s'a = Some obj'a; transform s' = transform s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (Syscall_D.syscall (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s') (cdl_intent_cap (transform_full_intent (machine_state s') (cur_thread s') obj'));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s') (cdl_intent_extras (transform_full_intent (machine_state s') (cur_thread s') obj'));
returnOk (cap, cap_ref, extra_caps)
odE) (when block Endpoint_D.handle_fault) (\<lambda>(cap, cap_ref, extra_caps). case cdl_intent_op (transform_full_intent (machine_state s') (cur_thread s') obj') of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (do y <- corrupt_ipc_buffer (cur_thread s') True;
when call (mark_tcb_intent_error (cur_thread s') True)
od) (\<lambda>inv. do y <- KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block inv;
do restart <- has_restart_cap (cur_thread s');
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s') True;
y <- when call (mark_tcb_intent_error (cur_thread s') False);
KHeap_D.set_cap (cur_thread s', tcb_pending_op_slot) RunningCap
od))
od
odE
od)) (Syscall_A.syscall (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s') (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s');
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE) (\<lambda>fault. when block (Ipc_A.handle_fault (cur_thread s') fault)) (\<lambda>(slot, cap, extracaps, buffer). do args <- get_mrs (cur_thread s') buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj') msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) (\<lambda>err. when call (reply_from_kernel (cur_thread s') (msg_from_syscall_error err))) (\<lambda>oper. do y <- set_thread_state (cur_thread s') Restart;
doE reply <- Syscall_A.perform_invocation block call oper;
liftE (get_thread_state (cur_thread s') >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s') (0, reply));
set_thread_state (cur_thread s') Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)) proof (prove)
goal (1 subgoal):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) ((=) (transform s'a)) ((=) s'a) (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE >>= case_sum (\<lambda>e. liftE (when block Endpoint_D.handle_fault)) (\<lambda>v'. (case v' of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od))) (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE >>= case_sum (\<lambda>f. liftE (when block (Ipc_A.handle_fault (cur_thread s'a) f))) (\<lambda>a. (case a of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))) proof (prove)
goal (3 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?Q45 etcb s'a obj'a) (?Q'45 etcb s'a obj'a) (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE >>= case_sum (\<lambda>e. liftE (when block Endpoint_D.handle_fault)) (\<lambda>v'. (case v' of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od))) (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE >>= case_sum (\<lambda>f. liftE (when block (Ipc_A.handle_fault (cur_thread s'a) f))) (\<lambda>a. (case a of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)))
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ?Q45 etcb s'a obj'a s
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ?Q'45 etcb s'a obj'a s proof (prove)
goal (7 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres (?lr49 etcb s'a obj'a \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra')) (\<lambda>_. True) ((=) s'a) (doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE) (doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE)
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; ?lr49 etcb s'a obj'a rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (10 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres (?lr49 etcb s'a obj'a \<oplus> ?r'51 etcb s'a obj'a) (\<lambda>_. True) ((=) s'a) (CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a))) (cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))))
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; ?r'51 etcb s'a obj'a rv rv'\<rbrakk> \<Longrightarrow> dcorres (?lr49 etcb s'a obj'a \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra')) (\<lambda>_. True) ((=) s'a) (case rv of (cap, cap_ref) \<Rightarrow> doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE) (case rv' of (cap, slot) \<Rightarrow> do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od)
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; ?lr49 etcb s'a obj'a rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (10 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres (?lr49 etcb s'a obj'a \<oplus> ?r'51 etcb s'a obj'a) (\<lambda>_. True) ((=) s'a) (CSpace_D.lookup_cap_and_slot (cur_thread s'a) (arch_tcb_context_get (tcb_arch obj'a) cap_register)) (cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))))
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; ?r'51 etcb s'a obj'a rv rv'\<rbrakk> \<Longrightarrow> dcorres (?lr49 etcb s'a obj'a \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra')) (\<lambda>_. True) ((=) s'a) (case rv of (cap, cap_ref) \<Rightarrow> doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE) (case rv' of (cap, slot) \<Rightarrow> do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od)
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; ?lr49 etcb s'a obj'a rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (13 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> arch_tcb_context_get (tcb_arch obj'a) cap_register = of_bl (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> length (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) = word_bits
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; True\<rbrakk> \<Longrightarrow> True
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (not_idle_thread (cur_thread s'a) and valid_global_refs and valid_objs and valid_irq_node and valid_idle and valid_etcbs) s
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst rv') \<and> snd rv = transform_cslot_ptr (snd rv')\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra')) (\<lambda>_. True) ((=) s'a) (case rv of (cap, cap_ref) \<Rightarrow> doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE) (case rv' of (cap, slot) \<Rightarrow> do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od)
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 9. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
A total of 13 subgoals... proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (\<lambda>_. True) ((=) s'a) (doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)
odE) (do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk ((ac, ba), ab, extracaps, buffer)
odE
od)
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (12 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba sa. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> \<lbrace>(=) sa\<rbrace> lookup_ipc_buffer False (cur_thread s'a) \<lbrace>\<lambda>r. (=) sa\<rbrace>
 2. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (\<lambda>_. True) ((=) s'a) (doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)
odE) (doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk ((ac, ba), ab, extracaps, rv)
odE)
 3. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 4. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
A total of 12 subgoals... proof (prove)
goal (11 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (\<lambda>_. True) ((=) s'a) (doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)
odE) (doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk ((ac, ba), ab, extracaps, rv)
odE)
 2. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 3. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
A total of 11 subgoals... proof (prove)
goal (13 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (?Q105 etcb s'a obj'a aa b ab ac ba rv) (?Q'105 etcb s'a obj'a aa b ab ac ba rv) (doE extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)
odE) (doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk ((ac, ba), ab, extracaps, rv)
odE)
 2. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; True\<rbrakk> \<Longrightarrow> ?Q105 etcb s'a obj'a aa b ab ac ba rv s
 3. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; s'a = s\<rbrakk> \<Longrightarrow> ?Q'105 etcb s'a obj'a aa b ab ac ba rv s
 4. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 5. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 9. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
A total of 13 subgoals... proof (prove)
goal (16 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> ?r'109 etcb s'a obj'a aa b ab ac ba rv) (?P109 etcb s'a obj'a aa b ab ac ba rv) (?P'109 etcb s'a obj'a aa b ab ac ba rv) (Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a))) (Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)))
 2. \<And>etcb s'a obj'a aa b ab ac ba rv extra_caps extracaps. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; ?r'109 etcb s'a obj'a aa b ab ac ba rv extra_caps extracaps\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (?R109 etcb s'a obj'a aa b ab ac ba rv extra_caps) (?R'109 etcb s'a obj'a aa b ab ac ba rv extracaps) (returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)) (returnOk ((ac, ba), ab, extracaps, rv))
 3. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>?R109 etcb s'a obj'a aa b ab ac ba rv\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)) \<lbrace>?R'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 5. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; True\<rbrakk> \<Longrightarrow> (?P109 etcb s'a obj'a aa b ab ac ba rv and ?Q109 etcb s'a obj'a aa b ab ac ba rv) s
 6. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; s'a = s\<rbrakk> \<Longrightarrow> (?P'109 etcb s'a obj'a aa b ab ac ba rv and ?Q'109 etcb s'a obj'a aa b ab ac ba rv) s
 7. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 8. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
A total of 16 subgoals... proof (prove)
goal (15 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv extra_caps extracaps. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; extra_caps = transform_cap_list extracaps\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> (\<lambda>(cap, slot, extra) (slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra'))) (?R109 etcb s'a obj'a aa b ab ac ba rv extra_caps) (?R'109 etcb s'a obj'a aa b ab ac ba rv extracaps) (returnOk (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps)) (returnOk ((ac, ba), ab, extracaps, rv))
 2. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>?R109 etcb s'a obj'a aa b ab ac ba rv\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)) \<lbrace>?R'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q109 etcb s'a obj'a aa b ab ac ba rv) s
 5. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and ?Q'109 etcb s'a obj'a aa b ab ac ba rv) s
 6. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 7. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 10. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
A total of 15 subgoals... proof (prove)
goal (15 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv extra_caps extracaps. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; extra_caps = transform_cap_list extracaps\<rbrakk> \<Longrightarrow> (case (transform_cap ab, transform_cslot_ptr (ac, ba), extra_caps) of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra')) ((ac, ba), ab, extracaps, rv)
 2. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>extra_caps _. True\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)) \<lbrace>\<lambda>extracaps _. True\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q109 etcb s'a obj'a aa b ab ac ba rv) s
 5. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and ?Q'109 etcb s'a obj'a aa b ab ac ba rv) s
 6. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 7. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 10. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
A total of 15 subgoals... proof (prove)
goal (14 subgoals):
 1. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>extra_caps _. True\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 2. \<And>etcb s'a obj'a aa b ab ac ba rv. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv\<rbrakk> \<Longrightarrow> \<lbrace>?Q'109 etcb s'a obj'a aa b ab ac ba rv\<rbrace> Ipc_A.lookup_extra_caps (cur_thread s'a) rv (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)) \<lbrace>\<lambda>extracaps _. True\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q109 etcb s'a obj'a aa b ab ac ba rv) s
 4. \<And>etcb s'a obj'a aa b ab ac ba rv s. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a; evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and ?Q'109 etcb s'a obj'a aa b ab ac ba rv) s
 5. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 6. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 9. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 10. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
A total of 14 subgoals... proof (prove)
goal (10 subgoals):
 1. \<And>etcb s'a obj'a aa b ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 2. \<And>etcb s'a obj'a aa b ab ac ba. \<lbrakk>ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; valid_pspace s'a; (aa, b) = transform_cslot_ptr (ac, ba); valid_mdb s'a; valid_ioc s'a; valid_idle s'a; only_idle s'a; if_unsafe_then_cap s'a; valid_reply_caps s'a; valid_reply_masters s'a; valid_global_refs s'a; valid_arch_state s'a; valid_irq_node s'a; valid_irq_handlers s'a; valid_irq_states s'a; valid_machine_state s'a; valid_vspace_objs s'a; valid_arch_caps s'a; valid_global_objs s'a; valid_kernel_mappings s'a; equal_kernel_mappings s'a; valid_asid_map s'a; valid_global_vspace_mappings s'a; pspace_in_kernel_window s'a; cap_refs_in_kernel_window s'a; pspace_respects_device_region s'a; cap_refs_respects_device_region s'a; cur_tcb s'a\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (8 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a)) \<lbrace>\<lambda>x _. True\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x. (=) s'a\<rbrace>, \<lbrace>\<lambda>r s. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; dc rv rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (liftE (when block Endpoint_D.handle_fault)) (liftE (when block (Ipc_A.handle_fault (cur_thread s'a) rv')))
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres dc (?R49 etcb s'a obj'a rv) (?R'49 etcb s'a obj'a rv') (when block Endpoint_D.handle_fault) (when block (Ipc_A.handle_fault (cur_thread s'a) rv'))
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>?R49 etcb s'a obj'a\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>?R'49 etcb s'a obj'a\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> dcorres dc (?P173 etcb s'a obj'a rv) (?P'175 etcb s'a obj'a rv') Endpoint_D.handle_fault (Ipc_A.handle_fault (cur_thread s'a) rv')
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> ?P173 etcb s'a obj'a rv x\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> ?P'175 etcb s'a obj'a rv' x\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (5 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S49 etcb s'a obj'a rv) (?S'49 etcb s'a obj'a rv') ((case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) >>= case_sum (\<lambda>e. liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (\<lambda>v'. do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block v';
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od)) ((case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od) >>= case_sum (\<lambda>e. liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error e)))) (\<lambda>b. do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call b;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od))
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>?S49 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>?S'49 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> dcorres (?lr183 etcb s'a obj'a rv rv' \<oplus> ?rr183 etcb s'a obj'a rv rv') (?P184 etcb s'a obj'a rv) (?P'186 etcb s'a obj'a rv') (case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x) (case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od)
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; ?lr183 etcb s'a obj'a rv rv' rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R183 etcb s'a obj'a rv rv' rva) (?R'183 etcb s'a obj'a rv rv' rv'a) (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a))))
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; ?rr183 etcb s'a obj'a rv rv' rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R183 etcb s'a obj'a rv rv'\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R'183 etcb s'a obj'a rv rv'\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. ?P184 etcb s'a obj'a rv and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. ?P'186 etcb s'a obj'a rv' and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (12 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> get_tcb (cur_thread s'a) s'a = Some obj'a
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> ct_running s'a
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> invs s'a
 5. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; dc rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R183 etcb s'a obj'a rv rv' rva) (?R'183 etcb s'a obj'a rv rv' rv'a) (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od)) (liftE (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a))))
 6. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R183 etcb s'a obj'a rv rv'\<rbrace>
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R'183 etcb s'a obj'a rv rv'\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
A total of 12 subgoals... proof (prove)
goal (8 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv')))\<rbrakk> \<Longrightarrow> dcorres dc (?R183 etcb s'a obj'a rv rv' rva) (?R'183 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (when call (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a)))
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R183 etcb s'a obj'a rv rv'\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>?R'183 etcb s'a obj'a rv rv'\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?P202 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a))
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (return ())
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> ?P202 etcb s'a obj'a rv rv' rv'a s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?P202 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a) >>= return)
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (return ())
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> ?P202 etcb s'a obj'a rv rv' rv'a s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (13 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; dc y x\<rbrakk> \<Longrightarrow> dcorres dc (?R210 etcb s'a obj'a rv rv' rva rv'a y) (?R'210 etcb s'a obj'a rv rv' rva rv'a x) (when call (mark_tcb_intent_error (cur_thread s'a) True)) (return x)
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> corrupt_ipc_buffer (cur_thread s'a) True \<lbrace>?R210 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q'210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a) \<lbrace>?R'210 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q210 etcb s'a obj'a rv rv' rva rv'a) s
 5. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; ?P202 etcb s'a obj'a rv rv' rv'a s\<rbrakk> \<Longrightarrow> (invs and tcb_at (cur_thread s'a) and not_idle_thread (cur_thread s'a) and valid_etcbs and ?Q'210 etcb s'a obj'a rv rv' rva rv'a) s
 6. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (return ())
 7. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 9. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> ?P202 etcb s'a obj'a rv rv' rv'a s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
A total of 13 subgoals... proof (prove)
goal (13 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; Ball (ran (kheap s'a)) obj_valid_pdpt; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> dcorres dc (?R210 etcb s'a obj'a rv rv' rva rv'a ()) (?R'210 etcb s'a obj'a rv rv' rva rv'a ()) (mark_tcb_intent_error (cur_thread s'a) True) (return ())
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> corrupt_ipc_buffer (cur_thread s'a) True \<lbrace>?R210 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q'210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a) \<lbrace>?R'210 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q210 etcb s'a obj'a rv rv' rva rv'a) s
 5. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; ?P202 etcb s'a obj'a rv rv' rv'a s\<rbrakk> \<Longrightarrow> (invs and tcb_at (cur_thread s'a) and not_idle_thread (cur_thread s'a) and valid_etcbs and ?Q'210 etcb s'a obj'a rv rv' rva rv'a) s
 6. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (return ())
 7. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 9. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> ?P202 etcb s'a obj'a rv rv' rv'a s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
A total of 13 subgoals... proof (prove)
goal (12 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> corrupt_ipc_buffer (cur_thread s'a) True \<lbrace>\<lambda>a b. True\<rbrace>
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q'210 etcb s'a obj'a rv rv' rva rv'a\<rbrace> reply_from_kernel (cur_thread s'a) (msg_from_syscall_error rv'a) \<lbrace>\<lambda>a. invs and valid_etcbs and (\<lambda>s. \<exists>tcb. guess_error (mi_label (get_tcb_message_info tcb)) = True \<and> ko_at (TCB tcb) (cur_thread s'a) s) and not_idle_thread (cur_thread s'a)\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; True\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and ?Q210 etcb s'a obj'a rv rv' rva rv'a) s
 4. \<And>etcb s'a obj'a rv rv' rva rv'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call; ?P202 etcb s'a obj'a rv rv' rv'a s\<rbrakk> \<Longrightarrow> (invs and tcb_at (cur_thread s'a) and not_idle_thread (cur_thread s'a) and valid_etcbs and ?Q'210 etcb s'a obj'a rv rv' rva rv'a) s
 5. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
when call (mark_tcb_intent_error (cur_thread s'a) True)
od) (return ())
 6. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> ?P202 etcb s'a obj'a rv rv' rv'a s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
A total of 12 subgoals... proof (prove)
goal (8 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); \<not> call\<rbrakk> \<Longrightarrow> dcorres dc (\<lambda>_. True) (?Q204 etcb s'a obj'a rv rv' rv'a) (corrupt_ipc_buffer (cur_thread s'a) True) (return ())
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> ?Q204 etcb s'a obj'a rv rv' rv'a s)\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (7 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?S183 etcb s'a obj'a rv rv' rva) (?S'183 etcb s'a obj'a rv rv' rv'a) (do y <- KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap;
doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE
od) (do y <- set_thread_state (cur_thread s'a) Restart;
doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE
od)
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>?S183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>?S'183 etcb s'a obj'a rv rv'\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R236 etcb s'a obj'a rv rv' rva rv'a y) (?R'236 etcb s'a obj'a rv rv' rva rv'a ya) (doE y <- Syscall_D.perform_invocation call block rva;
do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od
odE) (doE reply <- Syscall_A.perform_invocation block call rv'a;
liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ()))
odE)
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>?R236 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>?R'236 etcb s'a obj'a rv rv' rva rv'a\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (12 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?P245 etcb s'a obj'a rv rv' rva rv'a y) (?P'247 etcb s'a obj'a rv rv' rva rv'a ya) (Syscall_D.perform_invocation call block rva) (Syscall_A.perform_invocation block call rv'a)
 2. \<And>etcb s'a obj'a rv rv' rva rv'a y ya yb reply. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya; dc yb reply\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R244 etcb s'a obj'a rv rv' rva rv'a y ya yb) (?R'244 etcb s'a obj'a rv rv' rva rv'a y ya reply) (do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od) (liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ())))
 3. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace> Syscall_D.perform_invocation call block rva \<lbrace>?R244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>?R'244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. ?P245 etcb s'a obj'a rv rv' rva rv'a y and ?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace>
 6. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. ?P'247 etcb s'a obj'a rv rv' rva rv'a ya and ?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace>
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 8. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 10. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
A total of 12 subgoals... proof (prove)
goal (11 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y ya yb reply. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya; dc yb reply\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R244 etcb s'a obj'a rv rv' rva rv'a y ya yb) (?R'244 etcb s'a obj'a rv rv' rva rv'a y ya reply) (do restart <- has_restart_cap (cur_thread s'a);
whenE restart (liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od))
od) (liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ())))
 2. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace> Syscall_D.perform_invocation call block rva \<lbrace>?R244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>?R'244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and ?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace>
 5. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and ?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace>
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
A total of 11 subgoals... proof (prove)
goal (11 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a reply. \<lbrakk>invs s'a; ct_running s'a; Ball (ran (kheap s'a)) obj_valid_pdpt; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra')) rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> dcorres (dc \<oplus> dc) (?R244 etcb s'a obj'a rv rv' rva rv'a () () ()) (?R'244 etcb s'a obj'a rv rv' rva rv'a () () reply) (do restart <- has_restart_cap (cur_thread s'a);
if restart then liftE (do y <- corrupt_ipc_buffer (cur_thread s'a) True;
y <- when call (mark_tcb_intent_error (cur_thread s'a) False);
KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RunningCap
od) else returnOk ()
od) (liftE (get_thread_state (cur_thread s'a) >>= case_thread_state (return ()) (return ()) (do y <- when call (reply_from_kernel (cur_thread s'a) (0, reply));
set_thread_state (cur_thread s'a) Running
od) (\<lambda>word receiver_payload_ext. return ()) (\<lambda>word sender_payload_ext. return ()) (return ()) (\<lambda>word. return ()) (return ())))
 2. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace> Syscall_D.perform_invocation call block rva \<lbrace>?R244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>?R'244 etcb s'a obj'a rv rv' rva rv'a y ya\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and ?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace>
 5. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and ?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace>
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 7. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 9. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
A total of 11 subgoals... proof (prove)
goal (10 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace> Syscall_D.perform_invocation call block rva \<lbrace>\<lambda>a b. True\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 2. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>\<lambda>a. invs and not_idle_thread (cur_thread s'a) and valid_idle and valid_etcbs\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and ?Q246 etcb s'a obj'a rv rv' rva rv'a y\<rbrace>
 4. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and ?Q'248 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 6. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 8. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 10. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a y ya. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a; dc y ya\<rbrakk> \<Longrightarrow> \<lbrace>?P'276 etcb s'a obj'a rv rv' rva rv'a ya\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>\<lambda>rv s. not_idle_thread (cur_thread s'a) s \<and> valid_idle s \<and> valid_etcbs s\<rbrace>, -
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and (\<lambda>s. True \<and> True)\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and (\<lambda>s. True \<and> (invs and ct_active and valid_invocation rv'a) s \<and> ?P'276 etcb s'a obj'a rv rv' rva rv'a ya s)\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; Ball (ran (kheap s'a)) obj_valid_pdpt; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra')) rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?P'276 etcb s'a obj'a rv rv' rva rv'a ()\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>\<lambda>rv s. cur_thread s'a \<noteq> idle_thread s \<and> valid_idle s \<and> valid_etcbs s\<rbrace>, -
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and (\<lambda>s. True \<and> True)\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and (\<lambda>s. True \<and> (invs and ct_active and valid_invocation rv'a) s \<and> ?P'276 etcb s'a obj'a rv rv' rva rv'a ya s)\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (9 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; Ball (ran (kheap s'a)) obj_valid_pdpt; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', ab). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> (case ab of (extra', buffer) \<Rightarrow> extra = transform_cap_list extra')) rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?P'276 etcb s'a obj'a rv rv' rva rv'a ()\<rbrace> Syscall_A.perform_invocation block call rv'a \<lbrace>\<lambda>r s. cur_thread s'a \<noteq> idle_thread s \<and> invs s \<and> valid_etcbs s\<rbrace>, -
 2. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q238 etcb s'a obj'a rv rv' rva\<rbrace> KHeap_D.set_cap (cur_thread s'a, tcb_pending_op_slot) RestartCap \<lbrace>\<lambda>y. (\<lambda>_. True) and (\<lambda>s. True \<and> True)\<rbrace>
 3. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>ya. invs and ct_active and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x) and valid_etcbs and invocation_duplicates_valid rv'a and valid_invocation rv'a and (\<lambda>s. True \<and> (invs and ct_active and valid_invocation rv'a) s \<and> ?P'276 etcb s'a obj'a rv rv' rva rv'a ya s)\<rbrace>
 4. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and ?Q238 etcb s'a obj'a rv rv' rva\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 5. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and ?Q'240 etcb s'a obj'a rv rv' rv'a\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 6. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 7. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 9. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (7 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?P'313 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>rv s. ct_active s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> invocation_duplicates_valid rv'a s \<and> valid_invocation rv'a s \<and> True \<and> (invs and ct_active and valid_invocation rv'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> (invs and ct_active and valid_invocation rv'a) s \<and> valid_etcbs s\<rbrace>
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and (\<lambda>a. True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and (\<lambda>s. (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> ?P'313 etcb s'a obj'a rv rv' rv'a s)\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (7 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva rv'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); cdl_invocation_relation rva rv'a\<rbrakk> \<Longrightarrow> \<lbrace>?P'313 etcb s'a obj'a rv rv' rv'a\<rbrace> set_thread_state (cur_thread s'a) Restart \<lbrace>\<lambda>rv s. invs s \<and> invocation_duplicates_valid rv'a s \<and> valid_invocation rv'a s \<and> Ball (ran (kheap s)) obj_valid_pdpt \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> ct_active s\<rbrace>
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q185 etcb s'a obj'a rv\<rbrace> case rv of (cap, cap_ref, extra_caps) \<Rightarrow> case cdl_intent_op (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a) of None \<Rightarrow> if ep_related_cap cap then Decode_D.decode_invocation cap cap_ref extra_caps undefined else throw | Some x \<Rightarrow> Decode_D.decode_invocation cap cap_ref extra_caps x \<lbrace>\<lambda>rva. (\<lambda>_. True) and (\<lambda>a. True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rva _. True\<rbrace>
 3. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?Q'187 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and (\<lambda>s. (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> ?P'313 etcb s'a obj'a rv rv' rv'a s)\<rbrace>, \<lbrace>\<lambda>rv'a s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv'a) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv'a) \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s)\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and ?Q185 etcb s'a obj'a rv\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and ?Q'187 etcb s'a obj'a rv'\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'; call\<rbrakk> \<Longrightarrow> \<lbrace>?Q377 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od -, \<lbrace>\<lambda>rv s. invs s \<and> tcb_at (cur_thread s'a) s \<and> cur_thread s'a \<noteq> idle_thread s \<and> valid_etcbs s \<and> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> tcb_at (cur_thread s'a) s \<and> fst (msg_from_syscall_error rv) \<le> mask 19 \<and> 0 < fst (msg_from_syscall_error rv) \<and> cur_thread s'a \<noteq> idle_thread s\<rbrace>
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?P'374 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and (\<lambda>s. (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> invocation_duplicates_valid rv'a s \<and> valid_invocation rv'a s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a)\<rbrace>, \<lbrace>\<lambda>rv s. \<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> ?Q377 etcb s'a obj'a rv' s) \<and> ?P'374 etcb s'a obj'a rv' s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); call\<rbrakk> \<Longrightarrow> \<lbrace>?Q377 etcb s'a obj'a rv'\<rbrace> do args <- get_mrs (cur_thread s'a) (snd (snd (snd rv'))) (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) (fst rv') (fst (snd rv')) (fst (snd (snd rv')))
od -, \<lbrace>\<lambda>rv s. invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s\<rbrace>
 2. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; (case rv of (cap, slot, extra) \<Rightarrow> \<lambda>(slot', cap', extra', buffer). cap = transform_cap cap' \<and> slot = transform_cslot_ptr slot' \<and> extra = transform_cap_list extra') rv'\<rbrakk> \<Longrightarrow> \<lbrace>?P'374 etcb s'a obj'a rv'\<rbrace> case rv' of (slot, cap, extracaps, buffer) \<Rightarrow> do args <- get_mrs (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) slot cap extracaps
od \<lbrace>\<lambda>rv'a. (\<lambda>a. valid_mdb a \<and> not_idle_thread (cur_thread s'a) a \<and> st_tcb_at idle (idle_thread a) a \<and> valid_etcbs a) and (\<lambda>s. (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> (st_tcb_at active (cur_thread s'a) and invs and ex_nonz_cap_to (cur_thread s'a)) s \<and> invocation_duplicates_valid rv'a s \<and> valid_invocation rv'a s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a)\<rbrace>, \<lbrace>\<lambda>rv s. \<not> call \<longrightarrow> (tcb_at (cur_thread s'a) and valid_idle and not_idle_thread (cur_thread s'a) and valid_etcbs) s\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> ?Q377 etcb s'a obj'a rv' s) \<and> ?P'374 etcb s'a obj'a rv' s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (5 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv')))\<rbrakk> \<Longrightarrow> \<lbrace>?P'496 etcb s'a obj'a rv'\<rbrace> do args <- get_mrs (cur_thread s'a) (snd (snd (snd rv'))) (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) (fst rv') (fst (snd rv')) (fst (snd (snd rv')))
od \<lbrace>\<lambda>rv s. invocation_duplicates_valid rv s \<and> valid_invocation rv s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a\<rbrace>, -
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> ?P'496 etcb s'a obj'a rv' s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv')))\<rbrakk> \<Longrightarrow> \<lbrace>?P'496 etcb s'a obj'a rv'\<rbrace> do args <- get_mrs (cur_thread s'a) (snd (snd (snd rv'))) (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) (fst rv') (fst (snd rv')) (fst (snd (snd rv')))
od \<lbrace>\<lambda>r s. s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation r s \<and> invocation_duplicates_valid r s\<rbrace>, -
 2. \<And>etcb s'a obj'a rv rv' rva s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation rva s \<and> invocation_duplicates_valid rva s\<rbrakk> \<Longrightarrow> invocation_duplicates_valid rva s \<and> valid_invocation rva s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> ?P'496 etcb s'a obj'a rv' s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a rv rv'. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv')))\<rbrakk> \<Longrightarrow> \<lbrace>?P'496 etcb s'a obj'a rv'\<rbrace> doE args <- liftE (get_mrs (cur_thread s'a) (snd (snd (snd rv'))) (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register)));
Decode_A.decode_invocation (mi_label (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register))) args (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)) (fst rv') (fst (snd rv')) (fst (snd (snd rv')))
odE \<lbrace>\<lambda>r s. s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation r s \<and> invocation_duplicates_valid r s\<rbrace>, -
 2. \<And>etcb s'a obj'a rv rv' rva s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation rva s \<and> invocation_duplicates_valid rva s\<rbrakk> \<Longrightarrow> invocation_duplicates_valid rva s \<and> valid_invocation rva s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 4. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> ?P'496 etcb s'a obj'a rv' s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (5 subgoals):
 1. \<And>etcb s'a obj'a rv rv' rva s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; fst rv = transform_cap (fst (snd rv')) \<and> fst (snd rv) = transform_cslot_ptr (fst rv') \<and> snd (snd rv) = transform_cap_list (fst (snd (snd rv'))); s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> valid_invocation rva s \<and> invocation_duplicates_valid rva s\<rbrakk> \<Longrightarrow> invocation_duplicates_valid rva s \<and> valid_invocation rva s \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x) \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s \<and> cur_thread s = cur_thread s'a
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv. (\<lambda>_. True) and (\<lambda>s. True \<and> True \<and> True \<and> True \<and> True)\<rbrace>, \<lbrace>\<lambda>rv x. block \<longrightarrow> True\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> True \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> (valid_cap (fst (snd rv')) and invs and cte_wp_at ((=) (fst (snd rv'))) (fst rv') and real_cte_at (fst rv') and ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') and (\<lambda>s. \<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s)) s \<and> (invs and valid_cap (fst (snd rv')) and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x)) s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (4 subgoals):
 1. \<And>etcb s'a obj'a tcb. \<lbrakk>invs s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; kheap s'a (cur_thread s'a) = Some (TCB tcb); tcb_state tcb = Running\<rbrakk> \<Longrightarrow> \<lbrace>\<lambda>_. True\<rbrace> doE (cap, cap_ref) <- CSpace_D.lookup_cap_and_slot (cur_thread s'a) (cdl_intent_cap (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
extra_caps <- Endpoint_D.lookup_extra_caps (cur_thread s'a) (cdl_intent_extras (transform_full_intent (machine_state s'a) (cur_thread s'a) obj'a));
returnOk (cap, cap_ref, extra_caps)
odE \<lbrace>\<lambda>rv _. True\<rbrace>, \<lbrace>\<lambda>rv x. True\<rbrace>
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> True \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> (valid_cap (fst (snd rv')) and invs and cte_wp_at ((=) (fst (snd rv'))) (fst rv') and real_cte_at (fst rv') and ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') and (\<lambda>s. \<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s)) s \<and> (invs and valid_cap (fst (snd rv')) and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x)) s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (3 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> True \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> (valid_cap (fst (snd rv')) and invs and cte_wp_at ((=) (fst (snd rv'))) (fst rv') and real_cte_at (fst rv') and ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') and (\<lambda>s. \<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) and (\<lambda>s. \<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s)) s \<and> (invs and valid_cap (fst (snd rv')) and (\<lambda>s. \<forall>x\<in>ran (kheap s). obj_valid_pdpt x)) s)\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (3 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>(=) s'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst (snd rv') \<and> invs s \<and> cte_wp_at ((=) (fst (snd rv'))) (fst rv') s \<and> real_cte_at (fst rv') s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') s \<and> (\<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s) \<and> invs s \<and> s \<turnstile> fst (snd rv') \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x))\<rbrace>, \<lbrace>\<lambda>rv' x. block \<longrightarrow> cur_thread x = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) x \<and> st_tcb_at active (cur_thread s'a) x \<and> valid_fault rv' \<and> invs x \<and> valid_irq_node x \<and> valid_etcbs x\<rbrace>
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; block\<rbrakk> \<Longrightarrow> \<lbrace>?B539 etcb s'a obj'a x\<rbrace> case x of (cap, slot) \<Rightarrow> do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od -, \<lbrace>\<lambda>rv s. cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> valid_fault rv \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s\<rbrace>
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; block\<rbrakk> \<Longrightarrow> \<lbrace>?Q538 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>?B539 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv s. cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> valid_fault rv \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst (snd rv') \<and> invs s \<and> cte_wp_at ((=) (fst (snd rv'))) (fst rv') s \<and> real_cte_at (fst rv') s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') s \<and> (\<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s) \<and> invs s \<and> s \<turnstile> fst (snd rv') \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x))\<rbrace>, -
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> ?Q538 etcb s'a obj'a s) \<and> ?P'537 etcb s'a obj'a s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; block\<rbrakk> \<Longrightarrow> \<lbrace>?B539 etcb s'a obj'a x\<rbrace> doE buffer <- liftE (lookup_ipc_buffer False (cur_thread s'a));
extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (snd x, fst x, extracaps, buffer)
odE -, \<lbrace>\<lambda>rv s. cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> valid_fault rv \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s\<rbrace>
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; block\<rbrakk> \<Longrightarrow> \<lbrace>?Q538 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>?B539 etcb s'a obj'a\<rbrace>, \<lbrace>\<lambda>rv s. cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> valid_fault rv \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s\<rbrace>
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> doE (cap, slot) <- cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register)));
do buffer <- lookup_ipc_buffer False (cur_thread s'a);
doE extracaps <- Ipc_A.lookup_extra_caps (cur_thread s'a) buffer (data_to_message_info (arch_tcb_context_get (tcb_arch obj'a) msg_info_register));
returnOk (slot, cap, extracaps, buffer)
odE
od
odE \<lbrace>\<lambda>rv'. (=) s'a and (case rv' of (slot, cap, excaps, buffer) \<Rightarrow> \<lambda>s. \<not> is_master_reply_cap cap \<and> s \<turnstile> cap \<and> valid_etcbs s \<and> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some buffer \<and> (\<forall>e\<in>set excaps. s \<turnstile> fst e) \<and> cte_wp_at (Not \<circ> is_master_reply_cap) slot s \<and> cte_wp_at ((=) cap) slot s \<and> (\<forall>e\<in>set excaps. cte_wp_at ((=) (fst e)) (snd e) s)) and (\<lambda>s. (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst (snd rv') \<and> invs s \<and> cte_wp_at ((=) (fst (snd rv'))) (fst rv') s \<and> real_cte_at (fst rv') s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (fst rv') s \<and> (\<forall>r\<in>zobj_refs (fst (snd rv')). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst (snd rv')) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>cap\<in>set (fst (snd (snd rv'))). \<forall>r\<in>cte_refs (fst cap) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). s \<turnstile> fst x) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). \<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at ((=) (fst x)) (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). real_cte_at (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). ex_cte_cap_wp_to Structures_A.is_cnode_cap (snd x) s) \<and> (\<forall>x\<in>set (fst (snd (snd rv'))). cte_wp_at (interrupt_derived (fst x)) (snd x) s) \<and> invs s \<and> s \<turnstile> fst (snd rv') \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x))\<rbrace>, -
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> ?Q538 etcb s'a obj'a s) \<and> ?P'537 etcb s'a obj'a s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (5 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'707 etcb s'a obj'a x\<rbrace> lookup_ipc_buffer False (cur_thread s'a) \<lbrace>\<lambda>rv s. evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some rv \<and> invs s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> valid_objs s \<and> (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst x \<and> invs s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> invs s \<and> valid_objs s \<and> invs s \<and> s \<turnstile> fst x \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x)\<rbrace>
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> ?P'707 etcb s'a obj'a x s\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'707 etcb s'a obj'a x\<rbrace> lookup_ipc_buffer False (cur_thread s'a) \<lbrace>\<lambda>r s. s = s'a \<and> evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some r \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrace>
 2. \<And>etcb s'a obj'a x rv s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s = s'a \<and> evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrakk> \<Longrightarrow> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some rv \<and> invs s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> valid_objs s \<and> (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst x \<and> invs s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> invs s \<and> valid_objs s \<and> invs s \<and> s \<turnstile> fst x \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x)
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> ?P'707 etcb s'a obj'a x s\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (8 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> empty_when_fail (lookup_ipc_buffer False (cur_thread s'a))
 2. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> weak_det_spec ((=) s'a) (lookup_ipc_buffer False (cur_thread s'a))
 3. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'716 etcb s'a obj'a x\<rbrace> lookup_ipc_buffer False (cur_thread s'a) \<lbrace>\<lambda>rv s. cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrace>
 4. \<And>etcb s'a obj'a x rv s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s = s'a \<and> evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrakk> \<Longrightarrow> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some rv \<and> invs s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> valid_objs s \<and> (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst x \<and> invs s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> invs s \<and> valid_objs s \<and> invs s \<and> s \<turnstile> fst x \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x)
 5. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> s = s'a \<and> s'a = s \<and> ?P'716 etcb s'a obj'a x s\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 7. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 8. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (6 subgoals):
 1. \<And>etcb s'a obj'a x. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'716 etcb s'a obj'a x\<rbrace> lookup_ipc_buffer False (cur_thread s'a) \<lbrace>\<lambda>rv s. cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrace>
 2. \<And>etcb s'a obj'a x rv s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s = s'a \<and> evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrakk> \<Longrightarrow> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some rv \<and> invs s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> valid_objs s \<and> (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst x \<and> invs s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> invs s \<and> valid_objs s \<and> invs s \<and> s \<turnstile> fst x \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x)
 3. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> s = s'a \<and> s'a = s \<and> ?P'716 etcb s'a obj'a x s\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 6. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (5 subgoals):
 1. \<And>etcb s'a obj'a x rv s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s = s'a \<and> evalMonad (lookup_ipc_buffer False (cur_thread s'a)) s'a = Some rv \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrakk> \<Longrightarrow> evalMonad (lookup_ipc_buffer False (cur_thread s)) s = Some rv \<and> invs s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> valid_objs s \<and> (call \<longrightarrow> invs s \<and> tcb_at (cur_thread s'a) s \<and> valid_etcbs s \<and> cur_thread s'a \<noteq> idle_thread s) \<and> (\<not> call \<longrightarrow> tcb_at (cur_thread s'a) s \<and> valid_idle s \<and> not_idle_thread (cur_thread s'a) s \<and> valid_etcbs s) \<and> valid_mdb s \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at idle (idle_thread s) s \<and> valid_etcbs s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> ex_nonz_cap_to (cur_thread s'a) s \<and> s = s'a \<and> ex_nonz_cap_to (cur_thread s) s \<and> s \<turnstile> fst x \<and> invs s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s) \<and> invs s \<and> valid_objs s \<and> invs s \<and> s \<turnstile> fst x \<and> (\<forall>x\<in>ran (kheap s). obj_valid_pdpt x)
 2. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> s = s'a \<and> s'a = s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 5. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (4 subgoals):
 1. \<And>etcb s'a obj'a. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb\<rbrakk> \<Longrightarrow> \<lbrace>?P'537 etcb s'a obj'a\<rbrace> cap_fault_on_failure (arch_tcb_context_get (tcb_arch obj'a) cap_register) False (CSpace_A.lookup_cap_and_slot (cur_thread s'a) (to_bl (arch_tcb_context_get (tcb_arch obj'a) cap_register))) \<lbrace>\<lambda>x s. True \<and> True \<and> s'a = s \<and> \<not> is_master_reply_cap (fst x) \<and> s \<turnstile> fst x \<and> valid_etcbs s \<and> s = s'a \<and> s'a = s \<and> cte_wp_at (Not \<circ> is_master_reply_cap) (snd x) s \<and> cte_wp_at ((=) (fst x)) (snd x) s \<and> real_cte_at (snd x) s \<and> s \<turnstile> fst x \<and> ex_cte_cap_wp_to (\<lambda>_. True) (snd x) s \<and> (\<forall>r\<in>zobj_refs (fst x). ex_nonz_cap_to r s) \<and> (\<forall>r\<in>cte_refs (fst x) (interrupt_irq_node s). ex_cte_cap_wp_to (\<lambda>_. True) r s)\<rbrace>, \<lbrace>\<lambda>_ _. True\<rbrace>
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> ?P'537 etcb s'a obj'a s
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 4. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (3 subgoals):
 1. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> (block \<longrightarrow> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> cur_thread s = cur_thread s'a \<and> not_idle_thread (cur_thread s'a) s \<and> st_tcb_at active (cur_thread s'a) s \<and> invs s \<and> invs s \<and> valid_irq_node s \<and> valid_etcbs s \<and> True) \<and> True \<and> True \<and> True \<and> s'a = s \<and> (valid_reply_masters and valid_objs) s \<and> invs s \<and> valid_etcbs s \<and> s = s'a \<and> s'a = s \<and> (valid_reply_masters and valid_objs) s \<and> valid_objs s \<and> valid_objs s \<and> invs s \<and> (invs and K (\<forall>cap. Structures_A.is_cnode_cap cap \<longrightarrow> True)) s \<and> invs s \<and> invs s
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 3. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal (2 subgoals):
 1. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; transform s'a = s\<rbrakk> \<Longrightarrow> ((\<lambda>_. True) and (\<lambda>_. True)) s
 2. \<And>etcb s'a obj'a s. \<lbrakk>invs s'a; ct_running s'a; \<forall>x\<in>ran (kheap s'a). obj_valid_pdpt x; valid_etcbs s'a; cur_thread s'a \<noteq> idle_thread s'a; thread_is_running (cur_thread s'a) s'a; get_tcb (cur_thread s'a) s'a = Some obj'a; get_etcb (cur_thread s'a) s'a = Some etcb; s'a = s\<rbrakk> \<Longrightarrow> ((=) s'a and (=) s'a) s proof (prove)
goal:
No subgoals!