pal.h 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463
  1. /* -*- mode:c; c-file-style:"k&r"; c-basic-offset: 4; tab-width:4; indent-tabs-mode:nil; mode:auto-fill; fill-column:78; -*- */
  2. /* vim: set ts=4 sw=4 et tw=78 fo=cqt wm=0: */
  3. /* Copyright (C) 2014 OSCAR lab, Stony Brook University
  4. This file is part of Graphene Library OS.
  5. Graphene Library OS is free software: you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License
  7. as published by the Free Software Foundation, either version 3 of the
  8. License, or (at your option) any later version.
  9. Graphene Library OS is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. You should have received a copy of the GNU General Public License
  14. along with this program. If not, see <http://www.gnu.org/licenses/>. */
  15. /*
  16. * pal.h
  17. *
  18. * This file contains definition of PAL host ABI.
  19. */
  20. #ifndef PAL_H
  21. #define PAL_H
  22. #include <stdint.h>
  23. #include <stdbool.h>
  24. #include <stddef.h>
  25. #ifdef __x86_64__
  26. typedef unsigned long PAL_NUM;
  27. #endif
  28. typedef const char * PAL_STR;
  29. typedef const void * PAL_PTR;
  30. typedef void * PAL_BUF;
  31. typedef unsigned int PAL_FLG;
  32. typedef unsigned int PAL_IDX;
  33. typedef char PAL_CHR;
  34. typedef bool PAL_BOL;
  35. typedef struct {
  36. #ifdef __x86_64__
  37. uint64_t r8, r9, r10, r11, r12, r13, r14, r15, rdi, rsi, rbp, rbx, rdx, rax,
  38. rcx, rsp, rip, efl, csgsfs, err, trapno, oldmask, cr2;
  39. #endif
  40. } PAL_CONTEXT;
  41. #define PAL_TRUE true
  42. #define PAL_FALSE false
  43. /********** PAL TYPE DEFINITIONS **********/
  44. enum {
  45. pal_type_none = 0,
  46. pal_type_file,
  47. pal_type_pipe,
  48. pal_type_pipesrv,
  49. pal_type_pipecli,
  50. pal_type_pipeprv,
  51. pal_type_dev,
  52. pal_type_dir,
  53. pal_type_tcp,
  54. pal_type_tcpsrv,
  55. pal_type_udp,
  56. pal_type_udpsrv,
  57. pal_type_process,
  58. pal_type_mcast,
  59. pal_type_thread,
  60. pal_type_semaphore,
  61. pal_type_event,
  62. pal_type_gipc,
  63. PAL_HANDLE_TYPE_BOUND,
  64. };
  65. #ifdef IN_PAL
  66. struct atomic_int {
  67. volatile int counter;
  68. } __attribute__((aligned(sizeof(int))));
  69. typedef struct atomic_int PAL_REF;
  70. typedef struct {
  71. PAL_IDX type;
  72. PAL_REF ref;
  73. PAL_FLG flags;
  74. } PAL_HDR;
  75. # include "pal_host.h"
  76. # define SET_HANDLE_TYPE(handle, t) \
  77. do { \
  78. (handle)->__in.type = pal_type_##t; \
  79. (handle)->__in.ref.counter = 0; \
  80. (handle)->__in.flags = 0; \
  81. } while (0)
  82. # define IS_HANDLE_TYPE(handle, t) \
  83. ((handle)->__in.type == pal_type_##t)
  84. #else
  85. typedef union pal_handle
  86. {
  87. struct {
  88. PAL_IDX type;
  89. } __in;
  90. } * PAL_HANDLE;
  91. #endif /* !IN_PAL */
  92. /* PAL identifier poison value */
  93. #define PAL_IDX_POISON ((PAL_IDX) -1)
  94. #define __PAL_GET_TYPE(h) ((h)->__in.type)
  95. #define __PAL_CHECK_TYPE(h, t) (__PAL_GET_TYPE(h) == pal_type_##t)
  96. /********** PAL APIs **********/
  97. typedef struct {
  98. /* program manifest */
  99. PAL_HANDLE manifest_handle;
  100. /* string for executable name */
  101. PAL_STR executable;
  102. /* address where executable is loaded */
  103. PAL_BUF executable_begin;
  104. PAL_BUF executable_end;
  105. /* address where PAL is loaded */
  106. PAL_BUF library_begin;
  107. PAL_BUF library_end;
  108. /* The range of address allowed for user */
  109. PAL_BUF user_address_begin;
  110. PAL_BUF user_address_end;
  111. /* host page size */
  112. PAL_NUM pagesize;
  113. /* host allocation alignment */
  114. PAL_NUM alloc_align;
  115. /* handle of parent process */
  116. PAL_HANDLE parent_process;
  117. /* handle of first thread */
  118. PAL_HANDLE first_thread;
  119. /* debug stream */
  120. PAL_HANDLE debug_stream;
  121. /* broadcast RPC stream */
  122. PAL_HANDLE broadcast_stream;
  123. } PAL_CONTROL;
  124. #define pal_control (*pal_control_addr())
  125. PAL_CONTROL * pal_control_addr (void);
  126. /* The ABI includes three calls to allocate, free, and modify the
  127. * permission bits on page-base virtual memory. Permissions in-
  128. * clude read, write, execute, and guard. Memory regions can be
  129. * unallocated, reserved, or backed by committed memory
  130. */
  131. /* Memory Allocation Flags */
  132. #define PAL_ALLOC_32BIT 0x0001 /* Only give out 32-bit addresses */
  133. #define PAL_ALLOC_RESERVE 0x0002 /* Only reserve the memory */
  134. /* Memory Protection Flags */
  135. #define PAL_PROT_NONE 0x0 /* 0x0 Page can not be accessed. */
  136. #define PAL_PROT_READ 0x1 /* 0x1 Page can be read. */
  137. #define PAL_PROT_WRITE 0x2 /* 0x2 Page can be written. */
  138. #define PAL_PROT_EXEC 0x4 /* 0x4 Page can be executed. */
  139. #define PAL_PROT_WRITECOPY 0x8 /* 0x8 Copy on write */
  140. PAL_BUF
  141. DkVirtualMemoryAlloc (PAL_BUF addr, PAL_NUM size, PAL_FLG alloc_type,
  142. PAL_FLG prot);
  143. void
  144. DkVirtualMemoryFree (PAL_BUF addr, PAL_NUM size);
  145. PAL_BOL
  146. DkVirtualMemoryProtect (PAL_BUF addr, PAL_NUM size,
  147. PAL_FLG prot);
  148. /* The ABI includes one call to create a child process and one call to
  149. * terminate the running process. A child process does not inherit
  150. * any objects or memory from its parent process and the parent
  151. * process may not modify the execution of its children. A parent can
  152. * wait for a child to exit using its handle. Parent and child may
  153. * communicate through I/O streams provided by the parent to the
  154. * child at creation
  155. */
  156. #define PAL_PROCESS_MASK 0x0
  157. PAL_HANDLE
  158. DkProcessCreate (PAL_STR uri, PAL_FLG flags, PAL_STR * args);
  159. void
  160. DkProcessExit (PAL_NUM exitCode);
  161. #define PAL_SANDBOX_PIPE 0x1
  162. PAL_BOL
  163. DkProcessSandboxCreate (PAL_STR manifest, PAL_FLG flags);
  164. /* The stream ABI includes nine calls to open, read, write, map, unmap,
  165. * truncate, flush, delete and wait for I/O streams and three calls to
  166. * access metadata about an I/O stream. The ABI purposefully does not
  167. * provide an ioctl call. Supported URI schemes include file:, pipe:,
  168. * http:, https:, tcp:, udp:, pipe.srv:, http.srv, tcp.srv:, and udp.srv:.
  169. * The latter four schemes are used to open inbound I/O streams for
  170. * server applications.
  171. */
  172. /* DkStreamOpen
  173. * access_mode: WRONLY or RDONLY or RDWR
  174. * share_flags: permission for the created file
  175. * create_flags: the creation options for the file
  176. * options: other options
  177. */
  178. /* Stream Access Flags */
  179. #define PAL_ACCESS_RDONLY 00
  180. #define PAL_ACCESS_WRONLY 01
  181. #define PAL_ACCESS_RDWR 02
  182. #define PAL_ACCESS_MASK 03
  183. /* Stream Sharing Flags */
  184. #define PAL_SHARE_GLOBAL_X 01
  185. #define PAL_SHARE_GLOBAL_W 02
  186. #define PAL_SHARE_GLOBAL_R 04
  187. #define PAL_SHARE_GROUP_X 010
  188. #define PAL_SHARE_GROUP_W 020
  189. #define PAL_SHARE_GROUP_R 040
  190. #define PAL_SHARE_OWNER_X 0100
  191. #define PAL_SHARE_OWNER_W 0200
  192. #define PAL_SHARE_OWNER_R 0400
  193. #define PAL_SHARE_MASK 0777
  194. /* Stream Create Flags */
  195. #define PAL_CREAT_TRY 0100 /* 0100 Create file if file not
  196. exist (O_CREAT) */
  197. #define PAL_CREAT_ALWAYS 0200 /* 0300 Create file and fail if file
  198. already exist (O_CREAT|O_EXCL) */
  199. #define PAL_CREAT_MASK 0300
  200. /* Stream Option Flags */
  201. #define PAL_OPTION_NONBLOCK 04000
  202. #define PAL_OPTION_MASK 04000
  203. PAL_HANDLE
  204. DkStreamOpen (PAL_STR uri, PAL_FLG access, PAL_FLG share_flags,
  205. PAL_FLG create, PAL_FLG options);
  206. PAL_HANDLE
  207. DkStreamWaitForClient (PAL_HANDLE handle);
  208. PAL_NUM
  209. DkStreamRead (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
  210. PAL_BUF buffer, PAL_BUF source, PAL_NUM size);
  211. PAL_NUM
  212. DkStreamWrite (PAL_HANDLE handle, PAL_NUM offset, PAL_NUM count,
  213. PAL_PTR buffer, PAL_STR dest);
  214. #define PAL_DELETE_RD 01
  215. #define PAL_DELETE_WR 02
  216. void
  217. DkStreamDelete (PAL_HANDLE handle, PAL_FLG access);
  218. PAL_BUF
  219. DkStreamMap (PAL_HANDLE handle, PAL_BUF address, PAL_FLG prot,
  220. PAL_NUM offset, PAL_NUM size);
  221. void
  222. DkStreamUnmap (PAL_BUF addr, PAL_NUM size);
  223. PAL_NUM
  224. DkStreamSetLength (PAL_HANDLE handle, PAL_NUM length);
  225. PAL_BOL
  226. DkStreamFlush (PAL_HANDLE handle);
  227. PAL_BOL
  228. DkSendHandle (PAL_HANDLE handle, PAL_HANDLE cargo);
  229. PAL_HANDLE
  230. DkReceiveHandle (PAL_HANDLE handle);
  231. /* stream attribute structure */
  232. typedef struct {
  233. PAL_IDX type;
  234. PAL_NUM file_id;
  235. PAL_NUM size;
  236. PAL_NUM access_time;
  237. PAL_NUM change_time;
  238. PAL_NUM create_time;
  239. PAL_BOL disconnected;
  240. PAL_BOL readable;
  241. PAL_BOL writeable;
  242. PAL_BOL runnable;
  243. PAL_FLG share_flags;
  244. PAL_BOL nonblocking;
  245. PAL_BOL reuseaddr;
  246. PAL_NUM linger;
  247. PAL_NUM receivebuf;
  248. PAL_NUM sendbuf;
  249. PAL_NUM receivetimeout;
  250. PAL_NUM sendtimeout;
  251. PAL_BOL tcp_cork;
  252. PAL_BOL tcp_keepalive;
  253. PAL_BOL tcp_nodelay;
  254. } PAL_STREAM_ATTR;
  255. PAL_BOL
  256. DkStreamAttributesQuery (PAL_STR uri, PAL_STREAM_ATTR * attr);
  257. PAL_BOL
  258. DkStreamAttributesQuerybyHandle (PAL_HANDLE handle,
  259. PAL_STREAM_ATTR * attr);
  260. PAL_BOL
  261. DkStreamAttributesSetbyHandle (PAL_HANDLE handle, PAL_STREAM_ATTR * attr);
  262. PAL_NUM
  263. DkStreamGetName (PAL_HANDLE handle, PAL_BUF buffer, PAL_NUM size);
  264. PAL_BOL
  265. DkStreamChangeName (PAL_HANDLE handle, PAL_STR uri);
  266. /* The ABI supports multithreading through five calls to create,
  267. * sleep, yield the scheduler quantum for, resume execution of, and
  268. * terminate threads, as well as seven calls to create, signal, and
  269. * block on synchronization objects
  270. */
  271. #define PAL_THREAD_PARENT 0x00008000 /* Have the same parent as cloner */
  272. #define PAL_THREAD_DETACHED 0x00400000 /* Thread deattached */
  273. #define PAL_THREAD_STOPPED 0x02000000 /* Start in stopped state */
  274. #define PAL_THREAD_MASK 0x02408000
  275. PAL_HANDLE
  276. DkThreadCreate (PAL_PTR addr, PAL_PTR param, PAL_FLG flags);
  277. PAL_BUF
  278. DkThreadPrivate (PAL_BUF addr);
  279. // assuming duration to be in microseconds
  280. PAL_NUM
  281. DkThreadDelayExecution (PAL_NUM duration);
  282. void
  283. DkThreadYieldExecution (void);
  284. void
  285. DkThreadExit (void);
  286. PAL_BOL
  287. DkThreadResume (PAL_HANDLE thread);
  288. /* Exception Handling */
  289. /* Div-by-zero */
  290. #define PAL_EVENT_DIVZERO 1
  291. /* segmentation fault, protection fault, bus fault */
  292. #define PAL_EVENT_MEMFAULT 2
  293. /* illegal instructions */
  294. #define PAL_EVENT_ILLEGAL 3
  295. /* terminated by external program */
  296. #define PAL_EVENT_QUIT 4
  297. /* suspended by external program */
  298. #define PAL_EVENT_SUSPEND 5
  299. /* continued by external program */
  300. #define PAL_EVENT_RESUME 6
  301. /* failure within PAL calls */
  302. #define PAL_EVENT_FAILURE 7
  303. #define PAL_EVENT_NUM_BOUND 8
  304. #define PAL_EVENT_PRIVATE 0x0001 /* upcall specific to thread */
  305. #define PAL_EVENT_RESET 0x0002 /* reset the event upcall */
  306. PAL_BOL
  307. DkSetExceptionHandler (void (*handler) (PAL_PTR event, PAL_NUM arg,
  308. PAL_CONTEXT * context),
  309. PAL_NUM event, PAL_FLG flags);
  310. void
  311. DkExceptionReturn (PAL_PTR event);
  312. /* parameter: keeping int threadHandle for now (to be in sync with the paper).
  313. * We may want to replace it with a PAL_HANDLE. Ideally, either use PAL_HANDLE
  314. * or threadHandle.
  315. */
  316. PAL_HANDLE
  317. DkSemaphoreCreate (PAL_NUM initialCount, PAL_NUM maxCount);
  318. /* DkSemaphoreDestroy deprecated, replaced by DkObjectClose */
  319. /* TSAI: I preserve this API because DkObjectsWaitAny can't acquire multiple
  320. * counts of a semaphore. Acquiring multiple counts is required for
  321. * implementing a read-write-lock. To make this API complementary to
  322. * DkObjectsWaitAny, I added a 'timeout' to its arguments */
  323. /* DkSemaphoreAcquire deprecated */
  324. void
  325. DkSemaphoreRelease (PAL_HANDLE semaphoreHandle, PAL_NUM count);
  326. /* DkSemaphoreGetCurrentCount deprecated */
  327. PAL_HANDLE
  328. DkNotificationEventCreate (PAL_BOL initialState);
  329. PAL_HANDLE
  330. DkSynchronizationEventCreate (PAL_BOL initialState);
  331. /* DkEventDestroy deprecated, replaced by DkObjectClose */
  332. void
  333. DkEventSet (PAL_HANDLE eventHandle);
  334. /* DkEventWait deprecated, replaced by DkObjectsWaitAny */
  335. void
  336. DkEventClear (PAL_HANDLE eventHandle);
  337. #define NO_TIMEOUT ((PAL_NUM) -1)
  338. /* assuming timeout to be in microseconds */
  339. PAL_HANDLE
  340. DkObjectsWaitAny (PAL_NUM count, PAL_HANDLE * handleArray, PAL_NUM timeout);
  341. /* the ABI includes seven assorted calls to get wall clock
  342. * time, generate cryptographically-strong random bits, flush por-
  343. * tions of instruction caches, increment and decrement the reference
  344. * counts on objects shared between threads, and to coordinate
  345. * threads with the security monitor during process serialization
  346. */
  347. /* assuming the time to be in microseconds */
  348. PAL_NUM
  349. DkSystemTimeQuery (void);
  350. PAL_NUM
  351. DkRandomBitsRead (PAL_BUF buffer, PAL_NUM size);
  352. void
  353. DkObjectClose (PAL_HANDLE objectHandle);
  354. PAL_BOL
  355. DkInstructionCacheFlush (PAL_PTR addr, PAL_NUM size);
  356. PAL_HANDLE
  357. DkCreatePhysicalMemoryChannel (PAL_NUM * key);
  358. PAL_NUM
  359. DkPhysicalMemoryCommit (PAL_HANDLE channel, PAL_NUM entries, PAL_BUF * addrs,
  360. PAL_NUM * sizes, PAL_FLG flags);
  361. PAL_NUM
  362. DkPhysicalMemoryMap (PAL_HANDLE channel, PAL_NUM entries, PAL_BUF * addrs,
  363. PAL_NUM * sizes, PAL_FLG * prots);
  364. #endif /* PAL_H */