Library topsy_threadBuild
Load seplog_header.
Open Local Scope Z_scope.
Open Local Scope vc_scope.
Definition pcp_tf_gs := 0.
Definition pcp_tf_fs := 1.
Definition pcp_tf_es := 2.
Definition pcp_tf_ds := 3.
Definition pcp_tf_trapno := 4.
Definition pcp_tf_edi := 5.
Definition pcp_tf_esi := 6.
Definition pcp_tf_ebp := 7.
Definition pcp_tf_temp_esp := 8.
Definition pcp_tf_ebx := 9.
Definition pcp_tf_edx := 10.
Definition pcp_tf_ecx := 11.
Definition pcp_tf_eax := 12.
Definition pcp_tf_err := 13.
Definition pcp_tf_eip := 14.
Definition pcp_tf_cs := 15.
Definition pcp_tf_eflags := 16.
Definition pcp_tf_esp := 17.
Definition pcp_tf_ss := 18.
Definition th_contextPtr := 0.
Definition th_id := 1.
Definition th_name :=2.
Definition th_parentId := 3.
Definition th_stackStart := 4.
Definition th_stackEnd := 5.
Definition th_msgQueue := 6.
Definition th_schedInfo := 7.
Definition th_stat := 8.
Close Local Scope Z_scope.
Definition USER : Z := 1%Z.
Definition KERNEL : Z := 0%Z.
Axiom sizeof_Message:nat.
Axiom exitCodeLength:nat.
Axiom MAXNAMESIZE : nat.
Axiom STATUS_INT_ENABLE_USER_PREV:nat.
Axiom STATUS_INT_ENABLE_KERNEL_PREV:nat.
Definition skip : cmd' := (0) <- (var_e 0).
Open Local Scope Z_scope.
Definition stringNCopy (tmp:nat) (target:nat) (source:nat) (size:nat) :=
tmp <-* var_e source;
var_e target *<- var_e tmp;
size <- var_e size -e int_e 1%Z;
while' ((var_e tmp == int_e 0) &&& (var_e size =/= int_e 0)) (TT) (
tmp <-* var_e source;
var_e target *<- var_e tmp;
size <- var_e size -e int_e 1
).
Definition tmSetMachineDependentRegisters (context_ptr space:nat) :=
ifte (var_e space == int_e USER) thendo (
(context_ptr -.> pcp_tf_cs) *<- int_e 3;
(context_ptr -.> pcp_tf_ds) *<- int_e 3;
(context_ptr -.> pcp_tf_es) *<- int_e 3;
(context_ptr -.> pcp_tf_fs) *<- int_e 3;
(context_ptr -.> pcp_tf_gs) *<- int_e 3;
(context_ptr -.> pcp_tf_ss) *<- int_e 3
) elsedo (
(context_ptr -.> pcp_tf_cs) *<- int_e 0;
(context_ptr -.> pcp_tf_ds) *<- int_e 0;
(context_ptr -.> pcp_tf_es) *<- int_e 0;
(context_ptr -.> pcp_tf_fs) *<- int_e 0;
(context_ptr -.> pcp_tf_gs) *<- int_e 0;
(context_ptr -.> pcp_tf_ss) *<- int_e 0
) .
Definition precond (cs0 ds0 es0 fs0 gs0 ss0:expr) (context_ptr space:var.v) := fun s h =>
eval (var_e space) s = USER /\ (
(context_ptr -.> pcp_tf_cs |-> cs0) **
(context_ptr -.> pcp_tf_ds |-> ds0) **
(context_ptr -.> pcp_tf_es |-> es0) **
(context_ptr -.> pcp_tf_fs |-> fs0) **
(context_ptr -.> pcp_tf_gs |-> gs0) **
(context_ptr -.> pcp_tf_ss |-> ss0)) s h.
Definition postcond (context_ptr space:var.v) :=
(context_ptr -.> pcp_tf_cs |-> int_e 3) **
(context_ptr -.> pcp_tf_ds |-> int_e 3) **
(context_ptr -.> pcp_tf_es |-> int_e 3) **
(context_ptr -.> pcp_tf_fs |-> int_e 3) **
(context_ptr -.> pcp_tf_gs |-> int_e 3) **
(context_ptr -.> pcp_tf_ss |-> int_e 3) .
Definition threadBuild
(stringNCopy_source:nat) (stringNCopy_target:nat) (stringNCopy_size:nat)
(tmp:nat)
(sp:nat) (mode:nat)
(id:nat) (parentId:nat) (name:nat) (contextPtr:nat) (stackBaseAddress:nat)
(stackSize:nat) (mainFunction:nat) (parameter:nat) (space:nat) (threadPtr:nat) (priority:nat) :=
(threadPtr -.> th_id) *<- var_e id;
(threadPtr -.> th_parentId) *<- var_e parentId;
ifte (var_e name =/= int_e 0) thendo (
stringNCopy_source <-* (threadPtr -.> th_name);
stringNCopy_target <- var_e name;
stringNCopy_size <- int_e (Z_of_nat MAXNAMESIZE);
stringNCopy tmp stringNCopy_source stringNCopy_target stringNCopy_size)
elsedo (
stringNCopy_source <-* (threadPtr -.> th_name);
stringNCopy tmp stringNCopy_source stringNCopy_target stringNCopy_size);
ifte (var_e space == int_e USER) thendo (
skip;
mode <- int_e (Z_of_nat STATUS_INT_ENABLE_USER_PREV))
elsedo (
skip;
mode <- int_e (Z_of_nat STATUS_INT_ENABLE_KERNEL_PREV));
(threadPtr -.> th_stackStart) *<- var_e stackBaseAddress +e var_e stackSize -e int_e 4;
(threadPtr -.> th_stackEnd) *<- var_e stackBaseAddress;
(threadPtr -.> th_contextPtr) *<- var_e contextPtr;
tmp <-* (threadPtr -.> th_stackStart);
sp <- var_e tmp -e int_e (Z_of_nat sizeof_Message) -e int_e (Z_of_nat exitCodeLength)
.
Close Local Scope vc_scope.
Lemma false_imp : forall c P, {{ FF }} c {{ P }}.
Lemma tmSetMachineDependentRegisters_Lemma: forall (cs0 ds0 es0 fs0 gs0 ss0:expr),
forall (context_ptr space:var.v), (var.set (context_ptr::space::nil)) ->
{{ (precond cs0 ds0 es0 fs0 gs0 ss0) context_ptr space}}
proj_cmd (tmSetMachineDependentRegisters context_ptr space)
{{ postcond context_ptr space}}.