Library mcertikos.trap.TTrapArgCode

Require Import Coqlib.
Require Import Maps.
Require Import AST.
Require Import Integers.
Require Import Floats.
Require Import Values.
Require Import MemoryX.
Require Import EventsX.
Require Import Globalenvs.
Require Import Locations.
Require Import Smallstep.
Require Import ClightBigstep.
Require Import Cop.
Require Import compcert.lib.Integers.
Require Import ZArith.Zwf.
Require Import RealParams.
Require Import VCGen.
Require Import liblayers.compcertx.Stencil.
Require Import liblayers.compcertx.MakeProgram.
Require Import liblayers.compat.CompatLayers.
Require Import liblayers.compat.CompatGenSem.
Require Import CompatClightSem.
Require Import PrimSemantics.
Require Import TacticsForTesting.
Require Import XOmega.
Require Import Clight.
Require Import CDataTypes.
Require Import Ctypes.
Require Import CLemmas.
Require Import AbstractDataType.
Require Import TTrapArg.
Require Import TrapGenSpec.
Require Import TTrapArgCSource.
Require Import ObjTrap.
Require Import CommonTactic.

Lemma int_wrap:
  Int.repr (-1) = Int.repr (Int.max_unsigned).
Proof.
  apply Int.eqm_samerepr.
  unfold Int.eqm.
  unfold Int.eqmod.
   (-1).
  reflexivity.
Qed.

Lemma unsigned_int_range:
   x: int,
    0 Int.unsigned x Int64.max_unsigned.
Proof.
  split.
  apply Int.unsigned_range.
  apply Z.le_trans with (m:=Int.max_unsigned);
    ( apply Int.unsigned_range_2 ||
            unfold Int.max_unsigned, Int64.max_unsigned;
      simpl; omega).
Qed.

Lemma cat_unsigned64_lor_range:
   lo hi,
    0 Z.lor (Z.shiftl (Int.unsigned hi) 32) (Int.unsigned lo) Int64.max_unsigned.
Proof.
  intros lo hi.
  apply Z64_lor_range.
  apply Z_shiftl_32_range.
  apply Int.unsigned_range_2.
  apply unsigned_int_range.
Qed.

Lemma unsigned_div_2pow32_eq_0:
   x, Int.unsigned x / 2 ^ 32 = 0.
Proof.
  intro.
  generalize (Int.unsigned_range x); intro.
  repeat autounfold in H.
  unfold two_power_nat, shift_nat in H.
  simpl in H.
  change (2 ^ 32) with 4294967296.
  xomega.
Qed.

Lemma unsigned_shiftl_lor_shiftr_range:
   x y n,
    0 n
    0 Z.shiftr (Z.lor (Z.shiftl (Int.unsigned x) n) (Int.unsigned y)) n Int.max_unsigned.
Proof.
  split.
  - apply Z.shiftr_nonneg.
    apply Z_lor_range_lo.
    + apply Z.shiftl_nonneg.
      apply Int.unsigned_range.
    + apply Int.unsigned_range.
  - rewrite Z.shiftr_lor.
    rewrite Z.shiftr_shiftl_r.
    + rewrite Z.sub_diag with (n:=n).
      rewrite Z.shiftr_0_r.
      rewrite Z.shiftr_div_pow2.
      apply Z_lor_range.
      apply Int.unsigned_range_2.
      split.
      × change 0 with (0 / 2 ^ n).
        apply Z_div_le.
        apply Z.lt_gt.
        apply Z.pow_pos_nonneg; omega.
        apply Int.unsigned_range.
      × rewrite <- Z_div_mult_full with (a:=Int.max_unsigned)(b:=2^n).
        {
          apply Z_div_le.
          - apply Z.lt_gt.
            apply Z.pow_pos_nonneg; omega.
          - apply Z.le_trans with (m:=Int.max_unsigned).
            + apply Int.unsigned_range_2.
            + apply Z.le_mul_diag_r with (n:=Int.max_unsigned)(m:=2^n).
              × repeat autounfold.
                unfold two_power_nat, shift_nat.
                simpl.
                omega.
              × apply Zle_lt_or_eq in H.
                destruct H.
                {
                  generalize (Z.pow_gt_1 2 n).
                  intro Hr.
                  destruct Hr.
                  - omega.
                  - apply H0 in H.
                    omega.
                }
                rewrite <- H.
                simpl.
                omega.
        }
        apply Z.pow_nonzero.
        omega.
        assumption.
      × assumption.
    + assumption.
Qed.

Lemma unsigned_shiftl_lor_shiftr_32_range:
   x y,
    0 Z.shiftr (Z.lor (Z.shiftl (Int.unsigned x) 32) (Int.unsigned y)) 32 Int.max_unsigned.
Proof.
  intros.
  apply unsigned_shiftl_lor_shiftr_range with (n:=32).
  omega.
Qed.

Lemma Z_mod_range:
   x n,
    n > 0 →
    0 x mod n n - 1.
Proof.
  intros.
  assert(0 x mod n < n).
  apply Z_mod_lt.
  omega.
  omega.
Qed.

Ltac intomega :=
  repeat autounfold; unfold two_power_nat, shift_nat; simpl; omega.

Hint Resolve Z_lor_range_lo.
Hint Resolve Z_land_range_lo.
Hint Resolve Z_shiftl_32_range.
Hint Resolve Int.unsigned_range_2.
Hint Resolve cat_unsigned64_lor_range.
Hint Resolve Z.shiftr_nonneg.
Hint Resolve unsigned_shiftl_lor_shiftr_range.
Hint Resolve unsigned_shiftl_lor_shiftr_32_range.

Module TTRAPARGCODE.

  Section WithPrimitives.

    Context `{real_params: RealParams}.
    Context {memb} `{Hmemx: Mem.MemoryModelX memb}.
    Context `{Hmwd: UseMemWithData memb}.

    Let mem := mwd (cdata RData).

    Context `{Hstencil: Stencil}.
    Context `{make_program_ops: !MakeProgramOps Clight.function type Clight.fundef type}.
    Context `{Hmake_program: !MakeProgram Clight.function type Clight.fundef type}.

    Section SYS_PRINT.


      Let L: compatlayer (cdata RData) := get_curid gensem get_curid_spec
                       uctx_arg2 gensem uctx_arg2_spec
                       device_output gensem device_output_spec
                       uctx_set_errno gensem uctx_set_errno_spec.

      Local Instance: ExternalCallsOps mem := CompatExternalCalls.compatlayer_extcall_ops L.

      Local Instance: CompilerConfigOps mem := CompatExternalCalls.compatlayer_compiler_config_ops L.

      Section PrintBody.

        Context `{Hwb: WritableBlockOps}.

        Variable (sc: stencil).

        Variables (ge: genv)
                  (STENCIL_MATCHES: stencil_matches sc ge).

get_curid
        Variable bget_curid: block.
        Hypothesis hget_curid1 : Genv.find_symbol ge get_curid = Some bget_curid.
        Hypothesis hget_curid2 : Genv.find_funct_ptr ge bget_curid =
                                 Some (External (EF_external get_curid (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

uctx_arg2
        Variable buctx_arg2: block.
        Hypothesis huctx_arg21 : Genv.find_symbol ge uctx_arg2 = Some buctx_arg2.
        Hypothesis huctx_arg22 : Genv.find_funct_ptr ge buctx_arg2 =
                                 Some (External (EF_external uctx_arg2
                                                             (signature_of_type Tnil tint cc_default))
                                                Tnil tint cc_default).

device_output
        Variable bdevice_output: block.
        Hypothesis hdevice_output1 : Genv.find_symbol ge device_output = Some bdevice_output.
        Hypothesis hdevice_output2 : Genv.find_funct_ptr ge bdevice_output =
                                     Some (External (EF_external device_output
                                                                 (signature_of_type (Tcons tuint (Tcons tuint (Tcons tuint Tnil)))
                                                                                    tvoid cc_default))
                                                    (Tcons tuint (Tcons tuint (Tcons tuint Tnil))) tvoid cc_default).

uctx_set_errno
        Variable buctx_set_errno: block.
        Hypothesis huctx_set_errno1 : Genv.find_symbol ge uctx_set_errno = Some buctx_set_errno.
        Hypothesis huctx_set_errno2 : Genv.find_funct_ptr ge buctx_set_errno =
                                      Some (External (EF_external uctx_set_errno
                                                                  (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                     (Tcons tint Tnil) Tvoid cc_default).

        Require Import AuxLemma.
        Require Import CommonTactic.

        Lemma print_correct:
           m d d' env le,
            env = PTree.empty _
            print_spec d = Some d'
            high_level_invariant d
             le',
              exec_stmt ge env le ((m, d): mem) print_body E0 le' (m, d') Out_normal.
        Proof.
          intros; subst.
          unfold print_body.
          functional inversion H0.
          esplit.

          assert (0 cid d Int.max_unsigned) as curid_range.
          { pose proof (valid_curid _ H1) as valid_curid.
            rewrite_omega.
          }

          d3 vcgen.
          { repeat vcgen.
            unfold get_curid_spec.
            functional inversion H2; subst. subrewrite'.
            instantiate (1 := Int.repr (cid d)).
            rewrite Int.unsigned_repr; auto.
          }

          assert (0 content Int.max_unsigned)
            as (content_range).
          { functional inversion H2; subst.
            repeat discharge_unsigned_range.
          }

          repeat vcgen.
          {
            instantiate (1 := Int.repr content).
            rewrite Int.unsigned_repr; auto.
          }
          rewrite Int.unsigned_repr; auto.
        Qed.

      End PrintBody.

      Theorem print_code_correct:
        spec_le (print print_spec_low)
                (print f_print L).
      Proof.
        set (L' := L) in ×. unfold L in ×.
        fbigstep_pre L'.
        fbigstep
          (print_correct
             s (Genv.globalenv p) makeglobalenv
             b0 Hb0fs Hb0fp
             b1 Hb1fs Hb1fp
             b2 Hb2fs Hb2fp
             b3 Hb3fs Hb3fp
             m'0 labd labd'
             (PTree.empty _)
             (bind_parameter_temps' (fn_params f_print)
                                    nil
                                    (create_undef_temps (fn_temps f_print)))) H.
      Qed.

    End SYS_PRINT.

    Section SYSGETQUOTA.

      Let L: compatlayer (cdata RData) := get_curid gensem get_curid_spec
                       container_get_quota gensem container_get_quota_spec
                       container_get_usage gensem container_get_usage_spec
                       uctx_set_errno gensem uctx_set_errno_spec
                       uctx_set_retval1 gensem uctx_set_retval1_spec.

      Local Instance: ExternalCallsOps mem := CompatExternalCalls.compatlayer_extcall_ops L.

      Local Instance: CompilerConfigOps mem := CompatExternalCalls.compatlayer_compiler_config_ops L.

      Section SysGetQuotaBody.

        Context `{Hwb: WritableBlockOps}.

        Variable (sc: stencil).

        Variables (ge: genv)
                  (STENCIL_MATCHES: stencil_matches sc ge).

get_curid
        Variable bget_curid: block.
        Hypothesis hget_curid1 : Genv.find_symbol ge get_curid = Some bget_curid.
        Hypothesis hget_curid2 : Genv.find_funct_ptr ge bget_curid =
                                 Some (External (EF_external get_curid (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

container_get_quota
        Variable bcontainer_get_quota: block.
        Hypothesis hcontainer_get_quota1 : Genv.find_symbol ge container_get_quota = Some bcontainer_get_quota.
        Hypothesis hcontainer_get_quota2 : Genv.find_funct_ptr ge bcontainer_get_quota =
                                   Some (External (EF_external container_get_quota
                                                               (signature_of_type (Tcons tint Tnil) tint cc_default))
                                                  (Tcons tint Tnil) tint cc_default).

container_get_usage
        Variable bcontainer_get_usage: block.
        Hypothesis hcontainer_get_usage1 : Genv.find_symbol ge container_get_usage = Some bcontainer_get_usage.
        Hypothesis hcontainer_get_usage2 : Genv.find_funct_ptr ge bcontainer_get_usage =
                                   Some (External (EF_external container_get_usage
                                                               (signature_of_type (Tcons tint Tnil) tint cc_default))
                                                  (Tcons tint Tnil) tint cc_default).

uctx_set_errno
        Variable buctx_set_errno: block.
        Hypothesis huctx_set_errno1 : Genv.find_symbol ge uctx_set_errno = Some buctx_set_errno.
        Hypothesis huctx_set_errno2 : Genv.find_funct_ptr ge buctx_set_errno =
                                      Some (External (EF_external uctx_set_errno
                                                                  (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                     (Tcons tint Tnil) Tvoid cc_default).

uctx_set_retval1
        Variable buctx_set_retval1: block.
        Hypothesis huctx_set_retval11 : Genv.find_symbol ge uctx_set_retval1 = Some buctx_set_retval1.
        Hypothesis huctx_set_retval12 : Genv.find_funct_ptr ge buctx_set_retval1 =
                                        Some (External (EF_external uctx_set_retval1
                                                                    (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                       (Tcons tint Tnil) Tvoid cc_default).

        Lemma sys_get_quota_body_correct:
           m d d' env le,
            env = PTree.empty _
            trap_get_quota_spec d = Some d'
            high_level_invariant d
             le',
              exec_stmt ge env le ((m, d): mem) sys_get_quota_body E0 le' (m, d') Out_normal.
        Proof.
          intros; subst.
          unfold sys_get_quota_body.
          functional inversion H0.

          assert (0 curid Int.max_unsigned) as curid_range.
          { functional inversion H2.
            pose proof (valid_curid _ H1) as valid_curid.
            intomega.
          }

          assert (0 quota Int.max_unsigned
                  0 usage Int.max_unsigned
                  0 quota - usage Int.max_unsigned)
              as (quota_range & usage_range & remaining_quota_range).
          { functional inversion H3; subst.
            functional inversion H4; subst.
            pose proof (cvalid_quota _ (valid_container _ H1) _ H7) as valid_quota.
            pose proof (cvalid_usage _ (valid_container _ H1) _ H7) as valid_usage.
            unfold c, c0; omega.
          }

          esplit.
          d3 vcgen.
          { repeat vcgen.
            instantiate (1 := Int.repr curid).
            rewrite Int.unsigned_repr; auto.
          }
          d3 vcgen; [ repeat vcgen.. |].
          { instantiate (1 := Int.repr quota).
            rewrite Int.unsigned_repr; auto.
          }
          vcgen.
          { repeat vcgen.
            instantiate (1 := Int.repr usage).
            rewrite Int.unsigned_repr; auto.
          }
          repeat vcgen.
        Qed.

      End SysGetQuotaBody.

      Theorem sys_get_quota_code_correct:
        spec_le (sys_get_quota trap_get_quota_spec_low)
                (sys_get_quota f_sys_get_quota L).
      Proof.
        set (L' := L) in ×. unfold L in ×.
        fbigstep_pre L'.
        fbigstep
          (sys_get_quota_body_correct
             s (Genv.globalenv p) makeglobalenv
             b0 Hb0fs Hb0fp
             b1 Hb1fs Hb1fp
             b2 Hb2fs Hb2fp
             b3 Hb3fs Hb3fp
             b4 Hb4fs Hb4fp
             m'0 labd labd0
             (PTree.empty _)
             (bind_parameter_temps' (fn_params f_sys_get_quota)
                                    nil
                                    (create_undef_temps (fn_temps f_sys_get_quota)))) H.
      Qed.

    End SYSGETQUOTA.

    Section SYSOFFER_SHARED_MEM.

extern unsigned int get_curid(void);
extern unsigned int uctx_arg2(void);
extern unsigned int offer_shared_mem(unsigned int, unsigned int, unsigned int);
extern void uctx_set_errno(unsigned int);
extern void uctx_set_retval1(unsigned int);

void sys_offer_shared_mem()
{
    unsigned int curid;
    unsigned int vadr;
    unsigned int res;
    curid = get_curid();
    if (curid == 1) {
       vadr = uctx_arg2();
       res = offer_shared_mem (1, 2, vadr);
       uctx_set_retval1(res);
       uctx_set_errno(0);       
    } {
       uctx_set_errno(0);             
    }
}

      Let L: compatlayer (cdata RData) := get_curid gensem get_curid_spec
                       uctx_arg2 gensem uctx_arg2_spec
                       offer_shared_mem gensem offer_shared_mem_spec
                       uctx_set_errno gensem uctx_set_errno_spec
                       uctx_set_retval1 gensem uctx_set_retval1_spec.

      Local Instance: ExternalCallsOps mem := CompatExternalCalls.compatlayer_extcall_ops L.

      Local Instance: CompilerConfigOps mem := CompatExternalCalls.compatlayer_compiler_config_ops L.

      Section SysShareBody.

        Context `{Hwb: WritableBlockOps}.

        Variable (sc: stencil).

        Variables (ge: genv)
                  (STENCIL_MATCHES: stencil_matches sc ge).

get_curid
        Variable bget_curid: block.
        Hypothesis hget_curid1 : Genv.find_symbol ge get_curid = Some bget_curid.
        Hypothesis hget_curid2 : Genv.find_funct_ptr ge bget_curid =
                                 Some (External (EF_external get_curid (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

uctx_arg2
        Variable buctx_arg2: block.
        Hypothesis huctx_arg21 : Genv.find_symbol ge uctx_arg2 = Some buctx_arg2.
        Hypothesis huctx_arg22 : Genv.find_funct_ptr ge buctx_arg2 =
                                 Some (External (EF_external uctx_arg2
                                                             (signature_of_type Tnil tint cc_default))
                                                Tnil tint cc_default).

offer_shared_mem
        Variable boffer_shared_mem: block.
        Hypothesis hoffer_shared_mem1 : Genv.find_symbol ge offer_shared_mem = Some boffer_shared_mem.
        Hypothesis hoffer_shared_mem2 : Genv.find_funct_ptr ge boffer_shared_mem =
                                        Some (External (EF_external offer_shared_mem
                                                                    (signature_of_type (Tcons tint (Tcons tint (Tcons tint Tnil)))
                                                                                       tint cc_default))
                                                       (Tcons tint(Tcons tint(Tcons tint Tnil))) tint cc_default).

uctx_set_errno
        Variable buctx_set_errno: block.
        Hypothesis huctx_set_errno1 : Genv.find_symbol ge uctx_set_errno = Some buctx_set_errno.
        Hypothesis huctx_set_errno2 : Genv.find_funct_ptr ge buctx_set_errno =
                                      Some (External (EF_external uctx_set_errno
                                                                  (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                     (Tcons tint Tnil) Tvoid cc_default).

uctx_set_retval1
        Variable buctx_set_retval1: block.
        Hypothesis huctx_set_retval11 : Genv.find_symbol ge uctx_set_retval1 = Some buctx_set_retval1.
        Hypothesis huctx_set_retval12 : Genv.find_funct_ptr ge buctx_set_retval1 =
                                        Some (External (EF_external uctx_set_retval1
                                                                    (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                       (Tcons tint Tnil) Tvoid cc_default).

        Require Import AuxLemma.

        Lemma sys_offer_shared_mem_correct:
           m d d' env le,
            env = PTree.empty _
            trap_offer_shared_mem_spec d = Some d'
            high_level_invariant d
             le',
              exec_stmt ge env le ((m, d): mem) sys_offer_shared_mem_body E0 le' (m, d') Out_normal.
        Proof.
          intros; subst.
          unfold sys_offer_shared_mem_body.
          functional inversion H0.
          - esplit.
            assert (0 vadr Int.max_unsigned
                    0 res Int.max_unsigned)
              as (vadr_range & res_range).
            { functional inversion H3; subst.
              split.
              repeat discharge_unsigned_range.
              functional inversion H5; subst; rewrite_omega.
            }

            d3 vcgen.
            { repeat vcgen.
              unfold get_curid_spec.
              functional inversion H3; subst. subrewrite'.
              instantiate (1 := Int.repr 1).
              rewrite Int.unsigned_repr; auto.
              rewrite_omega.
            }

            repeat vcgen.

            {
              rewrite Int.unsigned_repr; auto.
            }
            {
              instantiate (1 := Int.repr res).
              rewrite Int.unsigned_repr; auto.
              rewrite Int.unsigned_repr; eauto.
            }
            {
              rewrite_omega.
            }
            {
              rewrite Int.unsigned_repr; eauto.
            }
          - esplit.
            assert (0 n Int.max_unsigned) as curid_range.
            { pose proof (valid_curid _ H1) as valid_curid.
              intomega.
            }

            d3 vcgen.
            { repeat vcgen.
              unfold get_curid_spec.
              functional inversion H3; subst. subrewrite'.
              instantiate (1 := Int.repr n).
              rewrite Int.unsigned_repr; auto.
            }

            repeat vcgen.
        Qed.

      End SysShareBody.

      Theorem sys_offer_shared_mem_code_correct:
        spec_le (sys_offer_shared_mem trap_offer_shared_mem_spec_low)
                (sys_offer_shared_mem f_sys_offer_shared_mem L).
      Proof.
        set (L' := L) in ×. unfold L in ×.
        fbigstep_pre L'.
        fbigstep
          (sys_offer_shared_mem_correct
             s (Genv.globalenv p) makeglobalenv
             b0 Hb0fs Hb0fp
             b1 Hb1fs Hb1fp
             b2 Hb2fs Hb2fp
             b3 Hb3fs Hb3fp
             b4 Hb4fs Hb4fp
             m'0 labd labd0
             (PTree.empty _)
             (bind_parameter_temps' (fn_params f_sys_offer_shared_mem)
                                    nil
                                    (create_undef_temps (fn_temps f_sys_offer_shared_mem)))) H.
      Qed.

    End SYSOFFER_SHARED_MEM.

    Section SYSRECEIVECHAN.

      Let L: compatlayer (cdata RData) :=
                    uctx_arg2 gensem uctx_arg2_spec
                     uctx_arg3 gensem uctx_arg3_spec
                     uctx_arg4 gensem uctx_arg4_spec
                     uctx_set_errno gensem uctx_set_errno_spec
                     uctx_set_retval1 gensem uctx_set_retval1_spec
                     syncreceive_chan gensem syncreceive_chan_spec.

      Local Instance: ExternalCallsOps mem := CompatExternalCalls.compatlayer_extcall_ops L.

      Local Instance: CompilerConfigOps mem := CompatExternalCalls.compatlayer_compiler_config_ops L.

      Section SysReceiveChanBody.

        Context `{Hwb: WritableBlockOps}.

        Variable (sc: stencil).

        Variables (ge: genv)
                  (STENCIL_MATCHES: stencil_matches sc ge).

uctx_arg2
        Variable buctx_arg2: block.
        Hypothesis huctx_arg21 : Genv.find_symbol ge uctx_arg2 = Some buctx_arg2.
        Hypothesis huctx_arg22 : Genv.find_funct_ptr ge buctx_arg2 =
                                 Some (External (EF_external uctx_arg2 (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

uctx_arg3
        Variable buctx_arg3: block.
        Hypothesis huctx_arg31 : Genv.find_symbol ge uctx_arg3 = Some buctx_arg3.
        Hypothesis huctx_arg32 : Genv.find_funct_ptr ge buctx_arg3 =
                                 Some (External (EF_external uctx_arg3 (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

uctx_arg4
        Variable buctx_arg4: block.
        Hypothesis huctx_arg41 : Genv.find_symbol ge uctx_arg4 = Some buctx_arg4.
        Hypothesis huctx_arg42 : Genv.find_funct_ptr ge buctx_arg4 =
                                 Some (External (EF_external uctx_arg4 (signature_of_type Tnil tuint cc_default))
                                                Tnil tint cc_default).

uctx_set_errno
        Variable buctx_set_errno: block.
        Hypothesis huctx_set_errno1 : Genv.find_symbol ge uctx_set_errno = Some buctx_set_errno.
        Hypothesis huctx_set_errno2 : Genv.find_funct_ptr ge buctx_set_errno =
                                      Some (External (EF_external uctx_set_errno
                                                                  (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                     (Tcons tint Tnil) Tvoid cc_default).

uctx_set_retval1
        Variable buctx_set_retval1: block.
        Hypothesis huctx_set_retval11 : Genv.find_symbol ge uctx_set_retval1 = Some buctx_set_retval1.
        Hypothesis huctx_set_retval12 : Genv.find_funct_ptr ge buctx_set_retval1 =
                                        Some (External (EF_external uctx_set_retval1
                                                                    (signature_of_type (Tcons tint Tnil) Tvoid cc_default))
                                                       (Tcons tint Tnil) Tvoid cc_default).

syncreceive_chan
        Variable bsyncreceive_chan: block.
        Hypothesis hsyncreceive_chan1 : Genv.find_symbol ge syncreceive_chan = Some bsyncreceive_chan.
        Hypothesis hsyncreceive_chan2 : Genv.find_funct_ptr ge bsyncreceive_chan =
                                    Some (External (EF_external syncreceive_chan
                                                                (signature_of_type (Tcons tint (Tcons tint (Tcons tint Tnil))) tint cc_default))
                                                   (Tcons tint (Tcons tint (Tcons tint Tnil))) tint cc_default).

        Lemma sys_receive_chan_body_correct: m d d' env le,
            env = PTree.empty _
            trap_receivechan_spec d = Some d'
             le',
              exec_stmt ge env le ((m, d): mem) sys_receive_chan_body E0 le' (m, d') Out_normal.
        Proof.
          generalize max_unsigned_val; intro muval.
          intros; subst.
          functional inversion H0; subst.
          assert(rrange: 0 r Int.max_unsigned).
          {
            functional inversion H4; try omega.
            unfold arecvcount.
            functional inversion H3.
            rewrite <- H20 in ×.
            generalize (Z.min_spec (Int.unsigned scount) (Int.unsigned n)).
            intro tmp.
            destruct tmp; destruct H25; rewrite H26;
            apply Int.unsigned_range_2.
          }
          rewrite <- Int.unsigned_repr with r in H4; try omega.
          functional inversion H1; try subst;
          functional inversion H2; try subst;
          functional inversion H3; try subst;
          unfold sys_receive_chan_body;
          esplit;
          repeat vcgen.
        Qed.

      End SysReceiveChanBody.

      Theorem sys_receive_chan_code_correct:
        spec_le
          (sys_receive_chan trap_receivechan_spec_low)
          (sys_receive_chan f_sys_receive_chan L).
      Proof.
        set (L' := L) in ×. unfold L in ×.
        fbigstep_pre L'.
        fbigstep
          (sys_receive_chan_body_correct
             s (Genv.globalenv p) makeglobalenv
             b0 Hb0fs Hb0fp
             b1 Hb1fs Hb1fp
             b2 Hb2fs Hb2fp
             b3 Hb3fs Hb3fp
             b4 Hb4fs Hb4fp
             b5 Hb5fs Hb5fp
             m'0 labd labd0
             (PTree.empty _)
             (bind_parameter_temps' (fn_params f_sys_receive_chan)
                                    nil
                                    (create_undef_temps (fn_temps f_sys_receive_chan)))) H0.
      Qed.

    End SYSRECEIVECHAN.




  End WithPrimitives.

End TTRAPARGCODE.