Annotation of XNU/osfmk/mach/rpc.h, revision 1.1.1.1

1.1       root        1: /*
                      2:  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
                      3:  *
                      4:  * @APPLE_LICENSE_HEADER_START@
                      5:  * 
                      6:  * The contents of this file constitute Original Code as defined in and
                      7:  * are subject to the Apple Public Source License Version 1.1 (the
                      8:  * "License").  You may not use this file except in compliance with the
                      9:  * License.  Please obtain a copy of the License at
                     10:  * http://www.apple.com/publicsource and read it before using this file.
                     11:  * 
                     12:  * This Original Code and all software distributed under the License are
                     13:  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
                     14:  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
                     15:  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
                     16:  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
                     17:  * License for the specific language governing rights and limitations
                     18:  * under the License.
                     19:  * 
                     20:  * @APPLE_LICENSE_HEADER_END@
                     21:  */
                     22: /*
                     23:  * @OSF_COPYRIGHT@
                     24:  */
                     25: 
                     26: /*
                     27:  * Mach RPC Subsystem Interfaces
                     28:  */
                     29: 
                     30: #ifndef        _MACH_RPC_H_
                     31: #define _MACH_RPC_H_
                     32: 
                     33: #include <mach/boolean.h>
                     34: #include <mach/kern_return.h>
                     35: #include <mach/port.h>
                     36: #include <mach/vm_types.h>
                     37: 
                     38: #include <mach/mig_errors.h>
                     39: #include <mach/machine/rpc.h>
                     40: #include <mach/thread_status.h>
                     41: 
                     42: #ifdef MACH_KERNEL_PRIVATE
                     43: #include <ipc/ipc_object.h>
                     44: #endif /* MACH_KERNEL_PRIVATE */
                     45: 
                     46: /*
                     47:  * The various bits of the type field of the routine_arg_descriptor
                     48:  */
                     49: 
                     50: /* The basic types */
                     51: 
                     52: #define TYPE_SHIFT                      0
                     53: #define MACH_RPC_PORT                  (1 << TYPE_SHIFT)
                     54: #define MACH_RPC_ARRAY                  (1 << (TYPE_SHIFT + 1))
                     55: #define MACH_RPC_VARIABLE               (1 << (TYPE_SHIFT + 2))
                     56: #define LAST_TYPE_BIT                   (TYPE_SHIFT+3)
                     57: 
                     58: /* XXX Port arrays need not be variable arrays, as assumed below. Fixme. */
                     59: #define MACH_RPC_ARRAY_FIX             (MACH_RPC_ARRAY)
                     60: #define MACH_RPC_ARRAY_FIXED           (MACH_RPC_ARRAY)
                     61: #define MACH_RPC_ARRAY_VAR             (MACH_RPC_ARRAY | MACH_RPC_VARIABLE)
                     62: #define MACH_RPC_ARRAY_VARIABLE                (MACH_RPC_ARRAY | MACH_RPC_VARIABLE)
                     63: #define MACH_RPC_PORT_ARRAY            (MACH_RPC_PORT  | MACH_RPC_ARRAY_VAR)
                     64: 
                     65: /* Argument direction bits */
                     66: 
                     67: #define DIRECT_SHIFT                   LAST_TYPE_BIT
                     68: #define DIRECTION_SHIFT                 LAST_TYPE_BIT
                     69: #define MACH_RPC_IN                    (1 << DIRECTION_SHIFT)
                     70: #define MACH_RPC_OUT                   (1 << (DIRECTION_SHIFT + 1))
                     71: #define LAST_DIRECT_BIT                (DIRECTION_SHIFT + 2)
                     72: #define LAST_DIRECTION_BIT              (DIRECTION_SHIFT + 2)
                     73: 
                     74: #define MACH_RPC_INOUT                 (MACH_RPC_IN | MACH_RPC_OUT)
                     75: 
                     76: /* Persist and pointer bit */
                     77: 
                     78: #define POINTER_SHIFT                   LAST_DIRECTION_BIT
                     79: #define MACH_RPC_POINTER                (1 << POINTER_SHIFT)
                     80: #define LAST_POINTER_BIT                (POINTER_SHIFT + 1)
                     81: 
                     82: /* Port disposition bits */
                     83: 
                     84: #define NAME_SHIFT                     LAST_POINTER_BIT
                     85: #define MACH_RPC_RECEIVE                (1 << NAME_SHIFT)
                     86: #define MACH_RPC_SEND                   (2 << NAME_SHIFT)
                     87: #define MACH_RPC_SEND_ONCE              (3 << NAME_SHIFT)
                     88: #define LAST_NAME_BIT                  (NAME_SHIFT + 2)
                     89: 
                     90: #define ACTION_SHIFT                   LAST_NAME_BIT
                     91: #define MACH_RPC_MOVE                   (1 << ACTION_SHIFT)
                     92: #define MACH_RPC_COPY                   (2 << ACTION_SHIFT)
                     93: #define MACH_RPC_MAKE                   (3 << ACTION_SHIFT)
                     94: #define LAST_ACTION_BIT                 (ACTION_SHIFT + 2)
                     95: 
                     96: #define MACH_RPC_MOVE_RECEIVE          (MACH_RPC_MOVE | MACH_RPC_RECEIVE)
                     97: #define MACH_RPC_MOVE_SEND             (MACH_RPC_MOVE | MACH_RPC_SEND)
                     98: #define MACH_RPC_COPY_SEND             (MACH_RPC_COPY | MACH_RPC_SEND)
                     99: #define MACH_RPC_MAKE_SEND             (MACH_RPC_MAKE | MACH_RPC_SEND)
                    100: #define MACH_RPC_MOVE_SEND_ONCE                (MACH_RPC_MOVE | MACH_RPC_SEND_ONCE)
                    101: #define MACH_RPC_MAKE_SEND_ONCE                (MACH_RPC_MAKE | MACH_RPC_SEND_ONCE)
                    102: 
                    103: /* Hint for virtual vs. physical copy */ 
                    104: 
                    105: #define OPTION_SHIFT                    LAST_ACTION_BIT
                    106: #define MACH_RPC_PHYSICAL_COPY         (1 << OPTION_SHIFT)
                    107: #define MACH_RPC_VIRTUAL_COPY          (1 << (OPTION_SHIFT + 1))
                    108: #define LAST_OPTION_BIT                 (OPTION_SHIFT + 2)
                    109: 
                    110: /* Deallocate? */
                    111: 
                    112: #define DEALLOCATE_SHIFT                LAST_OPTION_BIT
                    113: #define MACH_RPC_DEALLOCATE            (1 << DEALLOCATE_SHIFT)
                    114: #define LAST_DEALLOCATE_BIT             (DEALLOCATE_SHIFT + 1)
                    115: 
                    116: /* Argument is already on the stack */
                    117: 
                    118: #define ONSTACK_SHIFT                   LAST_DEALLOCATE_BIT
                    119: #define MACH_RPC_ONSTACK               (1 << ONSTACK_SHIFT)
                    120: #define LAST_ONSTACK_BIT                (ONSTACK_SHIFT + 1)
                    121: 
                    122: /* Is variable array bounded? Derived from type and arg.size */
                    123: 
                    124: #define BOUND_SHIFT                    LAST_ONSTACK_BIT
                    125: #define MACH_RPC_BOUND                 (1 << BOUND_SHIFT)
                    126: #define MACH_RPC_UNBOUND               (0)
                    127: #define BOUND                          MACH_RPC_BOUND
                    128: #define UNBND                          MACH_RPC_UNBOUND
                    129: #define LAST_BOUND_BIT                 (BOUND_SHIFT + 1)
                    130: 
                    131: /*
                    132:  * Basic mach rpc types.
                    133:  */
                    134: typedef unsigned int    routine_arg_type;
                    135: typedef unsigned int   routine_arg_offset;
                    136: typedef unsigned int   routine_arg_size;
                    137: 
                    138: /*
                    139:  * Definition for MIG-generated server stub routines.  These routines
                    140:  * unpack the request message, call the server procedure, and pack the
                    141:  * reply message.
                    142:  */
                    143: typedef void   (*mig_stub_routine_t) (mach_msg_header_t *InHeadP,
                    144:                                       mach_msg_header_t *OutHeadP);
                    145: 
                    146: typedef mig_stub_routine_t mig_routine_t;
                    147: 
                    148: /*
                    149:  * Definition for server implementation routines.  This is the routine
                    150:  * called by the MIG-generated server stub routine.
                    151:  */
                    152: typedef kern_return_t   (*mig_impl_routine_t)(void);
                    153: 
                    154: typedef mig_impl_routine_t entry_function_t;
                    155: 
                    156: /*
                    157:  * Structure for parameters of new activation. The entry_func field is used
                    158:  * as the upcall PC when there is no registered subsystem. The return_func is
                    159:  * a pointer to a mach_rpc_return_trap instruction. In addition, optional
                    160:  * thread state parameters are provided for architectures that require it.
                    161:  */
                    162: 
                    163: struct thread_act_params
                    164: {
                    165:     vm_offset_t         stack;
                    166:     vm_size_t           stack_size;
                    167:     entry_function_t    entry_func;
                    168:     int                flavor;
                    169:     thread_state_t     act_state;
                    170:     unsigned int       act_state_count;  
                    171: };
                    172: 
                    173: typedef struct thread_act_params *thread_act_params_t;
                    174: typedef char act_params_t[sizeof(struct thread_act_params)];
                    175: #define NULL_PARAMS ((thread_act_params_t) 0)
                    176: 
                    177: /*
                    178:  * Definitions for a signature's argument and routine descriptor's.
                    179:  */
                    180: struct routine_arg_descriptor {
                    181:        routine_arg_type        type;      /* Port, Array, etc. */
                    182:         routine_arg_size        size;      /* element size in bytes */
                    183:         routine_arg_size        count;     /* number of elements */
                    184:        routine_arg_offset      offset;    /* Offset in list of routine args */
                    185: };
                    186: typedef struct routine_arg_descriptor *routine_arg_descriptor_t;
                    187: 
                    188: struct routine_descriptor {
                    189:        mig_impl_routine_t      impl_routine;   /* Server work func pointer   */
                    190:        mig_stub_routine_t      stub_routine;   /* Unmarshalling func pointer */
                    191:        unsigned int            argc;           /* Number of argument words   */
                    192:        unsigned int            descr_count;    /* Number of complex argument */
                    193:                                                /* descriptors                */
                    194:        struct routine_arg_descriptor *
                    195:                                arg_descr;      /* Pointer to beginning of    */
                    196:                                                /* the arg_descr array        */
                    197:        unsigned int            max_reply_msg;  /* Max size for reply msg     */
                    198: };
                    199: typedef struct routine_descriptor *routine_descriptor_t;
                    200: 
                    201: #define DESCR_SIZE(x) ((x)->descr_count * sizeof(struct routine_arg_descriptor))
                    202: 
                    203: struct rpc_signature {
                    204:     struct routine_descriptor rd;
                    205:     struct routine_arg_descriptor rad[1];
                    206: };
                    207: 
                    208: #ifdef MACH_KERNEL_PRIVATE
                    209: 
                    210: typedef struct rpc_signature *rpc_signature_t;
                    211: 
                    212: #endif
                    213: 
                    214: #define RPC_SIGBUF_SIZE 8
                    215: /*
                    216:  *     A subsystem describes a set of server routines that can be invoked by
                    217:  *     mach_rpc() on the ports that are registered with the subsystem.  For
                    218:  *     each routine, the routine number is given, along with the
                    219:  *     address of the implementation function in the server and a
                    220:  *     description of the arguments of the routine (it's "signature").
                    221:  *
                    222:  *     This structure definition is only a template for what is really a
                    223:  *     variable-length structure (generated by MIG for each subsystem).
                    224:  *     The actual structures do not always have one entry in the routine
                    225:  *     array, and also have a varying number of entries in the arg_descr
                    226:  *     array.  Each routine has an array of zero or more arg descriptors
                    227:  *     one for each complex arg.  These arrays are all catenated together
                    228:  *     to form the arg_descr field of the subsystem struct.  The
                    229:  *     arg_descr field of each routine entry points to a unique sub-sequence
                    230:  *     within this catenated array.  The goal is to keep everything
                    231:  *     contiguous.
                    232:  */
                    233: struct rpc_subsystem {
                    234:        struct subsystem *subsystem;    /* Reserved for system use */
                    235: 
                    236:        mach_msg_id_t   start;          /* Min routine number */
                    237:        mach_msg_id_t   end;            /* Max routine number + 1 */
                    238:        unsigned int    maxsize;        /* Max mach_msg size */
                    239:        vm_address_t    base_addr;      /* Address of this struct in user */
                    240: 
                    241:        struct routine_descriptor       /* Array of routine descriptors */
                    242:                        routine[1       /* Actually, (start-end+1) */
                    243:                                 ];
                    244: 
                    245:        struct routine_arg_descriptor
                    246:                        arg_descriptor[1   /* Actually, the sum of the descr_ */
                    247:                                        ]; /* count fields for all routines   */
                    248: };
                    249: typedef struct rpc_subsystem  *rpc_subsystem_t;
                    250: 
                    251: #define RPC_SUBSYSTEM_NULL     ((rpc_subsystem_t) 0)
                    252: 
                    253: /* 
                    254:  *     New RPC declarations
                    255:  *
                    256:  *     First pass at definitions and types for the new rpc service.
                    257:  *     This is subject to revision.
                    258:  */
                    259: 
                    260: /*
                    261:  *     RPC macros
                    262:  */
                    263: 
                    264: #define RPC_MASK(shift,last)                                            \
                    265:         ( ((1 << ((last)-(shift)))-1) << (shift) )
                    266: 
                    267: #define RPC_FIELD(field,shift,last)                                     \
                    268:         ( (field) & (((1 << ((last)-(shift)))-1) << (shift)) )
                    269: 
                    270: #define RPC_BOUND(dsc)                                                  \
                    271:         (((RPC_FIELD((dsc).type,TYPE_SHIFT+1,TYPE_SHIFT+3) ==           \
                    272:            MACH_RPC_ARRAY_VARIABLE) && (dsc).count != 0) ? MACH_RPC_BOUND : 0)
                    273: 
                    274: #define ROUNDUP2(x,n)    ((((unsigned)(x)) + (n) - 1) & ~((n)-1))
                    275: #define ROUNDWORD(x)    ROUNDUP2(x,sizeof(int))
                    276: 
                    277: /*
                    278:  *      RPC errors
                    279:  *
                    280:  *      Display and process errors of different severity, from just for
                    281:  *      information only to fatal (panic). Error code colors indicate how
                    282:  *      difficult it is for the subsystem to handle the error correctly.
                    283:  *      The implication is that, for example, early versions of the code may
                    284:  *      not be handling code red errors properly. The code should use this
                    285:  *      facility instead of regular printf's.
                    286:  */
                    287: 
                    288: #define        MACH_RPC_DEBUG  1
                    289: 
                    290: #define ERR_INFO        1               /* purely informational */
                    291: #define ERR_GREEN       2               /* easily handled error */
                    292: #define ERR_YELLOW      3               /* medium difficult error */
                    293: #define ERR_RED         4               /* difficult to handle error */
                    294: #define ERR_FATAL       5               /* unrecoverable error, panic */
                    295: 
                    296: #if MACH_RPC_DEBUG > 1
                    297: #define rpc_error(E,S)                                                  \
                    298:         printf("RPC error ");                                           \
                    299:         rpc_error_show_severity(S);                                     \
                    300:         printf("in file \"%s\", line %d: ", __FILE__, __LINE__);        \
                    301:         printf E ;                                                      \
                    302:         printf("\n");                                                   \
                    303:         rpc_error_severity(S)
                    304: #else
                    305: #define rpc_error(E,S)                                                  \
                    306:        if ((S) == ERR_FATAL || (S) == ERR_RED) {                       \
                    307:         printf("RPC error ");                                           \
                    308:         rpc_error_show_severity(S);                                     \
                    309:         printf("in file \"%s\", line %d: ", __FILE__, __LINE__);        \
                    310:         printf E ;                                                      \
                    311:         printf("\n");                                                   \
                    312:         rpc_error_severity(S);                                         \
                    313:        }
                    314: #endif /* MACH_RPC_DEBUG */
                    315: 
                    316: /*
                    317:  *      RPC buffer size and break points
                    318:  *
                    319:  *      These values define the rpc buffer size on the kernel stack,
                    320:  *      and break point values for switching to virtual copy (cow).
                    321:  *      This should be in a machine dependent include file. All sizes
                    322:  *      are in word (sizeof(int)) units.
                    323:  */
                    324: 
                    325: #define RPC_KBUF_SIZE   16              /* kernel stack buffer size (ints) */
                    326: #define RPC_COW_SIZE    1024            /* size where COW is a win (ints) */
                    327: #define RPC_DESC_COUNT  4               /* default descriptor count */
                    328: 
                    329: 
                    330: /*
                    331:  *      RPC copy state
                    332:  *
                    333:  *      Record the rpc copy state for arrays, so we can unwind our state
                    334:  *      during error processing. There is one entry per complex (signatured)
                    335:  *      argument. The first entry is marked COPY_TYPE_ALLOC_KRN if this record
                    336:  *      itself was kalloc'd because the number of complex arg descriptors
                    337:  *      exceeded the default value (RPC_DESC_COUNT). This is not a conflict
                    338:  *      since the first argument is always the destination port, never an array.
                    339:  */
                    340: 
                    341: #define COPY_TYPE_NO_COPY               0       /* nothing special */
                    342: #define COPY_TYPE_ON_KSTACK             1       /* array is on kernel stack */
                    343: #define COPY_TYPE_ON_SSTACK             2       /* array is on server stack */
                    344: #define COPY_TYPE_VIRTUAL_IN            3       /* vm_map_copyin part of cow */
                    345: #define COPY_TYPE_VIRTUAL_OUT_SVR       4       /* map cpyout svr part of cow */
                    346: #define COPY_TYPE_VIRTUAL_OUT_CLN       5       /* map cpyout cln part of cow */
                    347: #define COPY_TYPE_ALLOC_KRN             6       /* kernel kalloc'd for array */
                    348: #define COPY_TYPE_ALLOC_SVR             7       /* vm_alloc'd in server space */
                    349: #define COPY_TYPE_ALLOC_CLN             8       /* vm_alloc'd in client space */
                    350: #define COPY_TYPE_PORT                  9       /* plain port translated */
                    351: #define COPY_TYPE_PORT_ARRAY            10      /* port array translated */
                    352: 
                    353: 
                    354: /*
                    355:  *     RPC types
                    356:  */
                    357: typedef int                    rpc_id_t;
                    358: typedef int                    rpc_return_t;
                    359: typedef unsigned int           rpc_size_t;
                    360: typedef unsigned int           rpc_offset_t;
                    361: 
                    362: struct rpc_copy_state {
                    363:         unsigned                copy_type;      /* what kind of copy */
                    364:         vm_offset_t             alloc_addr;     /* address to free */
                    365: };
                    366: typedef struct rpc_copy_state *rpc_copy_state_t;
                    367: typedef struct rpc_copy_state  rpc_copy_state_data_t;
                    368: 
                    369: typedef boolean_t (*copyfunc_t)(const char *, char *, vm_size_t);
                    370: 
                    371: 
                    372: /*
                    373:  *     RPC function declarations
                    374:  */
                    375: 
                    376: #ifdef CALLOUT_RPC_MODEL
                    377: 
                    378: extern
                    379: void            rpc_bootstrap( void );
                    380: 
                    381: extern
                    382: void            rpc_remote_bootstrap( void );
                    383: 
                    384: extern 
                    385: rpc_return_t   mach_rpc_trap(
                    386:                                mach_port_name_t        dest_port,
                    387:                                rpc_id_t                routine_num,
                    388:                                rpc_signature_t signature_ptr,
                    389:                                rpc_size_t      signature_size );
                    390:                                                                                
                    391: extern 
                    392: rpc_return_t   mach_rpc_return_trap( void );
                    393: 
                    394: extern 
                    395: rpc_return_t   mach_rpc_return_error( void );
                    396: 
                    397: void                   mach_rpc_return_wrapper( void );
                    398: 
                    399: void                   rpc_upcall( 
                    400:                                vm_offset_t             stack,
                    401:                                vm_offset_t             new_stack, 
                    402:                                vm_offset_t             server_func, 
                    403:                                int                     return_code );
                    404: 
                    405: void                   rpc_error_severity( int severity );
                    406: void                   rpc_error_show_severity( int severity );
                    407: unsigned int           name_rpc_to_ipc( unsigned int action );
                    408: 
                    409: void                   clean_port_array(
                    410:                                ipc_object_t *          array,
                    411:                                unsigned                count,
                    412:                                unsigned                cooked,
                    413:                                unsigned                direct );
                    414: 
                    415: void                   unwind_rpc_state( 
                    416:                                routine_descriptor_t    routine, 
                    417:                                rpc_copy_state_t        state, 
                    418:                                int *                   arg_buf );
                    419: 
                    420: kern_return_t          unwind_invoke_state( 
                    421:                                thread_act_t            thr_act );
                    422: 
                    423: kern_return_t          rpc_invke_args_in( 
                    424:                                routine_descriptor_t    routine, 
                    425:                                rpc_copy_state_t        state,
                    426:                                int *                   arg_buf,
                    427:                                copyfunc_t              infunc );
                    428: 
                    429: kern_return_t          rpc_invke_args_out( 
                    430:                                routine_descriptor_t    routine, 
                    431:                                rpc_copy_state_t        state,
                    432:                                int *                   arg_buf, 
                    433:                                int **                  new_sp,
                    434:                                copyfunc_t              outfunc );
                    435: 
                    436: kern_return_t          rpc_reply_args_in( 
                    437:                                routine_descriptor_t    routine, 
                    438:                                rpc_copy_state_t        state,
                    439:                                int *                   svr_buf,
                    440:                                copyfunc_t              infunc );
                    441: 
                    442: kern_return_t          rpc_reply_args_out( 
                    443:                                routine_descriptor_t    routine, 
                    444:                                rpc_copy_state_t        state,
                    445:                                int *                   svr_buf, 
                    446:                                int *                   cln_buf,
                    447:                                copyfunc_t              outfunc );
                    448: 
                    449: #endif  /* CALLOUT_RPC_MODEL */
                    450: 
                    451: /*
                    452:  * libmach helper functions:
                    453:  */
                    454: extern rpc_subsystem_t mach_subsystem_join(
                    455:                                rpc_subsystem_t,
                    456:                                rpc_subsystem_t,
                    457:                                unsigned int *,
                    458:                                void *(* )(int));
                    459: 
                    460: #endif /* _MACH_RPC_H_ */
                    461: 
                    462: 

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.