diff options
Diffstat (limited to 'debian/patches/0003-ipc-undo-manual-inlining-of-ipc_entry_X-functions.patch')
-rw-r--r-- | debian/patches/0003-ipc-undo-manual-inlining-of-ipc_entry_X-functions.patch | 535 |
1 files changed, 535 insertions, 0 deletions
diff --git a/debian/patches/0003-ipc-undo-manual-inlining-of-ipc_entry_X-functions.patch b/debian/patches/0003-ipc-undo-manual-inlining-of-ipc_entry_X-functions.patch new file mode 100644 index 0000000..df13e0a --- /dev/null +++ b/debian/patches/0003-ipc-undo-manual-inlining-of-ipc_entry_X-functions.patch @@ -0,0 +1,535 @@ +From 95cc13087c944e7fd95bd39374bdd5d7477dff76 Mon Sep 17 00:00:00 2001 +From: Justus Winter <4winter@informatik.uni-hamburg.de> +Date: Mon, 16 Mar 2015 12:52:24 +0100 +Subject: [PATCH gnumach 3/6] ipc: undo manual inlining of `ipc_entry_X' + functions + +Today we can rely on the compiler to inline functions. Undoing this +manual optimization is a first step to replace the IPC tables. + +* ipc/mach_msg.c (mach_msg_trap): Undo the manual inlining of +`ipc_entry_lookup', `ipc_entry_dealloc', and `ipc_entry_get'. +* ipc/ipc_kmsg.c (ipc_kmsg_copyin_header, ipc_kmsg_copyout_header): Likewise. +* kern/exception.c (exception_raise): Likewise. +* kern/ipc_mig.c (fast_send_right_lookup): Likewise. +--- + ipc/ipc_kmsg.c | 107 +++++++++++------------------------------- + ipc/mach_msg.c | 139 ++++++++----------------------------------------------- + kern/exception.c | 18 ++----- + kern/ipc_mig.c | 14 +++--- + 4 files changed, 57 insertions(+), 221 deletions(-) + +diff --git a/ipc/ipc_kmsg.c b/ipc/ipc_kmsg.c +index c0f07dd..cae700f 100644 +--- a/ipc/ipc_kmsg.c ++++ b/ipc/ipc_kmsg.c +@@ -698,24 +698,14 @@ ipc_kmsg_copyin_header( + if (!space->is_active) + goto abort_async; + +- /* optimized ipc_entry_lookup */ +- +- { +- mach_port_index_t index = MACH_PORT_INDEX(dest_name); +- mach_port_gen_t gen = MACH_PORT_GEN(dest_name); +- +- if (index >= space->is_table_size) ++ entry = ipc_entry_lookup (space, dest_name); ++ if (entry == IE_NULL) + goto abort_async; +- +- entry = &space->is_table[index]; + bits = entry->ie_bits; + +- /* check generation number and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK|MACH_PORT_TYPE_SEND)) != +- (gen | MACH_PORT_TYPE_SEND)) ++ /* check type bits */ ++ if (IE_BITS_TYPE (bits) != MACH_PORT_TYPE_SEND) + goto abort_async; +- } + + /* optimized ipc_right_copyin */ + +@@ -750,8 +740,6 @@ ipc_kmsg_copyin_header( + + case MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, + MACH_MSG_TYPE_MAKE_SEND_ONCE): { +- ipc_entry_num_t size; +- ipc_entry_t table; + ipc_entry_t entry; + ipc_entry_bits_t bits; + ipc_port_t dest_port, reply_port; +@@ -762,51 +750,28 @@ ipc_kmsg_copyin_header( + if (!space->is_active) + goto abort_request; + +- size = space->is_table_size; +- table = space->is_table; +- +- /* optimized ipc_entry_lookup of dest_name */ +- +- { +- mach_port_index_t index = MACH_PORT_INDEX(dest_name); +- mach_port_gen_t gen = MACH_PORT_GEN(dest_name); +- +- if (index >= size) ++ entry = ipc_entry_lookup (space, dest_name); ++ if (entry == IE_NULL) + goto abort_request; +- +- entry = &table[index]; + bits = entry->ie_bits; + +- /* check generation number and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK|MACH_PORT_TYPE_SEND)) != +- (gen | MACH_PORT_TYPE_SEND)) ++ /* check type bits */ ++ if (IE_BITS_TYPE (bits) != MACH_PORT_TYPE_SEND) + goto abort_request; +- } + + assert(IE_BITS_UREFS(bits) > 0); + + dest_port = (ipc_port_t) entry->ie_object; + assert(dest_port != IP_NULL); + +- /* optimized ipc_entry_lookup of reply_name */ +- +- { +- mach_port_index_t index = MACH_PORT_INDEX(reply_name); +- mach_port_gen_t gen = MACH_PORT_GEN(reply_name); +- +- if (index >= size) ++ entry = ipc_entry_lookup (space, reply_name); ++ if (entry == IE_NULL) + goto abort_request; +- +- entry = &table[index]; + bits = entry->ie_bits; + +- /* check generation number and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK|MACH_PORT_TYPE_RECEIVE)) != +- (gen | MACH_PORT_TYPE_RECEIVE)) ++ /* check type bits */ ++ if (IE_BITS_TYPE (bits) != MACH_PORT_TYPE_RECEIVE) + goto abort_request; +- } + + reply_port = (ipc_port_t) entry->ie_object; + assert(reply_port != IP_NULL); +@@ -853,9 +818,6 @@ ipc_kmsg_copyin_header( + } + + case MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE, 0): { +- mach_port_index_t index; +- mach_port_gen_t gen; +- ipc_entry_t table; + ipc_entry_t entry; + ipc_entry_bits_t bits; + ipc_port_t dest_port; +@@ -869,24 +831,13 @@ ipc_kmsg_copyin_header( + if (!space->is_active) + goto abort_reply; + +- /* optimized ipc_entry_lookup */ +- +- table = space->is_table; +- +- index = MACH_PORT_INDEX(dest_name); +- gen = MACH_PORT_GEN(dest_name); +- +- if (index >= space->is_table_size) ++ entry = ipc_entry_lookup (space, dest_name); ++ if (entry == IE_NULL) + goto abort_reply; +- +- entry = &table[index]; + bits = entry->ie_bits; + +- /* check generation number, collision bit, and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK|IE_BITS_COLLISION| +- MACH_PORT_TYPE_SEND_ONCE)) != +- (gen | MACH_PORT_TYPE_SEND_ONCE)) ++ /* check and type bits */ ++ if (IE_BITS_TYPE (bits) != MACH_PORT_TYPE_SEND_ONCE) + goto abort_reply; + + /* optimized ipc_right_copyin */ +@@ -910,12 +861,8 @@ ipc_kmsg_copyin_header( + assert(dest_port->ip_sorights > 0); + ip_unlock(dest_port); + +- /* optimized ipc_entry_dealloc */ +- +- entry->ie_next = table->ie_next; +- table->ie_next = index; +- entry->ie_bits = gen; + entry->ie_object = IO_NULL; ++ ipc_entry_dealloc (space, dest_name, entry); + is_write_unlock(space); + + msg->msgh_bits = (MACH_MSGH_BITS_OTHER(mbits) | +@@ -1815,8 +1762,6 @@ ipc_kmsg_copyout_header( + + case MACH_MSGH_BITS(MACH_MSG_TYPE_PORT_SEND, + MACH_MSG_TYPE_PORT_SEND_ONCE): { +- ipc_entry_t table; +- mach_port_index_t index; + ipc_entry_t entry; + ipc_port_t reply = (ipc_port_t) msg->msgh_local_port; + mach_port_t dest_name, reply_name; +@@ -1829,8 +1774,7 @@ ipc_kmsg_copyout_header( + break; + + is_write_lock(space); +- if (!space->is_active || +- ((index = (table = space->is_table)->ie_next) == 0)) { ++ if (!space->is_active || space->is_table->ie_next == 0) { + is_write_unlock(space); + break; + } +@@ -1860,11 +1804,14 @@ ipc_kmsg_copyout_header( + assert(reply->ip_sorights > 0); + ip_unlock(reply); + +- /* optimized ipc_entry_get */ +- +- entry = &table[index]; +- table->ie_next = entry->ie_next; +- entry->ie_request = 0; ++ kern_return_t kr; ++ kr = ipc_entry_get (space, &reply_name, &entry); ++ if (kr) { ++ ip_unlock(reply); ++ ip_unlock(dest); ++ is_write_unlock(space); ++ break; ++ } + + { + mach_port_gen_t gen; +@@ -1872,8 +1819,6 @@ ipc_kmsg_copyout_header( + assert((entry->ie_bits &~ IE_BITS_GEN_MASK) == 0); + gen = entry->ie_bits + IE_BITS_GEN_ONE; + +- reply_name = MACH_PORT_MAKE(index, gen); +- + /* optimized ipc_right_copyout */ + + entry->ie_bits = gen | (MACH_PORT_TYPE_SEND_ONCE | 1); +diff --git a/ipc/mach_msg.c b/ipc/mach_msg.c +index aecfcd4..fe0c43e 100644 +--- a/ipc/mach_msg.c ++++ b/ipc/mach_msg.c +@@ -482,16 +482,7 @@ mach_msg_trap( + switch (kmsg->ikm_header.msgh_bits) { + case MACH_MSGH_BITS(MACH_MSG_TYPE_COPY_SEND, + MACH_MSG_TYPE_MAKE_SEND_ONCE): { +- ipc_entry_t table; +- ipc_entry_num_t size; + ipc_port_t reply_port; +- +- /* sending a request message */ +- +- { +- mach_port_index_t index; +- mach_port_gen_t gen; +- + { + mach_port_t reply_name = + kmsg->ikm_header.msgh_local_port; +@@ -499,68 +490,30 @@ mach_msg_trap( + if (reply_name != rcv_name) + goto slow_copyin; + +- /* optimized ipc_entry_lookup of reply_name */ +- +- index = MACH_PORT_INDEX(reply_name); +- gen = MACH_PORT_GEN(reply_name); +- } +- + is_read_lock(space); + assert(space->is_active); + +- size = space->is_table_size; +- table = space->is_table; +- +- if (index >= size) +- goto abort_request_copyin; +- +- { + ipc_entry_t entry; +- ipc_entry_bits_t bits; +- +- entry = &table[index]; +- bits = entry->ie_bits; +- +- /* check generation number and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK| +- MACH_PORT_TYPE_RECEIVE)) != +- (gen | MACH_PORT_TYPE_RECEIVE)) ++ entry = ipc_entry_lookup (space, reply_name); ++ if (entry == IE_NULL) + goto abort_request_copyin; +- + reply_port = (ipc_port_t) entry->ie_object; + assert(reply_port != IP_NULL); + } +- } +- +- /* optimized ipc_entry_lookup of dest_name */ +- +- { +- mach_port_index_t index; +- mach_port_gen_t gen; + + { + mach_port_t dest_name = + kmsg->ikm_header.msgh_remote_port; + +- index = MACH_PORT_INDEX(dest_name); +- gen = MACH_PORT_GEN(dest_name); +- } +- +- if (index >= size) +- goto abort_request_copyin; +- +- { + ipc_entry_t entry; + ipc_entry_bits_t bits; +- +- entry = &table[index]; ++ entry = ipc_entry_lookup (space, dest_name); ++ if (entry == IE_NULL) ++ goto abort_request_copyin; + bits = entry->ie_bits; + +- /* check generation number and type bit */ +- +- if ((bits & (IE_BITS_GEN_MASK|MACH_PORT_TYPE_SEND)) != +- (gen | MACH_PORT_TYPE_SEND)) ++ /* check type bits */ ++ if (IE_BITS_TYPE (bits) != MACH_PORT_TYPE_SEND) + goto abort_request_copyin; + + assert(IE_BITS_UREFS(bits) > 0); +@@ -568,7 +521,6 @@ mach_msg_trap( + dest_port = (ipc_port_t) entry->ie_object; + assert(dest_port != IP_NULL); + } +- } + + /* + * To do an atomic copyin, need simultaneous +@@ -649,9 +601,6 @@ mach_msg_trap( + } + + case MACH_MSGH_BITS(MACH_MSG_TYPE_MOVE_SEND_ONCE, 0): { +- ipc_entry_num_t size; +- ipc_entry_t table; +- + /* sending a reply message */ + + { +@@ -665,35 +614,18 @@ mach_msg_trap( + is_write_lock(space); + assert(space->is_active); + +- /* optimized ipc_entry_lookup */ +- +- size = space->is_table_size; +- table = space->is_table; +- + { + ipc_entry_t entry; +- mach_port_gen_t gen; +- mach_port_index_t index; +- +- { + mach_port_t dest_name = + kmsg->ikm_header.msgh_remote_port; + +- index = MACH_PORT_INDEX(dest_name); +- gen = MACH_PORT_GEN(dest_name); +- } +- +- if (index >= size) ++ entry = ipc_entry_lookup (space, dest_name); ++ if (entry == IE_NULL) + goto abort_reply_dest_copyin; + +- entry = &table[index]; +- +- /* check generation, collision bit, and type bit */ +- +- if ((entry->ie_bits & (IE_BITS_GEN_MASK| +- IE_BITS_COLLISION| +- MACH_PORT_TYPE_SEND_ONCE)) != +- (gen | MACH_PORT_TYPE_SEND_ONCE)) ++ /* check type bits */ ++ if (IE_BITS_TYPE (entry->ie_bits) != ++ MACH_PORT_TYPE_SEND_ONCE) + goto abort_reply_dest_copyin; + + /* optimized ipc_right_copyin */ +@@ -716,13 +648,8 @@ mach_msg_trap( + } + + assert(dest_port->ip_sorights > 0); +- +- /* optimized ipc_entry_dealloc */ +- +- entry->ie_next = table->ie_next; +- table->ie_next = index; +- entry->ie_bits = gen; + entry->ie_object = IO_NULL; ++ ipc_entry_dealloc (space, dest_name, entry); + } + + kmsg->ikm_header.msgh_bits = +@@ -735,31 +662,16 @@ mach_msg_trap( + + assert(dest_port->ip_receiver != ipc_space_kernel); + +- /* optimized ipc_entry_lookup/ipc_mqueue_copyin */ ++ /* optimized ipc_mqueue_copyin */ + + { + ipc_entry_t entry; + ipc_entry_bits_t bits; +- +- { +- mach_port_index_t index; +- mach_port_gen_t gen; +- +- index = MACH_PORT_INDEX(rcv_name); +- gen = MACH_PORT_GEN(rcv_name); +- +- if (index >= size) ++ entry = ipc_entry_lookup (space, rcv_name); ++ if (entry == IE_NULL) + goto abort_reply_rcv_copyin; +- +- entry = &table[index]; + bits = entry->ie_bits; + +- /* check generation number */ +- +- if ((bits & IE_BITS_GEN_MASK) != gen) +- goto abort_reply_rcv_copyin; +- } +- + /* check type bits; looking for receive or set */ + + if (bits & MACH_PORT_TYPE_PORT_SET) { +@@ -1073,21 +985,12 @@ mach_msg_trap( + ip_unlock(reply_port); + + { +- ipc_entry_t table; + ipc_entry_t entry; +- mach_port_index_t index; +- +- /* optimized ipc_entry_get */ +- +- table = space->is_table; +- index = table->ie_next; +- +- if (index == 0) ++ kern_return_t kr; ++ kr = ipc_entry_get (space, &reply_name, &entry); ++ if (kr) + goto abort_request_copyout; +- +- entry = &table[index]; +- table->ie_next = entry->ie_next; +- entry->ie_request = 0; ++ assert (entry != NULL); + + { + mach_port_gen_t gen; +@@ -1095,8 +998,6 @@ mach_msg_trap( + assert((entry->ie_bits &~ IE_BITS_GEN_MASK) == 0); + gen = entry->ie_bits + IE_BITS_GEN_ONE; + +- reply_name = MACH_PORT_MAKE(index, gen); +- + /* optimized ipc_right_copyout */ + + entry->ie_bits = gen | (MACH_PORT_TYPE_SEND_ONCE | 1); +diff --git a/kern/exception.c b/kern/exception.c +index 7954fba..6e84c0a 100644 +--- a/kern/exception.c ++++ b/kern/exception.c +@@ -603,30 +603,18 @@ exception_raise( + ip_unlock(reply_port); + + { +- ipc_entry_t table; ++ kern_return_t kr; + ipc_entry_t entry; +- mach_port_index_t index; +- +- /* optimized ipc_entry_get */ +- +- table = space->is_table; +- index = table->ie_next; + +- if (index == 0) ++ kr = ipc_entry_get (space, &exc->Head.msgh_remote_port, &entry); ++ if (kr) + goto abort_copyout; +- +- entry = &table[index]; +- table->ie_next = entry->ie_next; +- entry->ie_request = 0; +- + { + mach_port_gen_t gen; + + assert((entry->ie_bits &~ IE_BITS_GEN_MASK) == 0); + gen = entry->ie_bits + IE_BITS_GEN_ONE; + +- exc->Head.msgh_remote_port = MACH_PORT_MAKE(index, gen); +- + /* optimized ipc_right_copyout */ + + entry->ie_bits = gen | (MACH_PORT_TYPE_SEND_ONCE | 1); +diff --git a/kern/ipc_mig.c b/kern/ipc_mig.c +index cc61ec7..22dac42 100644 +--- a/kern/ipc_mig.c ++++ b/kern/ipc_mig.c +@@ -310,16 +310,18 @@ mig_strncpy(dest, src, len) + MACRO_BEGIN \ + ipc_space_t space = current_space(); \ + ipc_entry_t entry; \ +- mach_port_index_t index = MACH_PORT_INDEX(name); \ + \ + is_read_lock(space); \ + assert(space->is_active); \ + \ +- if ((index >= space->is_table_size) || \ +- (((entry = &space->is_table[index])->ie_bits & \ +- (IE_BITS_GEN_MASK|MACH_PORT_TYPE_SEND)) != \ +- (MACH_PORT_GEN(name) | MACH_PORT_TYPE_SEND))) { \ +- is_read_unlock(space); \ ++ entry = ipc_entry_lookup (space, name); \ ++ if (entry == IE_NULL) { \ ++ is_read_unlock (space); \ ++ abort; \ ++ } \ ++ \ ++ if (IE_BITS_TYPE (entry->ie_bits) != MACH_PORT_TYPE_SEND) { \ ++ is_read_unlock (space); \ + abort; \ + } \ + \ +-- +2.1.4 + |