Library mcertikos.proc.PThreadCSource
*********************************************************************** * * * 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.
#define num_chan 64 struct ChanStruct { unsigned int isbusy; unsigned int content; }; extern struct ChanStruct CHPOOL_LOC[num_chan]; unsigned int get_chan_info(unsigned int chan_index) { return CHPOOL_LOC[chan_index].isbusy; }
Local Open Scope positive_scope.
Let tchan_index: ident := 1.
Local Open Scope Z_scope.
Definition get_chan_info_body : statement :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) isbusy tint))).
Definition f_get_chan_info := {|
fn_return := tint;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: nil);
fn_temps := nil;
fn_body := get_chan_info_body
|}.
Let tchan_index: ident := 1.
Local Open Scope Z_scope.
Definition get_chan_info_body : statement :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) isbusy tint))).
Definition f_get_chan_info := {|
fn_return := tint;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: nil);
fn_temps := nil;
fn_body := get_chan_info_body
|}.
#define num_chan 64 struct ChanStruct { unsigned int isbusy; unsigned int content; }; extern struct ChanStruct CHPOOL_LOC[num_chan]; void set_chan_info(unsigned int chan_index, unsigned int info) { CHPOOL_LOC[chan_index].isbusy = info; }
Local Open Scope positive_scope.
Let tinfo: ident := 2.
Local Open Scope Z_scope.
Definition set_chan_info_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) isbusy tint) (Etempvar tinfo tint)).
Definition f_set_chan_info := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: (tinfo, tint) :: nil);
fn_temps := nil;
fn_body := set_chan_info_body
|}.
Let tinfo: ident := 2.
Local Open Scope Z_scope.
Definition set_chan_info_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) isbusy tint) (Etempvar tinfo tint)).
Definition f_set_chan_info := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: (tinfo, tint) :: nil);
fn_temps := nil;
fn_body := set_chan_info_body
|}.
#define num_chan 64 struct ChanStruct { unsigned int isbusy; unsigned int content; }; extern struct ChanStruct CHPOOL_LOC[num_chan]; unsigned int get_chan_content(unsigned int chan_index) { return CHPOOL_LOC[chan_index].content; }
Definition get_chan_content_body : statement :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) content tint))).
Definition f_get_chan_content := {|
fn_return := tint;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: nil);
fn_temps := nil;
fn_body := get_chan_content_body
|}.
#define num_chan 64 struct ChanStruct { unsigned int isbusy; unsigned int content; }; extern struct ChanStruct CHPOOL_LOC[num_chan]; void set_chan_content(unsigned int chan_index, unsigned int content) { CHPOOL_LOC[chan_index].content = content; }
Local Open Scope positive_scope.
Let tcontent: ident := 3.
Local Open Scope Z_scope.
Definition set_chan_content_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) content tint) (Etempvar tcontent tint)).
Definition f_set_chan_content := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: (tcontent, tint) :: nil);
fn_temps := nil;
fn_body := set_chan_content_body
|}.
Let tcontent: ident := 3.
Local Open Scope Z_scope.
Definition set_chan_content_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) content tint) (Etempvar tcontent tint)).
Definition f_set_chan_content := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: (tcontent, tint) :: nil);
fn_temps := nil;
fn_body := set_chan_content_body
|}.
#define num_chan 64 struct ChanStruct { unsigned int isbusy; unsigned int content; }; extern struct ChanStruct CHPOOL_LOC[num_chan]; void init_chan(unsigned int chan_index, unsigned int info, unsigned int content) { CHPOOL_LOC[chan_index].isbusy = info; CHPOOL_LOC[chan_index].content = content; }
Definition init_chan_body : statement :=
(Ssequence
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) isbusy tint) (Etempvar tinfo tint))
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar CHPOOL_LOC (tarray t_struct_Chan num_chan))
(Etempvar tchan_index tint) (tptr t_struct_Chan))
t_struct_Chan) content tint) (Etempvar tcontent tint))).
Definition f_init_chan := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_vars := nil;
fn_params := ((tchan_index, tint) :: (tinfo, tint) :: (tcontent, tint) :: nil);
fn_temps := nil;
fn_body := init_chan_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; void init_sync_chan(unsigned int cid) { SYNCCHPOOL_LOC[cid].to = num_proc; SYNCCHPOOL_LOC[cid].vaddr = 0; SYNCCHPOOL_LOC[cid].count = 0; }
Let tchanid := 4%positive.
Definition init_sync_chan_body : statement :=
(Ssequence
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) to tint) (Econst_int (Int.repr num_chan) tint))
(Ssequence
(Sassign
(Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) paddr tint) (Econst_int (Int.repr 0) tint))
(Sassign
(Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) count tint) (Econst_int (Int.repr 0) tint)))).
Definition f_init_sync_chan := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := init_sync_chan_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; void set_sync_chan_to(unsigned int tchanid, unsigned int toval) { SYNCCHPOOL_LOC[tchanid].to = toval; }
Let toval := 5%positive.
Definition set_sync_chan_to_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) to tint) (Etempvar toval tint)).
Definition f_set_sync_chan_to := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: (toval, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := set_sync_chan_to_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; unsigned int get_sync_chan_to(unsigned int tchanid) { return SYNCCHPOOL_LOC[tchanid].to; }
Definition get_sync_chan_to_body : statement :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) to tint))).
Definition f_get_sync_chan_to := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := get_sync_chan_to_body
|}.
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) to tint))).
Definition f_get_sync_chan_to := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := get_sync_chan_to_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int paddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; void set_sync_chan_paddr(unsigned int tchanid, unsigned int paddrval) { SYNCCHPOOL_LOC[tchanid].paddr = paddrval; }
Let paddrval := 6%positive.
Definition set_sync_chan_paddr_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) paddr tint) (Etempvar paddrval tint)).
Definition f_set_sync_chan_paddr := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: (paddrval, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := set_sync_chan_paddr_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int paddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; unsigned int get_sync_chan_paddr(unsigned int tchanid) { return SYNCCHPOOL_LOC[tchanid].paddr; }
Definition get_sync_chan_paddr_body : statement :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) paddr tint))).
Definition f_get_sync_chan_paddr := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := get_sync_chan_paddr_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; unsigned int is_pid_sending_to(unsigned int tchanid, unsigned int to) { return SYNCCHPOOL_LOC[tchanid].to == to; }
Definition is_pid_sending_to_body : statement :=
(Sreturn (Some (Ebinop Oeq
(Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) to tint) (Etempvar to tint)
tint))).
Definition f_is_pid_sending_to := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: (to, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := is_pid_sending_to_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; unsigned int get_sync_chan_count(unsigned int tchanid) { return SYNCCHPOOL_LOC[tchanid].count; }
Definition get_sync_chan_count_body :=
(Sreturn (Some (Efield
(Ederef
(Ebinop Oadd
(Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) count tint))).
Definition f_get_sync_chan_count := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := get_sync_chan_count_body
|}.
#define num_proc 64 struct SyncIPCChan { unsigned int to; unsigned int vaddr; // Sender's virtual address of the send buffer unsigned int count; }; extern struct SyncIPCChan SYNCCHPOOL_LOC[num_proc]; void set_sync_chan_count(unsigned int tchanid, unsigned int countval) { SYNCCHPOOL_LOC[tchanid].count = countval; }
Let countval := 7%positive.
Definition set_sync_chan_count_body : statement :=
(Sassign
(Efield
(Ederef
(Ebinop Oadd (Evar SYNCCHPOOL_LOC (tarray t_struct_SyncIPCChan num_chan))
(Etempvar tchanid tint) (tptr t_struct_SyncIPCChan))
t_struct_SyncIPCChan) count tint) (Etempvar countval tint)).
Definition f_set_sync_chan_count := {|
fn_return := tvoid;
fn_callconv := cc_default;
fn_params := ((tchanid, tint) :: (countval, tint) :: nil);
fn_vars := nil;
fn_temps := nil;
fn_body := set_sync_chan_count_body
|}.
#define PAGESIZE 4096 extern unsigned int pt_read(unsigned int pid, unsigned int vaddr); unsigned int get_kernel_pa(unsigned int pid, unsigned int va) { unsigned int kpa = pt_read(pid, va); kpa = kpa / PAGESIZE * PAGESIZE + va % PAGESIZE; return kpa; }
Local Open Scope positive_scope.
Definition _pid : ident := 8.
Definition _kpa : ident := 30.
Definition _va : ident := 31.
Definition get_kernel_pa_body : statement :=
(Ssequence
(Scall (Some _kpa)
(Evar pt_read (Tfunction (Tcons tuint (Tcons tuint Tnil)) tuint
cc_default))
((Etempvar _pid tuint) :: (Etempvar _va tuint) :: nil))
(Ssequence
(Sset _kpa
(Ebinop Oadd
(Ebinop Omul
(Ebinop Odiv (Etempvar _kpa tuint)
(Econst_int (Int.repr 4096) tint) tuint)
(Econst_int (Int.repr 4096) tint) tuint)
(Ebinop Omod (Etempvar _va tuint) (Econst_int (Int.repr 4096) tint)
tuint) tuint))
(Sreturn (Some (Etempvar _kpa tuint)))))
.
Definition f_get_kernel_pa := {|
fn_return := tint;
fn_callconv := cc_default;
fn_params := ((_pid, tint) :: (_va, tint) :: nil);
fn_vars := nil;
fn_temps := ((_kpa, tint) :: nil);
fn_body := get_kernel_pa_body
|}.