Library mcertikos.virt.intel.VVMCSInitCSource

***********************************************************************
*                                                                     *
*            The CertiKOS Certified Kit Operating System              *
*                                                                     *
*                   The FLINT Group, Yale University                  *
*                                                                     *
*  Copyright The FLINT Group, Yale University.  All rights reserved.  *
*  This file is distributed under the terms of the Yale University    *
*  Non-Commercial License Agreement.                                  *
*                                                                     *
*********************************************************************** 

Require Import Coqlib.
Require Import AST.
Require Import Integers.
Require Import Values.
Require Import Cop.
Require Import Clight.
Require Import CDataTypes.
Require Import Ctypes.

Definition v_VMX_LOC := {|
  gvar_info := (tarray tuint 36);
  gvar_init := Init_space (VMX_Size´ × 4) :: nil;
  gvar_readonly := false;
  gvar_volatile := false
|}.

Definition _vmx_idx := 1 % positive.

    #define VMX_SIZE 36

    extern unsigned int VMX_LOC[VMX_SIZE];

    unsigned int vmx_readz(unsigned int vmx_idx){
        return VMX_LOC[vmx_idx];
    }

Definition vmx_readz_body :=
  (Sreturn (Some (Ederef
                    (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                            (Etempvar _vmx_idx tuint) (tptr tuint)) tuint))).

Definition f_vmx_readz := {|
  fn_return := tuint;
  fn_callconv := cc_default;
  fn_params := ((_vmx_idx, tuint) :: nil);
  fn_vars := nil;
  fn_temps := nil;
  fn_body := vmx_readz_body
|}.

    #define VMX_SIZE 36

    extern unsigned int VMX_LOC[VMX_SIZE];

    void vmx_writez(unsigned int vmx_idx, unsigned int vmx_val){
        VMX_LOC[vmx_idx] = vmx_val;
    }

Definition _vmx_val := 2 % positive.

Definition vmx_writez_body :=
  (Sassign
     (Ederef
        (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36)) (Etempvar _vmx_idx tuint)
                (tptr tuint)) tuint) (Etempvar _vmx_val tuint)).

Definition f_vmx_writez := {|
  fn_return := tvoid;
  fn_callconv := cc_default;
  fn_params := ((_vmx_idx, tuint) :: (_vmx_val, tuint) :: nil);
  fn_vars := nil;
  fn_temps := nil;
  fn_body := vmx_writez_body
|}.

    #define VMX_G_RIP 14
    #define C_VMCS_GUEST_RIP 26654
    #define VMX_SIZE 36

    extern unsigned int VMX_LOC[VMX_SIZE];
    extern void vmcs_writez(unsigned int encoding, unsigned int val);

    void vmx_enter_pre() {
        unsigned int val = VMX_LOC[VMX_G_RIP];
        vmcs_writez(C_VMCS_GUEST_RIP, val);
    }

Definition _val := 3 % positive.

Definition vmx_enter_pre_body :=
  (Ssequence
     (Sset _val
           (Ederef
              (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                      (Econst_int (Int.repr 14) tint) (tptr tuint)) tuint))
     (Scall None
            (Evar vmcs_writez (Tfunction (Tcons tuint (Tcons tuint Tnil)) tvoid
                                         cc_default))
            ((Econst_int (Int.repr 26654) tint) :: (Etempvar _val tuint) :: nil))).

Definition f_vmx_enter_pre := {|
  fn_return := tvoid;
  fn_callconv := cc_default;
  fn_params := nil;
  fn_vars := nil;
  fn_temps := ((_val, tuint) :: nil);
  fn_body := vmx_enter_pre_body
|}.

    #define C_VMCS_GUEST_RIP 26654
    #define C_VMCS_EXIT_REASON 17410
    #define C_VMCS_EXIT_QUALIFICATION 25600
    #define VMX_G_RIP 14
    #define VMX_EXIT_REASON 27
    #define VMX_EXIT_QUALIFICATION 28
    #define VMX_LAUNCHED 31
    #define VMX_SIZE 36

    extern unsigned int VMX_LOC[VMX_SIZE];
    extern unsigned int vmcs_readz(unsigned int encoding);

    void vmx_exit_post(){
       unsigned int val0 = vmcs_readz(C_VMCS_GUEST_RIP);
       unsigned int val1 = vmcs_readz(C_VMCS_EXIT_REASON);
       unsigned int val2 = vmcs_readz(C_VMCS_EXIT_QUALIFICATION);

       VMX_LOC[VMX_G_RIP] = val0;
       VMX_LOC[VMX_EXIT_REASON] = val1;
       VMX_LOC[VMX_EXIT_QUALIFICATION] = val2;
       VMX_LOC[VMX_LAUNCHED] = 1;
    }

Definition _val0 := 4 % positive.
Definition _val1 := 5 % positive.
Definition _val2 := 6 % positive.

Definition vmx_exit_post_body :=
  (Ssequence
     (Scall (Some _val0)
            (Evar vmcs_readz (Tfunction (Tcons tuint Tnil) tuint cc_default))
            ((Econst_int (Int.repr 26654) tint) :: nil))
     (Ssequence
        (Scall (Some _val1)
               (Evar vmcs_readz (Tfunction (Tcons tuint Tnil) tuint cc_default))
               ((Econst_int (Int.repr 17410) tint) :: nil))
        (Ssequence
           (Scall (Some _val2)
                  (Evar vmcs_readz (Tfunction (Tcons tuint Tnil) tuint cc_default))
                  ((Econst_int (Int.repr 25600) tint) :: nil))
           (Ssequence
              (Sassign
                 (Ederef
                    (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                            (Econst_int (Int.repr 14) tint) (tptr tuint)) tuint)
                 (Etempvar _val0 tuint))
              (Ssequence
                 (Sassign
                    (Ederef
                       (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                               (Econst_int (Int.repr 27) tint) (tptr tuint)) tuint)
                    (Etempvar _val1 tuint))
                 (Ssequence
                    (Sassign
                       (Ederef
                          (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                                  (Econst_int (Int.repr 28) tint) (tptr tuint)) tuint)
                       (Etempvar _val2 tuint))
                    (Sassign
                       (Ederef
                          (Ebinop Oadd (Evar VMX_LOC (tarray tuint 36))
                                  (Econst_int (Int.repr 31) tint) (tptr tuint)) tuint)
                       (Econst_int (Int.repr 1) tint)))))))).

Definition f_vmx_exit_post := {|
  fn_return := tvoid;
  fn_callconv := cc_default;
  fn_params := nil;
  fn_vars := nil;
  fn_temps := ((_val0, tuint) :: (_val1, tuint) :: (_val2, tuint) :: nil);
  fn_body := vmx_exit_post_body
|}.