--- Gnu-Mach/ipc/mach_msg.c 2020/09/02 04:45:06 1.1.1.3 +++ Gnu-Mach/ipc/mach_msg.c 2020/09/02 04:47:18 1.1.1.4 @@ -46,6 +46,7 @@ #include #include #include +#include #include #include #include @@ -61,9 +62,6 @@ #include #include -extern void exception_raise_continue(); -extern void exception_raise_continue_fast(); - /* * Routine: mach_msg_send * Purpose: @@ -90,12 +88,12 @@ extern void exception_raise_continue_fas */ mach_msg_return_t -mach_msg_send(msg, option, send_size, time_out, notify) - mach_msg_header_t *msg; - mach_msg_option_t option; - mach_msg_size_t send_size; - mach_msg_timeout_t time_out; - mach_port_t notify; +mach_msg_send( + mach_msg_header_t *msg, + mach_msg_option_t option, + mach_msg_size_t send_size, + mach_msg_timeout_t time_out, + mach_port_t notify) { ipc_space_t space = current_space(); vm_map_t map = current_map(); @@ -172,13 +170,13 @@ mach_msg_send(msg, option, send_size, ti */ mach_msg_return_t -mach_msg_receive(msg, option, rcv_size, rcv_name, time_out, notify) - mach_msg_header_t *msg; - mach_msg_option_t option; - mach_msg_size_t rcv_size; - mach_port_t rcv_name; - mach_msg_timeout_t time_out; - mach_port_t notify; +mach_msg_receive( + mach_msg_header_t *msg, + mach_msg_option_t option, + mach_msg_size_t rcv_size, + mach_port_t rcv_name, + mach_msg_timeout_t time_out, + mach_port_t notify) { ipc_thread_t self = current_thread(); ipc_space_t space = current_space(); @@ -381,26 +379,26 @@ mach_msg_receive_continue(void) */ mach_msg_return_t -mach_msg_trap(msg, option, send_size, rcv_size, rcv_name, time_out, notify) - mach_msg_header_t *msg; - mach_msg_option_t option; - mach_msg_size_t send_size; - mach_msg_size_t rcv_size; - mach_port_t rcv_name; - mach_msg_timeout_t time_out; - mach_port_t notify; +mach_msg_trap( + mach_msg_header_t *msg, + mach_msg_option_t option, + mach_msg_size_t send_size, + mach_msg_size_t rcv_size, + mach_port_t rcv_name, + mach_msg_timeout_t time_out, + mach_port_t notify) { mach_msg_return_t mr; /* first check for common cases */ if (option == (MACH_SEND_MSG|MACH_RCV_MSG)) { - register ipc_thread_t self = current_thread(); + ipc_thread_t self = current_thread(); ipc_space_t space = self->task->itk_space; - register ipc_kmsg_t kmsg; - register ipc_port_t dest_port; + ipc_kmsg_t kmsg; + ipc_port_t dest_port; ipc_object_t rcv_object; - register ipc_mqueue_t rcv_mqueue; + ipc_mqueue_t rcv_mqueue; mach_msg_size_t reply_size; /* @@ -484,18 +482,18 @@ mach_msg_trap(msg, option, send_size, rc switch (kmsg->ikm_header.msgh_bits) { case MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, MACH_MSG_TYPE_MAKE_SEND_ONCE): { - register ipc_entry_t table; - register ipc_entry_num_t size; - register ipc_port_t reply_port; + ipc_entry_t table; + ipc_entry_num_t size; + ipc_port_t reply_port; /* sending a request message */ { - register mach_port_index_t index; - register mach_port_gen_t gen; + mach_port_index_t index; + mach_port_gen_t gen; { - register mach_port_t reply_name = + mach_port_t reply_name = kmsg->ikm_header.msgh_local_port; if (reply_name != rcv_name) @@ -517,8 +515,8 @@ mach_msg_trap(msg, option, send_size, rc goto abort_request_copyin; { - register ipc_entry_t entry; - register ipc_entry_bits_t bits; + ipc_entry_t entry; + ipc_entry_bits_t bits; entry = &table[index]; bits = entry->ie_bits; @@ -538,11 +536,11 @@ mach_msg_trap(msg, option, send_size, rc /* optimized ipc_entry_lookup of dest_name */ { - register mach_port_index_t index; - register mach_port_gen_t gen; + mach_port_index_t index; + mach_port_gen_t gen; { - register mach_port_t dest_name = + mach_port_t dest_name = kmsg->ikm_header.msgh_remote_port; index = MACH_PORT_INDEX(dest_name); @@ -553,8 +551,8 @@ mach_msg_trap(msg, option, send_size, rc goto abort_request_copyin; { - register ipc_entry_t entry; - register ipc_entry_bits_t bits; + ipc_entry_t entry; + ipc_entry_bits_t bits; entry = &table[index]; bits = entry->ie_bits; @@ -651,13 +649,13 @@ mach_msg_trap(msg, option, send_size, rc } case MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE, 0): { - register ipc_entry_num_t size; - register ipc_entry_t table; + ipc_entry_num_t size; + ipc_entry_t table; /* sending a reply message */ { - register mach_port_t reply_name = + mach_port_t reply_name = kmsg->ikm_header.msgh_local_port; if (reply_name != MACH_PORT_NULL) @@ -673,12 +671,12 @@ mach_msg_trap(msg, option, send_size, rc table = space->is_table; { - register ipc_entry_t entry; - register mach_port_gen_t gen; - register mach_port_index_t index; + ipc_entry_t entry; + mach_port_gen_t gen; + mach_port_index_t index; { - register mach_port_t dest_name = + mach_port_t dest_name = kmsg->ikm_header.msgh_remote_port; index = MACH_PORT_INDEX(dest_name); @@ -740,12 +738,12 @@ mach_msg_trap(msg, option, send_size, rc /* optimized ipc_entry_lookup/ipc_mqueue_copyin */ { - register ipc_entry_t entry; - register ipc_entry_bits_t bits; + ipc_entry_t entry; + ipc_entry_bits_t bits; { - register mach_port_index_t index; - register mach_port_gen_t gen; + mach_port_index_t index; + mach_port_gen_t gen; index = MACH_PORT_INDEX(rcv_name); gen = MACH_PORT_GEN(rcv_name); @@ -765,7 +763,7 @@ mach_msg_trap(msg, option, send_size, rc /* check type bits; looking for receive or set */ if (bits & MACH_PORT_TYPE_PORT_SET) { - register ipc_pset_t rcv_pset; + ipc_pset_t rcv_pset; rcv_pset = (ipc_pset_t) entry->ie_object; assert(rcv_pset != IPS_NULL); @@ -776,7 +774,7 @@ mach_msg_trap(msg, option, send_size, rc rcv_object = (ipc_object_t) rcv_pset; rcv_mqueue = &rcv_pset->ips_messages; } else if (bits & MACH_PORT_TYPE_RECEIVE) { - register ipc_port_t rcv_port; + ipc_port_t rcv_port; rcv_port = (ipc_port_t) entry->ie_object; assert(rcv_port != IP_NULL); @@ -841,11 +839,11 @@ mach_msg_trap(msg, option, send_size, rc MACH_MSGH_BITS_CIRCULAR) == 0); { - register ipc_mqueue_t dest_mqueue; - register ipc_thread_t receiver; + ipc_mqueue_t dest_mqueue; + ipc_thread_t receiver; { - register ipc_pset_t dest_pset; + ipc_pset_t dest_pset; dest_pset = dest_port->ip_pset; if (dest_pset == IPS_NULL) @@ -1074,9 +1072,9 @@ mach_msg_trap(msg, option, send_size, rc ip_unlock(reply_port); { - register ipc_entry_t table; - register ipc_entry_t entry; - register mach_port_index_t index; + ipc_entry_t table; + ipc_entry_t entry; + mach_port_index_t index; /* optimized ipc_entry_get */ @@ -1091,7 +1089,7 @@ mach_msg_trap(msg, option, send_size, rc entry->ie_request = 0; { - register mach_port_gen_t gen; + mach_port_gen_t gen; assert((entry->ie_bits &~ IE_BITS_GEN_MASK) == 0); gen = entry->ie_bits + IE_BITS_GEN_ONE; @@ -1134,11 +1132,19 @@ mach_msg_trap(msg, option, send_size, rc } else ip_unlock(dest_port); - kmsg->ikm_header.msgh_bits = - MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, - MACH_MSG_TYPE_PORT_SEND); + if (! ipc_port_flag_protected_payload(dest_port)) { + kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS( + MACH_MSG_TYPE_PORT_SEND_ONCE, + MACH_MSG_TYPE_PORT_SEND); + kmsg->ikm_header.msgh_local_port = dest_name; + } else { + kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS( + MACH_MSG_TYPE_PORT_SEND_ONCE, + MACH_MSG_TYPE_PROTECTED_PAYLOAD); + kmsg->ikm_header.msgh_protected_payload = + dest_port->ip_protected_payload; + } kmsg->ikm_header.msgh_remote_port = reply_name; - kmsg->ikm_header.msgh_local_port = dest_name; goto fast_put; abort_request_copyout: @@ -1148,7 +1154,7 @@ mach_msg_trap(msg, option, send_size, rc } case MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0): { - register mach_port_t dest_name; + mach_port_t dest_name; /* receiving a reply message */ @@ -1172,17 +1178,25 @@ mach_msg_trap(msg, option, send_size, rc dest_name = MACH_PORT_NULL; } - kmsg->ikm_header.msgh_bits = - MACH_MSGH_BITS(0, - MACH_MSG_TYPE_PORT_SEND_ONCE); + if (! ipc_port_flag_protected_payload(dest_port)) { + kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS( + 0, + MACH_MSG_TYPE_PORT_SEND_ONCE); + kmsg->ikm_header.msgh_local_port = dest_name; + } else { + kmsg->ikm_header.msgh_bits = MACH_MSGH_BITS( + 0, + MACH_MSG_TYPE_PROTECTED_PAYLOAD); + kmsg->ikm_header.msgh_protected_payload = + dest_port->ip_protected_payload; + } kmsg->ikm_header.msgh_remote_port = MACH_PORT_NULL; - kmsg->ikm_header.msgh_local_port = dest_name; goto fast_put; } case MACH_MSGH_BITS_COMPLEX| MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND_ONCE, 0): { - register mach_port_t dest_name; + mach_port_t dest_name; /* receiving a complex reply message */ @@ -1206,12 +1220,23 @@ mach_msg_trap(msg, option, send_size, rc dest_name = MACH_PORT_NULL; } - kmsg->ikm_header.msgh_bits = - MACH_MSGH_BITS_COMPLEX | - MACH_MSGH_BITS(0, - MACH_MSG_TYPE_PORT_SEND_ONCE); + if (! ipc_port_flag_protected_payload(dest_port)) { + kmsg->ikm_header.msgh_bits = + MACH_MSGH_BITS_COMPLEX + | MACH_MSGH_BITS( + 0, + MACH_MSG_TYPE_PORT_SEND_ONCE); + kmsg->ikm_header.msgh_local_port = dest_name; + } else { + kmsg->ikm_header.msgh_bits = + MACH_MSGH_BITS_COMPLEX + | MACH_MSGH_BITS( + 0, + MACH_MSG_TYPE_PROTECTED_PAYLOAD); + kmsg->ikm_header.msgh_protected_payload = + dest_port->ip_protected_payload; + } kmsg->ikm_header.msgh_remote_port = MACH_PORT_NULL; - kmsg->ikm_header.msgh_local_port = dest_name; mr = ipc_kmsg_copyout_body( (vm_offset_t) (&kmsg->ikm_header + 1), @@ -1322,7 +1347,7 @@ mach_msg_trap(msg, option, send_size, rc * It will work if this is a request message. */ - register ipc_port_t reply_port; + ipc_port_t reply_port; reply_port = (ipc_port_t) kmsg->ikm_header.msgh_local_port; @@ -1357,7 +1382,7 @@ mach_msg_trap(msg, option, send_size, rc */ { - register ipc_port_t reply_port; + ipc_port_t reply_port; /* * Perform the kernel function. @@ -1735,8 +1760,7 @@ mach_msg_continue(void) */ boolean_t -mach_msg_interrupt(thread) - thread_t thread; +mach_msg_interrupt(thread_t thread) { ipc_mqueue_t mqueue;