Annotation of XNU/osfmk/kern/rpc_remote.h, revision 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_FREE_COPYRIGHT@
        !            24:  * 
        !            25:  */
        !            26: /*
        !            27:  * HISTORY
        !            28:  * 
        !            29:  * Revision 1.1.1.1  1998/09/22 21:05:33  wsanchez
        !            30:  * Import of Mac OS X kernel (~semeria)
        !            31:  *
        !            32:  * Revision 1.1  1998/04/29 17:36:12  mburg
        !            33:  * MK7.3 merger
        !            34:  *
        !            35:  * Revision 1.1.7.1  1998/02/03  09:29:37  gdt
        !            36:  *     Merge up to MK7.3
        !            37:  *     [1998/02/03  09:14:34  gdt]
        !            38:  *
        !            39:  * Revision 1.1.4.1  1997/06/17  02:58:23  devrcs
        !            40:  *     Handle some errors caused by node failures.
        !            41:  *     [1996/09/25  19:00:00  watkins]
        !            42:  * 
        !            43:  *     Added `#include' for DIPC types.  This is needed for non-DIPC
        !            44:  *     configurations to build.  Also, defined away trans-node RPC
        !            45:  *     routines when DIPC is not configured.  (Trans-node RPC currently
        !            46:  *     uses DIPC features.)
        !            47:  *     [1996/04/16  19:02:12  rkc]
        !            48:  * 
        !            49:  *     Use scheduling framework to access scheduling parameters.
        !            50:  *     [1996/03/29  22:08:50  watkins]
        !            51:  * 
        !            52:  *     Merge with rt3_merge.
        !            53:  *     [1996/03/22  22:49:57  watkins]
        !            54:  * 
        !            55:  * Revision 1.1.1.2  1996/03/21  19:21:13  watkins
        !            56:  *     Initial revision.
        !            57:  * 
        !            58:  * $EndLog$
        !            59:  */
        !            60: 
        !            61: 
        !            62: /*
        !            63:  *     rpc_remote.h
        !            64:  *
        !            65:  *     Definitions and functions for the Mach RPC remote.
        !            66:  */
        !            67: 
        !            68: 
        !            69: #include <dipc.h>
        !            70: #include <kernel_test.h>
        !            71: #include <mach/kkt_request.h>
        !            72: #include <dipc/dipc_types.h>
        !            73: #include <mach/policy.h>
        !            74: #include <kern/sf.h>
        !            75: #include <kern/mk_sp.h>
        !            76: 
        !            77: 
        !            78: /*
        !            79:  *     IN and OUT are defined for documenting argument-passing 
        !            80:  *     conventions and have no meaning to the compiler.
        !            81:  */
        !            82: #define        IN
        !            83: #define        OUT
        !            84: #define        INOUT
        !            85: 
        !            86: 
        !            87: /*
        !            88:  *     Bound on the highest allocated remote procedure call number.  
        !            89:  *     This number may be used for allocating arrays.
        !            90:  */
        !            91: #define        RPC_KKT_MAX_PROC                10
        !            92: 
        !            93: 
        !            94: /*
        !            95:  *     We staticly size the transfer arrays for now. This will
        !            96:  *     be dynamic later.
        !            97:  */
        !            98: #define RPC_ARRAYS_MAX_SIZE    4
        !            99: #define RPC_ARRAYS_MAX_ENTRY   32
        !           100: #define RPC_ARRAYS_MAX_DATA    (RPC_ARRAYS_MAX_SIZE * RPC_ARRAYS_MAX_ENTRY)
        !           101: 
        !           102: 
        !           103: /*
        !           104:  *     rpc_control
        !           105:  *
        !           106:  *     Control information sent with a remote RPC request, including
        !           107:  *     scheduling information for the request on remote node.
        !           108:  */
        !           109: 
        !           110: typedef struct rpc_control {
        !           111:        policy_t                                        policy;
        !           112:                union {
        !           113:                mk_sp_attribute_struct_t        mk;
        !           114:        }                                               attributes;
        !           115:        union {
        !           116:                mk_sp_info_struct_t             mk;
        !           117:        }                                               information;
        !           118: } Rpc_Control;
        !           119: 
        !           120: typedef struct rpc_service {
        !           121:        node_name               src_node;
        !           122:        node_name               dst_node;
        !           123:        uid_t                   uid;
        !           124:        int                     routine_num;
        !           125:        int                     signature_token;
        !           126:        void                    *instance;
        !           127: } Rpc_Service;
        !           128: 
        !           129: typedef struct rpc_control *rpc_control_t;
        !           130: typedef struct rpc_service *rpc_service_t;
        !           131: 
        !           132: 
        !           133: /*
        !           134:  *     rpc invoke
        !           135:  *     
        !           136:  *     Request RPC service from a remote node. The initial contact
        !           137:  *     contact includes subsystem, signature token and scheduling 
        !           138:  *     information. The invoke request will be acknowledged with a
        !           139:  *     reply.
        !           140:  *
        !           141:  *     Send a list of arrays to a remote node and receive a list of
        !           142:  *     arrays in return. Count is the number of arrays and the number of 
        !           143:  *     size values in the Sizes array. Data points to the arrays, one 
        !           144:  *     after another.
        !           145:  */
        !           146: 
        !           147: #define        RPC_KKT_INVOKE          2
        !           148: #define        RPC_KKT_INVOKE_ACK      3
        !           149: 
        !           150: extern kkt_return_t    rpc_kkt_invoke(
        !           151:                        IN      rpc_service_t           servp,
        !           152:                        INOUT   unsigned                *count,
        !           153:                        INOUT   unsigned                *sizes,
        !           154:                        INOUT   unsigned                *datap,
        !           155:                         OUT     rpc_return_t           *rr);
        !           156: 
        !           157: extern rpc_return_t    rpc_kkt_invoke_ack( 
        !           158:                         OUT     rpc_return_t           rr);
        !           159: 
        !           160: struct rpc_kkt_invoke_args {
        !           161:        Rpc_Service             service;
        !           162:        unsigned                count;
        !           163:        unsigned                sizes[RPC_ARRAYS_MAX_SIZE];
        !           164:        unsigned                data[RPC_ARRAYS_MAX_DATA];
        !           165: };
        !           166: 
        !           167: 
        !           168: /*
        !           169:  *      rpc reply
        !           170:  *
        !           171:  *     Reply to an RPC request from a remote node. The reply will
        !           172:  *     include any result data, as well as signature token and sched-
        !           173:  *     uling information. This reply must be acknowledged by the client
        !           174:  *     side of the RPC.
        !           175:  *
        !           176:  *     Send a list of arrays to a remote node and receive a list of
        !           177:  *     arrays in return. Count is the number of arrays and the number of 
        !           178:  *     size values in the Sizes array. Data points to the arrays, one 
        !           179:  *     after another.
        !           180:  */
        !           181: 
        !           182: #define RPC_KKT_REPLY          4
        !           183: #define RPC_KKT_REPLY_ACK      5
        !           184: 
        !           185: extern kkt_return_t     rpc_kkt_reply(
        !           186:                        IN      rpc_service_t           servp,
        !           187:                        INOUT   unsigned                *count,
        !           188:                        INOUT   unsigned                *sizes,
        !           189:                        INOUT   unsigned                *datap,
        !           190:                         OUT     rpc_return_t           *rr);
        !           191: 
        !           192: extern rpc_return_t     rpc_kkt_reply_ack(
        !           193:                        OUT     rpc_return_t            rr);
        !           194: 
        !           195: struct rpc_kkt_reply_args {
        !           196:        Rpc_Service             service;
        !           197:        unsigned                count;
        !           198:        unsigned                sizes[RPC_ARRAYS_MAX_SIZE];
        !           199:        unsigned                data[RPC_ARRAYS_MAX_DATA];
        !           200: };
        !           201: 
        !           202: 
        !           203: 
        !           204: /* 
        !           205:  *     All possible arguments for thread-level service 
        !           206:  */
        !           207: typedef struct rpc_kkt_args {
        !           208:        int                     procnum;
        !           209:        rpc_return_t            rr;
        !           210:        Rpc_Control             control;
        !           211:        Rpc_Service             service;
        !           212:        vm_offset_t             kkt_size;
        !           213: } *rpc_kkt_args_t;
        !           214: 
        !           215: #define alink  rr
        !           216: #define alink_t        rpc_return_t
        !           217: 
        !           218: #define RPC_KKT_ARG_NULL                ((rpc_kkt_args_t)0)
        !           219: 
        !           220: 
        !           221: /*
        !           222:  *     Macros for sanity checking.
        !           223:  */
        !           224: 
        !           225: #define valid_rpc_kkt_proc(p)  (p >= 2 && p <= 5 && p < RPC_KKT_MAX_PROC)
        !           226: 
        !           227: 
        !           228: 
        !           229: /*
        !           230:  *     External Declarations
        !           231:  */
        !           232: 
        !           233: void           rpc_bootstrap(void);
        !           234: 
        !           235: rpc_return_t   rpc_server_reply(void);
        !           236: 
        !           237: rpc_return_t   rpc_client_reply(void);
        !           238: 
        !           239: rpc_return_t   rpc_server_invoke(rpc_kkt_args_t);
        !           240: 
        !           241: rpc_return_t   rpc_client_invoke(
        !           242:                                ipc_port_t, rpc_id_t, rpc_signature_t, 
        !           243:                                rpc_size_t);
        !           244: 
        !           245: /*
        !           246:  * Definitions for Trans-node RPC routines when DIPC is disabled
        !           247:  */
        !           248: 
        !           249: #if    !DIPC
        !           250: #define rpc_client_invoke(a, b, c, d)  KERN_FAILURE
        !           251: #define rpc_server_reply()             panic("rpc_server_reply() disabled")
        !           252: #endif /* DIPC */
        !           253: 
        !           254: 
        !           255: /*
        !           256:  *      Macros for declaring and using statistics variables.
        !           257:  *      These variables are present whenever statistics
        !           258:  *      or assertion checking are enabled.
        !           259:  */
        !           260: 
        !           261: /* #include <rpc_stats.h> */
        !           262: #define  RPC_STATS 1
        !           263: #include <mach_assert.h>
        !           264: 
        !           265: 
        !           266: #define RPC_DO_STATS   (RPC_STATS || MACH_ASSERT)
        !           267: 
        !           268: 
        !           269: #if    RPC_DO_STATS
        !           270: #define dstat_decl(clause)      clause
        !           271: #define dstat(clause)           clause
        !           272: #define dstat_max(m,c)          ((c) > (m) ? (m) = (c) : 0)
        !           273: extern void    rpc_kkt_stats(void);
        !           274: #else  /* RPC_DO_STATS */
        !           275: #define dstat_decl(clause)
        !           276: #define dstat(clause)
        !           277: #define dstat_max(m,c)
        !           278: #endif /* RPC_DO_STATS */
        !           279: 

unix.superglobalmegacorp.com

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