1/* 2 * Copyright (c) 2011 Apple Inc. All rights reserved. 3 * 4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@ 5 * 6 * This file contains Original Code and/or Modifications of Original Code 7 * as defined in and that are subject to the Apple Public Source License 8 * Version 2.0 (the 'License'). You may not use this file except in 9 * compliance with the License. The rights granted to you under the License 10 * may not be used to create, or enable the creation or redistribution of, 11 * unlawful or unlicensed copies of an Apple operating system, or to 12 * circumvent, violate, or enable the circumvention or violation of, any 13 * terms of an Apple operating system software license agreement. 14 * 15 * Please obtain a copy of the License at 16 * http://www.opensource.apple.com/apsl/ and read it before using this file. 17 * 18 * The Original Code and all software distributed under the License are 19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER 20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, 21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, 22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. 23 * Please see the License for the specific language governing rights and 24 * limitations under the License. 25 * 26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@ 27 */ 28 29#include <mach/mach_port_internal.h> 30#include <mach/mach.h> 31#include <mach/mach_vm.h> 32#include <mach/mach_traps.h> 33 34kern_return_t 35mach_port_names( 36 ipc_space_t task, 37 mach_port_name_array_t *names, 38 mach_msg_type_number_t *namesCnt, 39 mach_port_type_array_t *types, 40 mach_msg_type_number_t *typesCnt) 41{ 42 kern_return_t rv; 43 44 rv = _kernelrpc_mach_port_names(task, names, namesCnt, types, 45 typesCnt); 46 47 return (rv); 48} 49 50kern_return_t 51mach_port_type( 52 ipc_space_t task, 53 mach_port_name_t name, 54 mach_port_type_t *ptype) 55{ 56 kern_return_t rv; 57 58 rv = _kernelrpc_mach_port_type(task, name, ptype); 59 60 return (rv); 61} 62 63kern_return_t 64mach_port_rename( 65 ipc_space_t task, 66 mach_port_name_t old_name, 67 mach_port_name_t new_name) 68{ 69 kern_return_t rv; 70 71 rv = _kernelrpc_mach_port_rename(task, old_name, new_name); 72 73 return (rv); 74} 75 76kern_return_t 77mach_port_allocate_name( 78 ipc_space_t task, 79 mach_port_right_t right, 80 mach_port_name_t name) 81{ 82 kern_return_t rv; 83 84 rv = _kernelrpc_mach_port_allocate_name(task, right, name); 85 86 return (rv); 87} 88 89kern_return_t 90mach_port_allocate( 91 ipc_space_t task, 92 mach_port_right_t right, 93 mach_port_name_t *name) 94{ 95 kern_return_t rv; 96 97 rv = _kernelrpc_mach_port_allocate_trap(task, right, name); 98 99 if (rv == MACH_SEND_INVALID_DEST) 100 rv = _kernelrpc_mach_port_allocate(task, right, name); 101 102 return (rv); 103} 104 105kern_return_t 106mach_port_destroy( 107 ipc_space_t task, 108 mach_port_name_t name) 109{ 110 kern_return_t rv; 111 112 rv = _kernelrpc_mach_port_destroy_trap(task, name); 113 114 if (rv == MACH_SEND_INVALID_DEST) 115 rv = _kernelrpc_mach_port_destroy(task, name); 116 117 return (rv); 118} 119 120kern_return_t 121mach_port_deallocate( 122 ipc_space_t task, 123 mach_port_name_t name) 124{ 125 kern_return_t rv; 126 127 rv = _kernelrpc_mach_port_deallocate_trap(task, name); 128 129 if (rv == MACH_SEND_INVALID_DEST) 130 rv = _kernelrpc_mach_port_deallocate(task,name); 131 132 return (rv); 133} 134 135kern_return_t 136mach_port_get_refs( 137 ipc_space_t task, 138 mach_port_name_t name, 139 mach_port_right_t right, 140 mach_port_urefs_t *refs) 141{ 142 kern_return_t rv; 143 144 rv = _kernelrpc_mach_port_get_refs(task, name, right, refs); 145 146 return (rv); 147} 148 149kern_return_t 150mach_port_mod_refs( 151 ipc_space_t task, 152 mach_port_name_t name, 153 mach_port_right_t right, 154 mach_port_delta_t delta) 155{ 156 kern_return_t rv; 157 158 rv = _kernelrpc_mach_port_mod_refs_trap(task, name, right, delta); 159 160 if (rv == MACH_SEND_INVALID_DEST) 161 rv = _kernelrpc_mach_port_mod_refs(task, name, right, delta); 162 163 return (rv); 164} 165 166kern_return_t 167mach_port_peek( 168 ipc_space_t task, 169 mach_port_name_t name, 170 mach_msg_trailer_type_t trailer_type, 171 mach_port_seqno_t *seqnop, 172 mach_msg_size_t *msg_sizep, 173 mach_msg_id_t *msg_idp, 174 mach_msg_trailer_info_t trailer_infop, 175 mach_msg_type_number_t *trailer_sizep) 176{ 177 kern_return_t rv; 178 179 rv = _kernelrpc_mach_port_peek(task, name, trailer_type, 180 seqnop, msg_sizep, msg_idp, 181 trailer_infop, trailer_sizep); 182 183 return (rv); 184} 185 186kern_return_t 187mach_port_set_mscount( 188 ipc_space_t task, 189 mach_port_name_t name, 190 mach_port_mscount_t mscount) 191{ 192 kern_return_t rv; 193 194 rv = _kernelrpc_mach_port_set_mscount(task, name, mscount); 195 196 return (rv); 197} 198 199kern_return_t 200mach_port_get_set_status( 201 ipc_space_t task, 202 mach_port_name_t name, 203 mach_port_name_array_t *members, 204 mach_msg_type_number_t *membersCnt) 205{ 206 kern_return_t rv; 207 208 rv = _kernelrpc_mach_port_get_set_status(task, name, members, 209 membersCnt); 210 211 return (rv); 212} 213 214kern_return_t 215mach_port_move_member( 216 ipc_space_t task, 217 mach_port_name_t member, 218 mach_port_name_t after) 219{ 220 kern_return_t rv; 221 222 rv = _kernelrpc_mach_port_move_member_trap(task, member, after); 223 224 if (rv == MACH_SEND_INVALID_DEST) 225 rv = _kernelrpc_mach_port_move_member(task, member, after); 226 227 return (rv); 228} 229 230kern_return_t 231mach_port_request_notification( 232 ipc_space_t task, 233 mach_port_name_t name, 234 mach_msg_id_t msgid, 235 mach_port_mscount_t sync, 236 mach_port_t notify, 237 mach_msg_type_name_t notifyPoly, 238 mach_port_t *previous) 239{ 240 kern_return_t rv; 241 242 rv = _kernelrpc_mach_port_request_notification(task, name, msgid, 243 sync, notify, notifyPoly, previous); 244 245 return (rv); 246} 247 248kern_return_t 249mach_port_insert_right( 250 ipc_space_t task, 251 mach_port_name_t name, 252 mach_port_t poly, 253 mach_msg_type_name_t polyPoly) 254{ 255 kern_return_t rv; 256 257 rv = _kernelrpc_mach_port_insert_right_trap(task, name, poly, polyPoly); 258 259 if (rv == MACH_SEND_INVALID_DEST) 260 rv = _kernelrpc_mach_port_insert_right(task, name, poly, 261 polyPoly); 262 263 return (rv); 264} 265 266kern_return_t 267mach_port_extract_right( 268 ipc_space_t task, 269 mach_port_name_t name, 270 mach_msg_type_name_t msgt_name, 271 mach_port_t *poly, 272 mach_msg_type_name_t *polyPoly) 273{ 274 kern_return_t rv; 275 276 rv = _kernelrpc_mach_port_extract_right(task, name, msgt_name, 277 poly, polyPoly); 278 279 return (rv); 280} 281 282kern_return_t 283mach_port_set_seqno( 284 ipc_space_t task, 285 mach_port_name_t name, 286 mach_port_seqno_t seqno) 287{ 288 kern_return_t rv; 289 290 rv = _kernelrpc_mach_port_set_seqno(task, name, seqno); 291 292 return (rv); 293} 294 295kern_return_t 296mach_port_get_attributes( 297 ipc_space_t task, 298 mach_port_name_t name, 299 mach_port_flavor_t flavor, 300 mach_port_info_t port_info_out, 301 mach_msg_type_number_t *port_info_outCnt) 302{ 303 kern_return_t rv; 304 305 rv = _kernelrpc_mach_port_get_attributes(task, name, flavor, 306 port_info_out, port_info_outCnt); 307 308 return (rv); 309} 310 311kern_return_t 312mach_port_set_attributes( 313 ipc_space_t task, 314 mach_port_name_t name, 315 mach_port_flavor_t flavor, 316 mach_port_info_t port_info, 317 mach_msg_type_number_t port_infoCnt) 318{ 319 kern_return_t rv; 320 321 rv = _kernelrpc_mach_port_set_attributes(task, name, flavor, 322 port_info, port_infoCnt); 323 324 return (rv); 325} 326 327kern_return_t 328mach_port_allocate_qos( 329 ipc_space_t task, 330 mach_port_right_t right, 331 mach_port_qos_t *qos, 332 mach_port_name_t *name) 333{ 334 kern_return_t rv; 335 336 rv = _kernelrpc_mach_port_allocate_qos(task, right, qos, name); 337 338 return (rv); 339} 340 341kern_return_t 342mach_port_allocate_full( 343 ipc_space_t task, 344 mach_port_right_t right, 345 mach_port_t proto, 346 mach_port_qos_t *qos, 347 mach_port_name_t *name) 348{ 349 kern_return_t rv; 350 351 rv = _kernelrpc_mach_port_allocate_full(task, right, proto, qos, name); 352 353 return (rv); 354} 355 356kern_return_t 357task_set_port_space( 358 ipc_space_t task, 359 int table_entries) 360{ 361 kern_return_t rv; 362 363 rv = _kernelrpc_task_set_port_space(task, table_entries); 364 365 return (rv); 366} 367 368kern_return_t 369mach_port_get_srights( 370 ipc_space_t task, 371 mach_port_name_t name, 372 mach_port_rights_t *srights) 373{ 374 kern_return_t rv; 375 376 rv = _kernelrpc_mach_port_get_srights(task, name, srights); 377 378 return (rv); 379} 380 381kern_return_t 382mach_port_space_info( 383 ipc_space_t task, 384 ipc_info_space_t *space_info, 385 ipc_info_name_array_t *table_info, 386 mach_msg_type_number_t *table_infoCnt, 387 ipc_info_tree_name_array_t *tree_info, 388 mach_msg_type_number_t *tree_infoCnt) 389{ 390 kern_return_t rv; 391 392 rv = _kernelrpc_mach_port_space_info(task, space_info, table_info, 393 table_infoCnt, tree_info, tree_infoCnt); 394 395 return (rv); 396} 397 398kern_return_t 399mach_port_dnrequest_info( 400 ipc_space_t task, 401 mach_port_name_t name, 402 unsigned *dnr_total, 403 unsigned *dnr_used) 404{ 405 kern_return_t rv; 406 407 rv = _kernelrpc_mach_port_dnrequest_info(task, name, dnr_total, 408 dnr_used); 409 410 return (rv); 411} 412 413kern_return_t 414mach_port_kernel_object( 415 ipc_space_t task, 416 mach_port_name_t name, 417 unsigned *object_type, 418 unsigned *object_addr) 419{ 420 kern_return_t rv; 421 422 rv = _kernelrpc_mach_port_kernel_object(task, name, 423 object_type, object_addr); 424 425 return (rv); 426} 427 428kern_return_t 429mach_port_insert_member( 430 ipc_space_t task, 431 mach_port_name_t name, 432 mach_port_name_t pset) 433{ 434 kern_return_t rv; 435 436 rv = _kernelrpc_mach_port_insert_member_trap(task, name, pset); 437 438 if (rv == MACH_SEND_INVALID_DEST) 439 rv = _kernelrpc_mach_port_insert_member(task, name, pset); 440 441 return (rv); 442} 443 444kern_return_t 445mach_port_extract_member( 446 ipc_space_t task, 447 mach_port_name_t name, 448 mach_port_name_t pset) 449{ 450 kern_return_t rv; 451 452 rv = _kernelrpc_mach_port_extract_member_trap(task, name, pset); 453 454 if (rv == MACH_SEND_INVALID_DEST) 455 rv = _kernelrpc_mach_port_extract_member(task, name, pset); 456 457 return (rv); 458} 459 460kern_return_t 461mach_port_get_context( 462 ipc_space_t task, 463 mach_port_name_t name, 464 mach_port_context_t *context) 465{ 466 kern_return_t rv; 467 mach_vm_address_t wide_context; 468 469 rv = _kernelrpc_mach_port_get_context(task, name, &wide_context); 470 471 if (rv == KERN_SUCCESS) { 472 *context = (mach_port_context_t)wide_context; 473 } 474 475 return (rv); 476} 477 478kern_return_t 479mach_port_set_context( 480 ipc_space_t task, 481 mach_port_name_t name, 482 mach_port_context_t context) 483{ 484 kern_return_t rv; 485 486 rv = _kernelrpc_mach_port_set_context(task, name, context); 487 488 return (rv); 489} 490 491kern_return_t 492mach_port_kobject( 493 ipc_space_t task, 494 mach_port_name_t name, 495 natural_t *object_type, 496 mach_vm_address_t *object_addr) 497{ 498 kern_return_t rv; 499 500 rv = _kernelrpc_mach_port_kobject(task, name, object_type, object_addr); 501 502 return (rv); 503} 504 505kern_return_t 506mach_port_construct( 507 ipc_space_t task, 508 mach_port_options_t *options, 509 mach_port_context_t context, 510 mach_port_name_t *name) 511{ 512 kern_return_t rv; 513 514 rv = _kernelrpc_mach_port_construct_trap(task, options, (uint64_t) context, name); 515 516 if (rv == MACH_SEND_INVALID_DEST) 517 rv = _kernelrpc_mach_port_construct(task, options, (uint64_t) context, name); 518 519 return (rv); 520} 521 522kern_return_t 523mach_port_destruct( 524 ipc_space_t task, 525 mach_port_name_t name, 526 mach_port_delta_t srdelta, 527 mach_port_context_t guard) 528{ 529 kern_return_t rv; 530 531 rv = _kernelrpc_mach_port_destruct_trap(task, name, srdelta, (uint64_t) guard); 532 533 if (rv == MACH_SEND_INVALID_DEST) 534 rv = _kernelrpc_mach_port_destruct(task, name, srdelta, (uint64_t) guard); 535 536 return (rv); 537 538} 539 540kern_return_t 541mach_port_guard( 542 ipc_space_t task, 543 mach_port_name_t name, 544 mach_port_context_t guard, 545 boolean_t strict) 546{ 547 kern_return_t rv; 548 549 rv = _kernelrpc_mach_port_guard_trap(task, name, (uint64_t) guard, strict); 550 551 if (rv == MACH_SEND_INVALID_DEST) 552 rv = _kernelrpc_mach_port_guard(task, name, (uint64_t) guard, strict); 553 554 return (rv); 555 556} 557 558kern_return_t 559mach_port_unguard( 560 ipc_space_t task, 561 mach_port_name_t name, 562 mach_port_context_t guard) 563{ 564 kern_return_t rv; 565 566 rv = _kernelrpc_mach_port_unguard_trap(task, name, (uint64_t) guard); 567 568 if (rv == MACH_SEND_INVALID_DEST) 569 rv = _kernelrpc_mach_port_unguard(task, name, (uint64_t) guard); 570 571 return (rv); 572 573} 574 575