]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/mach/mig.h
xnu-201.19.tar.gz
[apple/xnu.git] / osfmk / mach / mig.h
index 501d6a8dcbfd75dbd8c435fe074e528b7167fdad..8bc149230b11e63c2b2acc07a13984863d442bfa 100644 (file)
@@ -45,11 +45,146 @@ typedef void       (*mig_stub_routine_t) (mach_msg_header_t *InHeadP,
 typedef mig_stub_routine_t mig_routine_t;
 
 /*
- * Definition for server implementation routines.  This is the routine
- * called by the MIG-generated server stub routine.
+ * Definition for MIG-generated server routine.  This routine takes a
+ * message, and returns the appropriate stub function for handling that
+ * message.
+ */
+typedef mig_routine_t (*mig_server_routine_t) (mach_msg_header_t *InHeadP);
+
+/*
+ * Generic definition for implementation routines.  These routines do
+ * the real work associated with this request.  This generic type is
+ * used for keeping the pointers in the subsystem array.
  */
 typedef kern_return_t   (*mig_impl_routine_t)(void);
 
-typedef mig_impl_routine_t entry_function_t;
+typedef struct mig_routine_descriptor {
+       mig_stub_routine_t       stub_routine;  /* Unmarshalling function   */
+       mach_msg_size_t          max_reply_msg; /* Max size for this reply  */
+} mig_routine_descriptor;
+typedef mig_routine_descriptor  *mig_routine_descriptor_t;
+
+typedef struct mig_subsystem {
+       mig_server_routine_t     server;        /* server routine           */
+       mach_msg_id_t            start;         /* Min routine number       */
+       mach_msg_id_t            end;           /* Max routine number + 1   */
+       mach_msg_size_t          max_reply;     /* Max reply message size   */
+       mach_msg_size_t          max_request;   /* Max request msg size     */
+       mig_routine_descriptor   routine[1];    /* Routine descriptor array */
+} *mig_subsystem_t;
+
+#ifdef KERNEL_PRIVATE
+/*
+ * MIG object runtime definitions
+ *
+ * Conforming MIG subsystems may enable this support to get
+ * significant assistance from the base mig_object_t implementation.
+ *
+ * Support includes:
+ *     - Transparency from port manipulation.
+ *     - Dymanic port allocation on first "remoting" of an object.
+ *     - Reference conversions from object to port and vice versa.
+ *     - Automatic port deallocation on no-more-senders.
+ *     - Support for multiple server implementations in a single space.
+ *     - Messaging bypass for local servers.
+ *     - Automatic hookup to base dispatch mechanism.
+ *     - General notification support
+ * Coming soon:
+ *     - User-level support
+ */
+typedef unsigned int                           mig_notify_type_t;
+
+typedef struct MIGIID {
+       unsigned long                           data1;
+       unsigned short                          data2;
+       unsigned short                          data3;
+       unsigned char                           data4[8];
+} MIGIID;
+
+typedef struct IMIGObjectVtbl                  IMIGObjectVtbl;
+typedef struct IMIGNotifyObjectVtbl            IMIGNotifyObjectVtbl;
+
+typedef struct IMIGObject {
+       IMIGObjectVtbl                          *pVtbl;
+} IMIGObject;
+
+typedef struct IMIGNotifyObject {
+       IMIGNotifyObjectVtbl                    *pVtbl;
+} IMIGNotifyObject;
+
+struct IMIGObjectVtbl {
+       kern_return_t (*QueryInterface)(
+                       IMIGObject              *object,
+                       const MIGIID            *iid,
+                       void                    **ppv);
+
+       unsigned long (*AddRef)(
+                       IMIGObject              *object);
+
+       unsigned long (*Release)(       
+                       IMIGObject              *object);
+
+       unsigned long (*GetServer)(
+                       IMIGObject              *object,
+                       mig_server_routine_t    *server);
+           
+       boolean_t (*RaiseNotification)(
+                       IMIGObject              *object,
+                       mig_notify_type_t       notify_type);
+
+       boolean_t (*RequestNotification)(
+                       IMIGObject              *object,
+                       IMIGNotifyObject        *notify,
+                       mig_notify_type_t       notify_type);
+};             
+
+/*
+ * IMIGNotifyObject
+ *
+ * A variant of the IMIGObject interface that is a sink for
+ * MIG notifications.
+ *
+ * A reference is held on both the subject MIGObject and the target
+ * MIGNotifyObject. Because of this, care must be exercised to avoid
+ * reference cycles.  Once a notification is raised, the object
+ * reference is returned and the request must be re-requested (if
+ * desired).
+ *
+ * One interesting note:  because this interface is itself a MIG
+ * object, one may request notification about state changes in
+ * the MIGNotifyObject itself.
+ */
+struct IMIGNotifyObjectVtbl {
+       kern_return_t (*QueryInterface)(
+                       IMIGNotifyObject        *notify,
+                       const MIGIID            *iid,
+                       void                    **ppv);
+
+       unsigned long (*AddRef)(        
+                       IMIGNotifyObject        *notify);
+
+       unsigned long (*Release)(       
+                       IMIGNotifyObject        *notify);
+
+       unsigned long (*GetServer)(
+                       IMIGNotifyObject        *notify,
+                       mig_server_routine_t    *server);
+
+       boolean_t (*RaiseNotification)(
+                       IMIGNotifyObject        *notify,
+                       mig_notify_type_t       notify_type);
+
+       boolean_t (*RequestNotification)(
+                       IMIGNotifyObject        *notify,
+                       IMIGNotifyObject        *notify_notify,
+                       mig_notify_type_t       notify_type);
+
+       void (*HandleNotification)(
+                       IMIGNotifyObject        *notify,
+                       IMIGObject              *object,
+                       mig_notify_type_t       notify_type);
+};
+
+#endif /* KERNEL_PRIVATE */
 
 #endif /* _MACH_MIG_H_ */