]> git.saurik.com Git - apple/xnu.git/blobdiff - osfmk/mach/rpc.h
xnu-344.49.tar.gz
[apple/xnu.git] / osfmk / mach / rpc.h
index 2794e4dd9721323e018659b7b939f83afd95860f..229ce23fd3ec2c3f86d2a4e74b1679d1a917c483 100644 (file)
@@ -1,21 +1,24 @@
 /*
- * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
+ * Copyright (c) 2002,2000 Apple Computer, Inc. All rights reserved.
  *
  * @APPLE_LICENSE_HEADER_START@
  * 
- * The contents of this file constitute Original Code as defined in and
- * are subject to the Apple Public Source License Version 1.1 (the
- * "License").  You may not use this file except in compliance with the
- * License.  Please obtain a copy of the License at
- * http://www.apple.com/publicsource and read it before using this file.
+ * Copyright (c) 1999-2003 Apple Computer, Inc.  All Rights Reserved.
  * 
- * This Original Code and all software distributed under the License are
- * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ * 
+ * The Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
- * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
- * License for the specific language governing rights and limitations
- * under the License.
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
  * 
  * @APPLE_LICENSE_HEADER_END@
  */
 #include <mach/machine/rpc.h>
 #include <mach/thread_status.h>
 
-#ifdef MACH_KERNEL_PRIVATE
-#include <ipc/ipc_object.h>
-#endif /* MACH_KERNEL_PRIVATE */
+#include <sys/appleapiopts.h>
+
+#ifdef __APPLE_API_OBSOLETE
 
 /*
- * The various bits of the type field of the routine_arg_descriptor
+ * These are the types for RPC-specific variants of the MIG routine
+ * descriptor and subsystem data types.
+ *
+ * THIS IS ONLY FOR COMPATIBILITY.  WE WILL NOT BE IMPLEMENTING THIS.
  */
 
-/* The basic types */
-
-#define TYPE_SHIFT                      0
-#define MACH_RPC_PORT                  (1 << TYPE_SHIFT)
-#define MACH_RPC_ARRAY                  (1 << (TYPE_SHIFT + 1))
-#define MACH_RPC_VARIABLE               (1 << (TYPE_SHIFT + 2))
-#define LAST_TYPE_BIT                   (TYPE_SHIFT+3)
-
-/* XXX Port arrays need not be variable arrays, as assumed below. Fixme. */
-#define MACH_RPC_ARRAY_FIX             (MACH_RPC_ARRAY)
-#define MACH_RPC_ARRAY_FIXED           (MACH_RPC_ARRAY)
-#define MACH_RPC_ARRAY_VAR             (MACH_RPC_ARRAY | MACH_RPC_VARIABLE)
-#define MACH_RPC_ARRAY_VARIABLE                (MACH_RPC_ARRAY | MACH_RPC_VARIABLE)
-#define MACH_RPC_PORT_ARRAY            (MACH_RPC_PORT  | MACH_RPC_ARRAY_VAR)
-
-/* Argument direction bits */
-
-#define DIRECT_SHIFT                   LAST_TYPE_BIT
-#define DIRECTION_SHIFT                 LAST_TYPE_BIT
-#define MACH_RPC_IN                    (1 << DIRECTION_SHIFT)
-#define MACH_RPC_OUT                   (1 << (DIRECTION_SHIFT + 1))
-#define LAST_DIRECT_BIT                (DIRECTION_SHIFT + 2)
-#define LAST_DIRECTION_BIT              (DIRECTION_SHIFT + 2)
-
-#define MACH_RPC_INOUT                 (MACH_RPC_IN | MACH_RPC_OUT)
-
-/* Persist and pointer bit */
-
-#define POINTER_SHIFT                   LAST_DIRECTION_BIT
-#define MACH_RPC_POINTER                (1 << POINTER_SHIFT)
-#define LAST_POINTER_BIT                (POINTER_SHIFT + 1)
-
-/* Port disposition bits */
-
-#define NAME_SHIFT                     LAST_POINTER_BIT
-#define MACH_RPC_RECEIVE                (1 << NAME_SHIFT)
-#define MACH_RPC_SEND                   (2 << NAME_SHIFT)
-#define MACH_RPC_SEND_ONCE              (3 << NAME_SHIFT)
-#define LAST_NAME_BIT                  (NAME_SHIFT + 2)
-
-#define ACTION_SHIFT                   LAST_NAME_BIT
-#define MACH_RPC_MOVE                   (1 << ACTION_SHIFT)
-#define MACH_RPC_COPY                   (2 << ACTION_SHIFT)
-#define MACH_RPC_MAKE                   (3 << ACTION_SHIFT)
-#define LAST_ACTION_BIT                 (ACTION_SHIFT + 2)
-
-#define MACH_RPC_MOVE_RECEIVE          (MACH_RPC_MOVE | MACH_RPC_RECEIVE)
-#define MACH_RPC_MOVE_SEND             (MACH_RPC_MOVE | MACH_RPC_SEND)
-#define MACH_RPC_COPY_SEND             (MACH_RPC_COPY | MACH_RPC_SEND)
-#define MACH_RPC_MAKE_SEND             (MACH_RPC_MAKE | MACH_RPC_SEND)
-#define MACH_RPC_MOVE_SEND_ONCE                (MACH_RPC_MOVE | MACH_RPC_SEND_ONCE)
-#define MACH_RPC_MAKE_SEND_ONCE                (MACH_RPC_MAKE | MACH_RPC_SEND_ONCE)
-
-/* Hint for virtual vs. physical copy */ 
-
-#define OPTION_SHIFT                    LAST_ACTION_BIT
-#define MACH_RPC_PHYSICAL_COPY         (1 << OPTION_SHIFT)
-#define MACH_RPC_VIRTUAL_COPY          (1 << (OPTION_SHIFT + 1))
-#define LAST_OPTION_BIT                 (OPTION_SHIFT + 2)
-
-/* Deallocate? */
-
-#define DEALLOCATE_SHIFT                LAST_OPTION_BIT
-#define MACH_RPC_DEALLOCATE            (1 << DEALLOCATE_SHIFT)
-#define LAST_DEALLOCATE_BIT             (DEALLOCATE_SHIFT + 1)
-
-/* Argument is already on the stack */
-
-#define ONSTACK_SHIFT                   LAST_DEALLOCATE_BIT
-#define MACH_RPC_ONSTACK               (1 << ONSTACK_SHIFT)
-#define LAST_ONSTACK_BIT                (ONSTACK_SHIFT + 1)
-
-/* Is variable array bounded? Derived from type and arg.size */
-
-#define BOUND_SHIFT                    LAST_ONSTACK_BIT
-#define MACH_RPC_BOUND                 (1 << BOUND_SHIFT)
-#define MACH_RPC_UNBOUND               (0)
-#define BOUND                          MACH_RPC_BOUND
-#define UNBND                          MACH_RPC_UNBOUND
-#define LAST_BOUND_BIT                 (BOUND_SHIFT + 1)
-
 /*
  * Basic mach rpc types.
  */
@@ -139,41 +64,37 @@ typedef unsigned int       routine_arg_size;
 /*
  * Definitions for a signature's argument and routine descriptor's.
  */
-struct routine_arg_descriptor {
+struct rpc_routine_arg_descriptor {
        routine_arg_type        type;      /* Port, Array, etc. */
         routine_arg_size        size;      /* element size in bytes */
         routine_arg_size        count;     /* number of elements */
        routine_arg_offset      offset;    /* Offset in list of routine args */
 };
-typedef struct routine_arg_descriptor *routine_arg_descriptor_t;
+typedef struct rpc_routine_arg_descriptor *rpc_routine_arg_descriptor_t;
 
-struct routine_descriptor {
+struct rpc_routine_descriptor {
        mig_impl_routine_t      impl_routine;   /* Server work func pointer   */
        mig_stub_routine_t      stub_routine;   /* Unmarshalling func pointer */
        unsigned int            argc;           /* Number of argument words   */
        unsigned int            descr_count;    /* Number of complex argument */
                                                /* descriptors                */
-       struct routine_arg_descriptor *
+       rpc_routine_arg_descriptor_t
                                arg_descr;      /* Pointer to beginning of    */
                                                /* the arg_descr array        */
        unsigned int            max_reply_msg;  /* Max size for reply msg     */
 };
-typedef struct routine_descriptor *routine_descriptor_t;
+typedef struct rpc_routine_descriptor *rpc_routine_descriptor_t;
 
-#define DESCR_SIZE(x) ((x)->descr_count * sizeof(struct routine_arg_descriptor))
+#define RPC_DESCR_SIZE(x) ((x)->descr_count * \
+                               sizeof(struct rpc_routine_arg_descriptor))
 
 struct rpc_signature {
-    struct routine_descriptor rd;
-    struct routine_arg_descriptor rad[1];
+    struct rpc_routine_descriptor rd;
+    struct rpc_routine_arg_descriptor rad[1];
 };
 
-#ifdef MACH_KERNEL_PRIVATE
-
-typedef struct rpc_signature *rpc_signature_t;
-
-#endif
-
 #define RPC_SIGBUF_SIZE 8
+
 /*
  *     A subsystem describes a set of server routines that can be invoked by
  *     mach_rpc() on the ports that are registered with the subsystem.  For
@@ -193,18 +114,18 @@ typedef struct rpc_signature *rpc_signature_t;
  *     contiguous.
  */
 struct rpc_subsystem {
-       struct subsystem *subsystem;    /* Reserved for system use */
+       void            *reserved;      /* Reserved for system use */
 
        mach_msg_id_t   start;          /* Min routine number */
        mach_msg_id_t   end;            /* Max routine number + 1 */
        unsigned int    maxsize;        /* Max mach_msg size */
        vm_address_t    base_addr;      /* Address of this struct in user */
 
-       struct routine_descriptor       /* Array of routine descriptors */
+       struct rpc_routine_descriptor   /* Array of routine descriptors */
                        routine[1       /* Actually, (start-end+1) */
                                 ];
 
-       struct routine_arg_descriptor
+       struct rpc_routine_arg_descriptor
                        arg_descriptor[1   /* Actually, the sum of the descr_ */
                                        ]; /* count fields for all routines   */
 };
@@ -212,213 +133,6 @@ typedef struct rpc_subsystem  *rpc_subsystem_t;
 
 #define RPC_SUBSYSTEM_NULL     ((rpc_subsystem_t) 0)
 
-/* 
- *     New RPC declarations
- *
- *     First pass at definitions and types for the new rpc service.
- *     This is subject to revision.
- */
-
-/*
- *     RPC macros
- */
-
-#define RPC_MASK(shift,last)                                            \
-        ( ((1 << ((last)-(shift)))-1) << (shift) )
-
-#define RPC_FIELD(field,shift,last)                                     \
-        ( (field) & (((1 << ((last)-(shift)))-1) << (shift)) )
-
-#define RPC_BOUND(dsc)                                                  \
-        (((RPC_FIELD((dsc).type,TYPE_SHIFT+1,TYPE_SHIFT+3) ==           \
-           MACH_RPC_ARRAY_VARIABLE) && (dsc).count != 0) ? MACH_RPC_BOUND : 0)
-
-#define ROUNDUP2(x,n)    ((((unsigned)(x)) + (n) - 1) & ~((n)-1))
-#define ROUNDWORD(x)    ROUNDUP2(x,sizeof(int))
-
-/*
- *      RPC errors
- *
- *      Display and process errors of different severity, from just for
- *      information only to fatal (panic). Error code colors indicate how
- *      difficult it is for the subsystem to handle the error correctly.
- *      The implication is that, for example, early versions of the code may
- *      not be handling code red errors properly. The code should use this
- *      facility instead of regular printf's.
- */
-
-#define        MACH_RPC_DEBUG  1
-
-#define ERR_INFO        1               /* purely informational */
-#define ERR_GREEN       2               /* easily handled error */
-#define ERR_YELLOW      3               /* medium difficult error */
-#define ERR_RED         4               /* difficult to handle error */
-#define ERR_FATAL       5               /* unrecoverable error, panic */
-
-#if MACH_RPC_DEBUG > 1
-#define rpc_error(E,S)                                                  \
-        printf("RPC error ");                                           \
-        rpc_error_show_severity(S);                                     \
-        printf("in file \"%s\", line %d: ", __FILE__, __LINE__);        \
-        printf E ;                                                      \
-        printf("\n");                                                   \
-        rpc_error_severity(S)
-#else
-#define rpc_error(E,S)                                                  \
-       if ((S) == ERR_FATAL || (S) == ERR_RED) {                       \
-        printf("RPC error ");                                           \
-        rpc_error_show_severity(S);                                     \
-        printf("in file \"%s\", line %d: ", __FILE__, __LINE__);        \
-        printf E ;                                                      \
-        printf("\n");                                                   \
-        rpc_error_severity(S);                                         \
-       }
-#endif /* MACH_RPC_DEBUG */
-
-/*
- *      RPC buffer size and break points
- *
- *      These values define the rpc buffer size on the kernel stack,
- *      and break point values for switching to virtual copy (cow).
- *      This should be in a machine dependent include file. All sizes
- *      are in word (sizeof(int)) units.
- */
-
-#define RPC_KBUF_SIZE   16              /* kernel stack buffer size (ints) */
-#define RPC_COW_SIZE    1024            /* size where COW is a win (ints) */
-#define RPC_DESC_COUNT  4               /* default descriptor count */
-
-
-/*
- *      RPC copy state
- *
- *      Record the rpc copy state for arrays, so we can unwind our state
- *      during error processing. There is one entry per complex (signatured)
- *      argument. The first entry is marked COPY_TYPE_ALLOC_KRN if this record
- *      itself was kalloc'd because the number of complex arg descriptors
- *      exceeded the default value (RPC_DESC_COUNT). This is not a conflict
- *      since the first argument is always the destination port, never an array.
- */
-
-#define COPY_TYPE_NO_COPY               0       /* nothing special */
-#define COPY_TYPE_ON_KSTACK             1       /* array is on kernel stack */
-#define COPY_TYPE_ON_SSTACK             2       /* array is on server stack */
-#define COPY_TYPE_VIRTUAL_IN            3       /* vm_map_copyin part of cow */
-#define COPY_TYPE_VIRTUAL_OUT_SVR       4       /* map cpyout svr part of cow */
-#define COPY_TYPE_VIRTUAL_OUT_CLN       5       /* map cpyout cln part of cow */
-#define COPY_TYPE_ALLOC_KRN             6       /* kernel kalloc'd for array */
-#define COPY_TYPE_ALLOC_SVR             7       /* vm_alloc'd in server space */
-#define COPY_TYPE_ALLOC_CLN             8       /* vm_alloc'd in client space */
-#define COPY_TYPE_PORT                  9       /* plain port translated */
-#define COPY_TYPE_PORT_ARRAY            10      /* port array translated */
-
-
-/*
- *     RPC types
- */
-typedef int                    rpc_id_t;
-typedef int                    rpc_return_t;
-typedef unsigned int           rpc_size_t;
-typedef unsigned int           rpc_offset_t;
-
-struct rpc_copy_state {
-        unsigned                copy_type;      /* what kind of copy */
-        vm_offset_t             alloc_addr;     /* address to free */
-};
-typedef struct rpc_copy_state *rpc_copy_state_t;
-typedef struct rpc_copy_state  rpc_copy_state_data_t;
-
-typedef boolean_t (*copyfunc_t)(const char *, char *, vm_size_t);
-
-
-/*
- *     RPC function declarations
- */
-
-#ifdef CALLOUT_RPC_MODEL
-
-extern
-void            rpc_bootstrap( void );
-
-extern
-void            rpc_remote_bootstrap( void );
-
-extern 
-rpc_return_t   mach_rpc_trap(
-                               mach_port_name_t        dest_port,
-                               rpc_id_t                routine_num,
-                               rpc_signature_t signature_ptr,
-                               rpc_size_t      signature_size );
-                                                                               
-extern 
-rpc_return_t   mach_rpc_return_trap( void );
-
-extern 
-rpc_return_t   mach_rpc_return_error( void );
-
-void                   mach_rpc_return_wrapper( void );
-
-void                   rpc_upcall( 
-                               vm_offset_t             stack,
-                               vm_offset_t             new_stack, 
-                               vm_offset_t             server_func, 
-                               int                     return_code );
-
-void                   rpc_error_severity( int severity );
-void                   rpc_error_show_severity( int severity );
-unsigned int           name_rpc_to_ipc( unsigned int action );
-
-void                   clean_port_array(
-                               ipc_object_t *          array,
-                               unsigned                count,
-                               unsigned                cooked,
-                               unsigned                direct );
-
-void                   unwind_rpc_state( 
-                               routine_descriptor_t    routine, 
-                               rpc_copy_state_t        state, 
-                               int *                   arg_buf );
-
-kern_return_t          unwind_invoke_state( 
-                               thread_act_t            thr_act );
-
-kern_return_t          rpc_invke_args_in( 
-                               routine_descriptor_t    routine, 
-                               rpc_copy_state_t        state,
-                               int *                   arg_buf,
-                               copyfunc_t              infunc );
-
-kern_return_t          rpc_invke_args_out( 
-                               routine_descriptor_t    routine, 
-                               rpc_copy_state_t        state,
-                               int *                   arg_buf, 
-                               int **                  new_sp,
-                               copyfunc_t              outfunc );
-
-kern_return_t          rpc_reply_args_in( 
-                               routine_descriptor_t    routine, 
-                               rpc_copy_state_t        state,
-                               int *                   svr_buf,
-                               copyfunc_t              infunc );
-
-kern_return_t          rpc_reply_args_out( 
-                               routine_descriptor_t    routine, 
-                               rpc_copy_state_t        state,
-                               int *                   svr_buf, 
-                               int *                   cln_buf,
-                               copyfunc_t              outfunc );
-
-#endif  /* CALLOUT_RPC_MODEL */
-
-/*
- * libmach helper functions:
- */
-extern rpc_subsystem_t mach_subsystem_join(
-                               rpc_subsystem_t,
-                               rpc_subsystem_t,
-                               unsigned int *,
-                               void *(* )(int));
+#endif  /* __APPLE_API_OBSOLETE */
 
 #endif /* _MACH_RPC_H_ */
-
-