summaryrefslogtreecommitdiffstats
path: root/bootstrap_cmds/migcom.tproj/type.h
blob: b1b514b3c80959b2edb7ae9881ac7c3b32bd0f3c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
/*
 * Copyright (c) 1999-2018 Apple Inc. All rights reserved.
 *
 * @APPLE_LICENSE_HEADER_START@
 * 
 * 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, QUIET ENJOYMENT OR NON-INFRINGEMENT.
 * Please see the License for the specific language governing rights and
 * limitations under the License.
 * 
 * @APPLE_LICENSE_HEADER_END@
 */
/*  HISTORY
 * 07-Apr-89  Richard Draves (rpd) at Carnegie-Mellon University
 * Extensive revamping.  Added polymorphic arguments.
 * Allow multiple variable-sized inline arguments in messages.
 *
 * 16-Nov-87  David Golub (dbg) at Carnegie-Mellon University
 * Changed itVarArrayDecl to take a 'max' parameter.
 * Added itDestructor.
 *
 *  18-Aug-87 Mary Thompson @ Carnegie Mellon
 * Added itPortType
 * Added itTidType
 */

#ifndef _TYPE_H
#define _TYPE_H

#include <mach/boolean.h>
#include "strdefs.h"

#ifdef linux
#include <linux/types.h>
#else /* linux */
#include <sys/types.h>
#endif /* linux */
typedef u_int ipc_flags_t;

/*
 * MIG built-in types
 */
#define MACH_MSG_TYPE_UNSTRUCTURED      0
#define MACH_MSG_TYPE_BIT               0
#define MACH_MSG_TYPE_BOOLEAN           0
#define MACH_MSG_TYPE_INTEGER_8         9
#define MACH_MSG_TYPE_INTEGER_16        1
#define MACH_MSG_TYPE_INTEGER_32        2
#define MACH_MSG_TYPE_INTEGER_64        3
#define MACH_MSG_TYPE_CHAR              8
#define MACH_MSG_TYPE_BYTE              9
#define MACH_MSG_TYPE_REAL_32           10
#define MACH_MSG_TYPE_REAL_64           11
#define MACH_MSG_TYPE_STRING            12
#define MACH_MSG_TYPE_STRING_C          12

#define flNone          (0x00)
#define flPhysicalCopy  (0x01) /* Physical Copy specified */
#define flOverwrite     (0x02) /* Overwrite mode specified */
#define flDealloc       (0x04) /* Dealloc specified */
#define flNotDealloc    (0x08) /* NotDealloc specified */
#define flMaybeDealloc  (0x10) /* Dealloc[] specified */
#define flSameCount     (0x20) /* SamCount specified, used by co-bounded arrays */
#define flCountInOut    (0x40) /* CountInOut specified */
#define flRetCode       (0x80) /* RetCode specified */
#define flAuto          (0x100) /* Will not be referenced by server after RPC */
#define flConst         (0x200) /* Will not be modified by server during RPC */

typedef enum dealloc {
 d_NO, /* do not deallocate */
 d_YES, /* always deallocate */
 d_MAYBE /* deallocate according to parameter */
} dealloc_t;

/* Convert dealloc_t to TRUE/FALSE */
#define strdealloc(d) (strbool(d == d_YES))

/*
 * itName and itNext are internal fields (not used for code generation).
 * They are only meaningful for types entered into the symbol table.
 * The symbol table is a simple self-organizing linked list.
 *
 * The function itCheckDecl checks & fills in computed information.
 * Every type actually used (pointed at by argType) is so processed.
 *
 * The itInName, itOutName, itSize, itNumber, fields correspond directly
 * to mach_msg_type_t fields.
 * For out-of-line variable sized types, itNumber is zero.  For
 * in-line variable sized types, itNumber is the maximum size of the
 * array.  itInName is the name value supplied to the kernel,
 * and itOutName is the name value received from the kernel.
 * When the type describes a MACH port, either or both may be
 * MACH_MSG_TYPE_POLYMORPHIC, indicating a "polymorphic" name.
 * For itInName, this means the user supplies the value with an argument.
 * For itOutName, this means the value is returned in an argument.
 *
 * The itInNameStr and itOutNameStr fields contain "printing" versions
 * of the itInName and itOutName values.  The mapping from number->string
 * is not into (eg, MACH_MSG_TYPE_UNSTRUCTURED/MACH_MSG_TYPE_BOOLEAN/
 * MACH_MSG_TYPE_BIT).  These fields are used for code-generation and
 * pretty-printing.
 *
 * itTypeSize is the calculated size of the C type, in bytes.
 * itPadSize is the size of any padded needed after the data field.
 * itMinTypeSize is the minimum size of the data field, including padding.
 * For variable-length inline data, it is zero.
 *
 * itUserType, itServerType, itTransType are the C types used in
 * code generation.  itUserType is the C type passed to the user-side stub
 * and used for msg declarations in the user-side stub.  itServerType
 * is the C type used for msg declarations in the server-side stub.
 * itTransType is the C type passed to the server function by the
 * server-side stub.  Normally it differs from itServerType only when
 * translation functions are defined.
 *
 * itInTrans and itOutTrans are translation functions.  itInTrans
 * takes itServerType values and returns itTransType values.  itOutTrans
 * takes itTransType vaulues and returns itServerType values.
 * itDestructor is a finalization function applied to In arguments
 * after the server-side stub calls the server function.  It takes
 * itTransType values.  Any combination of these may be defined.
 *
 * The following type specification syntax modifies these values:
 * type new = old
 * ctype: name // itUserType and itServerType
 * cusertype: itUserType
 * cservertype: itServerType
 * intran: itTransType itInTrans(itServerType)
 * outtran: itServerType itOutTrans(itTransType)
 * destructor: itDestructor(itTransType);
 *
 * At most one of itStruct and itString should be TRUE.  If both are
 * false, then this is assumed to be an array type (msg data is passed
 * by reference).  If itStruct is TRUE, then msg data is passed by value
 * and can be assigned with =.  If itString is TRUE, then the msg_data
 * is a null-terminated string, assigned with strncpy.  The itNumber
 * value is a maximum length for the string; the msg field always
 * takes up this much space.
 * NoOptArray has been introduced for the cases where the special
 * code generated for array assignments would not work (either because
 * there is  not a ctype (array of automagically generated MiG variables)
 * or because we need to reference the single elements of the array
 * (array of variable sized ool regions).
 *
 * itVarArray means this is a variable-sized array.  If it is inline,
 * then itStruct and itString are FALSE.  If it is out-of-line, then
 * itStruct is TRUE (because pointers can be assigned).
 *
 * itMigInLine means this is an indefinite-length array. Although the
 * argument was not specified as out-of-line, MIG will send it anyway
 * os an out-of-line.
 *
 * itUserKPDType (itServerKPDType) identify the type of Kernel Processed
 * Data that we must deal with: it can be either "mach_msg_port_descriptor_t"
 * or "mach_msg_ool_ports_descriptor_t" or "mach_msg_ool_descriptor_t".
 *
 * itKPD_Number is used any time a single argument require more than
 * one Kernel Processed Data entry: i.e., an in-line array of ports, an array
 * of pointers (out-of-line data)
 *
 * itElement points to any substructure that the type may have.
 * It is only used with variable-sized array types.
 */

typedef struct ipc_type
  {
    identifier_t itName;      /* Mig's name for this type */
    struct ipc_type *itNext;  /* next type in symbol table */
    
    u_int itTypeSize;         /* size of the C type */
    u_int itPadSize;          /* amount of padding after data */
    u_int itMinTypeSize;      /* minimal amount of space occupied by data */
    
    u_int itInName;           /* name supplied to kernel in sent msg */
    u_int itOutName;          /* name in received msg */
    u_int itSize;
    u_int itNumber;
    u_int itKPD_Number;       /* number of Kernel Processed Data entries */
    boolean_t itInLine;
    boolean_t itMigInLine;    /* MiG presents data as InLine, although it is sent OOL */
    boolean_t itPortType;
    
    string_t itInNameStr;     /* string form of itInName */
    string_t itOutNameStr;    /* string form of itOutName */
    
    boolean_t itStruct;
    boolean_t itString;
    boolean_t itVarArray;
    boolean_t itNoOptArray;
    boolean_t itNative;       /* User specified a native (C) type. */
    boolean_t itNativePointer;/* The user will pass a pointer to the */
    /* native C type. */
    
    struct ipc_type *itElement; /* may be NULL */
    
    identifier_t itUserType;
    identifier_t itServerType;
    identifier_t itTransType;
    
    identifier_t itKPDType;   /* descriptors for KPD type of arguments */
    
    identifier_t itInTrans;   /* may be NULL */
    identifier_t itOutTrans;  /* may be NULL */
    identifier_t itDestructor;/* may be NULL */
    identifier_t itBadValue;   /* Excluded value for PointerToIfNot.  May
     be NULL. */
    u_int itOOL_Number;
  } ipc_type_t;

enum {
  ConsumeOnSendErrorNone,
  ConsumeOnSendErrorTimeout,
  ConsumeOnSendErrorAny,
};


#define itNULL ((ipc_type_t *) 0)

#define itWordAlign     sizeof(natural_t)

extern ipc_type_t *itLookUp(identifier_t name);
extern void itInsert(identifier_t name, ipc_type_t *it);
extern void itTypeDecl(identifier_t name, ipc_type_t *it);

extern ipc_type_t *itShortDecl(u_int inname, string_t instr,
                                  u_int outname, string_t outstr,
                                  u_int dfault);
extern ipc_type_t *itPrevDecl(identifier_t name);
extern ipc_type_t *itResetType(ipc_type_t *it);
extern ipc_type_t *itVarArrayDecl(u_int number, ipc_type_t *it);
extern ipc_type_t *itArrayDecl(u_int number, ipc_type_t *it);
extern ipc_type_t *itPtrDecl(ipc_type_t *it);
extern ipc_type_t *itStructDecl(u_int number, ipc_type_t *it);
extern ipc_type_t *itCStringDecl(int count, boolean_t varying);
extern ipc_type_t *itNativeType(identifier_t CType, boolean_t pointer,
                                   identifier_t NotVal);

extern ipc_type_t *itRetCodeType;
extern ipc_type_t *itNdrCodeType;
extern ipc_type_t *itDummyType;
extern ipc_type_t *itTidType;
extern ipc_type_t *itRequestPortType;
extern ipc_type_t *itZeroReplyPortType;
extern ipc_type_t *itRealReplyPortType;
extern ipc_type_t *itWaitTimeType;
extern ipc_type_t *itMsgOptionType;
extern ipc_type_t *itMakeCountType(void);
extern ipc_type_t *itMakeSubCountType(int count, boolean_t varying, string_t  name);
extern ipc_type_t *itMakePolyType(void);
extern ipc_type_t *itMakeDeallocType(void);

extern void init_type(void);

extern void itCheckReturnType(identifier_t name, ipc_type_t *it);
extern void itCheckRequestPortType(identifier_t name, ipc_type_t *it);
extern void itCheckReplyPortType(identifier_t name, ipc_type_t *it);
extern void itCheckIntType(identifier_t name, ipc_type_t *it);
extern void itCheckTokenType(identifier_t name, ipc_type_t *it);

#endif /* _TYPE_H */