bug-hurd
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH 4/7] update writev syscall signature with rpc types


From: Luca Dariz
Subject: [PATCH 4/7] update writev syscall signature with rpc types
Date: Mon, 16 Jan 2023 11:58:54 +0100

* device/device_emul.h: write/writev: update trap argument types
* device/ds_routines.c: update argument types and adjust copyin
* device/ds_routines.h: write/writev: update trap argument type
* include/device/device_types.h: add rpc_io_buf_vec_t type
* kern/ipc_mig.c: write/writev: update trap argument type
* kern/ipc_mig.h: Likewise
---
 device/device_emul.h          |  4 ++--
 device/ds_routines.c          | 22 +++++++++++++---------
 device/ds_routines.h          | 12 ++++++------
 include/device/device_types.h |  4 ++++
 kern/ipc_mig.c                |  6 +++---
 kern/ipc_mig.h                |  6 +++---
 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);
-- 
2.30.2




reply via email to

[Prev in Thread] Current Thread [Next in Thread]