|
|
1.1 root 1: /*
2: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved.
3: *
4: * @APPLE_LICENSE_HEADER_START@
5: *
6: * Portions Copyright (c) 1999 Apple Computer, Inc. All Rights
7: * Reserved. This file contains Original Code and/or Modifications of
8: * Original Code as defined in and that are subject to the Apple Public
9: * Source License Version 1.1 (the "License"). You may not use this file
10: * except in compliance with the License. Please obtain a copy of the
11: * License at http://www.apple.com/publicsource and read it before using
12: * this file.
13: *
14: * The Original Code and all software distributed under the License are
15: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
16: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
17: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
18: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the
19: * License for the specific language governing rights and limitations
20: * under the License.
21: *
22: * @APPLE_LICENSE_HEADER_END@
23: */
24:
25: /*
26: * Mach Operating System
27: * Copyright (c) 1991,1990,1989,1988,1987 Carnegie Mellon University
28: * All Rights Reserved.
29: *
30: * Permission to use, copy, modify and distribute this software and its
31: * documentation is hereby granted, provided that both the copyright
32: * notice and this permission notice appear in all copies of the
33: * software, derivative works or modified versions, and any portions
34: * thereof, and that both notices appear in supporting documentation.
35: *
36: * CARNEGIE MELLON ALLOWS FREE USE OF THIS SOFTWARE IN ITS "AS IS"
37: * CONDITION. CARNEGIE MELLON DISCLAIMS ANY LIABILITY OF ANY KIND FOR
38: * ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF THIS SOFTWARE.
39: *
40: * Carnegie Mellon requests users of this software to return to
41: *
42: * Software Distribution Coordinator or [email protected]
43: * School of Computer Science
44: * Carnegie Mellon University
45: * Pittsburgh PA 15213-3890
46: *
47: * any improvements or extensions that they make and grant Carnegie Mellon
48: * the rights to redistribute these changes.
49: */
50: /*
51: * HISTORY
52: * $Log: memory_object.defs,v $
53: * Revision 1.1.1.1.666.4 1999/03/16 17:05:40 wsanchez
54: * Substitute License
55: *
56: * Revision 1.1.1.1.666.3 1999/03/16 15:28:03 wsanchez
57: * Substitute copyright
58: *
59: * Revision 1.1.1.1.666.2 1999/03/16 10:37:39 umeshv
60: * Fixed errors in previous commit.
61: *
62: * Revision 1.1.1.1.666.1 1999/03/11 09:52:50 umeshv
63: * Added copyrights.
64: *
65: * Revision 1.1.1.1 1997/09/30 02:44:51 wsanchez
66: * Import of kernel from umeshv/kernel
67: *
68: * Revision 2.9 91/08/28 11:15:19 jsb
69: * Added conditionalized sequence number support.
70: * [91/08/13 rpd]
71: * Fixed memory_object_supply_completed and memory_object_data_return
72: * to use mach_port_t as the C type name for port arguments.
73: * [91/08/02 rpd]
74: * Update types in new memory object routines. Add
75: * memory_object_change_completed.
76: * [91/07/03 14:05:39 dlb]
77: *
78: * Revision 2.8 91/07/01 08:25:16 jsb
79: * From David Black at OSF: added memory_object_supply_completed
80: * and memory_object_data_return.
81: * [91/06/29 14:54:47 jsb]
82: *
83: * Revision 2.7 91/06/25 10:30:30 rpd
84: * Changed the port-based type declarations
85: * to use mach_port_t as the C type name.
86: * [91/05/23 rpd]
87: *
88: * Revision 2.6 91/06/17 15:47:26 jsb
89: * If KERNEL and NORMA_VM, then use a userprefix (to allow interposition).
90: * [91/06/17 10:55:06 jsb]
91: *
92: * Revision 2.5 91/05/14 16:55:36 mrt
93: * Correcting copyright
94: *
95: * Revision 2.4 91/02/05 17:33:53 mrt
96: * Changed to new Mach copyright
97: * [91/02/01 17:19:02 mrt]
98: *
99: * Revision 2.3 90/08/06 17:06:11 rpd
100: * For compatibility with Mach 2.5, added dealloc to
101: * arguments of memory_object_terminate and memory_object_copy.
102: * [90/08/04 rpd]
103: *
104: * Revision 2.2 90/06/02 14:58:51 rpd
105: * Changed memory_object argument to memory_object_lock_completed
106: * to default to a send-once right but still allow send rights.
107: * [90/05/31 rpd]
108: *
109: * Converted to new IPC.
110: * [90/03/26 22:35:02 rpd]
111: *
112: * Revision 2.1 89/08/03 17:18:02 rwd
113: * Created.
114: *
115: * Revision 2.3 89/02/25 18:38:17 gm0w
116: * Changes for cleanup.
117: *
118: * Revision 2.2 89/01/15 16:31:06 rpd
119: * Moved from kern/ to mach/.
120: * [89/01/15 14:40:04 rpd]
121: *
122: * Revision 2.6 89/01/12 07:58:12 rpd
123: * Fixed includes.
124: * [89/01/12 04:52:21 rpd]
125: *
126: * Revision 2.5 88/12/19 02:46:15 mwyoung
127: * Change argument to memory_object_init to avoid lint in the MiG
128: * output.
129: * [88/12/18 mwyoung]
130: *
131: * Add memory_object_copy.
132: * [88/11/07 mwyoung]
133: *
134: * Revision 2.4 88/08/25 18:16:54 mwyoung
135: * Add memory_object_terminate.
136: * [88/08/11 18:46:46 mwyoung]
137: *
138: * 29-Jun-88 Michael Young (mwyoung) at Carnegie-Mellon University
139: * Use new types.
140: *
141: * 29-Jun-88 Michael Young (mwyoung) at Carnegie-Mellon University
142: * Moved data type declarations to "mach_types.defs".
143: *
144: * 9-Dec-87 Michael Young (mwyoung) at Carnegie-Mellon University
145: * Split that part of the interface applicable only to default
146: * pagers into a separate interface definition.
147: *
148: * Documented the interface.
149: *
150: * Purged history. Contributors so far: jle, mwyoung, bolosky.
151: *
152: */
153: /*
154: * File: mach/memory_object.defs
155: *
156: * Abstract:
157: * Basic Mach external memory management interface declaration.
158: */
159:
160: subsystem
161: #if KERNEL_USER
162: KernelUser
163: #endif KERNEL_USER
164: #if KERNEL_SERVER
165: KernelServer
166: #endif KERNEL_SERVER
167: memory_object 2200;
168:
169: #include <mach/std_types.defs>
170: #include <mach/mach_types.defs>
171:
172: #if SEQNOS
173: serverprefix seqnos_;
174: serverdemux seqnos_memory_object_server;
175: #endif SEQNOS
176:
177: /*
178: * Initialize the specified memory object, providing
179: * a reqeust port on which control calls can be made, and
180: * a name port that identifies this object to callers of
181: * vm_regions.
182: * [To allow the mapping of this object to be used, the
183: * memory manager must call memory_object_set_attributes,
184: * specifying the "ready" parameter as TRUE. To reject
185: * all mappings of this object, the memory manager may
186: * use memory_object_destroy.]
187: */
188: simpleroutine memory_object_init(
189: memory_object : memory_object_t;
190: #if SEQNOS
191: msgseqno seqno : mach_port_seqno_t;
192: #endif SEQNOS
193: memory_control : memory_object_control_t =
194: MACH_MSG_TYPE_MAKE_SEND
195: ctype: mach_port_t;
196: memory_object_name : memory_object_name_t =
197: MACH_MSG_TYPE_MAKE_SEND
198: ctype: mach_port_t;
199: memory_object_page_size : vm_size_t);
200:
201: /*
202: * Indicates that the specified memory object is no longer
203: * mapped (or cached -- see memory_object_set_attributes),
204: * and that further mappings will cause another memory_object_init
205: * call to be made. No further calls will be made on
206: * the memory object by this kernel.
207: *
208: * [All rights to the control and name ports are included
209: * in this call. The memory manager should use port_deallocate
210: * to release them once they are no longer needed.]
211: */
212: simpleroutine memory_object_terminate(
213: memory_object : memory_object_t =
214: MACH_MSG_TYPE_MOVE_SEND
215: ctype: mach_port_t;
216: #if SEQNOS
217: msgseqno seqno : mach_port_seqno_t;
218: #endif SEQNOS
219: memory_control : memory_object_control_t =
220: MACH_MSG_TYPE_MOVE_RECEIVE
221: ctype: mach_port_t
222: #if KERNEL_USER
223: /* for compatibility with Mach 2.5 kernels */
224: , dealloc
225: #endif KERNEL_USER
226: ;
227: memory_object_name : memory_object_name_t =
228: MACH_MSG_TYPE_MOVE_RECEIVE
229: ctype: mach_port_t
230: #if KERNEL_USER
231: /* for compatibility with Mach 2.5 kernels */
232: , dealloc
233: #endif KERNEL_USER
234: );
235:
236: /*
237: * Indicates that a copy has been made of the specified range of
238: * the given original memory object. The kernel will use the new
239: * memory object, control and name ports to refer to the new copy
240: * (once the memory manager has asserted its "ready" attribute).
241: *
242: * Cached pages from the original memory object at the time of
243: * the copy operation are handled as follows:
244: * Readable pages may be silently copied to the new
245: * memory object (with all access permissions).
246: * Pages not copied are locked to prevent write access.
247: *
248: * This call includes only the new memory object itself; a
249: * memory_object_init call will be made on the new memory
250: * object after the actions above are completed.
251: *
252: * The new memory object is *temporary*, meaning that the
253: * memory manager should not change its contents or allow
254: * the memory object to be mapped in another client. The
255: * memory manager may use the memory_object_data_unavailable
256: * call to indicate that the appropriate page of the original
257: * memory object may be used to fulfill a data request.
258: *
259: * [Reply should be memory_object_set_attributes on the
260: * new memory object control port to indicate readiness.]
261: */
262: simpleroutine memory_object_copy(
263: old_memory_object : memory_object_t;
264: #if SEQNOS
265: msgseqno seqno : mach_port_seqno_t;
266: #endif SEQNOS
267: old_memory_control : memory_object_control_t =
268: MACH_MSG_TYPE_MAKE_SEND
269: ctype: mach_port_t;
270: offset : vm_offset_t;
271: length : vm_size_t;
272: new_memory_object : memory_object_t =
273: MACH_MSG_TYPE_MOVE_RECEIVE
274: ctype: mach_port_t
275: #if KERNEL_USER
276: /* for compatibility with Mach 2.5 kernels */
277: , dealloc
278: #endif KERNEL_USER
279: );
280:
281: /*
282: * Request data from this memory object. At least
283: * the specified data should be returned with at
284: * least the specified access permitted.
285: *
286: * [Reply should be memory_object_data_provided.]
287: */
288: simpleroutine memory_object_data_request(
289: memory_object : memory_object_t;
290: #if SEQNOS
291: msgseqno seqno : mach_port_seqno_t;
292: #endif SEQNOS
293: memory_control : memory_object_control_t =
294: MACH_MSG_TYPE_MAKE_SEND
295: ctype: mach_port_t;
296: offset : vm_offset_t;
297: length : vm_size_t;
298: desired_access : vm_prot_t);
299:
300: /*
301: * Request that the specified portion of this
302: * memory object be unlocked to allow the specified
303: * forms of access; the kernel already has the data.
304: *
305: * [Reply should be memory_object_lock_request.]
306: */
307: simpleroutine memory_object_data_unlock(
308: memory_object : memory_object_t;
309: #if SEQNOS
310: msgseqno seqno : mach_port_seqno_t;
311: #endif SEQNOS
312: memory_control : memory_object_control_t =
313: MACH_MSG_TYPE_MAKE_SEND
314: ctype: mach_port_t;
315: offset : vm_offset_t;
316: length : vm_size_t;
317: desired_access : vm_prot_t);
318:
319: /*
320: * Write back modifications made to this portion of
321: * the memory object while in memory.
322: *
323: * Unless explicitly requested by a memory_object_lock_request
324: * (clean, but not flush), the kernel will not retain
325: * the data.
326: *
327: * [Reply should be vm_deallocate to release the data.]
328: */
329: simpleroutine memory_object_data_write(
330: memory_object : memory_object_t;
331: #if SEQNOS
332: msgseqno seqno : mach_port_seqno_t;
333: #endif SEQNOS
334: memory_control : memory_object_control_t =
335: MACH_MSG_TYPE_MAKE_SEND
336: ctype: mach_port_t;
337: offset : vm_offset_t;
338: data : pointer_t);
339:
340: /*
341: * Indicate that a previous memory_object_lock_reqeust has been
342: * completed. Note that this call is made on whatever
343: * port is specified in the memory_object_lock_request; that port
344: * need not be the memory object port itself.
345: *
346: * [No reply expected.]
347: */
348: simpleroutine memory_object_lock_completed(
349: memory_object : memory_object_t =
350: polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
351: ctype: mach_port_t;
352: #if SEQNOS
353: msgseqno seqno : mach_port_seqno_t;
354: #endif SEQNOS
355: memory_control : memory_object_control_t =
356: MACH_MSG_TYPE_MAKE_SEND
357: ctype: mach_port_t;
358: offset : vm_offset_t;
359: length : vm_size_t);
360:
361: /*
362: * Indicate that a previous memory_object_data_supply has been
363: * completed. Note that this call is made on whatever
364: * port is specified in the memory_object_data_supply; that port
365: * need not be the memory object port itself.
366: *
367: * The result parameter indicates what happened during the supply.
368: * If it is not KERN_SUCCESS, then error_offset identifies the
369: * first offset at which a problem occurred. The pagein operation
370: * stopped at this point. Note that the only failures reported
371: * by this mechanism are KERN_MEMORY_PRESENT. All other failures
372: * (invalid argument, error on pagein of supplied data in manager's
373: * address space) cause the entire operation to fail.
374: *
375: * XXX Check what actually happens in latter case!
376: *
377: * [No reply expected.]
378: */
379: simpleroutine memory_object_supply_completed(
380: memory_object : memory_object_t =
381: polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
382: ctype: mach_port_t;
383: #if SEQNOS
384: msgseqno seqno : mach_port_seqno_t;
385: #endif SEQNOS
386: memory_control : memory_object_control_t =
387: MACH_MSG_TYPE_MAKE_SEND
388: ctype: mach_port_t;
389: offset : vm_offset_t;
390: length : vm_size_t;
391: result : kern_return_t;
392: error_offset : vm_offset_t);
393:
394: /*
395: * Return data to manager. This call is used in place of data_write
396: * for objects initialized by object_ready instead of set_attributes.
397: * This call indicates whether the returned data is dirty and whether
398: * the kernel kept a copy. Precious data remains precious if the
399: * kernel keeps a copy. The indication that the kernel kept a copy
400: * is only a hint if the data is not precious; the cleaned copy may
401: * be discarded without further notifying the manager.
402: *
403: * [Reply should be vm_deallocate to release the data.]
404: */
405: simpleroutine memory_object_data_return(
406: memory_object : memory_object_t;
407: #if SEQNOS
408: msgseqno seqno : mach_port_seqno_t;
409: #endif SEQNOS
410: memory_control : memory_object_control_t =
411: MACH_MSG_TYPE_MAKE_SEND
412: ctype: mach_port_t;
413: offset : vm_offset_t;
414: data : pointer_t;
415: dirty : boolean_t;
416: kernel_copy : boolean_t);
417:
418: /*
419: * XXX Warning: This routine does NOT contain a memory_object_control_t
420: * XXX because the memory_object_change_attributes call may cause
421: * XXX memory object termination (by uncaching the object). This would
422: * XXX yield an invalid port.
423: */
424:
425: simpleroutine memory_object_change_completed(
426: memory_object : memory_object_t =
427: polymorphic|MACH_MSG_TYPE_PORT_SEND_ONCE
428: ctype: mach_port_t;
429: #if SEQNOS
430: msgseqno seqno : mach_port_seqno_t;
431: #endif SEQNOS
432: may_cache : boolean_t;
433: copy_strategy : memory_object_copy_strategy_t);
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.