aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--device/device_emul.h4
-rw-r--r--device/ds_routines.c22
-rw-r--r--device/ds_routines.h12
-rw-r--r--include/device/device_types.h4
-rw-r--r--kern/ipc_mig.c6
-rw-r--r--kern/ipc_mig.h6
6 files changed, 31 insertions, 23 deletions
diff --git a/device/device_emul.h b/device/device_emul.h
index 957bd505..683fc802 100644
--- a/device/device_emul.h
+++ b/device/device_emul.h
@@ -56,9 +56,9 @@ struct device_emulation_ops
vm_size_t, ipc_port_t *, boolean_t);
void (*no_senders) (mach_no_senders_notification_t *);
io_return_t (*write_trap) (void *, dev_mode_t,
- recnum_t, vm_offset_t, vm_size_t);
+ rpc_recnum_t, rpc_vm_offset_t, rpc_vm_size_t);
io_return_t (*writev_trap) (void *, dev_mode_t,
- recnum_t, io_buf_vec_t *, vm_size_t);
+ rpc_recnum_t, rpc_io_buf_vec_t *, rpc_vm_size_t);
};
#endif /* _I386AT_DEVICE_EMUL_H_ */
diff --git a/device/ds_routines.c b/device/ds_routines.c
index 11589d63..07cfd85b 100644
--- a/device/ds_routines.c
+++ b/device/ds_routines.c
@@ -412,7 +412,7 @@ ds_notify (mach_msg_header_t *msg)
io_return_t
ds_device_write_trap (device_t dev, dev_mode_t mode,
- recnum_t recnum, vm_offset_t data, vm_size_t count)
+ rpc_recnum_t recnum, rpc_vm_offset_t data, rpc_vm_size_t count)
{
/* Refuse if device is dead or not completely open. */
if (dev == DEVICE_NULL)
@@ -427,7 +427,7 @@ ds_device_write_trap (device_t dev, dev_mode_t mode,
io_return_t
ds_device_writev_trap (device_t dev, dev_mode_t mode,
- recnum_t recnum, io_buf_vec_t *iovec, vm_size_t count)
+ rpc_recnum_t recnum, rpc_io_buf_vec_t *iovec, rpc_vm_size_t count)
{
/* Refuse if device is dead or not completely open. */
if (dev == DEVICE_NULL)
@@ -1713,7 +1713,7 @@ ds_trap_write_done(const io_req_t ior)
*/
static io_return_t
device_write_trap (mach_device_t device, dev_mode_t mode,
- recnum_t recnum, vm_offset_t data, vm_size_t data_count)
+ rpc_recnum_t recnum, rpc_vm_offset_t data, rpc_vm_size_t data_count)
{
io_req_t ior;
io_return_t result;
@@ -1752,7 +1752,7 @@ device_write_trap (mach_device_t device, dev_mode_t mode,
* Copy the data from user space.
*/
if (data_count > 0)
- copyin((void *)data, ior->io_data, data_count);
+ copyin((void*)(vm_offset_t)data, ior->io_data, data_count);
/*
* The ior keeps an extra reference for the device.
@@ -1781,7 +1781,7 @@ device_write_trap (mach_device_t device, dev_mode_t mode,
static io_return_t
device_writev_trap (mach_device_t device, dev_mode_t mode,
- recnum_t recnum, io_buf_vec_t *iovec, vm_size_t iocount)
+ rpc_recnum_t recnum, rpc_io_buf_vec_t *iovec, rpc_vm_size_t iocount)
{
io_req_t ior;
io_return_t result;
@@ -1799,11 +1799,15 @@ device_writev_trap (mach_device_t device, dev_mode_t mode,
*/
if (iocount > 16)
return KERN_INVALID_VALUE; /* lame */
- copyin(iovec,
- stack_iovec,
- iocount * sizeof(io_buf_vec_t));
- for (data_count = 0, i = 0; i < iocount; i++)
+
+ for (data_count = 0, i=0; i<iocount; i++) {
+ rpc_io_buf_vec_t riov;
+ if (copyin(iovec + i, &riov, sizeof(riov)))
+ return KERN_INVALID_ARGUMENT;
+ stack_iovec[i].data = riov.data;
+ stack_iovec[i].count = riov.count;
data_count += stack_iovec[i].count;
+ }
/*
* Get a buffer to hold the ioreq.
diff --git a/device/ds_routines.h b/device/ds_routines.h
index c0543cbc..48d85dd0 100644
--- a/device/ds_routines.h
+++ b/device/ds_routines.h
@@ -72,15 +72,15 @@ extern void io_done_thread(void) __attribute__ ((noreturn));
io_return_t ds_device_write_trap(
device_t dev,
dev_mode_t mode,
- recnum_t recnum,
- vm_offset_t data,
- vm_size_t count);
+ rpc_recnum_t recnum,
+ rpc_vm_offset_t data,
+ rpc_vm_size_t count);
io_return_t ds_device_writev_trap(
device_t dev,
dev_mode_t mode,
- recnum_t recnum,
- io_buf_vec_t *iovec,
- vm_size_t count);
+ rpc_recnum_t recnum,
+ rpc_io_buf_vec_t *iovec,
+ rpc_vm_size_t count);
#endif /* DS_ROUTINES_H */
diff --git a/include/device/device_types.h b/include/device/device_types.h
index 7c533723..583d9e03 100644
--- a/include/device/device_types.h
+++ b/include/device/device_types.h
@@ -85,6 +85,10 @@ typedef struct {
vm_offset_t data;
vm_size_t count;
} io_buf_vec_t;
+typedef struct {
+ rpc_vm_offset_t data;
+ rpc_vm_size_t count;
+} rpc_io_buf_vec_t;
/*
* Record number for random-access devices
diff --git a/kern/ipc_mig.c b/kern/ipc_mig.c
index afda1016..aa433614 100644
--- a/kern/ipc_mig.c
+++ b/kern/ipc_mig.c
@@ -875,7 +875,7 @@ io_return_t
syscall_device_write_request(mach_port_name_t device_name,
mach_port_name_t reply_name,
dev_mode_t mode,
- recnum_t recnum,
+ rpc_recnum_t recnum,
rpc_vm_offset_t data,
rpc_vm_size_t data_count)
{
@@ -926,8 +926,8 @@ io_return_t
syscall_device_writev_request(mach_port_name_t device_name,
mach_port_name_t reply_name,
dev_mode_t mode,
- recnum_t recnum,
- io_buf_vec_t *iovec,
+ rpc_recnum_t recnum,
+ rpc_io_buf_vec_t *iovec,
rpc_vm_size_t iocount)
{
device_t dev;
diff --git a/kern/ipc_mig.h b/kern/ipc_mig.h
index c96a00da..cd298efe 100644
--- a/kern/ipc_mig.h
+++ b/kern/ipc_mig.h
@@ -127,7 +127,7 @@ extern io_return_t syscall_device_write_request(
mach_port_name_t device_name,
mach_port_name_t reply_name,
dev_mode_t mode,
- recnum_t recnum,
+ rpc_recnum_t recnum,
rpc_vm_offset_t data,
rpc_vm_size_t data_count);
@@ -135,8 +135,8 @@ io_return_t syscall_device_writev_request(
mach_port_name_t device_name,
mach_port_name_t reply_name,
dev_mode_t mode,
- recnum_t recnum,
- io_buf_vec_t *iovec,
+ rpc_recnum_t recnum,
+ rpc_io_buf_vec_t *iovec,
rpc_vm_size_t iocount);
mach_port_name_t mig_get_reply_port(void);