Library mcertikos.trap.TTrapCSource

***********************************************************************
*                                                                     *
*            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.

    extern unsigned int uctx_arg1(void);
    extern unsigned int uctx_arg2(void);
    extern unsigned int uctx_arg3(void);
    extern unsigned int uctx_arg4(void);
    extern unsigned int uctx_arg5(void);
    extern void uctx_set_errno(unsigned int);
    extern void uctx_set_retval1(unsigned int);
    extern unsigned int syncsendto_chan_pre(unsigned int, unsigned int, unsigned int);

    unsigned int trap_sendtochan_pre()
    {
        unsigned int chid;
        unsigned int vaddr;
        unsigned int scount;
        unsigned int val;
        chid = uctx_arg2();
        vaddr = uctx_arg3();
        scount = uctx_arg4();
        val = syncsendto_chan_pre(chid, vaddr, scount);
        return val;
    }

Definition _chid := 100 % positive.
Definition _vaddr := 101 % positive.
Definition _scount := 102 % positive.
Definition _val := 103 % positive.

Definition trap_sendtochan_pre_body :=
  (Ssequence
    (Scall (Some _chid) (Evar uctx_arg2 (Tfunction Tnil tuint cc_default))
      nil)
  (Ssequence
      (Scall (Some _vaddr)
        (Evar uctx_arg3 (Tfunction Tnil tuint cc_default)) nil)
    (Ssequence
        (Scall (Some _scount)
          (Evar uctx_arg4 (Tfunction Tnil tuint cc_default)) nil)
      (Ssequence
          (Scall (Some _val)
            (Evar syncsendto_chan_pre (Tfunction
                                         (Tcons tuint
                                           (Tcons tuint (Tcons tuint Tnil)))
                                         tuint cc_default))
            ((Etempvar _chid tuint) :: (Etempvar _vaddr tuint) ::
             (Etempvar _scount tuint) :: nil))
        (Sreturn (Some (Etempvar _val tuint))))))).

Definition f_trap_sendtochan_pre := {|
  fn_return := tuint;
  fn_callconv := cc_default;
  fn_params := nil;
  fn_vars := nil;
  fn_temps := ((_chid, tuint) :: (_vaddr, tuint) :: (_scount, tuint) :: (_val, tuint) :: nil);
  fn_body := trap_sendtochan_pre_body
|}.

    extern void uctx_set_errno(unsigned int);
    extern void uctx_set_retval1(unsigned int);
    extern unsigned int syncsendto_chan_post(void);

    void trap_sendtochan_post()
    {
        unsigned int val;
        val = syncsendto_chan_post();
        uctx_set_retval1(val);
        uctx_set_errno(0);
    }
enum
{
	SYS_puts = 0,
	SYS_ring0_spawn,
	SYS_spawn,
	SYS_yield,
	SYS_sleep,
	SYS_disk_op,
	SYS_disk_cap,
	SYS_is_chan_ready,
	SYS_send,
	SYS_recv,
	SYS_get_tsc_per_ms ,
	SYS_hvm_run_vm ,
	SYS_hvm_get_exitinfo ,
	SYS_hvm_mmap ,
	SYS_hvm_set_seg ,
	SYS_hvm_set_reg ,
	SYS_hvm_get_reg ,
	SYS_hvm_get_next_eip ,
	SYS_hvm_inject_event ,
	SYS_hvm_check_int_shadow ,
	SYS_hvm_check_pending_event ,
	SYS_hvm_intercept_int_window ,
	SYS_hvm_get_tsc_offset ,
	SYS_hvm_set_tsc_offset ,
	SYS_hvm_handle_rdmsr ,
	SYS_hvm_handle_wrmsr ,
	SYS_get_quota ,
	SYS_getc,
	SYS_putc,
	MAX_SYSCALL_NR
};

#define E_INVAL_CALLNR 3

extern void sys_proc_create(void);
extern void sys_get_tsc_offset(void);
extern void sys_set_tsc_offset(void);
extern void sys_get_exitinfo(void);
extern void sys_mmap(void);
extern void sys_set_reg(void);
extern void sys_get_reg(void);
extern void sys_set_seg(void);
extern void sys_get_next_eip(void);
extern void sys_inject_event(void);
extern void sys_check_pending_event(void);
extern void sys_check_int_shadow(void);
extern void sys_intercept_int_window(void);
extern void sys_handle_rdmsr(void);
extern void sys_handle_wrmsr(void);
extern void sys_receive_chan(void);
extern void sys_get_quota(void);
extern void sys_putc (void);
extern void sys_getc (void);
extern void uctx_set_errno(unsigned int);
extern unsigned int uctx_arg1(void);

void
syscall_dispatch_c ()
{
	unsigned int arg1;
	arg1 = uctx_arg1 ();
	if (arg1 == SYS_putc)
		sys_putc ();
	else if (arg1 == SYS_getc)
		sys_getc ();
	else if (arg1 == SYS_spawn)
		sys_proc_create ();
	else if (arg1 == SYS_get_quota)
		sys_get_quota ();
	else if (arg1 == SYS_recv)
		sys_receive_chan ();
	else if (arg1 == SYS_hvm_get_tsc_offset)
		sys_get_tsc_offset ();
	else if (arg1 == SYS_hvm_set_tsc_offset)
		sys_set_tsc_offset ();
	else if (arg1 == SYS_hvm_get_exitinfo)
		sys_get_exitinfo ();
	else if (arg1 == SYS_hvm_mmap)
		sys_mmap ();
	else if (arg1 == SYS_hvm_set_reg)
		sys_set_reg ();
	else if (arg1 == SYS_hvm_get_reg)
		sys_get_reg ();
	else if (arg1 == SYS_hvm_set_seg)
		sys_set_seg ();
	else if (arg1 == SYS_hvm_get_next_eip)
		sys_get_next_eip ();
	else if (arg1 == SYS_hvm_inject_event)
		sys_inject_event ();
	else if (arg1 == SYS_hvm_check_pending_event)
		sys_check_pending_event ();
	else if (arg1 == SYS_hvm_check_int_shadow)
		sys_check_int_shadow ();
	else if (arg1 == SYS_hvm_intercept_int_window)
		sys_intercept_int_window ();
	else if (arg1 == SYS_hvm_handle_rdmsr)
		sys_handle_rdmsr ();
	else if (arg1 == SYS_hvm_handle_wrmsr)
		sys_handle_wrmsr ();
	else
		uctx_set_errno (E_INVAL_CALLNR);
}

Definition _arg1 := 1 % positive.

Definition syscall_dispatch_c_body :=
  (Ssequence
    (Scall (Some _arg1) (Evar uctx_arg1 (Tfunction Tnil tuint cc_default))
           nil)
    (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                 (Econst_int (Int.repr 28) tint) tint)
    (Scall None (Evar sys_putc (Tfunction Tnil tvoid cc_default)) nil)
    (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                   (Econst_int (Int.repr 27) tint) tint)
      (Scall None (Evar sys_getc (Tfunction Tnil tvoid cc_default)) nil)
  (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                 (Econst_int (Int.repr 2) tint) tint)
    (Scall None (Evar sys_proc_create (Tfunction Tnil tvoid cc_default))
      nil)
    (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                   (Econst_int (Int.repr 22) tint) tint)
      (Scall None
        (Evar sys_get_tsc_offset (Tfunction Tnil tvoid cc_default)) nil)
      (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                     (Econst_int (Int.repr 23) tint) tint)
        (Scall None
          (Evar sys_set_tsc_offset (Tfunction Tnil tvoid cc_default)) nil)
        (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                       (Econst_int (Int.repr 12) tint) tint)
          (Scall None
            (Evar sys_get_exitinfo (Tfunction Tnil tvoid cc_default)) nil)
          (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                         (Econst_int (Int.repr 13) tint) tint)
            (Scall None (Evar sys_mmap (Tfunction Tnil tvoid cc_default))
              nil)
            (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                           (Econst_int (Int.repr 15) tint) tint)
              (Scall None
                (Evar sys_set_reg (Tfunction Tnil tvoid cc_default)) nil)
              (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                             (Econst_int (Int.repr 16) tint) tint)
                (Scall None
                  (Evar sys_get_reg (Tfunction Tnil tvoid cc_default)) nil)
                (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                               (Econst_int (Int.repr 14) tint) tint)
                  (Scall None
                    (Evar sys_set_seg (Tfunction Tnil tvoid cc_default))
                    nil)
                  (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                 (Econst_int (Int.repr 17) tint) tint)
                    (Scall None
                      (Evar sys_get_next_eip (Tfunction Tnil tvoid
                                                cc_default)) nil)
                    (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                   (Econst_int (Int.repr 18) tint) tint)
                      (Scall None
                        (Evar sys_inject_event (Tfunction Tnil tvoid
                                                  cc_default)) nil)
                      (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                     (Econst_int (Int.repr 20) tint) tint)
                        (Scall None
                          (Evar sys_check_pending_event (Tfunction Tnil
                                                           tvoid cc_default))
                          nil)
                        (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                       (Econst_int (Int.repr 19) tint) tint)
                          (Scall None
                            (Evar sys_check_int_shadow (Tfunction Tnil tvoid
                                                          cc_default)) nil)
                          (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                         (Econst_int (Int.repr 21) tint)
                                         tint)
                            (Scall None
                              (Evar sys_intercept_int_window (Tfunction Tnil
                                                                tvoid
                                                                cc_default))
                              nil)
                            (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                           (Econst_int (Int.repr 24) tint)
                                           tint)
                              (Scall None
                                (Evar sys_handle_rdmsr (Tfunction Tnil tvoid
                                                          cc_default)) nil)
                              (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                             (Econst_int (Int.repr 25) tint)
                                             tint)
                                (Scall None
                                  (Evar sys_handle_wrmsr (Tfunction Tnil
                                                            tvoid cc_default))
                                  nil)
                                (Sifthenelse (Ebinop Oeq (Etempvar _arg1 tuint)
                                               (Econst_int (Int.repr 26) tint)
                                               tint)
                                  (Scall None
                                    (Evar sys_get_quota (Tfunction Tnil
                                                              tvoid cc_default))
                                    nil)
                                      (Sifthenelse (Ebinop Oeq
                                                     (Etempvar _arg1 tuint)
                                                     (Econst_int (Int.repr 9) tint)
                                                     tint)
                                        (Scall None
                                          (Evar sys_receive_chan (Tfunction
                                                                    Tnil tvoid
                                                                    cc_default))
                                          nil)
                                        (Scall None
                                          (Evar uctx_set_errno (Tfunction
                                                                  (Tcons tuint
                                                                    Tnil) tvoid
                                                                  cc_default))
                                          ((Econst_int (Int.repr 3) tint) ::
                                           nil)))))))))))))))))))))).

Definition f_syscall_dispatch_c := {|
  fn_return := tvoid;
  fn_callconv := cc_default;
  fn_params := nil;
  fn_vars := nil;
  fn_temps := ((_arg1, tuint) :: nil);
  fn_body := syscall_dispatch_c_body
|}.