#ifndef _SHIM_DEFS_H_
#define _SHIM_DEFS_H_

#define MIGRATE_MORE_GIPC           0

#define HASH_GIPC                   0

/*
 * If enable CPSTORE_DERANDOMIZATION, the library OS will try to
 * load the checkpoint (either from the parent or a file) at the
 * exact address it was created. Currently this option is disabled
 * to prevent internal fragmentation of virtual memory space.
 */
#define CPSTORE_DERANDOMIZATION     1

/* This macro disables current vfork implementation and aliases it to fork.
 *
 * Rationale:
 * Current vfork() implementation is broken and works only in simple cases.
 * The implementation creates a new thread in the same process and runs it
 * in place of the previous (parent) thread which called vfork(). When the
 * "pseudo-process" new thread reaches execve(), it silently dies and
 * switches execution back to the suspended parent thread (as per vfork
 * semantics). Because execve() emulation creates a new host-OS process,
 * this vfork implementation works in simple benign cases.
 *
 * However, this co-existence of the "pseudo-process" thread with threads
 * of the parent process leads to bugs elsewhere in Graphene. In general,
 * the rest of Graphene is not aware of such situation when two processes
 * co-exist in the same Graphene instance and share memory. If the new
 * "pseudo-process" thread makes syscalls in-between vfork() and execve()
 * or abnormally dies or receives a signal, Graphene may hang or segfault
 * or end up with inconsistent internal state.
 *
 * Therefore, instead of trying to support Linux semantics for vfork() --
 * which requires adding corner-cases in signal handling and syscalls --
 * we simply redirect vfork() as fork(). We assume that performance hit is
 * negligible (Graphene has to migrate internal state anyway which is slow)
 * and apps do not rely on insane Linux-specific semantics of vfork().
 * */
#define ALIAS_VFORK_AS_FORK 1

#define DEFAULT_HEAP_MIN_SIZE       (256 * 1024 * 1024) /* 256MB */
#define DEFAULT_MEM_MAX_NPAGES      (1024 * 1024)       /* 4GB */
#define DEFAULT_BRK_MAX_SIZE        (256 * 1024)        /* 256KB */
#define DEFAULT_SYS_STACK_SIZE      (256 * 1024)        /* 256KB */

#define CP_INIT_VMA_SIZE            (64 * 1024 * 1024)  /* 64MB */

#define EXECVE_RTLD                 1

#define ENABLE_ASLR                 1

/* debug message printout */
#define DEBUGBUF_SIZE               256
#define DEBUGBUF_BREAK              0

#define DEFAULT_VMA_COUNT           64

/* System V IPC semaphore / message queue migration */
#define MIGRATE_SYSV_SEM            0
#define MIGRATE_SYSV_MSG            1

/* ELF aux vectors  */
#define REQUIRED_ELF_AUXV           8   /* number of LibOS-supported vectors */
#define REQUIRED_ELF_AUXV_SPACE     16  /* extra memory space (in bytes) */

#define WARN_NO_GIPC                0   /* warn if GIPC is not supported for process creation */

#endif /* _SHIM_DEFS_H_ */
