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_space_basic_info( 400 ipc_space_t task, 401 ipc_info_space_basic_t *space_basic_info) 402{ 403 kern_return_t rv; 404 405 rv = _kernelrpc_mach_port_space_basic_info(task, space_basic_info); 406 407 return (rv); 408} 409 410kern_return_t 411mach_port_dnrequest_info( 412 ipc_space_t task, 413 mach_port_name_t name, 414 unsigned *dnr_total, 415 unsigned *dnr_used) 416{ 417 kern_return_t rv; 418 419 rv = _kernelrpc_mach_port_dnrequest_info(task, name, dnr_total, 420 dnr_used); 421 422 return (rv); 423} 424 425kern_return_t 426mach_port_kernel_object( 427 ipc_space_t task, 428 mach_port_name_t name, 429 unsigned *object_type, 430 unsigned *object_addr) 431{ 432 kern_return_t rv; 433 434 rv = _kernelrpc_mach_port_kernel_object(task, name, 435 object_type, object_addr); 436 437 return (rv); 438} 439 440kern_return_t 441mach_port_insert_member( 442 ipc_space_t task, 443 mach_port_name_t name, 444 mach_port_name_t pset) 445{ 446 kern_return_t rv; 447 448 rv = _kernelrpc_mach_port_insert_member_trap(task, name, pset); 449 450 if (rv == MACH_SEND_INVALID_DEST) 451 rv = _kernelrpc_mach_port_insert_member(task, name, pset); 452 453 return (rv); 454} 455 456kern_return_t 457mach_port_extract_member( 458 ipc_space_t task, 459 mach_port_name_t name, 460 mach_port_name_t pset) 461{ 462 kern_return_t rv; 463 464 rv = _kernelrpc_mach_port_extract_member_trap(task, name, pset); 465 466 if (rv == MACH_SEND_INVALID_DEST) 467 rv = _kernelrpc_mach_port_extract_member(task, name, pset); 468 469 return (rv); 470} 471 472kern_return_t 473mach_port_get_context( 474 ipc_space_t task, 475 mach_port_name_t name, 476 mach_port_context_t *context) 477{ 478 kern_return_t rv; 479 mach_vm_address_t wide_context; 480 481 rv = _kernelrpc_mach_port_get_context(task, name, &wide_context); 482 483 if (rv == KERN_SUCCESS) { 484 *context = (mach_port_context_t)wide_context; 485 } 486 487 return (rv); 488} 489 490kern_return_t 491mach_port_set_context( 492 ipc_space_t task, 493 mach_port_name_t name, 494 mach_port_context_t context) 495{ 496 kern_return_t rv; 497 498 rv = _kernelrpc_mach_port_set_context(task, name, context); 499 500 return (rv); 501} 502 503kern_return_t 504mach_port_kobject( 505 ipc_space_t task, 506 mach_port_name_t name, 507 natural_t *object_type, 508 mach_vm_address_t *object_addr) 509{ 510 kern_return_t rv; 511 512 rv = _kernelrpc_mach_port_kobject(task, name, object_type, object_addr); 513 514 return (rv); 515} 516 517kern_return_t 518mach_port_construct( 519 ipc_space_t task, 520 mach_port_options_t *options, 521 mach_port_context_t context, 522 mach_port_name_t *name) 523{ 524 kern_return_t rv; 525 526 rv = _kernelrpc_mach_port_construct_trap(task, options, (uint64_t) context, name); 527 528 if (rv == MACH_SEND_INVALID_DEST) 529 rv = _kernelrpc_mach_port_construct(task, options, (uint64_t) context, name); 530 531 return (rv); 532} 533 534kern_return_t 535mach_port_destruct( 536 ipc_space_t task, 537 mach_port_name_t name, 538 mach_port_delta_t srdelta, 539 mach_port_context_t guard) 540{ 541 kern_return_t rv; 542 543 rv = _kernelrpc_mach_port_destruct_trap(task, name, srdelta, (uint64_t) guard); 544 545 if (rv == MACH_SEND_INVALID_DEST) 546 rv = _kernelrpc_mach_port_destruct(task, name, srdelta, (uint64_t) guard); 547 548 return (rv); 549 550} 551 552kern_return_t 553mach_port_guard( 554 ipc_space_t task, 555 mach_port_name_t name, 556 mach_port_context_t guard, 557 boolean_t strict) 558{ 559 kern_return_t rv; 560 561 rv = _kernelrpc_mach_port_guard_trap(task, name, (uint64_t) guard, strict); 562 563 if (rv == MACH_SEND_INVALID_DEST) 564 rv = _kernelrpc_mach_port_guard(task, name, (uint64_t) guard, strict); 565 566 return (rv); 567 568} 569 570kern_return_t 571mach_port_unguard( 572 ipc_space_t task, 573 mach_port_name_t name, 574 mach_port_context_t guard) 575{ 576 kern_return_t rv; 577 578 rv = _kernelrpc_mach_port_unguard_trap(task, name, (uint64_t) guard); 579 580 if (rv == MACH_SEND_INVALID_DEST) 581 rv = _kernelrpc_mach_port_unguard(task, name, (uint64_t) guard); 582 583 return (rv); 584 585} 586 587