Browse Source

[Pal] Move header files under include/ and adjust the include directive

Isaku Yamahata 4 years ago
parent
commit
05e42acbc6

+ 0 - 0
Pal/src/host/Linux-SGX/host_endian.h → Pal/include/host/Linux-SGX/host_endian.h


+ 0 - 0
Pal/src/host/Linux/host_endian.h → Pal/include/host/Linux/host_endian.h


+ 0 - 0
Pal/src/host/Skeleton/host_endian.h → Pal/include/host/Skeleton/host_endian.h


+ 0 - 1
Pal/include/pal/generated-offsets-build.h

@@ -1 +0,0 @@
-../../src/generated-offsets-build.h

+ 10 - 0
Pal/include/pal/generated-offsets-build.h

@@ -0,0 +1,10 @@
+#ifndef GENERATED_OFFSETS_BUILD_H
+#define GENERATED_OFFSETS_BUILD_H
+
+#define DEFINE(name, value) \
+    __asm__ volatile(".ascii \"GENERATED_INTEGER " #name " %p0 \"\n" ::"i"(value))
+
+#define OFFSET(name, str, member)     DEFINE(name, offsetof(struct str, member))
+#define OFFSET_T(name, str_t, member) DEFINE(name, offsetof(str_t, member))
+
+#endif /* GENERATED_OFFSETS_BUILD_H */

+ 0 - 1
Pal/include/pal/pal.h

@@ -1 +0,0 @@
-../../src/pal.h

+ 669 - 0
Pal/include/pal/pal.h

@@ -0,0 +1,669 @@
+/* Copyright (C) 2014 Stony Brook University
+   This file is part of Graphene Library OS.
+
+   Graphene Library OS is free software: you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License
+   as published by the Free Software Foundation, either version 3 of the
+   License, or (at your option) any later version.
+
+   Graphene Library OS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/*
+ * pal.h
+ *
+ * This file contains definition of PAL host ABI.
+ */
+
+#ifndef PAL_H
+#define PAL_H
+
+#include <stdbool.h>
+#include <stddef.h>
+#include <stdint.h>
+#include <stdnoreturn.h>
+
+typedef uint64_t      PAL_NUM;
+typedef const char *  PAL_STR;
+typedef void *        PAL_PTR;
+typedef uint32_t      PAL_FLG;
+typedef uint32_t      PAL_IDX;
+typedef bool          PAL_BOL;
+
+/* Moved MAX_FDS from <host_kernel>/pal_host.h to here,
+ * since it is 3, across all host kernels. */
+#define MAX_FDS 3
+
+#ifdef IN_PAL
+#include <atomic.h>
+typedef struct atomic_int PAL_REF;
+
+typedef struct {
+    PAL_IDX type;
+    PAL_FLG flags;
+} PAL_HDR;
+
+# include "pal_host.h"
+
+# ifndef HANDLE_HDR
+#  define HANDLE_HDR(handle) (&((handle)->hdr))
+# endif
+
+static inline void init_handle_hdr(PAL_HDR *hdr, int pal_type) {
+    hdr->type = pal_type;
+    hdr->flags = 0;
+}
+
+# define SET_HANDLE_TYPE(handle, t) init_handle_hdr(HANDLE_HDR(handle), pal_type_##t)
+# define IS_HANDLE_TYPE(handle, t) (HANDLE_HDR(handle)->type == pal_type_##t)
+
+#else
+typedef union pal_handle
+{
+    struct {
+        PAL_IDX type;
+        /* the PAL-level reference counting is deprecated */
+    } hdr;
+} * PAL_HANDLE;
+
+# ifndef HANDLE_HDR
+#  define HANDLE_HDR(handle) (&((handle)->hdr))
+# endif
+
+#endif /* !IN_PAL */
+
+#define PAL_LIBOS_TCB_SIZE  256
+
+typedef struct pal_tcb {
+    struct pal_tcb * self;
+    /* uint64_t for alignment */
+    uint64_t libos_tcb[(PAL_LIBOS_TCB_SIZE + sizeof(uint64_t) - 1) / sizeof(uint64_t)];
+    /* data private to PAL implementation follows this struct. */
+} PAL_TCB;
+
+static inline PAL_TCB * pal_get_tcb (void)
+{
+    PAL_TCB * tcb;
+    __asm__ ("movq %%gs:%c1,%q0"
+             : "=r" (tcb)
+             : "i" (offsetof(struct pal_tcb, self)));
+    return tcb;
+}
+
+#ifdef __x86_64__
+union pal_csgsfs {
+    struct {
+        uint16_t cs;
+        uint16_t gs;
+        uint16_t fs;
+        uint16_t ss;
+    };
+    uint64_t csgsfs;
+};
+
+/* adopt Linux style fp layout, _libc_fpstate of glibc:
+ * Because self-contained definition is needed for Pal definition,
+ * same layout is defined with PAL prefix.
+ */
+#define PAL_FP_XSTATE_MAGIC1        0x46505853U
+#define PAL_FP_XSTATE_MAGIC2        0x46505845U
+#define PAL_FP_XSTATE_MAGIC2_SIZE   (sizeof(PAL_FP_XSTATE_MAGIC2))
+
+enum PAL_XFEATURE {
+    PAL_XFEATURE_FP,
+    PAL_XFEATURE_SSE,
+    PAL_XFEATURE_YMM,
+    PAL_XFEATURE_BNDREGS,
+    PAL_XFEATURE_BNDCSR,
+    PAL_XFEATURE_OPMASK,
+    PAL_XFEATURE_ZMM_Hi256,
+    PAL_XFEATURE_Hi16_ZMM,
+    PAL_XFEATURE_PT,
+    PAL_XFEATURE_PKRU,
+
+    PAL_XFEATURE_MAX,
+};
+
+#define PAL_XFEATURE_MASK_FP                (1UL << PAL_XFEATURE_FP)
+#define PAL_XFEATURE_MASK_SSE               (1UL << PAL_XFEATURE_SSE)
+#define PAL_XFEATURE_MASK_YMM               (1UL << PAL_XFEATURE_YMM)
+#define PAL_XFEATURE_MASK_BNDREGS           (1UL << PAL_XFEATURE_BNDREGS)
+#define PAL_XFEATURE_MASK_BNDCSR            (1UL << PAL_XFEATURE_BNDCSR)
+#define PAL_XFEATURE_MASK_OPMASK            (1UL << PAL_XFEATURE_OPMASK)
+#define PAL_XFEATURE_MASK_ZMM_Hi256         (1UL << PAL_XFEATURE_ZMM_Hi256)
+#define PAL_XFEATURE_MASK_Hi16_ZMM          (1UL << PAL_XFEATURE_Hi16_ZMM)
+#define PAL_XFEATURE_MASK_PT                (1UL << PAL_XFEATURE_PT)
+#define PAL_XFEATURE_MASK_PKRU              (1UL << PAL_XFEATURE_PKRU)
+
+#define PAL_XFEATURE_MASK_FPSSE             (PAL_XFEATURE_MASK_FP \
+                                             | PAL_XFEATURE_MASK_SSE)
+#define PAL_XFEATURE_MASK_AVX512            (PAL_XFEATURE_MASK_OPMASK \
+                                             | PAL_XFEATURE_MASK_ZMM_Hi256 \
+                                             | PAL_XFEATURE_MASK_Hi16_ZMM)
+
+typedef struct {
+    uint32_t magic1;        /* PAL_FP_XSTATE_MAGIC1 */
+    uint32_t extended_size; /* xsave_size */
+    uint64_t xfeatures;     /* XSAVE feature */
+    uint32_t xstate_size;   /* xsave_size + PAL_FP_STATE_MAGIC2_SIZE */
+    uint32_t padding[7];
+} PAL_FPX_SW_BYTES;
+
+typedef struct {
+    uint32_t cwd;
+    uint32_t swd;
+    uint32_t twd;
+    uint32_t fip;
+    uint32_t fcs;
+    uint32_t foo;
+    uint32_t fos;
+    uint32_t st_space[20];
+    uint8_t ftop;
+    uint8_t changed;
+    uint8_t lookahead;
+    uint8_t no_update;
+    uint8_t rm;
+    uint8_t alimit;
+    void* info; /* struct math_emu_info */
+    uint32_t entry_eip;
+} PAL_SWREGS_STATE;
+
+typedef struct {
+    uint16_t significand[4];
+    uint16_t exponent;
+    uint16_t padding[3];
+} PAL_FPXREG;
+
+typedef struct {
+    uint32_t element[4];
+} PAL_XMMREG;
+
+typedef struct {
+    /* 64-bit FXSAVE format.  */
+    uint16_t cwd;
+    uint16_t swd;
+    uint16_t ftw;
+    uint16_t fop;
+    uint64_t rip;
+    uint64_t rdp;
+    uint32_t mxcsr;
+    uint32_t mxcr_mask;
+    PAL_FPXREG st[8];
+    PAL_XMMREG xmm[16];
+    union {
+        uint32_t padding[24];
+        struct {
+            uint32_t padding2[12];
+            PAL_FPX_SW_BYTES sw_reserved;
+        };
+    };
+} PAL_FPSTATE;
+
+typedef struct {
+    uint64_t xfeatures;
+    uint64_t xcomp_bv;
+    uint64_t reserved[6];
+} __attribute__((packed)) PAL_XSTATE_HEADER;
+
+#define PAL_XSTATE_ALIGN 64
+
+typedef struct {
+    PAL_FPSTATE fpstate;
+    PAL_XSTATE_HEADER header;
+} __attribute__((packed, aligned(PAL_XSTATE_ALIGN))) PAL_XREGS_STATE;
+#else
+# error "Unsupported architecture"
+#endif
+
+typedef struct {
+#ifdef __x86_64__
+    PAL_NUM r8, r9, r10, r11, r12, r13, r14, r15;
+    PAL_NUM rdi, rsi, rbp, rbx, rdx, rax, rcx;
+    PAL_NUM rsp, rip;
+    PAL_NUM efl, csgsfs, err, trapno, oldmask, cr2;
+    PAL_XREGS_STATE* fpregs;
+#else
+# error "Unsupported architecture"
+#endif
+} PAL_CONTEXT;
+
+#define PAL_TRUE  true
+#define PAL_FALSE false
+
+/********** PAL TYPE DEFINITIONS **********/
+enum {
+    pal_type_file,
+    pal_type_pipe,
+    pal_type_pipesrv,
+    pal_type_pipecli,
+    pal_type_pipeprv,
+    pal_type_dev,
+    pal_type_dir,
+    pal_type_tcp,
+    pal_type_tcpsrv,
+    pal_type_udp,
+    pal_type_udpsrv,
+    pal_type_process,
+    pal_type_thread,
+    pal_type_mutex,
+    pal_type_event,
+    pal_type_eventfd,
+    PAL_HANDLE_TYPE_BOUND,
+};
+
+#define PAL_IDX_POISON          ((PAL_IDX)-1) /* PAL identifier poison value */
+#define PAL_GET_TYPE(h)         (HANDLE_HDR(h)->type)
+#define PAL_CHECK_TYPE(h, t)    (PAL_GET_TYPE(h) == pal_type_##t)
+#define UNKNOWN_HANDLE(handle)  (PAL_GET_TYPE(handle) >= PAL_HANDLE_TYPE_BOUND)
+
+typedef struct { PAL_PTR start, end; }  PAL_PTR_RANGE;
+
+typedef struct {
+    PAL_NUM cpu_num;
+    PAL_STR cpu_vendor;
+    PAL_STR cpu_brand;
+    PAL_NUM cpu_family;
+    PAL_NUM cpu_model;
+    PAL_NUM cpu_stepping;
+    PAL_STR cpu_flags;
+} PAL_CPU_INFO;
+
+typedef struct {
+    PAL_NUM mem_total;
+} PAL_MEM_INFO;
+
+/********** PAL APIs **********/
+typedef struct {
+    PAL_STR host_type;
+    /* An identifier of current picoprocess */
+    PAL_NUM process_id;
+    PAL_NUM host_id;
+
+    /***** Handles and executables *****/
+    /* program manifest */
+    PAL_HANDLE manifest_handle;
+    /* executable name */
+    PAL_STR executable;
+    /* handle of parent process */
+    PAL_HANDLE parent_process;
+    /* handle of first thread */
+    PAL_HANDLE first_thread;
+    /* debug stream */
+    PAL_HANDLE debug_stream;
+
+    /***** Memory layout ******/
+    /* The range of user address */
+    PAL_PTR_RANGE user_address;
+    /* Reserved memory range inside of user address.
+     * Used for example by SGX for exec area (including memory gap) in the
+     * middle of the heap. If unused set start == end. */
+    PAL_PTR_RANGE user_address_hole;
+    /* address where executable is loaded */
+    PAL_PTR_RANGE executable_range;
+    /* manifest preloaded here */
+    PAL_PTR_RANGE manifest_preload;
+
+    /***** Host information *****/
+    /* Host allocation alignment.
+     * This currently is (and most likely will always be) indistinguishable from the page size,
+     * looking from the LibOS perspective. The two values can be different on the PAL level though,
+     * see e.g. SYSTEM_INFO::dwAllocationGranularity on Windows.
+     */
+    PAL_NUM alloc_align;
+    /* CPU information (only required ones) */
+    PAL_CPU_INFO cpu_info;
+    /* Memory information (only required ones) */
+    PAL_MEM_INFO mem_info;
+
+    /* Attestation information */
+    PAL_STR attestation_status;
+    PAL_STR attestation_timestamp;
+
+    /* Purely for profiling */
+    PAL_NUM startup_time;
+    PAL_NUM host_specific_startup_time;
+    PAL_NUM relocation_time;
+    PAL_NUM linking_time;
+    PAL_NUM manifest_loading_time;
+    PAL_NUM allocation_time;
+    PAL_NUM tail_startup_time;
+    PAL_NUM child_creation_time;
+} PAL_CONTROL;
+
+#define pal_control (*pal_control_addr())
+PAL_CONTROL * pal_control_addr (void);
+
+/* The ABI includes three calls to allocate, free, and modify the
+ * permission bits on page-base virtual memory. Permissions in-
+ * clude read, write, execute, and guard. Memory regions can be
+ * unallocated, reserved, or backed by committed memory
+ */
+
+/* Memory Allocation Flags */
+#define PAL_ALLOC_RESERVE     0x0001   /* Only reserve the memory */
+
+#ifdef IN_PAL
+#define PAL_ALLOC_INTERNAL    0x8000
+#endif
+
+/* Memory Protection Flags */
+#define PAL_PROT_NONE       0x0     /* 0x0 Page can not be accessed. */
+#define PAL_PROT_READ       0x1     /* 0x1 Page can be read. */
+#define PAL_PROT_WRITE      0x2     /* 0x2 Page can be written. */
+#define PAL_PROT_EXEC       0x4     /* 0x4 Page can be executed. */
+#define PAL_PROT_WRITECOPY  0x8     /* 0x8 Copy on write */
+
+#define PAL_PROT_MASK       0xF
+
+
+// If addr != NULL, then the returned region is always exactly at addr.
+PAL_PTR
+DkVirtualMemoryAlloc (PAL_PTR addr, PAL_NUM size, PAL_FLG alloc_type,
+                      PAL_FLG prot);
+
+void
+DkVirtualMemoryFree (PAL_PTR addr, PAL_NUM size);
+
+PAL_BOL
+DkVirtualMemoryProtect (PAL_PTR addr, PAL_NUM size, PAL_FLG prot);
+
+
+/* The ABI includes one call to create a child process and one call to
+ * terminate the running process. A child process does not inherit
+ * any objects or memory from its parent process and the parent
+ * process may not modify the execution of its children. A parent can
+ * wait for a child to exit using its handle. Parent and child may
+ * communicate through I/O streams provided by the parent to the
+ * child at creation
+ */
+
+#define PAL_PROCESS_MASK         0x0
+
+PAL_HANDLE
+DkProcessCreate (PAL_STR uri, PAL_STR * args);
+
+noreturn void
+DkProcessExit (PAL_NUM exitCode);
+
+/* The stream ABI includes nine calls to open, read, write, map, unmap,
+ * truncate, flush, delete and wait for I/O streams and three calls to
+ * access metadata about an I/O stream. The ABI purposefully does not
+ * provide an ioctl call. Supported URI schemes include file:, pipe:,
+ * http:, https:, tcp:, udp:, pipe.srv:, http.srv, tcp.srv:, and udp.srv:.
+ * The latter four schemes are used to open inbound I/O streams for
+ * server applications.
+ */
+
+/* DkStreamOpen
+ *   access_mode: WRONLY or RDONLY or RDWR
+ *   share_flags: permission for the created file
+ *   create_flags: the creation options for the file
+ *   options: other options
+ */
+
+/* Stream Access Flags */
+#define PAL_ACCESS_RDONLY   00
+#define PAL_ACCESS_WRONLY   01
+#define PAL_ACCESS_RDWR     02
+#define PAL_ACCESS_APPEND   04
+#define PAL_ACCESS_MASK     07
+
+/* Stream Sharing Flags */
+#define PAL_SHARE_GLOBAL_X    01
+#define PAL_SHARE_GLOBAL_W    02
+#define PAL_SHARE_GLOBAL_R    04
+#define PAL_SHARE_GROUP_X    010
+#define PAL_SHARE_GROUP_W    020
+#define PAL_SHARE_GROUP_R    040
+#define PAL_SHARE_OWNER_X   0100
+#define PAL_SHARE_OWNER_W   0200
+#define PAL_SHARE_OWNER_R   0400
+#define PAL_SHARE_MASK      0777
+
+/* Stream Create Flags */
+#define PAL_CREATE_TRY        0100       /* Create file if file not exist (O_CREAT) */
+#define PAL_CREATE_ALWAYS     0200       /* Create file and fail if file already exist (O_CREAT|O_EXCL) */
+#define PAL_CREATE_DUALSTACK  0400       /* Create dual-stack socket (opposite of IPV6_V6ONLY) */
+#define PAL_CREATE_MASK       0700
+
+/* Stream Option Flags */
+#define PAL_OPTION_NONBLOCK     04000
+#define PAL_OPTION_MASK         04000
+
+/* CLOEXEC is generic for any stream.
+ * SEMAPHORE is specific to eventfd syscall. */
+#define PAL_OPTION_CLOEXEC       01000
+#define PAL_OPTION_EFD_SEMAPHORE 02000
+
+/* error value of read/write */
+#define PAL_STREAM_ERROR        ((PAL_NUM)-1L)
+
+#define WITHIN_MASK(val, mask)  (((val)|(mask)) == (mask))
+
+PAL_HANDLE
+DkStreamOpen (PAL_STR uri, PAL_FLG access, PAL_FLG share_flags,
+              PAL_FLG create, PAL_FLG options);
+
+PAL_HANDLE
+DkStreamWaitForClient (PAL_HANDLE handle);
+
+PAL_NUM
+DkStreamRead (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
+              PAL_PTR buffer, PAL_PTR source, PAL_NUM size);
+
+PAL_NUM
+DkStreamWrite (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
+               PAL_PTR buffer, PAL_STR dest);
+
+#define PAL_DELETE_RD       01
+#define PAL_DELETE_WR       02
+
+void
+DkStreamDelete (PAL_HANDLE handle, PAL_FLG access);
+
+PAL_PTR
+DkStreamMap (PAL_HANDLE handle, PAL_PTR address, PAL_FLG prot,
+             PAL_NUM offset, PAL_NUM size);
+
+void
+DkStreamUnmap (PAL_PTR addr, PAL_NUM size);
+
+/* Sets the length of the file referenced by handle to length.  Returns the 0
+ * on success, a _positive_ errno on failure.
+ */
+PAL_NUM
+DkStreamSetLength (PAL_HANDLE handle, PAL_NUM length);
+
+PAL_BOL
+DkStreamFlush (PAL_HANDLE handle);
+
+PAL_BOL
+DkSendHandle (PAL_HANDLE handle, PAL_HANDLE cargo);
+
+PAL_HANDLE
+DkReceiveHandle (PAL_HANDLE handle);
+
+/* stream attribute structure */
+typedef struct {
+    PAL_IDX handle_type;
+    PAL_BOL disconnected;
+    PAL_BOL nonblocking;
+    PAL_BOL readable, writable, runnable;
+    PAL_BOL secure;
+    PAL_FLG share_flags;
+    PAL_NUM pending_size;
+    PAL_IDX no_of_fds;
+    PAL_IDX fds[MAX_FDS];
+    union {
+        struct {
+            PAL_NUM linger;
+            PAL_NUM receivebuf, sendbuf;
+            PAL_NUM receivetimeout, sendtimeout;
+            PAL_BOL tcp_cork;
+            PAL_BOL tcp_keepalive;
+            PAL_BOL tcp_nodelay;
+        } socket;
+    };
+} PAL_STREAM_ATTR;
+
+PAL_BOL
+DkStreamAttributesQuery (PAL_STR uri, PAL_STREAM_ATTR * attr);
+
+PAL_BOL
+DkStreamAttributesQueryByHandle (PAL_HANDLE handle,
+                                 PAL_STREAM_ATTR * attr);
+
+PAL_BOL
+DkStreamAttributesSetByHandle (PAL_HANDLE handle, PAL_STREAM_ATTR * attr);
+
+PAL_NUM
+DkStreamGetName (PAL_HANDLE handle, PAL_PTR buffer, PAL_NUM size);
+
+PAL_BOL
+DkStreamChangeName (PAL_HANDLE handle, PAL_STR uri);
+
+/* The ABI supports multithreading through five calls to create,
+ * sleep, yield the scheduler quantum for, resume execution of, and
+ * terminate threads, as well as seven calls to create, signal, and
+ * block on synchronization objects
+ */
+
+#define PAL_THREAD_MASK         0
+
+PAL_HANDLE
+DkThreadCreate (PAL_PTR addr, PAL_PTR param);
+
+// assuming duration to be in microseconds
+PAL_NUM
+DkThreadDelayExecution (PAL_NUM duration);
+
+void
+DkThreadYieldExecution (void);
+
+noreturn void DkThreadExit(PAL_PTR clear_child_tid);
+
+PAL_BOL
+DkThreadResume (PAL_HANDLE thread);
+
+/* Exception Handling */
+/* arithmetic error (div-by-zero, floating point exception, etc.) */
+#define PAL_EVENT_ARITHMETIC_ERROR 1
+/* segmentation fault, protection fault, bus fault */
+#define PAL_EVENT_MEMFAULT         2
+/* illegal instructions */
+#define PAL_EVENT_ILLEGAL          3
+/* terminated by external program */
+#define PAL_EVENT_QUIT             4
+/* suspended by external program */
+#define PAL_EVENT_SUSPEND          5
+/* continued by external program */
+#define PAL_EVENT_RESUME           6
+/* failure within PAL calls */
+#define PAL_EVENT_FAILURE          7
+
+#define PAL_EVENT_NUM_BOUND        8
+
+#define PAL_EVENT_PRIVATE      0x0001       /* upcall specific to thread */
+#define PAL_EVENT_RESET        0x0002       /* reset the event upcall */
+
+typedef void (*PAL_EVENT_HANDLER) (PAL_PTR event, PAL_NUM arg, PAL_CONTEXT *);
+
+PAL_BOL
+DkSetExceptionHandler (PAL_EVENT_HANDLER handler, PAL_NUM event);
+
+void DkExceptionReturn (PAL_PTR event);
+
+
+/* parameter: keeping int threadHandle for now (to be in sync with the paper).
+ * We may want to replace it with a PAL_HANDLE. Ideally, either use PAL_HANDLE
+ * or threadHandle.
+ */
+/* Create a Mutex.
+ * initialCount of 0 is totally unlocked; an initialCount of 1
+ * is initialized to locked. */
+PAL_HANDLE
+DkMutexCreate (PAL_NUM initialCount);
+
+/* Destroy a mutex using DkObjectClose */
+
+void
+DkMutexRelease (PAL_HANDLE mutexHandle);
+
+PAL_HANDLE
+DkNotificationEventCreate (PAL_BOL initialState);
+
+PAL_HANDLE
+DkSynchronizationEventCreate (PAL_BOL initialState);
+
+void
+DkEventSet (PAL_HANDLE eventHandle);
+
+void
+DkEventClear (PAL_HANDLE eventHandle);
+
+#define NO_TIMEOUT ((PAL_NUM)-1)
+
+PAL_BOL DkSynchronizationObjectWait(PAL_HANDLE handle, PAL_NUM timeout_us);
+
+#define PAL_WAIT_SIGNAL     1   /* ignored in events */
+#define PAL_WAIT_READ       2
+#define PAL_WAIT_WRITE      4
+#define PAL_WAIT_ERROR      8   /* ignored in events */
+
+PAL_BOL DkStreamsWaitEvents(PAL_NUM count, PAL_HANDLE* handle_array, PAL_FLG* events,
+                            PAL_FLG* ret_events, PAL_NUM timeout_us);
+
+/* Deprecate DkObjectReference */
+
+void DkObjectClose (PAL_HANDLE objectHandle);
+
+/* the ABI includes seven assorted calls to get wall clock
+ * time, generate cryptographically-strong random bits, flush por-
+ * tions of instruction caches, increment and decrement the reference
+ * counts on objects shared between threads, and to coordinate
+ * threads with the security monitor during process serialization
+ */
+
+/* assuming the time to be in microseconds */
+PAL_NUM
+DkSystemTimeQuery (void);
+
+/*
+ * Cryptographically secure random.
+ * 0 on success, negative on failure.
+ */
+PAL_NUM
+DkRandomBitsRead (PAL_PTR buffer, PAL_NUM size);
+
+PAL_BOL
+DkInstructionCacheFlush (PAL_PTR addr, PAL_NUM size);
+
+#define PAL_SEGMENT_FS          0x1
+#define PAL_SEGMENT_GS          0x2
+
+PAL_PTR DkSegmentRegister (PAL_FLG reg, PAL_PTR addr);
+
+PAL_NUM DkMemoryAvailableQuota (void);
+
+#define PAL_CPUID_WORD_EAX  0
+#define PAL_CPUID_WORD_EBX  1
+#define PAL_CPUID_WORD_ECX  2
+#define PAL_CPUID_WORD_EDX  3
+#define PAL_CPUID_WORD_NUM  4
+
+PAL_BOL
+DkCpuIdRetrieve (PAL_IDX leaf, PAL_IDX subleaf, PAL_IDX values[4]);
+
+#ifdef __GNUC__
+# define symbol_version_default(real, name, version) \
+    __asm__ (".symver " #real "," #name "@@" #version "\n")
+#else
+# define symbol_version_default(real, name, version)
+#endif
+
+#endif /* PAL_H */

+ 0 - 1
Pal/include/pal/pal_debug.h

@@ -1 +0,0 @@
-../../src/pal_debug.h

+ 33 - 0
Pal/include/pal/pal_debug.h

@@ -0,0 +1,33 @@
+/* Copyright (C) 2014 Stony Brook University
+   This file is part of Graphene Library OS.
+
+   Graphene Library OS is free software: you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License
+   as published by the Free Software Foundation, either version 3 of the
+   License, or (at your option) any later version.
+
+   Graphene Library OS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/*
+ * pal_debug.h
+ *
+ * This file contains definitions of APIs used for debug purposes.
+ */
+
+#ifndef PAL_DEBUG_H
+#define PAL_DEBUG_H
+
+#include "pal.h"
+
+int pal_printf (const char *fmt, ...) __attribute__((format(printf, 1, 2)));
+
+void DkDebugAttachBinary (PAL_STR uri, PAL_PTR start_addr);
+void DkDebugDetachBinary (PAL_PTR start_addr);
+
+#endif /* PAL_DEBUG_H */

+ 0 - 1
Pal/include/pal/pal_error.h

@@ -1 +0,0 @@
-../../src/pal_error.h

+ 81 - 0
Pal/include/pal/pal_error.h

@@ -0,0 +1,81 @@
+/* Copyright (C) 2014 Stony Brook University
+   This file is part of Graphene Library OS.
+
+   Graphene Library OS is free software: you can redistribute it and/or
+   modify it under the terms of the GNU Lesser General Public License
+   as published by the Free Software Foundation, either version 3 of the
+   License, or (at your option) any later version.
+
+   Graphene Library OS is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU Lesser General Public License for more details.
+
+   You should have received a copy of the GNU Lesser General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+/*
+ * pal_error.h
+ *
+ * This file contains definitions of PAL error codes.
+ */
+
+#ifndef PAL_ERROR_H
+#define PAL_ERROR_H
+
+#include <stddef.h>
+
+typedef enum _pal_error_t {
+    PAL_ERROR_SUCCESS = 0,
+    PAL_ERROR_NOTIMPLEMENTED,
+    PAL_ERROR_NOTDEFINED,
+    PAL_ERROR_NOTSUPPORT,
+    PAL_ERROR_INVAL,
+    PAL_ERROR_TOOLONG,
+    PAL_ERROR_DENIED,
+    PAL_ERROR_BADHANDLE,
+    PAL_ERROR_STREAMEXIST,
+    PAL_ERROR_STREAMNOTEXIST,
+    PAL_ERROR_STREAMISFILE,
+    PAL_ERROR_STREAMISDIR,
+    PAL_ERROR_STREAMISDEVICE,
+    PAL_ERROR_INTERRUPTED,
+    PAL_ERROR_OVERFLOW,
+    PAL_ERROR_BADADDR,
+    PAL_ERROR_NOMEM,
+    PAL_ERROR_NOTKILLABLE,
+    PAL_ERROR_INCONSIST,
+    PAL_ERROR_TRYAGAIN,
+    PAL_ERROR_ENDOFSTREAM,
+    PAL_ERROR_NOTSERVER,
+    PAL_ERROR_NOTCONNECTION,
+    PAL_ERROR_CONNFAILED,
+    PAL_ERROR_ADDRNOTEXIST,
+    PAL_ERROR_AFNOSUPPORT,
+
+#define PAL_ERROR_NATIVE_COUNT PAL_ERROR_AFNOSUPPORT
+#define PAL_ERROR_CRYPTO_START PAL_ERROR_CRYPTO_FEATURE_UNAVAILABLE
+
+    /* Crypto error constants and their descriptions are adapted from mbedtls. */
+    PAL_ERROR_CRYPTO_FEATURE_UNAVAILABLE = 1000,
+    PAL_ERROR_CRYPTO_INVALID_CONTEXT,
+    PAL_ERROR_CRYPTO_INVALID_KEY_LENGTH,
+    PAL_ERROR_CRYPTO_INVALID_INPUT_LENGTH,
+    PAL_ERROR_CRYPTO_INVALID_OUTPUT_LENGTH,
+    PAL_ERROR_CRYPTO_BAD_INPUT_DATA,
+    PAL_ERROR_CRYPTO_INVALID_PADDING,
+    PAL_ERROR_CRYPTO_DATA_MISALIGNED,
+    PAL_ERROR_CRYPTO_INVALID_FORMAT,
+    PAL_ERROR_CRYPTO_AUTH_FAILED,
+    PAL_ERROR_CRYPTO_IO_ERROR,
+    PAL_ERROR_CRYPTO_KEY_GEN_FAILED,
+    PAL_ERROR_CRYPTO_INVALID_KEY,
+    PAL_ERROR_CRYPTO_VERIFY_FAILED,
+    PAL_ERROR_CRYPTO_RNG_FAILED,
+    PAL_ERROR_CRYPTO_INVALID_DH_STATE,
+#define PAL_ERROR_CRYPTO_END PAL_ERROR_CRYPTO_INVALID_DH_STATE
+} pal_error_t;
+
+const char* pal_strerror(int err);
+
+#endif

+ 1 - 1
Pal/lib/Makefile

@@ -2,7 +2,7 @@ include ../../Scripts/Makefile.configs
 include ../../Scripts/Makefile.rules
 include ../src/host/$(PAL_HOST)/Makefile.am
 
-CFLAGS += -I. -I../include -I../src -Icrypto/mbedtls/include -I../src/host/$(PAL_HOST)
+CFLAGS += -I. -I../include -I../include/pal -Icrypto/mbedtls/include -I../include/host/$(PAL_HOST)
 
 subdirs = string stdlib network graphene crypto
 

+ 2 - 1
Pal/src/Makefile

@@ -20,7 +20,8 @@ OBJ_DIR = $(HOST_DIR)/.obj
 
 include host/$(PAL_HOST)/Makefile.am
 
-CFLAGS	+= -I. -I../include -I$(HOST_DIR) -I../lib
+CFLAGS	+= -I. -I../include -I../include/pal -I../include/$(HOST_DIR) \
+	-I$(HOST_DIR) -I../lib
 
 PAL_HOST_MACRO = $(shell echo $(PAL_HOST) | tr '[:lower:]' '[:upper:]' | tr '-' '_')
 

+ 0 - 10
Pal/src/generated-offsets-build.h

@@ -1,10 +0,0 @@
-#ifndef GENERATED_OFFSETS_BUILD_H
-#define GENERATED_OFFSETS_BUILD_H
-
-#define DEFINE(name, value) \
-    __asm__ volatile(".ascii \"GENERATED_INTEGER " #name " %p0 \"\n" ::"i"(value))
-
-#define OFFSET(name, str, member)     DEFINE(name, offsetof(struct str, member))
-#define OFFSET_T(name, str_t, member) DEFINE(name, offsetof(str_t, member))
-
-#endif /* GENERATED_OFFSETS_BUILD_H */

+ 3 - 1
Pal/src/host/Linux-SGX/Makefile

@@ -5,7 +5,9 @@ ias_cert_url ?= https://certificates.trustedservices.intel.com/Intel_SGX_Attesta
 ias_cert_sha256 ?= e7b9113b647bc6bd421d4f140076a3acc31e410e01bf12883841e824cdaf1564
 ias_cert_file = quote/$(notdir $(ias_cert_url))
 
-CFLAGS	+= -I. -Iinclude -I../.. -I../../../include -I../../../lib -I../../../lib/crypto/mbedtls/include -Isgx-driver
+CFLAGS	+= -I. -Iinclude -I../.. -I../../../include  -I../../../include/pal \
+	-I../../../lib/crypto/mbedtls/include -I../../../include/host/Linux-SGX \
+	-I../../../lib -Isgx-driver
 ASFLAGS += -I. -I../.. -I../../../include
 
 host_files = libpal-Linux-SGX.a pal-sgx debugger/sgx_gdb.so pal.map generated_offsets.py

+ 2 - 1
Pal/src/host/Linux/Makefile

@@ -1,7 +1,8 @@
 include ../../../../Scripts/Makefile.configs
 include Makefile.am
 
-CFLAGS	+= -I. -Iinclude -I../.. -I../../../include -I../../../lib \
+CFLAGS	+= -I. -Iinclude -I../.. -I../../../include -I../../../include/pal \
+	   -I../../../include/host/Linux -I../../../lib \
 	   -I../../../linux-kernel/graphene
 ASFLAGS += -I. -Iinclude -I../.. -I../../../include
 

+ 2 - 1
Pal/src/host/Skeleton/Makefile

@@ -1,7 +1,8 @@
 include ../../../../Scripts/Makefile.configs
 include Makefile.am
 
-CFLAGS  += -I. -I../.. -I../../../include -I../../../lib
+CFLAGS  += -I. -I../.. -I../../../include  -I../../../include/pal \
+	-I../../../include/host/Skeleton -I../../../lib
 ASFLAGS += -I. -I../.. -I../../../include
 
 host_files = libpal-Skeleton.a pal.map

+ 0 - 669
Pal/src/pal.h

@@ -1,669 +0,0 @@
-/* Copyright (C) 2014 Stony Brook University
-   This file is part of Graphene Library OS.
-
-   Graphene Library OS is free software: you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License
-   as published by the Free Software Foundation, either version 3 of the
-   License, or (at your option) any later version.
-
-   Graphene Library OS is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/*
- * pal.h
- *
- * This file contains definition of PAL host ABI.
- */
-
-#ifndef PAL_H
-#define PAL_H
-
-#include <stdbool.h>
-#include <stddef.h>
-#include <stdint.h>
-#include <stdnoreturn.h>
-
-typedef uint64_t      PAL_NUM;
-typedef const char *  PAL_STR;
-typedef void *        PAL_PTR;
-typedef uint32_t      PAL_FLG;
-typedef uint32_t      PAL_IDX;
-typedef bool          PAL_BOL;
-
-/* Moved MAX_FDS from <host_kernel>/pal_host.h to here,
- * since it is 3, across all host kernels. */
-#define MAX_FDS 3
-
-#ifdef IN_PAL
-#include <atomic.h>
-typedef struct atomic_int PAL_REF;
-
-typedef struct {
-    PAL_IDX type;
-    PAL_FLG flags;
-} PAL_HDR;
-
-# include "pal_host.h"
-
-# ifndef HANDLE_HDR
-#  define HANDLE_HDR(handle) (&((handle)->hdr))
-# endif
-
-static inline void init_handle_hdr(PAL_HDR *hdr, int pal_type) {
-    hdr->type = pal_type;
-    hdr->flags = 0;
-}
-
-# define SET_HANDLE_TYPE(handle, t) init_handle_hdr(HANDLE_HDR(handle), pal_type_##t)
-# define IS_HANDLE_TYPE(handle, t) (HANDLE_HDR(handle)->type == pal_type_##t)
-
-#else
-typedef union pal_handle
-{
-    struct {
-        PAL_IDX type;
-        /* the PAL-level reference counting is deprecated */
-    } hdr;
-} * PAL_HANDLE;
-
-# ifndef HANDLE_HDR
-#  define HANDLE_HDR(handle) (&((handle)->hdr))
-# endif
-
-#endif /* !IN_PAL */
-
-#define PAL_LIBOS_TCB_SIZE  256
-
-typedef struct pal_tcb {
-    struct pal_tcb * self;
-    /* uint64_t for alignment */
-    uint64_t libos_tcb[(PAL_LIBOS_TCB_SIZE + sizeof(uint64_t) - 1) / sizeof(uint64_t)];
-    /* data private to PAL implementation follows this struct. */
-} PAL_TCB;
-
-static inline PAL_TCB * pal_get_tcb (void)
-{
-    PAL_TCB * tcb;
-    __asm__ ("movq %%gs:%c1,%q0"
-             : "=r" (tcb)
-             : "i" (offsetof(struct pal_tcb, self)));
-    return tcb;
-}
-
-#ifdef __x86_64__
-union pal_csgsfs {
-    struct {
-        uint16_t cs;
-        uint16_t gs;
-        uint16_t fs;
-        uint16_t ss;
-    };
-    uint64_t csgsfs;
-};
-
-/* adopt Linux style fp layout, _libc_fpstate of glibc:
- * Because self-contained definition is needed for Pal definition,
- * same layout is defined with PAL prefix.
- */
-#define PAL_FP_XSTATE_MAGIC1        0x46505853U
-#define PAL_FP_XSTATE_MAGIC2        0x46505845U
-#define PAL_FP_XSTATE_MAGIC2_SIZE   (sizeof(PAL_FP_XSTATE_MAGIC2))
-
-enum PAL_XFEATURE {
-    PAL_XFEATURE_FP,
-    PAL_XFEATURE_SSE,
-    PAL_XFEATURE_YMM,
-    PAL_XFEATURE_BNDREGS,
-    PAL_XFEATURE_BNDCSR,
-    PAL_XFEATURE_OPMASK,
-    PAL_XFEATURE_ZMM_Hi256,
-    PAL_XFEATURE_Hi16_ZMM,
-    PAL_XFEATURE_PT,
-    PAL_XFEATURE_PKRU,
-
-    PAL_XFEATURE_MAX,
-};
-
-#define PAL_XFEATURE_MASK_FP                (1UL << PAL_XFEATURE_FP)
-#define PAL_XFEATURE_MASK_SSE               (1UL << PAL_XFEATURE_SSE)
-#define PAL_XFEATURE_MASK_YMM               (1UL << PAL_XFEATURE_YMM)
-#define PAL_XFEATURE_MASK_BNDREGS           (1UL << PAL_XFEATURE_BNDREGS)
-#define PAL_XFEATURE_MASK_BNDCSR            (1UL << PAL_XFEATURE_BNDCSR)
-#define PAL_XFEATURE_MASK_OPMASK            (1UL << PAL_XFEATURE_OPMASK)
-#define PAL_XFEATURE_MASK_ZMM_Hi256         (1UL << PAL_XFEATURE_ZMM_Hi256)
-#define PAL_XFEATURE_MASK_Hi16_ZMM          (1UL << PAL_XFEATURE_Hi16_ZMM)
-#define PAL_XFEATURE_MASK_PT                (1UL << PAL_XFEATURE_PT)
-#define PAL_XFEATURE_MASK_PKRU              (1UL << PAL_XFEATURE_PKRU)
-
-#define PAL_XFEATURE_MASK_FPSSE             (PAL_XFEATURE_MASK_FP \
-                                             | PAL_XFEATURE_MASK_SSE)
-#define PAL_XFEATURE_MASK_AVX512            (PAL_XFEATURE_MASK_OPMASK \
-                                             | PAL_XFEATURE_MASK_ZMM_Hi256 \
-                                             | PAL_XFEATURE_MASK_Hi16_ZMM)
-
-typedef struct {
-    uint32_t magic1;        /* PAL_FP_XSTATE_MAGIC1 */
-    uint32_t extended_size; /* xsave_size */
-    uint64_t xfeatures;     /* XSAVE feature */
-    uint32_t xstate_size;   /* xsave_size + PAL_FP_STATE_MAGIC2_SIZE */
-    uint32_t padding[7];
-} PAL_FPX_SW_BYTES;
-
-typedef struct {
-    uint32_t cwd;
-    uint32_t swd;
-    uint32_t twd;
-    uint32_t fip;
-    uint32_t fcs;
-    uint32_t foo;
-    uint32_t fos;
-    uint32_t st_space[20];
-    uint8_t ftop;
-    uint8_t changed;
-    uint8_t lookahead;
-    uint8_t no_update;
-    uint8_t rm;
-    uint8_t alimit;
-    void* info; /* struct math_emu_info */
-    uint32_t entry_eip;
-} PAL_SWREGS_STATE;
-
-typedef struct {
-    uint16_t significand[4];
-    uint16_t exponent;
-    uint16_t padding[3];
-} PAL_FPXREG;
-
-typedef struct {
-    uint32_t element[4];
-} PAL_XMMREG;
-
-typedef struct {
-    /* 64-bit FXSAVE format.  */
-    uint16_t cwd;
-    uint16_t swd;
-    uint16_t ftw;
-    uint16_t fop;
-    uint64_t rip;
-    uint64_t rdp;
-    uint32_t mxcsr;
-    uint32_t mxcr_mask;
-    PAL_FPXREG st[8];
-    PAL_XMMREG xmm[16];
-    union {
-        uint32_t padding[24];
-        struct {
-            uint32_t padding2[12];
-            PAL_FPX_SW_BYTES sw_reserved;
-        };
-    };
-} PAL_FPSTATE;
-
-typedef struct {
-    uint64_t xfeatures;
-    uint64_t xcomp_bv;
-    uint64_t reserved[6];
-} __attribute__((packed)) PAL_XSTATE_HEADER;
-
-#define PAL_XSTATE_ALIGN 64
-
-typedef struct {
-    PAL_FPSTATE fpstate;
-    PAL_XSTATE_HEADER header;
-} __attribute__((packed, aligned(PAL_XSTATE_ALIGN))) PAL_XREGS_STATE;
-#else
-# error "Unsupported architecture"
-#endif
-
-typedef struct {
-#ifdef __x86_64__
-    PAL_NUM r8, r9, r10, r11, r12, r13, r14, r15;
-    PAL_NUM rdi, rsi, rbp, rbx, rdx, rax, rcx;
-    PAL_NUM rsp, rip;
-    PAL_NUM efl, csgsfs, err, trapno, oldmask, cr2;
-    PAL_XREGS_STATE* fpregs;
-#else
-# error "Unsupported architecture"
-#endif
-} PAL_CONTEXT;
-
-#define PAL_TRUE  true
-#define PAL_FALSE false
-
-/********** PAL TYPE DEFINITIONS **********/
-enum {
-    pal_type_file,
-    pal_type_pipe,
-    pal_type_pipesrv,
-    pal_type_pipecli,
-    pal_type_pipeprv,
-    pal_type_dev,
-    pal_type_dir,
-    pal_type_tcp,
-    pal_type_tcpsrv,
-    pal_type_udp,
-    pal_type_udpsrv,
-    pal_type_process,
-    pal_type_thread,
-    pal_type_mutex,
-    pal_type_event,
-    pal_type_eventfd,
-    PAL_HANDLE_TYPE_BOUND,
-};
-
-#define PAL_IDX_POISON          ((PAL_IDX)-1) /* PAL identifier poison value */
-#define PAL_GET_TYPE(h)         (HANDLE_HDR(h)->type)
-#define PAL_CHECK_TYPE(h, t)    (PAL_GET_TYPE(h) == pal_type_##t)
-#define UNKNOWN_HANDLE(handle)  (PAL_GET_TYPE(handle) >= PAL_HANDLE_TYPE_BOUND)
-
-typedef struct { PAL_PTR start, end; }  PAL_PTR_RANGE;
-
-typedef struct {
-    PAL_NUM cpu_num;
-    PAL_STR cpu_vendor;
-    PAL_STR cpu_brand;
-    PAL_NUM cpu_family;
-    PAL_NUM cpu_model;
-    PAL_NUM cpu_stepping;
-    PAL_STR cpu_flags;
-} PAL_CPU_INFO;
-
-typedef struct {
-    PAL_NUM mem_total;
-} PAL_MEM_INFO;
-
-/********** PAL APIs **********/
-typedef struct {
-    PAL_STR host_type;
-    /* An identifier of current picoprocess */
-    PAL_NUM process_id;
-    PAL_NUM host_id;
-
-    /***** Handles and executables *****/
-    /* program manifest */
-    PAL_HANDLE manifest_handle;
-    /* executable name */
-    PAL_STR executable;
-    /* handle of parent process */
-    PAL_HANDLE parent_process;
-    /* handle of first thread */
-    PAL_HANDLE first_thread;
-    /* debug stream */
-    PAL_HANDLE debug_stream;
-
-    /***** Memory layout ******/
-    /* The range of user address */
-    PAL_PTR_RANGE user_address;
-    /* Reserved memory range inside of user address.
-     * Used for example by SGX for exec area (including memory gap) in the
-     * middle of the heap. If unused set start == end. */
-    PAL_PTR_RANGE user_address_hole;
-    /* address where executable is loaded */
-    PAL_PTR_RANGE executable_range;
-    /* manifest preloaded here */
-    PAL_PTR_RANGE manifest_preload;
-
-    /***** Host information *****/
-    /* Host allocation alignment.
-     * This currently is (and most likely will always be) indistinguishable from the page size,
-     * looking from the LibOS perspective. The two values can be different on the PAL level though,
-     * see e.g. SYSTEM_INFO::dwAllocationGranularity on Windows.
-     */
-    PAL_NUM alloc_align;
-    /* CPU information (only required ones) */
-    PAL_CPU_INFO cpu_info;
-    /* Memory information (only required ones) */
-    PAL_MEM_INFO mem_info;
-
-    /* Attestation information */
-    PAL_STR attestation_status;
-    PAL_STR attestation_timestamp;
-
-    /* Purely for profiling */
-    PAL_NUM startup_time;
-    PAL_NUM host_specific_startup_time;
-    PAL_NUM relocation_time;
-    PAL_NUM linking_time;
-    PAL_NUM manifest_loading_time;
-    PAL_NUM allocation_time;
-    PAL_NUM tail_startup_time;
-    PAL_NUM child_creation_time;
-} PAL_CONTROL;
-
-#define pal_control (*pal_control_addr())
-PAL_CONTROL * pal_control_addr (void);
-
-/* The ABI includes three calls to allocate, free, and modify the
- * permission bits on page-base virtual memory. Permissions in-
- * clude read, write, execute, and guard. Memory regions can be
- * unallocated, reserved, or backed by committed memory
- */
-
-/* Memory Allocation Flags */
-#define PAL_ALLOC_RESERVE     0x0001   /* Only reserve the memory */
-
-#ifdef IN_PAL
-#define PAL_ALLOC_INTERNAL    0x8000
-#endif
-
-/* Memory Protection Flags */
-#define PAL_PROT_NONE       0x0     /* 0x0 Page can not be accessed. */
-#define PAL_PROT_READ       0x1     /* 0x1 Page can be read. */
-#define PAL_PROT_WRITE      0x2     /* 0x2 Page can be written. */
-#define PAL_PROT_EXEC       0x4     /* 0x4 Page can be executed. */
-#define PAL_PROT_WRITECOPY  0x8     /* 0x8 Copy on write */
-
-#define PAL_PROT_MASK       0xF
-
-
-// If addr != NULL, then the returned region is always exactly at addr.
-PAL_PTR
-DkVirtualMemoryAlloc (PAL_PTR addr, PAL_NUM size, PAL_FLG alloc_type,
-                      PAL_FLG prot);
-
-void
-DkVirtualMemoryFree (PAL_PTR addr, PAL_NUM size);
-
-PAL_BOL
-DkVirtualMemoryProtect (PAL_PTR addr, PAL_NUM size, PAL_FLG prot);
-
-
-/* The ABI includes one call to create a child process and one call to
- * terminate the running process. A child process does not inherit
- * any objects or memory from its parent process and the parent
- * process may not modify the execution of its children. A parent can
- * wait for a child to exit using its handle. Parent and child may
- * communicate through I/O streams provided by the parent to the
- * child at creation
- */
-
-#define PAL_PROCESS_MASK         0x0
-
-PAL_HANDLE
-DkProcessCreate (PAL_STR uri, PAL_STR * args);
-
-noreturn void
-DkProcessExit (PAL_NUM exitCode);
-
-/* The stream ABI includes nine calls to open, read, write, map, unmap,
- * truncate, flush, delete and wait for I/O streams and three calls to
- * access metadata about an I/O stream. The ABI purposefully does not
- * provide an ioctl call. Supported URI schemes include file:, pipe:,
- * http:, https:, tcp:, udp:, pipe.srv:, http.srv, tcp.srv:, and udp.srv:.
- * The latter four schemes are used to open inbound I/O streams for
- * server applications.
- */
-
-/* DkStreamOpen
- *   access_mode: WRONLY or RDONLY or RDWR
- *   share_flags: permission for the created file
- *   create_flags: the creation options for the file
- *   options: other options
- */
-
-/* Stream Access Flags */
-#define PAL_ACCESS_RDONLY   00
-#define PAL_ACCESS_WRONLY   01
-#define PAL_ACCESS_RDWR     02
-#define PAL_ACCESS_APPEND   04
-#define PAL_ACCESS_MASK     07
-
-/* Stream Sharing Flags */
-#define PAL_SHARE_GLOBAL_X    01
-#define PAL_SHARE_GLOBAL_W    02
-#define PAL_SHARE_GLOBAL_R    04
-#define PAL_SHARE_GROUP_X    010
-#define PAL_SHARE_GROUP_W    020
-#define PAL_SHARE_GROUP_R    040
-#define PAL_SHARE_OWNER_X   0100
-#define PAL_SHARE_OWNER_W   0200
-#define PAL_SHARE_OWNER_R   0400
-#define PAL_SHARE_MASK      0777
-
-/* Stream Create Flags */
-#define PAL_CREATE_TRY        0100       /* Create file if file not exist (O_CREAT) */
-#define PAL_CREATE_ALWAYS     0200       /* Create file and fail if file already exist (O_CREAT|O_EXCL) */
-#define PAL_CREATE_DUALSTACK  0400       /* Create dual-stack socket (opposite of IPV6_V6ONLY) */
-#define PAL_CREATE_MASK       0700
-
-/* Stream Option Flags */
-#define PAL_OPTION_NONBLOCK     04000
-#define PAL_OPTION_MASK         04000
-
-/* CLOEXEC is generic for any stream.
- * SEMAPHORE is specific to eventfd syscall. */
-#define PAL_OPTION_CLOEXEC       01000
-#define PAL_OPTION_EFD_SEMAPHORE 02000
-
-/* error value of read/write */
-#define PAL_STREAM_ERROR        ((PAL_NUM)-1L)
-
-#define WITHIN_MASK(val, mask)  (((val)|(mask)) == (mask))
-
-PAL_HANDLE
-DkStreamOpen (PAL_STR uri, PAL_FLG access, PAL_FLG share_flags,
-              PAL_FLG create, PAL_FLG options);
-
-PAL_HANDLE
-DkStreamWaitForClient (PAL_HANDLE handle);
-
-PAL_NUM
-DkStreamRead (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
-              PAL_PTR buffer, PAL_PTR source, PAL_NUM size);
-
-PAL_NUM
-DkStreamWrite (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
-               PAL_PTR buffer, PAL_STR dest);
-
-#define PAL_DELETE_RD       01
-#define PAL_DELETE_WR       02
-
-void
-DkStreamDelete (PAL_HANDLE handle, PAL_FLG access);
-
-PAL_PTR
-DkStreamMap (PAL_HANDLE handle, PAL_PTR address, PAL_FLG prot,
-             PAL_NUM offset, PAL_NUM size);
-
-void
-DkStreamUnmap (PAL_PTR addr, PAL_NUM size);
-
-/* Sets the length of the file referenced by handle to length.  Returns the 0
- * on success, a _positive_ errno on failure.
- */
-PAL_NUM
-DkStreamSetLength (PAL_HANDLE handle, PAL_NUM length);
-
-PAL_BOL
-DkStreamFlush (PAL_HANDLE handle);
-
-PAL_BOL
-DkSendHandle (PAL_HANDLE handle, PAL_HANDLE cargo);
-
-PAL_HANDLE
-DkReceiveHandle (PAL_HANDLE handle);
-
-/* stream attribute structure */
-typedef struct {
-    PAL_IDX handle_type;
-    PAL_BOL disconnected;
-    PAL_BOL nonblocking;
-    PAL_BOL readable, writable, runnable;
-    PAL_BOL secure;
-    PAL_FLG share_flags;
-    PAL_NUM pending_size;
-    PAL_IDX no_of_fds;
-    PAL_IDX fds[MAX_FDS];
-    union {
-        struct {
-            PAL_NUM linger;
-            PAL_NUM receivebuf, sendbuf;
-            PAL_NUM receivetimeout, sendtimeout;
-            PAL_BOL tcp_cork;
-            PAL_BOL tcp_keepalive;
-            PAL_BOL tcp_nodelay;
-        } socket;
-    };
-} PAL_STREAM_ATTR;
-
-PAL_BOL
-DkStreamAttributesQuery (PAL_STR uri, PAL_STREAM_ATTR * attr);
-
-PAL_BOL
-DkStreamAttributesQueryByHandle (PAL_HANDLE handle,
-                                 PAL_STREAM_ATTR * attr);
-
-PAL_BOL
-DkStreamAttributesSetByHandle (PAL_HANDLE handle, PAL_STREAM_ATTR * attr);
-
-PAL_NUM
-DkStreamGetName (PAL_HANDLE handle, PAL_PTR buffer, PAL_NUM size);
-
-PAL_BOL
-DkStreamChangeName (PAL_HANDLE handle, PAL_STR uri);
-
-/* The ABI supports multithreading through five calls to create,
- * sleep, yield the scheduler quantum for, resume execution of, and
- * terminate threads, as well as seven calls to create, signal, and
- * block on synchronization objects
- */
-
-#define PAL_THREAD_MASK         0
-
-PAL_HANDLE
-DkThreadCreate (PAL_PTR addr, PAL_PTR param);
-
-// assuming duration to be in microseconds
-PAL_NUM
-DkThreadDelayExecution (PAL_NUM duration);
-
-void
-DkThreadYieldExecution (void);
-
-noreturn void DkThreadExit(PAL_PTR clear_child_tid);
-
-PAL_BOL
-DkThreadResume (PAL_HANDLE thread);
-
-/* Exception Handling */
-/* arithmetic error (div-by-zero, floating point exception, etc.) */
-#define PAL_EVENT_ARITHMETIC_ERROR 1
-/* segmentation fault, protection fault, bus fault */
-#define PAL_EVENT_MEMFAULT         2
-/* illegal instructions */
-#define PAL_EVENT_ILLEGAL          3
-/* terminated by external program */
-#define PAL_EVENT_QUIT             4
-/* suspended by external program */
-#define PAL_EVENT_SUSPEND          5
-/* continued by external program */
-#define PAL_EVENT_RESUME           6
-/* failure within PAL calls */
-#define PAL_EVENT_FAILURE          7
-
-#define PAL_EVENT_NUM_BOUND        8
-
-#define PAL_EVENT_PRIVATE      0x0001       /* upcall specific to thread */
-#define PAL_EVENT_RESET        0x0002       /* reset the event upcall */
-
-typedef void (*PAL_EVENT_HANDLER) (PAL_PTR event, PAL_NUM arg, PAL_CONTEXT *);
-
-PAL_BOL
-DkSetExceptionHandler (PAL_EVENT_HANDLER handler, PAL_NUM event);
-
-void DkExceptionReturn (PAL_PTR event);
-
-
-/* parameter: keeping int threadHandle for now (to be in sync with the paper).
- * We may want to replace it with a PAL_HANDLE. Ideally, either use PAL_HANDLE
- * or threadHandle.
- */
-/* Create a Mutex.
- * initialCount of 0 is totally unlocked; an initialCount of 1
- * is initialized to locked. */
-PAL_HANDLE
-DkMutexCreate (PAL_NUM initialCount);
-
-/* Destroy a mutex using DkObjectClose */
-
-void
-DkMutexRelease (PAL_HANDLE mutexHandle);
-
-PAL_HANDLE
-DkNotificationEventCreate (PAL_BOL initialState);
-
-PAL_HANDLE
-DkSynchronizationEventCreate (PAL_BOL initialState);
-
-void
-DkEventSet (PAL_HANDLE eventHandle);
-
-void
-DkEventClear (PAL_HANDLE eventHandle);
-
-#define NO_TIMEOUT ((PAL_NUM)-1)
-
-PAL_BOL DkSynchronizationObjectWait(PAL_HANDLE handle, PAL_NUM timeout_us);
-
-#define PAL_WAIT_SIGNAL     1   /* ignored in events */
-#define PAL_WAIT_READ       2
-#define PAL_WAIT_WRITE      4
-#define PAL_WAIT_ERROR      8   /* ignored in events */
-
-PAL_BOL DkStreamsWaitEvents(PAL_NUM count, PAL_HANDLE* handle_array, PAL_FLG* events,
-                            PAL_FLG* ret_events, PAL_NUM timeout_us);
-
-/* Deprecate DkObjectReference */
-
-void DkObjectClose (PAL_HANDLE objectHandle);
-
-/* the ABI includes seven assorted calls to get wall clock
- * time, generate cryptographically-strong random bits, flush por-
- * tions of instruction caches, increment and decrement the reference
- * counts on objects shared between threads, and to coordinate
- * threads with the security monitor during process serialization
- */
-
-/* assuming the time to be in microseconds */
-PAL_NUM
-DkSystemTimeQuery (void);
-
-/*
- * Cryptographically secure random.
- * 0 on success, negative on failure.
- */
-PAL_NUM
-DkRandomBitsRead (PAL_PTR buffer, PAL_NUM size);
-
-PAL_BOL
-DkInstructionCacheFlush (PAL_PTR addr, PAL_NUM size);
-
-#define PAL_SEGMENT_FS          0x1
-#define PAL_SEGMENT_GS          0x2
-
-PAL_PTR DkSegmentRegister (PAL_FLG reg, PAL_PTR addr);
-
-PAL_NUM DkMemoryAvailableQuota (void);
-
-#define PAL_CPUID_WORD_EAX  0
-#define PAL_CPUID_WORD_EBX  1
-#define PAL_CPUID_WORD_ECX  2
-#define PAL_CPUID_WORD_EDX  3
-#define PAL_CPUID_WORD_NUM  4
-
-PAL_BOL
-DkCpuIdRetrieve (PAL_IDX leaf, PAL_IDX subleaf, PAL_IDX values[4]);
-
-#ifdef __GNUC__
-# define symbol_version_default(real, name, version) \
-    __asm__ (".symver " #real "," #name "@@" #version "\n")
-#else
-# define symbol_version_default(real, name, version)
-#endif
-
-#endif /* PAL_H */

+ 0 - 33
Pal/src/pal_debug.h

@@ -1,33 +0,0 @@
-/* Copyright (C) 2014 Stony Brook University
-   This file is part of Graphene Library OS.
-
-   Graphene Library OS is free software: you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License
-   as published by the Free Software Foundation, either version 3 of the
-   License, or (at your option) any later version.
-
-   Graphene Library OS is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/*
- * pal_debug.h
- *
- * This file contains definitions of APIs used for debug purposes.
- */
-
-#ifndef PAL_DEBUG_H
-#define PAL_DEBUG_H
-
-#include "pal.h"
-
-int pal_printf (const char *fmt, ...) __attribute__((format(printf, 1, 2)));
-
-void DkDebugAttachBinary (PAL_STR uri, PAL_PTR start_addr);
-void DkDebugDetachBinary (PAL_PTR start_addr);
-
-#endif /* PAL_DEBUG_H */

+ 0 - 81
Pal/src/pal_error.h

@@ -1,81 +0,0 @@
-/* Copyright (C) 2014 Stony Brook University
-   This file is part of Graphene Library OS.
-
-   Graphene Library OS is free software: you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public License
-   as published by the Free Software Foundation, either version 3 of the
-   License, or (at your option) any later version.
-
-   Graphene Library OS is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-   GNU Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public License
-   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
-
-/*
- * pal_error.h
- *
- * This file contains definitions of PAL error codes.
- */
-
-#ifndef PAL_ERROR_H
-#define PAL_ERROR_H
-
-#include <stddef.h>
-
-typedef enum _pal_error_t {
-    PAL_ERROR_SUCCESS = 0,
-    PAL_ERROR_NOTIMPLEMENTED,
-    PAL_ERROR_NOTDEFINED,
-    PAL_ERROR_NOTSUPPORT,
-    PAL_ERROR_INVAL,
-    PAL_ERROR_TOOLONG,
-    PAL_ERROR_DENIED,
-    PAL_ERROR_BADHANDLE,
-    PAL_ERROR_STREAMEXIST,
-    PAL_ERROR_STREAMNOTEXIST,
-    PAL_ERROR_STREAMISFILE,
-    PAL_ERROR_STREAMISDIR,
-    PAL_ERROR_STREAMISDEVICE,
-    PAL_ERROR_INTERRUPTED,
-    PAL_ERROR_OVERFLOW,
-    PAL_ERROR_BADADDR,
-    PAL_ERROR_NOMEM,
-    PAL_ERROR_NOTKILLABLE,
-    PAL_ERROR_INCONSIST,
-    PAL_ERROR_TRYAGAIN,
-    PAL_ERROR_ENDOFSTREAM,
-    PAL_ERROR_NOTSERVER,
-    PAL_ERROR_NOTCONNECTION,
-    PAL_ERROR_CONNFAILED,
-    PAL_ERROR_ADDRNOTEXIST,
-    PAL_ERROR_AFNOSUPPORT,
-
-#define PAL_ERROR_NATIVE_COUNT PAL_ERROR_AFNOSUPPORT
-#define PAL_ERROR_CRYPTO_START PAL_ERROR_CRYPTO_FEATURE_UNAVAILABLE
-
-    /* Crypto error constants and their descriptions are adapted from mbedtls. */
-    PAL_ERROR_CRYPTO_FEATURE_UNAVAILABLE = 1000,
-    PAL_ERROR_CRYPTO_INVALID_CONTEXT,
-    PAL_ERROR_CRYPTO_INVALID_KEY_LENGTH,
-    PAL_ERROR_CRYPTO_INVALID_INPUT_LENGTH,
-    PAL_ERROR_CRYPTO_INVALID_OUTPUT_LENGTH,
-    PAL_ERROR_CRYPTO_BAD_INPUT_DATA,
-    PAL_ERROR_CRYPTO_INVALID_PADDING,
-    PAL_ERROR_CRYPTO_DATA_MISALIGNED,
-    PAL_ERROR_CRYPTO_INVALID_FORMAT,
-    PAL_ERROR_CRYPTO_AUTH_FAILED,
-    PAL_ERROR_CRYPTO_IO_ERROR,
-    PAL_ERROR_CRYPTO_KEY_GEN_FAILED,
-    PAL_ERROR_CRYPTO_INVALID_KEY,
-    PAL_ERROR_CRYPTO_VERIFY_FAILED,
-    PAL_ERROR_CRYPTO_RNG_FAILED,
-    PAL_ERROR_CRYPTO_INVALID_DH_STATE,
-#define PAL_ERROR_CRYPTO_END PAL_ERROR_CRYPTO_INVALID_DH_STATE
-} pal_error_t;
-
-const char* pal_strerror(int err);
-
-#endif