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
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
|
/*
* Mach Operating System
* Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
* All Rights Reserved.
*
* Permission to use, copy, modify and distribute this software and its
* documentation is hereby granted, provided that both the copyright
* notice and this permission notice appear in all copies of the
* software, derivative works or modified versions, and any portions
* thereof, and that both notices appear in supporting documentation.
*
* CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
* CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
* ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
*
* Carnegie Mellon requests users of this software to return to
*
* Software Distribution Coordinator or Software.Distribution@CS.CMU.EDU
* School of Computer Science
* Carnegie Mellon University
* Pittsburgh PA 15213-3890
*
* any improvements or extensions that they make and grant Carnegie Mellon
* the rights to redistribute these changes.
*/
/*
* File: mach/memory_object.defs
*
* Abstract:
* Basic Mach external memory management interface declaration.
*/
subsystem
#if KERNEL_USER
KernelUser
#endif KERNEL_USER
#if KERNEL_SERVER
KernelServer
#endif KERNEL_SERVER
memory_object 2200;
#ifdef KERNEL
#include <norma_vm.h>
#if NORMA_VM
userprefix k_;
#endif NORMA_VM
#endif KERNEL
#include <mach/std_types.defs>
#include <mach/mach_types.defs>
#if SEQNOS
serverprefix seqnos_;
serverdemux seqnos_memory_object_server;
#endif SEQNOS
/*
* Initialize the specified memory object, providing
* a reqeust port on which control calls can be made, and
* a name port that identifies this object to callers of
* vm_regions.
* [To allow the mapping of this object to be used, the
* memory manager must call memory_object_set_attributes,
* specifying the "ready" parameter as TRUE. To reject
* all mappings of this object, the memory manager may
* use memory_object_destroy.]
*/
simpleroutine memory_object_init(
memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
memory_object_name : memory_object_name_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
memory_object_page_size : vm_size_t);
/*
* Indicates that the specified memory object is no longer
* mapped (or cached -- see memory_object_set_attributes),
* and that further mappings will cause another memory_object_init
* call to be made. No further calls will be made on
* the memory object by this kernel.
*
* [All rights to the control and name ports are included
* in this call. The memory manager should use port_deallocate
* to release them once they are no longer needed.]
*/
simpleroutine memory_object_terminate(
memory_object : memory_object_t =
MACH_MSG_TYPE_MOVE_SEND
ctype: mach_port_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MOVE_RECEIVE
ctype: mach_port_t
#if KERNEL_USER
/* for compatibility with Mach 2.5 kernels */
, dealloc
#endif KERNEL_USER
;
memory_object_name : memory_object_name_t =
MACH_MSG_TYPE_MOVE_RECEIVE
ctype: mach_port_t
#if KERNEL_USER
/* for compatibility with Mach 2.5 kernels */
, dealloc
#endif KERNEL_USER
);
/*
* Indicates that a copy has been made of the specified range of
* the given original memory object. The kernel will use the new
* memory object, control and name ports to refer to the new copy
* (once the memory manager has asserted its "ready" attribute).
*
* Cached pages from the original memory object at the time of
* the copy operation are handled as follows:
* Readable pages may be silently copied to the new
* memory object (with all access permissions).
* Pages not copied are locked to prevent write access.
*
* This call includes only the new memory object itself; a
* memory_object_init call will be made on the new memory
* object after the actions above are completed.
*
* The new memory object is *temporary*, meaning that the
* memory manager should not change its contents or allow
* the memory object to be mapped in another client. The
* memory manager may use the memory_object_data_unavailable
* call to indicate that the appropriate page of the original
* memory object may be used to fulfill a data request.
*
* [Reply should be memory_object_set_attributes on the
* new memory object control port to indicate readiness.]
*/
simpleroutine memory_object_copy(
old_memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
old_memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
length : vm_size_t;
new_memory_object : memory_object_t =
MACH_MSG_TYPE_MOVE_RECEIVE
ctype: mach_port_t
#if KERNEL_USER
/* for compatibility with Mach 2.5 kernels */
, dealloc
#endif KERNEL_USER
);
/*
* Request data from this memory object. At least
* the specified data should be returned with at
* least the specified access permitted.
*
* [Reply should be memory_object_data_provided.]
*/
simpleroutine memory_object_data_request(
memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
length : vm_size_t;
desired_access : vm_prot_t);
/*
* Request that the specified portion of this
* memory object be unlocked to allow the specified
* forms of access; the kernel already has the data.
*
* [Reply should be memory_object_lock_request.]
*/
simpleroutine memory_object_data_unlock(
memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
length : vm_size_t;
desired_access : vm_prot_t);
/*
* Write back modifications made to this portion of
* the memory object while in memory.
*
* Unless explicitly requested by a memory_object_lock_request
* (clean, but not flush), the kernel will not retain
* the data.
*
* [Reply should be vm_deallocate to release the data.]
*/
simpleroutine memory_object_data_write(
memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
data : pointer_t);
/*
* Indicate that a previous memory_object_lock_reqeust has been
* completed. Note that this call is made on whatever
* port is specified in the memory_object_lock_request; that port
* need not be the memory object port itself.
*
* [No reply expected.]
*/
simpleroutine memory_object_lock_completed(
memory_object : memory_object_t =
polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
ctype: mach_port_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
length : vm_size_t);
/*
* Indicate that a previous memory_object_data_supply has been
* completed. Note that this call is made on whatever
* port is specified in the memory_object_data_supply; that port
* need not be the memory object port itself.
*
* The result parameter indicates what happened during the supply.
* If it is not KERN_SUCCESS, then error_offset identifies the
* first offset at which a problem occurred. The pagein operation
* stopped at this point. Note that the only failures reported
* by this mechanism are KERN_MEMORY_PRESENT. All other failures
* (invalid argument, error on pagein of supplied data in manager's
* address space) cause the entire operation to fail.
*
* XXX Check what actually happens in latter case!
*
* [No reply expected.]
*/
simpleroutine memory_object_supply_completed(
memory_object : memory_object_t =
polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
ctype: mach_port_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
length : vm_size_t;
result : kern_return_t;
error_offset : vm_offset_t);
/*
* Return data to manager. This call is used in place of data_write
* for objects initialized by object_ready instead of set_attributes.
* This call indicates whether the returned data is dirty and whether
* the kernel kept a copy. Precious data remains precious if the
* kernel keeps a copy. The indication that the kernel kept a copy
* is only a hint if the data is not precious; the cleaned copy may
* be discarded without further notifying the manager.
*
* [Reply should be vm_deallocate to release the data.]
*/
simpleroutine memory_object_data_return(
memory_object : memory_object_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
memory_control : memory_object_control_t =
MACH_MSG_TYPE_MAKE_SEND
ctype: mach_port_t;
offset : vm_offset_t;
data : pointer_t;
dirty : boolean_t;
kernel_copy : boolean_t);
/*
* XXX Warning: This routine does NOT contain a memory_object_control_t
* XXX because the memory_object_change_attributes call may cause
* XXX memory object termination (by uncaching the object). This would
* XXX yield an invalid port.
*/
simpleroutine memory_object_change_completed(
memory_object : memory_object_t =
polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
ctype: mach_port_t;
#if SEQNOS
msgseqno seqno : mach_port_seqno_t;
#endif SEQNOS
may_cache : boolean_t;
copy_strategy : memory_object_copy_strategy_t);
|