|
|
1.1 root 1: /*
2: * Mach Operating System
3: * Copyright (c) 1991,1990,1989,1988 Carnegie Mellon University.
4: * Copyright (c) 1993,1994 The University of Utah and
5: * the Computer Systems Laboratory (CSL).
6: * All rights reserved.
7: *
8: * Permission to use, copy, modify and distribute this software and its
9: * documentation is hereby granted, provided that both the copyright
10: * notice and this permission notice appear in all copies of the
11: * software, derivative works or modified versions, and any portions
12: * thereof, and that both notices appear in supporting documentation.
13: *
14: * CARNEGIE MELLON, THE UNIVERSITY OF UTAH AND CSL ALLOW FREE USE OF
15: * THIS SOFTWARE IN ITS "AS IS" CONDITION, AND DISCLAIM ANY LIABILITY
16: * OF ANY KIND FOR ANY DAMAGES WHATSOEVER RESULTING FROM THE USE OF
17: * THIS SOFTWARE.
18: *
19: * Carnegie Mellon requests users of this software to return to
20: *
21: * Software Distribution Coordinator or [email protected]
22: * School of Computer Science
23: * Carnegie Mellon University
24: * Pittsburgh PA 15213-3890
25: *
26: * any improvements or extensions that they make and grant Carnegie Mellon
27: * the rights to redistribute these changes.
28: */
29: /*
30: * Matchmaker definitions file for Mach kernel interface.
31: */
32:
33: #ifdef MACH_KERNEL
34: #include <mach_ipc_compat.h>
35:
36: simport <kern/compat_xxx_defs.h>; /* for obsolete routines */
37: #endif /* MACH_KERNEL */
38:
39: subsystem
40: #if KERNEL_USER
41: KernelUser
42: #endif /* KERNEL_USER */
43: #if KERNEL_SERVER
44: KernelServer
45: #endif /* KERNEL_SERVER */
46: mach 2000;
47:
48: #ifdef KERNEL_USER
49: userprefix r_;
50: #endif /* KERNEL_USER */
51:
52: #include <mach/std_types.defs>
53: #include <mach/mach_types.defs>
54:
55: skip; /* old port_allocate */
56: skip; /* old port_deallocate */
57: skip; /* old port_enable */
58: skip; /* old port_disable */
59: skip; /* old port_select */
60: skip; /* old port_set_backlog */
61: skip; /* old port_status */
62:
63: /*
64: * Create a new task with an empty set of IPC rights,
65: * and having an address space constructed from the
66: * target task (or empty, if inherit_memory is FALSE).
67: */
68: routine task_create(
69: target_task : task_t;
70: inherit_memory : boolean_t;
71: out child_task : task_t);
72:
73: /*
74: * Destroy the target task, causing all of its threads
75: * to be destroyed, all of its IPC rights to be deallocated,
76: * and all of its address space to be deallocated.
77: */
78: routine task_terminate(
79: target_task : task_t);
80:
81: /*
82: * Get user-level handler entry points for all
83: * emulated system calls.
84: */
85: routine task_get_emulation_vector(
86: task : task_t;
87: out vector_start : int;
88: out emulation_vector: emulation_vector_t);
89:
90: /*
91: * Establish user-level handlers for the specified
92: * system calls. Non-emulated system calls are specified
93: * with emulation_vector[i] == EML_ROUTINE_NULL.
94: */
95: routine task_set_emulation_vector(
96: task : task_t;
97: vector_start : int;
98: emulation_vector: emulation_vector_t);
99:
100:
101: /*
102: * Returns the set of threads belonging to the target task.
103: */
104: routine task_threads(
105: target_task : task_t;
106: out thread_list : thread_array_t);
107:
108: /*
109: * Returns information about the target task.
110: */
111: routine task_info(
112: target_task : task_t;
113: flavor : int;
114: out task_info_out : task_info_t, CountInOut);
115:
116:
117: skip; /* old task_status */
118: skip; /* old task_set_notify */
119: skip; /* old thread_create */
120:
121: /*
122: * Destroy the target thread.
123: */
124: routine thread_terminate(
125: target_thread : thread_t);
126:
127: /*
128: * Return the selected state information for the target
129: * thread. If the thread is currently executing, the results
130: * may be stale. [Flavor THREAD_STATE_FLAVOR_LIST provides a
131: * list of valid flavors for the target thread.]
132: */
133: routine thread_get_state(
134: target_thread : thread_t;
135: flavor : int;
136: out old_state : thread_state_t, CountInOut);
137:
138: /*
139: * Set the selected state information for the target thread.
140: * If the thread is currently executing, the state change
141: * may be ill-defined.
142: */
143: routine thread_set_state(
144: target_thread : thread_t;
145: flavor : int;
146: new_state : thread_state_t);
147:
148: /*
149: * Returns information about the target thread.
150: */
151: routine thread_info(
152: target_thread : thread_t;
153: flavor : int;
154: out thread_info_out : thread_info_t, CountInOut);
155:
156: skip; /* old thread_mutate */
157:
158: /*
159: * Allocate zero-filled memory in the address space
160: * of the target task, either at the specified address,
161: * or wherever space can be found (if anywhere is TRUE),
162: * of the specified size. The address at which the
163: * allocation actually took place is returned.
164: */
165: #ifdef EMULATOR
166: skip; /* the emulator redefines vm_allocate using vm_map */
167: #else /* EMULATOR */
168: routine vm_allocate(
169: target_task : vm_task_t;
170: inout address : vm_address_t;
171: size : vm_size_t;
172: anywhere : boolean_t);
173: #endif /* EMULATOR */
174:
175: skip; /* old vm_allocate_with_pager */
176:
177: /*
178: * Deallocate the specified range from the virtual
179: * address space of the target task.
180: */
181: routine vm_deallocate(
182: target_task : vm_task_t;
183: address : vm_address_t;
184: size : vm_size_t);
185:
186: /*
187: * Set the current or maximum protection attribute
188: * for the specified range of the virtual address
189: * space of the target task. The current protection
190: * limits the memory access rights of threads within
191: * the task; the maximum protection limits the accesses
192: * that may be given in the current protection.
193: * Protections are specified as a set of {read, write, execute}
194: * *permissions*.
195: */
196: routine vm_protect(
197: target_task : vm_task_t;
198: address : vm_address_t;
199: size : vm_size_t;
200: set_maximum : boolean_t;
201: new_protection : vm_prot_t);
202:
203: /*
204: * Set the inheritance attribute for the specified range
205: * of the virtual address space of the target task.
206: * The inheritance value is one of {none, copy, share}, and
207: * specifies how the child address space should acquire
208: * this memory at the time of a task_create call.
209: */
210: routine vm_inherit(
211: target_task : vm_task_t;
212: address : vm_address_t;
213: size : vm_size_t;
214: new_inheritance : vm_inherit_t);
215:
216: /*
217: * Returns the contents of the specified range of the
218: * virtual address space of the target task. [The
219: * range must be aligned on a virtual page boundary,
220: * and must be a multiple of pages in extent. The
221: * protection on the specified range must permit reading.]
222: */
223: routine vm_read(
224: target_task : vm_task_t;
225: address : vm_address_t;
226: size : vm_size_t;
227: out data : pointer_t);
228:
229: /*
230: * Writes the contents of the specified range of the
231: * virtual address space of the target task. [The
232: * range must be aligned on a virtual page boundary,
233: * and must be a multiple of pages in extent. The
234: * protection on the specified range must permit writing.]
235: */
236: routine vm_write(
237: target_task : vm_task_t;
238: address : vm_address_t;
239: data : pointer_t);
240:
241: /*
242: * Copy the contents of the source range of the virtual
243: * address space of the target task to the destination
244: * range in that same address space. [Both of the
245: * ranges must be aligned on a virtual page boundary,
246: * and must be multiples of pages in extent. The
247: * protection on the source range must permit reading,
248: * and the protection on the destination range must
249: * permit writing.]
250: */
251: routine vm_copy(
252: target_task : vm_task_t;
253: source_address : vm_address_t;
254: size : vm_size_t;
255: dest_address : vm_address_t);
256:
257: /*
258: * Returns information about the contents of the virtual
259: * address space of the target task at the specified
260: * address. The returned protection, inheritance, sharing
261: * and memory object values apply to the entire range described
262: * by the address range returned; the memory object offset
263: * corresponds to the beginning of the address range.
264: * [If the specified address is not allocated, the next
265: * highest address range is described. If no addresses beyond
266: * the one specified are allocated, the call returns KERN_NO_SPACE.]
267: */
268: routine vm_region(
269: target_task : vm_task_t;
270: inout address : vm_address_t;
271: out size : vm_size_t;
272: out protection : vm_prot_t;
273: out max_protection : vm_prot_t;
274: out inheritance : vm_inherit_t;
275: out is_shared : boolean_t;
276: /* avoid out-translation of the argument */
277: out object_name : memory_object_name_t =
278: MACH_MSG_TYPE_MOVE_SEND
279: ctype: mach_port_t;
280: out offset : vm_offset_t);
281:
282: /*
283: * Return virtual memory statistics for the host
284: * on which the target task resides. [Note that the
285: * statistics are not specific to the target task.]
286: */
287: routine vm_statistics(
288: target_task : vm_task_t;
289: out vm_stats : vm_statistics_data_t);
290:
291: skip; /* old task_by_u*x_pid */
292: skip; /* old vm_pageable */
293:
294: /*
295: * Stash a handful of ports for the target task; child
296: * tasks inherit this stash at task_create time.
297: */
298: routine mach_ports_register(
299: target_task : task_t;
300: init_port_set : mach_port_array_t =
301: ^array[] of mach_port_t);
302:
303: /*
304: * Retrieve the stashed ports for the target task.
305: */
306: routine mach_ports_lookup(
307: target_task : task_t;
308: out init_port_set : mach_port_array_t =
309: ^array[] of mach_port_t);
310:
311: skip; /* old u*x_pid */
312: skip; /* old netipc_listen */
313: skip; /* old netipc_ignore */
314:
315: /*
316: * Provide the data contents of a range of the given memory
317: * object, with the access restriction specified. [Only
318: * whole virtual pages of data can be accepted; partial pages
319: * will be discarded. Data should be provided on request, but
320: * may be provided in advance as desired. When data already
321: * held by this kernel is provided again, the new data is ignored.
322: * The access restriction is the subset of {read, write, execute}
323: * which are prohibited. The kernel may not provide any data (or
324: * protection) consistency among pages with different virtual page
325: * alignments within the same object.]
326: */
327: simpleroutine memory_object_data_provided(
328: memory_control : memory_object_control_t;
329: offset : vm_offset_t;
330: data : pointer_t;
331: lock_value : vm_prot_t);
332:
333: /*
334: * Indicate that a range of the given temporary memory object does
335: * not exist, and that the backing memory object should be used
336: * instead (or zero-fill memory be used, if no backing object exists).
337: * [This call is intended for use only by the default memory manager.
338: * It should not be used to indicate a real error --
339: * memory_object_data_error should be used for that purpose.]
340: */
341: simpleroutine memory_object_data_unavailable(
342: memory_control : memory_object_control_t;
343: offset : vm_offset_t;
344: size : vm_size_t);
345:
346: /*
347: * Retrieves the attributes currently associated with
348: * a memory object.
349: */
350: routine memory_object_get_attributes(
351: memory_control : memory_object_control_t;
352: out object_ready : boolean_t;
353: out may_cache : boolean_t;
354: out copy_strategy : memory_object_copy_strategy_t);
355:
356: /*
357: * Sets the default memory manager, the port to which
358: * newly-created temporary memory objects are delivered.
359: * [See (memory_object_default)memory_object_create.]
360: * The old memory manager port is returned.
361: */
362: routine vm_set_default_memory_manager(
363: host_priv : host_priv_t;
364: inout default_manager : mach_port_make_send_t);
365:
366: skip; /* old pager_flush_request */
367:
368: /*
369: * Control use of the data associated with the given
370: * memory object. For each page in the given range,
371: * perform the following operations, in order:
372: * 1) restrict access to the page (disallow
373: * forms specified by "prot");
374: * 2) write back modifications (if "should_return"
375: * is RETURN_DIRTY and the page is dirty, or
376: * "should_return" is RETURN_ALL and the page
377: * is either dirty or precious); and,
378: * 3) flush the cached copy (if "should_flush"
379: * is asserted).
380: * The set of pages is defined by a starting offset
381: * ("offset") and size ("size"). Only pages with the
382: * same page alignment as the starting offset are
383: * considered.
384: *
385: * A single acknowledgement is sent (to the "reply_to"
386: * port) when these actions are complete.
387: *
388: * There are two versions of this routine because IPC distinguishes
389: * between booleans and integers (a 2-valued integer is NOT a
390: * boolean). The new routine is backwards compatible at the C
391: * language interface.
392: */
393: simpleroutine xxx_memory_object_lock_request(
394: memory_control : memory_object_control_t;
395: offset : vm_offset_t;
396: size : vm_size_t;
397: should_clean : boolean_t;
398: should_flush : boolean_t;
399: lock_value : vm_prot_t;
400: reply_to : mach_port_t =
401: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic);
402:
403:
404: simpleroutine memory_object_lock_request(
405: memory_control : memory_object_control_t;
406: offset : vm_offset_t;
407: size : vm_size_t;
408: should_return : memory_object_return_t;
409: should_flush : boolean_t;
410: lock_value : vm_prot_t;
411: reply_to : mach_port_t =
412: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic);
413:
414: /* obsolete */
415: routine xxx_task_get_emulation_vector(
416: task : task_t;
417: out vector_start : int;
418: out emulation_vector: xxx_emulation_vector_t, IsLong);
419:
420: /* obsolete */
421: routine xxx_task_set_emulation_vector(
422: task : task_t;
423: vector_start : int;
424: emulation_vector: xxx_emulation_vector_t, IsLong);
425:
426: /*
427: * Returns information about the host on which the
428: * target object resides. [This object may be
429: * a task, thread, or memory_object_control port.]
430: */
431: routine xxx_host_info(
432: target_task : mach_port_t;
433: out info : machine_info_data_t);
434:
435: /*
436: * Returns information about a particular processor on
437: * the host on which the target task resides.
438: */
439: routine xxx_slot_info(
440: target_task : task_t;
441: slot : int;
442: out info : machine_slot_data_t);
443:
444: /*
445: * Performs control operations (currently only
446: * turning off or on) on a particular processor on
447: * the host on which the target task resides.
448: */
449: routine xxx_cpu_control(
450: target_task : task_t;
451: cpu : int;
452: running : boolean_t);
453:
454: skip; /* old thread_statistics */
455: skip; /* old task_statistics */
456: skip; /* old netport_init */
457: skip; /* old netport_enter */
458: skip; /* old netport_remove */
459: skip; /* old thread_set_priority */
460:
461: /*
462: * Increment the suspend count for the target task.
463: * No threads within a task may run when the suspend
464: * count for that task is non-zero.
465: */
466: routine task_suspend(
467: target_task : task_t);
468:
469: /*
470: * Decrement the suspend count for the target task,
471: * if the count is currently non-zero. If the resulting
472: * suspend count is zero, then threads within the task
473: * that also have non-zero suspend counts may execute.
474: */
475: routine task_resume(
476: target_task : task_t);
477:
478: /*
479: * Returns the current value of the selected special port
480: * associated with the target task.
481: */
482: routine task_get_special_port(
483: task : task_t;
484: which_port : int;
485: out special_port : mach_port_t);
486:
487: /*
488: * Set one of the special ports associated with the
489: * target task.
490: */
491: routine task_set_special_port(
492: task : task_t;
493: which_port : int;
494: special_port : mach_port_t);
495:
496: /* obsolete */
497: routine xxx_task_info(
498: target_task : task_t;
499: flavor : int;
500: out task_info_out : task_info_t, IsLong);
501:
502:
503: /*
504: * Create a new thread within the target task, returning
505: * the port representing that new thread. The
506: * initial execution state of the thread is undefined.
507: */
508: routine thread_create(
509: parent_task : task_t;
510: out child_thread : thread_t);
511:
512: /*
513: * Increment the suspend count for the target thread.
514: * Once this call has completed, the thread will not
515: * execute any further user or meta- instructions.
516: * Once suspended, a thread may not execute again until
517: * its suspend count is zero, and the suspend count
518: * for its task is also zero.
519: */
520: routine thread_suspend(
521: target_thread : thread_t);
522:
523: /*
524: * Decrement the suspend count for the target thread,
525: * if that count is not already zero.
526: */
527: routine thread_resume(
528: target_thread : thread_t);
529:
530: /*
531: * Cause any user or meta- instructions currently being
532: * executed by the target thread to be aborted. [Meta-
533: * instructions consist of the basic traps for IPC
534: * (e.g., msg_send, msg_receive) and self-identification
535: * (e.g., task_self, thread_self, thread_reply). Calls
536: * described by MiG interfaces are not meta-instructions
537: * themselves.]
538: */
539: routine thread_abort(
540: target_thread : thread_t);
541:
542: /* obsolete */
543: routine xxx_thread_get_state(
544: target_thread : thread_t;
545: flavor : int;
546: out old_state : thread_state_t, IsLong);
547:
548: /* obsolete */
549: routine xxx_thread_set_state(
550: target_thread : thread_t;
551: flavor : int;
552: new_state : thread_state_t, IsLong);
553:
554: /*
555: * Returns the current value of the selected special port
556: * associated with the target thread.
557: */
558: routine thread_get_special_port(
559: thread : thread_t;
560: which_port : int;
561: out special_port : mach_port_t);
562:
563: /*
564: * Set one of the special ports associated with the
565: * target thread.
566: */
567: routine thread_set_special_port(
568: thread : thread_t;
569: which_port : int;
570: special_port : mach_port_t);
571:
572: /* obsolete */
573: routine xxx_thread_info(
574: target_thread : thread_t;
575: flavor : int;
576: out thread_info_out : thread_info_t, IsLong);
577:
578: /*
579: * Establish a user-level handler for the specified
580: * system call.
581: */
582: routine task_set_emulation(
583: target_port : task_t;
584: routine_entry_pt: vm_address_t;
585: routine_number : int);
586:
587: /*
588: * Establish restart pc for interrupted atomic sequences.
589: * This reuses the message number for the old task_get_io_port.
590: * See task_info.h for description of flavors.
591: *
592: */
593: routine task_ras_control(
594: target_task : task_t;
595: basepc : vm_address_t;
596: boundspc : vm_address_t;
597: flavor : int);
598:
599:
600:
601: skip; /* old host_ipc_statistics */
602:
603:
604: #if MACH_IPC_COMPAT
605:
606: /*
607: * Returns the set of port and port set names
608: * to which the target task has access, along with
609: * the type (set or port) for each name.
610: */
611: routine port_names(
612: task : ipc_space_t;
613: out port_names_p : port_name_array_t;
614: out port_types : port_type_array_t);
615:
616: /*
617: * Returns the type (set or port) for the port name
618: * within the target task.
619: */
620: routine port_type(
621: task : ipc_space_t;
622: port_name : port_name_t;
623: out port_type_p : port_type_t);
624:
625: /*
626: * Changes the name by which a port (or port set) is known to
627: * the target task.
628: */
629: routine port_rename(
630: task : ipc_space_t;
631: old_name : port_name_t;
632: new_name : port_name_t);
633:
634: /*
635: * Allocate a new port (with all rights) in the target task.
636: * The port name in that task is returned.
637: */
638: routine port_allocate(
639: task : ipc_space_t;
640: out port_name : port_name_t);
641:
642: /*
643: * Deallocate the port with the given name from the target task.
644: */
645: routine port_deallocate(
646: task : ipc_space_t;
647: port_name : port_name_t);
648:
649: /*
650: * Set the number of messages that may be queued to
651: * the port in the target task with the given name
652: * before further message queueing operations block.
653: * The target task must hold receive rights for the
654: * port named.
655: */
656: routine port_set_backlog(
657: task : ipc_space_t;
658: port_name : port_name_t;
659: backlog : int);
660:
661: /*
662: * Return information about the port with the given
663: * name in the target task. Only the ownership and
664: * receive_rights results are meaningful unless the
665: * target task holds receive rights for the port.
666: */
667: routine port_status(
668: task : ipc_space_t;
669: port_name : port_name_t;
670: out enabled : port_set_name_t;
671: out num_msgs : int;
672: out backlog : int;
673: out ownership : boolean_t;
674: out receive_rights : boolean_t);
675:
676: /*
677: * Allocate a new port set in the target task, returning
678: * the name of that new port set. [The new set is
679: * initially empty.]
680: */
681: routine port_set_allocate(
682: task : ipc_space_t;
683: out set_name : port_set_name_t);
684:
685: /*
686: * Deallocate the named port set from the target task.
687: * Ports that are currently members of the named port
688: * set are first removed from the set.
689: */
690: routine port_set_deallocate(
691: task : ipc_space_t;
692: set_name : port_set_name_t);
693:
694: /*
695: * Add the named port to the port set named within
696: * the target task. [If the port currently is a member
697: * of another port set, it is removed from that set.]
698: */
699: routine port_set_add(
700: task : ipc_space_t;
701: set_name : port_set_name_t;
702: port_name : port_name_t);
703:
704: /*
705: * Remove the named port from the port set named within
706: * the target task.
707: */
708: routine port_set_remove(
709: task : ipc_space_t;
710: port_name : port_name_t);
711:
712: /*
713: * Returns the current set of ports that are members
714: * of the named port set in the target task.
715: */
716: routine port_set_status(
717: task : ipc_space_t;
718: set_name : port_set_name_t;
719: out members : port_name_array_t);
720:
721: /*
722: * Insert send rights for the specified port into
723: * the target task with the specified port name.
724: * [If the name is in use, or the target task already
725: * has another name for the specified port, then
726: * the operation will fail.]
727: */
728: routine port_insert_send(
729: task : ipc_space_t;
730: my_port : port_t;
731: his_name : port_name_t);
732:
733: /*
734: * Returns send rights for the named port in the
735: * target task, removing that port name and port
736: * send rights from the target task. [If the
737: * target task holds receive rights for this port,
738: * the operation will fail.]
739: */
740: routine port_extract_send(
741: task : ipc_space_t;
742: his_name : port_name_t;
743: out his_port : port_t);
744:
745: /*
746: * Insert receive rights for the specified port into
747: * the target task with the specified port name.
748: * [If the name is in use, or the target task already
749: * has another name for the specified port, then
750: * the operation will fail.
751: */
752: routine port_insert_receive(
753: task : ipc_space_t;
754: my_port : port_all_t;
755: his_name : port_name_t);
756:
757: /*
758: * Returns receive rights for the named port in the
759: * target task, removing that port name and all port
760: * rights from the target task.
761: */
762: routine port_extract_receive(
763: task : ipc_space_t;
764: his_name : port_name_t;
765: out his_port : port_all_t);
766:
767: #else /* MACH_IPC_COMPAT */
768:
769: skip; /* old port_names */
770: skip; /* old port_type */
771: skip; /* old port_rename */
772: skip; /* old port_allocate */
773: skip; /* old port_deallocate */
774: skip; /* old port_set_backlog */
775: skip; /* old port_status */
776: skip; /* old port_set_allocate */
777: skip; /* old port_set_deallocate */
778: skip; /* old port_set_add */
779: skip; /* old port_set_remove */
780: skip; /* old port_set_status */
781: skip; /* old port_insert_send */
782: skip; /* old port_extract_send */
783: skip; /* old port_insert_receive */
784: skip; /* old port_extract_receive */
785:
786: #endif /* MACH_IPC_COMPAT */
787:
788: /*
789: * Map a user-defined memory object into the virtual address
790: * space of the target task. If desired (anywhere is TRUE),
791: * the kernel will find a suitable address range of the
792: * specified size; else, the specific address will be allocated.
793: *
794: * The beginning address of the range will be aligned on a virtual
795: * page boundary, be at or beyond the address specified, and
796: * meet the mask requirements (bits turned on in the mask must not
797: * be turned on in the result); the size of the range, in bytes,
798: * will be rounded up to an integral number of virtual pages.
799: *
800: * The memory in the resulting range will be associated with the
801: * specified memory object, with the beginning of the memory range
802: * referring to the specified offset into the memory object.
803: *
804: * The mapping will take the current and maximum protections and
805: * the inheritance attributes specified; see the vm_protect and
806: * vm_inherit calls for a description of these attributes.
807: *
808: * If desired (copy is TRUE), the memory range will be filled
809: * with a copy of the data from the memory object; this copy will
810: * be private to this mapping in this target task. Otherwise,
811: * the memory in this mapping will be shared with other mappings
812: * of the same memory object at the same offset (in this task or
813: * in other tasks). [The Mach kernel only enforces shared memory
814: * consistency among mappings on one host with similar page alignments.
815: * The user-defined memory manager for this object is responsible
816: * for further consistency.]
817: */
818: #ifdef EMULATOR
819: routine htg_vm_map(
820: target_task : vm_task_t;
821: ureplyport reply_port : mach_port_make_send_once_t;
822: inout address : vm_address_t;
823: size : vm_size_t;
824: mask : vm_address_t;
825: anywhere : boolean_t;
826: memory_object : memory_object_t;
827: offset : vm_offset_t;
828: copy : boolean_t;
829: cur_protection : vm_prot_t;
830: max_protection : vm_prot_t;
831: inheritance : vm_inherit_t);
832: #else /* EMULATOR */
833: routine vm_map(
834: target_task : vm_task_t;
835: inout address : vm_address_t;
836: size : vm_size_t;
837: mask : vm_address_t;
838: anywhere : boolean_t;
839: memory_object : memory_object_t;
840: offset : vm_offset_t;
841: copy : boolean_t;
842: cur_protection : vm_prot_t;
843: max_protection : vm_prot_t;
844: inheritance : vm_inherit_t);
845: #endif /* EMULATOR */
846:
847: /*
848: * Indicate that a range of the specified memory object cannot
849: * be provided at this time. [Threads waiting for memory pages
850: * specified by this call will experience a memory exception.
851: * Only threads waiting at the time of the call are affected.]
852: */
853: simpleroutine memory_object_data_error(
854: memory_control : memory_object_control_t;
855: offset : vm_offset_t;
856: size : vm_size_t;
857: error_value : kern_return_t);
858:
859: /*
860: * Make decisions regarding the use of the specified
861: * memory object.
862: */
863: simpleroutine memory_object_set_attributes(
864: memory_control : memory_object_control_t;
865: object_ready : boolean_t;
866: may_cache : boolean_t;
867: copy_strategy : memory_object_copy_strategy_t);
868:
869: /*
870: */
871: simpleroutine memory_object_destroy(
872: memory_control : memory_object_control_t;
873: reason : kern_return_t);
874:
875: /*
876: * Provide the data contents of a range of the given memory
877: * object, with the access restriction specified, optional
878: * precious attribute, and reply message. [Only
879: * whole virtual pages of data can be accepted; partial pages
880: * will be discarded. Data should be provided on request, but
881: * may be provided in advance as desired. When data already
882: * held by this kernel is provided again, the new data is ignored.
883: * The access restriction is the subset of {read, write, execute}
884: * which are prohibited. The kernel may not provide any data (or
885: * protection) consistency among pages with different virtual page
886: * alignments within the same object. The precious value controls
887: * how the kernel treats the data. If it is FALSE, the kernel treats
888: * its copy as a temporary and may throw it away if it hasn't been
889: * changed. If the precious value is TRUE, the kernel treats its
890: * copy as a data repository and promises to return it to the manager;
891: * the manager may tell the kernel to throw it away instead by flushing
892: * and not cleaning the data -- see memory_object_lock_request. The
893: * reply_to port is for a compeletion message; it will be
894: * memory_object_supply_completed.]
895: */
896:
897: simpleroutine memory_object_data_supply(
898: memory_control : memory_object_control_t;
899: offset : vm_offset_t;
900: data : pointer_t, Dealloc[];
901: lock_value : vm_prot_t;
902: precious : boolean_t;
903: reply_to : mach_port_t =
904: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic);
905:
906: simpleroutine memory_object_ready(
907: memory_control : memory_object_control_t;
908: may_cache : boolean_t;
909: copy_strategy : memory_object_copy_strategy_t);
910:
911: simpleroutine memory_object_change_attributes(
912: memory_control : memory_object_control_t;
913: may_cache : boolean_t;
914: copy_strategy : memory_object_copy_strategy_t;
915: reply_to : mach_port_t =
916: MACH_MSG_TYPE_MAKE_SEND_ONCE|polymorphic);
917:
918: skip; /* old host_callout_statistics_reset */
919: skip; /* old port_set_select */
920:
921: #if MACH_IPC_COMPAT
922:
923: /*
924: * Sets a backup port for the named port. The task
925: * must have receive rights for the named port.
926: * Returns the previous backup port, if any.
927: */
928:
929: routine port_set_backup(
930: task : ipc_space_t;
931: port_name : port_name_t;
932: backup : port_t = MACH_MSG_TYPE_MAKE_SEND
933: ctype: mach_port_t;
934: out previous : port_t);
935:
936: #else /* MACH_IPC_COMPAT */
937:
938: skip; /* old port_set_backup */
939:
940: #endif /* MACH_IPC_COMPAT */
941:
942: /*
943: * Set/Get special properties of memory associated
944: * to some virtual address range, such as cachability,
945: * migrability, replicability. Machine-dependent.
946: */
947: routine vm_machine_attribute(
948: target_task : vm_task_t;
949: address : vm_address_t;
950: size : vm_size_t;
951: attribute : vm_machine_attribute_t;
952: inout value : vm_machine_attribute_val_t);
953:
954: skip; /* old host_fpa_counters_reset */
955:
956: /*
957: * There is no more room in this interface for additional calls.
958: */
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.