diff options
Diffstat (limited to 'kern/ipc_mig.c')
-rw-r--r-- | kern/ipc_mig.c | 236 |
1 files changed, 116 insertions, 120 deletions
diff --git a/kern/ipc_mig.c b/kern/ipc_mig.c index 3f55da7c..22dac420 100644 --- a/kern/ipc_mig.c +++ b/kern/ipc_mig.c @@ -37,6 +37,7 @@ #include <kern/task.h> #include <kern/ipc_kobject.h> #include <kern/ipc_tt.h> +#include <kern/ipc_mig.h> #include <vm/vm_map.h> #include <vm/vm_user.h> #include <ipc/port.h> @@ -91,7 +92,7 @@ mach_msg_send_from_kernel( mach_msg_return_t mach_msg_rpc_from_kernel(msg, send_size, reply_size) - mach_msg_header_t *msg; + const mach_msg_header_t *msg; mach_msg_size_t send_size; mach_msg_size_t reply_size; { @@ -109,8 +110,7 @@ mach_msg_rpc_from_kernel(msg, send_size, reply_size) */ void -mach_msg_abort_rpc(thread) - ipc_thread_t thread; +mach_msg_abort_rpc(ipc_thread_t thread) { ipc_port_t reply = IP_NULL; @@ -140,14 +140,14 @@ mach_msg_abort_rpc(thread) */ mach_msg_return_t -mach_msg(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( + 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) { ipc_space_t space = current_space(); vm_map_t map = current_map(); @@ -271,10 +271,10 @@ mig_put_reply_port( /* * mig_strncpy.c - by Joshua Block * - * mig_strncp -- Bounded string copy. Does what the library routine strncpy - * OUGHT to do: Copies the (null terminated) string in src into dest, a - * buffer of length len. Assures that the copy is still null terminated - * and doesn't overflow the buffer, truncating the copy if necessary. + * mig_strncpy -- Bounded string copy. Does what the library routine + * strncpy does: Copies the (null terminated) string in src into dest, + * a buffer of length len. Returns the length of the destination + * string excluding the terminating null. * * Parameters: * @@ -284,37 +284,44 @@ mig_put_reply_port( * * len - Length of destination buffer. */ -void mig_strncpy(dest, src, len) -char *dest, *src; -int len; +vm_size_t +mig_strncpy(dest, src, len) + char *dest; + const char *src; + int len; { - int i; + char *dest_ = dest; + int i; - if (len <= 0) - return; + if (len <= 0) + return 0; - for (i=1; i<len; i++) - if (! (*dest++ = *src++)) - return; + for (i = 0; i < len; i++) { + if (! (*dest = *src)) + break; + dest++; + src++; + } - *dest = '\0'; - return; + return dest - dest_; } #define fast_send_right_lookup(name, port, abort) \ MACRO_BEGIN \ - register ipc_space_t space = current_space(); \ - register ipc_entry_t entry; \ - register mach_port_index_t index = MACH_PORT_INDEX(name); \ + ipc_space_t space = current_space(); \ + ipc_entry_t entry; \ \ 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; \ } \ \ @@ -327,11 +334,10 @@ MACRO_BEGIN \ MACRO_END device_t -port_name_to_device(name) - mach_port_t name; +port_name_to_device(mach_port_t name) { - register ipc_port_t port; - register device_t device; + ipc_port_t port; + device_t device; fast_send_right_lookup(name, port, goto abort); /* port is locked */ @@ -371,17 +377,16 @@ port_name_to_device(name) } thread_t -port_name_to_thread(name) - mach_port_t name; +port_name_to_thread(mach_port_t name) { - register ipc_port_t port; + ipc_port_t port; fast_send_right_lookup(name, port, goto abort); /* port is locked */ if (ip_active(port) && (ip_kotype(port) == IKOT_THREAD)) { - register thread_t thread; + thread_t thread; thread = (thread_t) port->ip_kobject; assert(thread != THREAD_NULL); @@ -417,17 +422,16 @@ port_name_to_thread(name) } task_t -port_name_to_task(name) - mach_port_t name; +port_name_to_task(mach_port_t name) { - register ipc_port_t port; + ipc_port_t port; fast_send_right_lookup(name, port, goto abort); /* port is locked */ if (ip_active(port) && (ip_kotype(port) == IKOT_TASK)) { - register task_t task; + task_t task; task = (task_t) port->ip_kobject; assert(task != TASK_NULL); @@ -468,14 +472,14 @@ vm_map_t port_name_to_map( mach_port_t name) { - register ipc_port_t port; + ipc_port_t port; fast_send_right_lookup(name, port, goto abort); /* port is locked */ if (ip_active(port) && (ip_kotype(port) == IKOT_TASK)) { - register vm_map_t map; + vm_map_t map; map = ((task_t) port->ip_kobject)->map; assert(map != VM_MAP_NULL); @@ -513,17 +517,16 @@ port_name_to_map( } ipc_space_t -port_name_to_space(name) - mach_port_t name; +port_name_to_space(mach_port_t name) { - register ipc_port_t port; + ipc_port_t port; fast_send_right_lookup(name, port, goto abort); /* port is locked */ if (ip_active(port) && (ip_kotype(port) == IKOT_TASK)) { - register ipc_space_t space; + ipc_space_t space; space = ((task_t) port->ip_kobject)->itk_space; assert(space != IS_NULL); @@ -569,12 +572,11 @@ port_name_to_space(name) * AARGH! */ -kern_return_t thread_get_state_KERNEL(thread_port, flavor, - old_state, old_state_count) - mach_port_t thread_port; /* port right for thread */ - int flavor; - thread_state_t old_state; /* pointer to OUT array */ - natural_t *old_state_count; /* IN/OUT */ +kern_return_t thread_get_state_KERNEL( + mach_port_t thread_port, /* port right for thread */ + int flavor, + thread_state_t old_state, /* pointer to OUT array */ + natural_t *old_state_count) /* IN/OUT */ { thread_t thread; kern_return_t result; @@ -586,12 +588,11 @@ kern_return_t thread_get_state_KERNEL(thread_port, flavor, return result; } -kern_return_t thread_set_state_KERNEL(thread_port, flavor, - new_state, new_state_count) - mach_port_t thread_port; /* port right for thread */ - int flavor; - thread_state_t new_state; - natural_t new_state_count; +kern_return_t thread_set_state_KERNEL( + mach_port_t thread_port, /* port right for thread */ + int flavor, + thread_state_t new_state, + natural_t new_state_count) { thread_t thread; kern_return_t result; @@ -613,7 +614,7 @@ kern_return_t thread_set_state_KERNEL(thread_port, flavor, * knows to fall back on an RPC. For other return values, it won't * retry with an RPC. The retry might get a different (incorrect) rc. * Return values are only set (and should only be set, with copyout) - * on successfull calls. + * on successful calls. */ kern_return_t @@ -650,12 +651,12 @@ syscall_vm_map( } else port = (ipc_port_t) memory_object; - copyin((char *)address, (char *)&addr, sizeof(vm_offset_t)); + copyin(address, &addr, sizeof(vm_offset_t)); result = vm_map(map, &addr, size, mask, anywhere, port, offset, copy, cur_protection, max_protection, inheritance); if (result == KERN_SUCCESS) - copyout((char *)&addr, (char *)address, sizeof(vm_offset_t)); + copyout(&addr, address, sizeof(vm_offset_t)); if (IP_VALID(port)) ipc_port_release_send(port); vm_map_deallocate(map); @@ -663,11 +664,11 @@ syscall_vm_map( return result; } -kern_return_t syscall_vm_allocate(target_map, address, size, anywhere) - mach_port_t target_map; - vm_offset_t *address; - vm_size_t size; - boolean_t anywhere; +kern_return_t syscall_vm_allocate( + mach_port_t target_map, + vm_offset_t *address, + vm_size_t size, + boolean_t anywhere) { vm_map_t map; vm_offset_t addr; @@ -677,19 +678,19 @@ kern_return_t syscall_vm_allocate(target_map, address, size, anywhere) if (map == VM_MAP_NULL) return MACH_SEND_INTERRUPTED; - copyin((char *)address, (char *)&addr, sizeof(vm_offset_t)); + copyin(address, &addr, sizeof(vm_offset_t)); result = vm_allocate(map, &addr, size, anywhere); if (result == KERN_SUCCESS) - copyout((char *)&addr, (char *)address, sizeof(vm_offset_t)); + copyout(&addr, address, sizeof(vm_offset_t)); vm_map_deallocate(map); return result; } -kern_return_t syscall_vm_deallocate(target_map, start, size) - mach_port_t target_map; - vm_offset_t start; - vm_size_t size; +kern_return_t syscall_vm_deallocate( + mach_port_t target_map, + vm_offset_t start, + vm_size_t size) { vm_map_t map; kern_return_t result; @@ -704,10 +705,10 @@ kern_return_t syscall_vm_deallocate(target_map, start, size) return result; } -kern_return_t syscall_task_create(parent_task, inherit_memory, child_task) - mach_port_t parent_task; - boolean_t inherit_memory; - mach_port_t *child_task; /* OUT */ +kern_return_t syscall_task_create( + mach_port_t parent_task, + boolean_t inherit_memory, + mach_port_t *child_task) /* OUT */ { task_t t, c; ipc_port_t port; @@ -725,7 +726,7 @@ kern_return_t syscall_task_create(parent_task, inherit_memory, child_task) (void) ipc_kmsg_copyout_object(current_space(), (ipc_object_t) port, MACH_MSG_TYPE_PORT_SEND, &name); - copyout((char *)&name, (char *)child_task, + copyout(&name, child_task, sizeof(mach_port_t)); } task_deallocate(t); @@ -733,8 +734,7 @@ kern_return_t syscall_task_create(parent_task, inherit_memory, child_task) return result; } -kern_return_t syscall_task_terminate(task) - mach_port_t task; +kern_return_t syscall_task_terminate(mach_port_t task) { task_t t; kern_return_t result; @@ -749,8 +749,7 @@ kern_return_t syscall_task_terminate(task) return result; } -kern_return_t syscall_task_suspend(task) - mach_port_t task; +kern_return_t syscall_task_suspend(mach_port_t task) { task_t t; kern_return_t result; @@ -765,10 +764,10 @@ kern_return_t syscall_task_suspend(task) return result; } -kern_return_t syscall_task_set_special_port(task, which_port, port_name) - mach_port_t task; - int which_port; - mach_port_t port_name; +kern_return_t syscall_task_set_special_port( + mach_port_t task, + int which_port, + mach_port_t port_name) { task_t t; ipc_port_t port; @@ -798,10 +797,10 @@ kern_return_t syscall_task_set_special_port(task, which_port, port_name) } kern_return_t -syscall_mach_port_allocate(task, right, namep) - mach_port_t task; - mach_port_right_t right; - mach_port_t *namep; +syscall_mach_port_allocate( + mach_port_t task, + mach_port_right_t right, + mach_port_t *namep) { ipc_space_t space; mach_port_t name; @@ -813,17 +812,17 @@ syscall_mach_port_allocate(task, right, namep) kr = mach_port_allocate(space, right, &name); if (kr == KERN_SUCCESS) - copyout((char *)&name, (char *)namep, sizeof(mach_port_t)); + copyout(&name, namep, sizeof(mach_port_t)); is_release(space); return kr; } kern_return_t -syscall_mach_port_allocate_name(task, right, name) - mach_port_t task; - mach_port_right_t right; - mach_port_t name; +syscall_mach_port_allocate_name( + mach_port_t task, + mach_port_right_t right, + mach_port_t name) { ipc_space_t space; kern_return_t kr; @@ -839,9 +838,9 @@ syscall_mach_port_allocate_name(task, right, name) } kern_return_t -syscall_mach_port_deallocate(task, name) - mach_port_t task; - mach_port_t name; +syscall_mach_port_deallocate( + mach_port_t task, + mach_port_t name) { ipc_space_t space; kern_return_t kr; @@ -857,11 +856,11 @@ syscall_mach_port_deallocate(task, name) } kern_return_t -syscall_mach_port_insert_right(task, name, right, rightType) - mach_port_t task; - mach_port_t name; - mach_port_t right; - mach_msg_type_name_t rightType; +syscall_mach_port_insert_right( + mach_port_t task, + mach_port_t name, + mach_port_t right, + mach_msg_type_name_t rightType) { ipc_space_t space; ipc_object_t object; @@ -896,8 +895,7 @@ syscall_mach_port_insert_right(task, name, right, rightType) return kr; } -kern_return_t syscall_thread_depress_abort(thread) - mach_port_t thread; +kern_return_t syscall_thread_depress_abort(mach_port_t thread) { thread_t t; kern_return_t result; @@ -915,10 +913,6 @@ kern_return_t syscall_thread_depress_abort(thread) /* * Device traps -- these are way experimental. */ - -extern io_return_t ds_device_write_trap(); -extern io_return_t ds_device_writev_trap(); - io_return_t syscall_device_write_request(mach_port_t device_name, mach_port_t reply_name, @@ -928,7 +922,7 @@ syscall_device_write_request(mach_port_t device_name, vm_size_t data_count) { device_t dev; - ipc_port_t reply_port; + /*ipc_port_t reply_port;*/ io_return_t res; /* @@ -949,9 +943,10 @@ syscall_device_write_request(mach_port_t device_name, /* * Translate reply port. */ - if (reply_name == MACH_PORT_NULL) + /*if (reply_name == MACH_PORT_NULL) reply_port = IP_NULL; - else { + */ + if (reply_name != MACH_PORT_NULL) { /* Homey don't play that. */ device_deallocate(dev); return KERN_INVALID_RIGHT; @@ -978,7 +973,7 @@ syscall_device_writev_request(mach_port_t device_name, vm_size_t iocount) { device_t dev; - ipc_port_t reply_port; + /*ipc_port_t reply_port;*/ io_return_t res; /* @@ -999,9 +994,10 @@ syscall_device_writev_request(mach_port_t device_name, /* * Translate reply port. */ - if (reply_name == MACH_PORT_NULL) + /*if (reply_name == MACH_PORT_NULL) reply_port = IP_NULL; - else { + */ + if (reply_name != MACH_PORT_NULL) { /* Homey don't play that. */ device_deallocate(dev); return KERN_INVALID_RIGHT; |