|
|
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_COPYRIGHT@ ! 24: */ ! 25: /* ! 26: * HISTORY ! 27: * ! 28: * Revision 1.1.1.1 1998/09/22 21:05:34 wsanchez ! 29: * Import of Mac OS X kernel (~semeria) ! 30: * ! 31: * Revision 1.2 1998/04/29 17:35:56 mburg ! 32: * MK7.3 merger ! 33: * ! 34: * Revision 1.1.10.1 1998/02/03 09:28:28 gdt ! 35: * Merge up to MK7.3 ! 36: * [1998/02/03 09:13:40 gdt] ! 37: * ! 38: * Revision 1.1.8.1 1997/06/17 02:57:46 devrcs ! 39: * Added `ipc_subsystem_terminate().' ! 40: * [1997/03/18 18:25:52 rkc] ! 41: * ! 42: * Revision 1.1.5.1 1994/09/23 02:19:57 ezf ! 43: * change marker to not FREE ! 44: * [1994/09/22 21:33:39 ezf] ! 45: * ! 46: * Revision 1.1.3.1 1994/01/20 11:05:46 emcmanus ! 47: * Copied for submission. ! 48: * [1994/01/20 11:04:25 emcmanus] ! 49: * ! 50: * Revision 1.1.1.2 1994/01/13 02:40:32 condict ! 51: * IPC support for the RPC subsytem object (server co-location). ! 52: * ! 53: * $EndLog$ ! 54: */ ! 55: ! 56: /* ! 57: * File: kern/ipc_subsystem.c ! 58: * Purpose: Routines to support ipc semantics of new kernel ! 59: * RPC subsystem descriptions ! 60: */ ! 61: ! 62: #include <mach/message.h> ! 63: #include <kern/ipc_kobject.h> ! 64: #include <kern/task.h> ! 65: #include <kern/ipc_subsystem.h> ! 66: #include <kern/subsystem.h> ! 67: #include <kern/misc_protos.h> ! 68: #include <ipc/ipc_port.h> ! 69: #include <ipc/ipc_space.h> ! 70: ! 71: /* ! 72: * Routine: ipc_subsystem_init ! 73: * Purpose: ! 74: * Initialize ipc control of a subsystem. ! 75: */ ! 76: void ! 77: ipc_subsystem_init( ! 78: subsystem_t subsystem) ! 79: { ! 80: ipc_port_t port; ! 81: ! 82: port = ipc_port_alloc_kernel(); ! 83: if (port == IP_NULL) ! 84: panic("ipc_subsystem_init"); ! 85: subsystem->ipc_self = port; ! 86: } ! 87: ! 88: /* ! 89: * Routine: ipc_subsystem_enable ! 90: * Purpose: ! 91: * Enable ipc access to a subsystem. ! 92: */ ! 93: void ! 94: ipc_subsystem_enable( ! 95: subsystem_t subsystem) ! 96: { ! 97: ipc_kobject_set(subsystem->ipc_self, ! 98: (ipc_kobject_t) subsystem, IKOT_SUBSYSTEM); ! 99: } ! 100: ! 101: ! 102: /* ! 103: * Routine: ipc_subsystem_disable ! 104: * Purpose: ! 105: * Disable IPC access to a subsystem. ! 106: * Conditions: ! 107: * Nothing locked. ! 108: */ ! 109: ! 110: void ! 111: ipc_subsystem_disable( ! 112: subsystem_t subsystem) ! 113: { ! 114: ipc_port_t kport; ! 115: ! 116: kport = subsystem->ipc_self; ! 117: if (kport != IP_NULL) ! 118: ipc_kobject_set(kport, IKO_NULL, IKOT_NONE); ! 119: } ! 120: ! 121: /* ! 122: * Routine: ipc_subsystem_terminate ! 123: * Purpose: ! 124: * Clean up and destroy a subsystem's IPC state. ! 125: */ ! 126: void ! 127: ipc_subsystem_terminate( ! 128: subsystem_t subsystem) ! 129: { ! 130: ipc_port_dealloc_kernel(subsystem->ipc_self); ! 131: } ! 132: ! 133: ! 134: /* ! 135: * Routine: convert_port_to_subsystem ! 136: * Purpose: ! 137: * Convert from a port to a subsystem. ! 138: * Doesn't consume the port ref; produces a subsystem ref, ! 139: * which may be null. ! 140: * Conditions: ! 141: * Nothing locked. ! 142: */ ! 143: subsystem_t ! 144: convert_port_to_subsystem( ! 145: ipc_port_t port) ! 146: { ! 147: subsystem_t subsystem = SUBSYSTEM_NULL; ! 148: ! 149: if (IP_VALID(port)) { ! 150: ip_lock(port); ! 151: if (ip_active(port) && ! 152: (ip_kotype(port) == IKOT_SUBSYSTEM)) { ! 153: subsystem = (subsystem_t) port->ip_kobject; ! 154: } ! 155: ip_unlock(port); ! 156: } ! 157: return (subsystem); ! 158: } ! 159: ! 160: ! 161: /* ! 162: * Routine: convert_subsystem_to_port ! 163: * Purpose: ! 164: * Convert from a subsystem to a port. ! 165: * Produces a naked send right which may be invalid. ! 166: * Conditions: ! 167: * Nothing locked. ! 168: */ ! 169: ipc_port_t ! 170: convert_subsystem_to_port( ! 171: subsystem_t subsystem) ! 172: { ! 173: ipc_port_t port; ! 174: ! 175: port = ipc_port_make_send(subsystem->ipc_self); ! 176: return (port); ! 177: } ! 178:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.