home *** CD-ROM | disk | FTP | other *** search
/ OpenStep (Enterprise) / OpenStepENTCD.toast / OEDEV / DEV.Z / mach.h < prev    next >
C/C++ Source or Header  |  1996-09-08  |  13KB  |  448 lines

  1. /*
  2.  * Copyright (c) 1995, NeXT Computer, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * Derived from the CMU mach headers.
  6.  */
  7.  
  8. #ifndef _MACH_EMULATION_H
  9. #define _MACH_EMULATION_H
  10.  
  11. #ifndef MACHEXPORT
  12. #if defined(WIN32) && defined(NEXTPDO)
  13. #define MACHEXPORT NEXTPDO
  14. #else
  15. #define MACHEXPORT extern
  16. #endif
  17. #endif
  18.  
  19. /*
  20.  * The greatly revered boolean type
  21.  */
  22.  
  23. #ifdef __svr4__
  24.  
  25. #include <sys/types.h>
  26.  
  27. #ifndef TRUE
  28. #define TRUE B_TRUE
  29. #endif
  30.  
  31. #ifndef FALSE
  32. #define FALSE B_FALSE
  33. #endif
  34.  
  35. #else
  36.  
  37. typedef unsigned int boolean_t;
  38.  
  39. #ifndef TRUE
  40. #define TRUE ((boolean_t) 1)
  41. #endif
  42.  
  43. #ifndef FALSE
  44. #define FALSE ((boolean_t) 0)
  45. #endif
  46.  
  47. #endif
  48.  
  49.  
  50.  
  51. /*
  52.  * Not a mach type, but lots of things need it.
  53.  */
  54. #if defined(WIN32) && !defined(NEXT_CRT)
  55.  
  56. #ifndef _DEFINE_PID_T
  57. #define _DEFINE_PID_T
  58. typedef unsigned long pid_t;
  59. #endif _DEFINE_PID_T
  60.  
  61. #endif
  62.  
  63.  
  64. /*
  65.  * Basic mach types
  66.  */
  67.  
  68. typedef unsigned int port_t;
  69. typedef unsigned int task_t;
  70.  
  71.  
  72.  
  73. /*
  74.  * Kernel return values
  75.  */
  76.  
  77. typedef int kern_return_t;
  78.  
  79. #define KERN_SUCCESS            0
  80. #define KERN_INVALID_ADDRESS        1
  81. #define KERN_PROTECTION_FAILURE        2
  82. #define KERN_NO_SPACE            3
  83. #define KERN_INVALID_ARGUMENT        4
  84. #define KERN_FAILURE            5
  85. #define KERN_RESOURCE_SHORTAGE        6
  86. #define KERN_NOT_RECEIVER        7
  87. #define KERN_NO_ACCESS            8
  88. #define KERN_MEMORY_FAILURE        9
  89. #define KERN_MEMORY_ERROR        10
  90. #define    KERN_ALREADY_IN_SET        11    /* obsolete */
  91. #define KERN_NOT_IN_SET            12
  92. #define KERN_NAME_EXISTS        13
  93. #define KERN_ABORTED            14
  94. #define KERN_INVALID_NAME        15
  95. #define    KERN_INVALID_TASK        16
  96. #define KERN_INVALID_RIGHT        17
  97. #define KERN_INVALID_VALUE        18
  98. #define    KERN_UREFS_OVERFLOW        19
  99. #define    KERN_INVALID_CAPABILITY        20
  100. #define KERN_RIGHT_EXISTS        21
  101. #define    KERN_INVALID_HOST        22
  102. #define KERN_MEMORY_PRESENT        23
  103.  
  104.  
  105.  
  106. /*
  107.  * Tasks
  108.  */
  109.  
  110. #define TASK_KERNEL_PORT 1    /* Not implemented */
  111. #define TASK_NOTIFY_PORT 2    /* Task receives kernel IPC notifications */
  112. #define TASK_EXCEPTION_PORT 3    /* Not implemented */
  113. #define TASK_BOOTSTRAP_PORT 4    /* Bootstrap server port */
  114.  
  115. #define task_get_kernel_port(task, port) \
  116.     (task_get_special_port((task), TASK_KERNEL_PORT, (port)))
  117. #define task_set_kernel_port(task, port) \
  118.     (task_set_special_port((task), TASK_KERNEL_PORT, (port)))
  119. #define task_get_notify_port(task, port) \
  120.     (task_get_special_port((task), TASK_NOTIFY_PORT, (port)))
  121. #define task_set_notify_port(task, port) \
  122.     (task_set_special_port((task), TASK_NOTIFY_PORT, (port)))
  123. #define task_get_exception_port(task, port) \
  124.     (task_get_special_port((task), TASK_EXCEPTION_PORT, (port)))
  125. #define task_set_exception_port(task, port) \
  126.     (task_set_special_port((task), TASK_EXCEPTION_PORT, (port)))
  127. #define task_get_bootstrap_port(task, port) \
  128.     (task_get_special_port((task), TASK_BOOTSTRAP_PORT, (port)))
  129. #define task_set_bootstrap_port(task, port) \
  130.     (task_set_special_port((task), TASK_BOOTSTRAP_PORT, (port)))
  131.  
  132.  
  133.  
  134. /*
  135.  * Ports
  136.  */
  137.  
  138. typedef int port_type_t;
  139. typedef port_t port_all_t;
  140. typedef port_t port_name_t;
  141. typedef port_t port_set_name_t;
  142. typedef port_t port_name_array_t;
  143. typedef port_t *port_array_t;
  144.  
  145. #define PORT_TYPE_NONE        0    /* No rights */
  146. #define PORT_TYPE_SEND        1    /* Send rights */
  147. #define PORT_TYPE_RECEIVE_OWN    7    /* Send, receive, ownership */
  148. #define PORT_TYPE_OWN        7    /* Same diff in our world */
  149. #define PORT_TYPE_SET        9    /* Port set ownership */
  150.  
  151. #ifdef WIN32
  152. #define PORT_TYPE_MSGQ        10
  153. #define PORT_TYPE_HANDLE    11
  154. #endif
  155.  
  156. #define PORT_NULL ((port_t) 0)
  157.  
  158. #define PORT_BACKLOG_DEFAULT    5
  159. #define PORT_BACKLOG_MAX    16
  160.  
  161.  
  162.  
  163. /*
  164.  * vm types
  165.  */
  166.  
  167. typedef unsigned long vm_offset_t;
  168. typedef unsigned long vm_size_t;
  169.  
  170. typedef vm_offset_t pointer_t;
  171. typedef vm_offset_t vm_address_t;
  172.  
  173. typedef vm_offset_t vm_region_t;
  174. typedef vm_region_t *vm_region_array_t;
  175.  
  176. vm_size_t __vm_page_size (void);
  177. #define vm_page_size __vm_page_size()
  178.  
  179. #define round_page(x)    (((vm_offset_t)(x) + (vm_page_size - 1)) & ~(vm_page_size - 1))
  180. #define trunc_page(x)    ((vm_offset_t)(x) & ~(vm_page_size - 1))
  181.  
  182. /*
  183.  * Message data structures.
  184.  *
  185.  * Messages consist of two parts: a fixed-size header, immediately
  186.  * followed by a variable-size array of typed data items.
  187.  *
  188.  */
  189.  
  190. typedef unsigned int msg_size_t;
  191.  
  192. typedef    struct {
  193.     unsigned int msg_unused : 24,
  194.                  msg_simple : 8;
  195.     msg_size_t   msg_size;
  196.     int          msg_type;
  197.     port_t       msg_local_port;
  198.     port_t       msg_remote_port;
  199.     int          msg_id;
  200. } msg_header_t;
  201.  
  202. #define msg_info_bits    msg_unused
  203. #define MSG_IS_LOCAL    (0x1)
  204.  
  205. #define MSG_SIZE_MAX    8192
  206.  
  207. /*
  208.  * Known values for the msg_type field.
  209.  */
  210.  
  211. #define MSG_TYPE_NORMAL        0
  212. #define MSG_TYPE_EMERGENCY    1
  213. #define MSG_TYPE_ENCRYPTED    (1 << 7)
  214. #define MSG_TYPE_RPC            (1 << 8)
  215.  
  216. /*
  217.  * Each data item is preceded by a description of that
  218.  * item, including what type of data, how big it is, and
  219.  * how many of them are present.
  220.  *
  221.  * The actual data will either follow this type
  222.  * descriptor ("inline") or will be specified by a pointer.
  223.  *
  224.  * If the type name, size, or number is too large to be encoded
  225.  * in this structure, the "longform" option may be selected,
  226.  * and those fields must immediately follow in full integer fields.
  227.  *
  228.  * For convenience, out-of-line data regions or port rights may
  229.  * be deallocated when the message is sent by specifying the
  230.  * "deallocate" field.  Beware: if the data item in question is both
  231.  * out-of-line and contains port rights, then both will be deallocated.
  232.  */
  233.  
  234. typedef struct  {
  235.     unsigned int msg_type_name : 8, /* What kind of data */
  236.     msg_type_size : 8,          /* How many bits is each item */
  237.     msg_type_number : 12,       /* How many items are there */
  238.     msg_type_inline : 1,        /* If true, data follows; else a pointer */
  239.     msg_type_longform : 1,      /* Name, size, number follow: see above */
  240.     msg_type_deallocate : 1,    /* Deallocate port rights or memory */
  241.     msg_type_unused : 1;
  242. } msg_type_t;
  243.  
  244.  
  245. typedef struct {
  246.     msg_type_t  msg_type_header; 
  247.     short       msg_type_long_name; 
  248.     short       msg_type_long_size; 
  249.     int         msg_type_long_number; 
  250. } msg_type_long_t;
  251.  
  252. /*
  253.  * Known values for the msg_type_name field.
  254.  *
  255.  * The only types known to the Mach kernel are
  256.  * the port types, and those types used in the
  257.  * kernel RPC interface.
  258.  */
  259.  
  260. #define MSG_TYPE_UNSTRUCTURED    0
  261. #define MSG_TYPE_BIT        0
  262. #define MSG_TYPE_BOOLEAN    0
  263. #define MSG_TYPE_INTEGER_16    1
  264. #define MSG_TYPE_INTEGER_32    2
  265. #define MSG_TYPE_PORT_ALL    5
  266. #define MSG_TYPE_PORT        6
  267. #define MSG_TYPE_CHAR        8
  268. #define MSG_TYPE_BYTE        9
  269. #define MSG_TYPE_INTEGER_8    9
  270. #define MSG_TYPE_REAL        10
  271. #define MSG_TYPE_STRING        12
  272. #define MSG_TYPE_STRING_C    12
  273. #define MSG_TYPE_PORT_NAME    15        /* A capability name */
  274.  
  275. #define MSG_TYPE_POLYMORPHIC    ((unsigned int) -1)
  276.  
  277. /*
  278.  * Is a given item a port?
  279.  */
  280. #define MSG_TYPE_PORT_ANY(x) \
  281.     (((x) == MSG_TYPE_PORT) || ((x) == MSG_TYPE_PORT_ALL))
  282.  
  283. /*
  284.  * Options to IPC primitives.
  285.  *
  286.  * These can be combined by or'ing; the combination RPC call
  287.  * uses both SEND_ and RCV_ options at once.
  288.  */
  289.  
  290. typedef int msg_option_t;
  291. typedef int msg_timeout_t;
  292.  
  293.  
  294. #define MSG_OPTION_NONE     0x0000
  295.  
  296. #define SEND_TIMEOUT    0x0001    /* Terminate on timeout elapsed */
  297. #define SEND_NOTIFY    0x0002    /* Terminate with reply message if need be (unimplemented) */
  298. #define SEND_INTERRUPT    0x0004    /* Terminate on software interrupt (unimplemented) */
  299. #define SEND_SWITCH    0x0020    /* Use handoff scheduling (unimplemented) */
  300.  
  301. #define RCV_TIMEOUT    0x0100    /* Terminate on timeout elapsed */
  302. #define RCV_NO_SENDERS    0x0200    /* Terminate if I'm the only sender left (unimplemented) */
  303. #define RCV_INTERRUPT    0x0400    /* Terminate on software interrupt (unimplemented) */
  304. #define RCV_LARGE    0x1000  /* Don't dequeue too large messages */
  305.  
  306.  
  307. /*
  308.  * Returns from IPC primitives.
  309.  *
  310.  * Values are separate in order to allow RPC users to
  311.  * distinguish which operation failed; for successful completion,
  312.  * this doesn't matter.
  313.  */
  314.  
  315. typedef int msg_return_t;
  316.  
  317. #define SEND_SUCCESS        KERN_SUCCESS
  318. #define SEND_INVALID_MEMORY    -101    /* Message or OOL data invalid */
  319. #define SEND_INVALID_PORT    -102    /* Reference to inacessible port */
  320. #define SEND_TIMED_OUT        -103    /* Terminated due to timeout */
  321. #define SEND_WILL_NOTIFY    -105    /* Msg accepted provisionally */
  322. #define SEND_NOTIFY_IN_PROGRESS    -106    /* Already awaiting a notification */
  323. #define SEND_KERNEL_REFUSED    -107    /* Message to the kernel refused */
  324. #define SEND_INTERRUPTED    -108    /* Software interrupt during send */
  325. #define SEND_MSG_TOO_LARGE    -109    /* Message specified was too large */
  326. #define SEND_MSG_TOO_SMALL    -110    /* Data specified exceeds msg size */
  327.  
  328. #define RCV_SUCCESS        KERN_SUCCESS
  329. #define RCV_INVALID_MEMORY    -201
  330. #define RCV_INVALID_PORT    -202
  331. #define RCV_TIMED_OUT        -203
  332. #define RCV_TOO_LARGE        -204    /* Msg structure too small for data */
  333. #define RCV_NOT_ENOUGH_MEMORY    -205    /* Can't find space for OOL data */
  334. #define RCV_ONLY_SENDER        -206    /* Receiver is only sender */
  335. #define RCV_INTERRUPTED        -207
  336. #define RCV_PORT_CHANGE        -208    /* Port was put in a set */
  337. #define RCV_KERNEL_REFUSED      -209    /* PDO specific */
  338.  
  339. #define RPC_SUCCESS        KERN_SUCCESS
  340.  
  341.  
  342. /*
  343.  * MIG errors.
  344.  */
  345.  
  346. #define MIG_TYPE_ERROR        -300    /* client type check failure */
  347. #define MIG_REPLY_MISMATCH    -301    /* wrong reply message ID */
  348. #define MIG_REMOTE_ERROR    -302    /* server detected error */
  349. #define MIG_BAD_ID        -303    /* bad request message ID */
  350. #define MIG_BAD_ARGUMENTS    -304    /* server type check failure */
  351. #define MIG_NO_REPLY        -305    /* no reply should be sent */
  352. #define MIG_EXCEPTION        -306    /* server raised exception */
  353. #define MIG_ARRAY_TOO_LARGE    -307    /* array not large enough */
  354. #define MIG_SERVER_DIED        -308    /* server died */
  355. #define MIG_DESTROY_REQUEST    -309    /* destroy request with no reply */
  356.  
  357. typedef struct {
  358.         msg_header_t        Head;
  359.         msg_type_t        RetCodeType;
  360.         kern_return_t        RetCode;
  361. } death_pill_t;
  362.  
  363.  
  364.  
  365.  
  366. /*
  367.  * The IPC primitive functions themselves
  368.  */
  369.  
  370.  
  371. MACHEXPORT msg_return_t msg_send (msg_header_t *header, msg_option_t option, msg_timeout_t timeout);
  372. MACHEXPORT msg_return_t msg_receive (msg_header_t *header, msg_option_t option, msg_timeout_t timeout);
  373. MACHEXPORT msg_return_t msg_rpc (msg_header_t *header, msg_option_t option, msg_size_t rcv_size, msg_timeout_t send_timeout, msg_timeout_t rcv_timeout);
  374.  
  375. /*
  376.  * task routines
  377.  */
  378.  
  379. //#define task_self() ((task_t) 1)
  380. //XXX #warning fix this when building in rc
  381. #define task_self() ((task_t) 0)
  382.  
  383.  
  384. /*
  385.  * special port routines
  386.  */
  387.  
  388. MACHEXPORT kern_return_t task_get_special_port (task_t task, int type, port_t *port);
  389. MACHEXPORT kern_return_t task_set_special_port (task_t task, int type, port_t port);
  390.  
  391. /*
  392.  * vm routines
  393.  */
  394.  
  395. MACHEXPORT kern_return_t vm_allocate (task_t task, vm_address_t *addr, vm_size_t size, boolean_t anywhere);
  396. MACHEXPORT kern_return_t vm_deallocate (task_t task, vm_address_t addr, vm_size_t size);
  397. MACHEXPORT kern_return_t vm_copy (task_t task, vm_address_t src, vm_size_t size, vm_address_t dst);
  398. MACHEXPORT kern_return_t map_fd (int fd, vm_offset_t offset, vm_offset_t *addr, boolean_t find_space, vm_size_t size);
  399.  
  400. /*
  401.  * port routines
  402.  */
  403.  
  404. MACHEXPORT kern_return_t port_allocate (task_t task, port_t *p);
  405. MACHEXPORT kern_return_t port_deallocate (task_t task, port_t p);
  406. MACHEXPORT kern_return_t port_set_backlog (task_t task, port_t port, unsigned backlog);
  407. MACHEXPORT kern_return_t port_type (task_t task, port_name_t port, port_type_t *type);
  408. MACHEXPORT kern_return_t port_status (task_t task, port_name_t port, port_set_name_t *set, int *num_msgs, int *backlog, boolean_t *owner, boolean_t *receiver);
  409.  
  410. #ifdef WIN32
  411. MACHEXPORT kern_return_t port_msgq_allocate (task_t task, unsigned long mask, port_t *p);
  412. MACHEXPORT kern_return_t port_handle_allocate (task_t task, void *handle, port_t *p);
  413. #endif
  414.  
  415. /*
  416.  * port set routines
  417.  */
  418.  
  419. MACHEXPORT kern_return_t port_set_allocate (task_t task, port_set_name_t *portsetp);
  420. MACHEXPORT kern_return_t port_set_deallocate (task_t task, port_set_name_t portset);
  421. MACHEXPORT kern_return_t port_set_add (task_t task, port_set_name_t portset, port_t port);
  422. MACHEXPORT kern_return_t port_set_remove (task_t task, port_t port);
  423. MACHEXPORT kern_return_t port_set_status(task_t task, port_set_name_t set_name, port_name_array_t *members, unsigned int *members_count);
  424. MACHEXPORT kern_return_t port_set_add_again (task_t task, port_set_name_t portset, port_t port);
  425. MACHEXPORT kern_return_t port_set_remove_once (task_t task, port_set_name_t portset, port_t port);
  426.  
  427. /*
  428.  * error routines
  429.  */
  430.  
  431. MACHEXPORT const char *mach_error_string (kern_return_t error_value);
  432. MACHEXPORT void mach_error (const char *str, kern_return_t error_value);
  433. MACHEXPORT char *mach_errormsg (kern_return_t error_value);
  434.  
  435. /*
  436.  * special ports
  437.  */
  438. MACHEXPORT port_t bootstrap_port;
  439. MACHEXPORT port_t name_server_port;
  440.  
  441. #include <mach/notify.h>
  442. #include <mach/cthreads.h>
  443. #include <servers/bootstrap.h>
  444. #include <servers/netname.h>
  445.  
  446. #endif _MACH_EMULATION_H
  447.  
  448.