summaryrefslogtreecommitdiffstats
path: root/sys/compat/freebsd32
diff options
context:
space:
mode:
authorjhb <jhb@FreeBSD.org>2008-12-10 20:56:19 +0000
committerjhb <jhb@FreeBSD.org>2008-12-10 20:56:19 +0000
commitf3dcc2d9e01895192f0f2cd23f138318b5165a71 (patch)
tree7f083c44ae313d40be6d905d4f71318477976d29 /sys/compat/freebsd32
parentb771657b300c491b2b1a2b18ddbcdbb4984b90c9 (diff)
downloadFreeBSD-src-f3dcc2d9e01895192f0f2cd23f138318b5165a71.zip
FreeBSD-src-f3dcc2d9e01895192f0f2cd23f138318b5165a71.tar.gz
- Add 32-bit compat system calls for VFS_AIO. The system calls live in the
aio code and are registered via the recently added SYSCALL32_*() helpers. - Since the aio code likes to invoke fuword and suword a lot down in the "bowels" of system calls, add a structure holding a set of operations for things like storing errors, copying in the aiocb structure, storing status, etc. The 32-bit system calls use a separate operations vector to handle fuword32 vs fuword, etc. Also, the oldsigevent handling is now done by having seperate operation vectors with different aiocb copyin routines. - Split out kern_foo() functions for the various AIO system calls so the 32-bit front ends can manage things like copying in and converting timespec structures, etc. - For both the native and 32-bit aio_suspend() and lio_listio() calls, just use copyin() to read the array of aiocb pointers instead of using a for loop that iterated over fuword/fuword32. The error handling in the old case was incomplete (lio_listio() just ignored any aiocb's that it got an EFAULT trying to read rather than reporting an error), and possibly slower. MFC after: 1 month
Diffstat (limited to 'sys/compat/freebsd32')
-rw-r--r--sys/compat/freebsd32/syscalls.master40
1 files changed, 28 insertions, 12 deletions
diff --git a/sys/compat/freebsd32/syscalls.master b/sys/compat/freebsd32/syscalls.master
index 97aefd2..25cb81c 100644
--- a/sys/compat/freebsd32/syscalls.master
+++ b/sys/compat/freebsd32/syscalls.master
@@ -454,9 +454,13 @@
u_int nfds, int timeout); }
253 AUE_ISSETUGID NOPROTO { int issetugid(void); }
254 AUE_LCHOWN NOPROTO { int lchown(char *path, int uid, int gid); }
-255 AUE_NULL UNIMPL nosys
-256 AUE_NULL UNIMPL nosys
-257 AUE_NULL UNIMPL nosys
+255 AUE_NULL NOSTD { int freebsd32_aio_read( \
+ struct aiocb32 *aiocbp); }
+256 AUE_NULL NOSTD { int freebsd32_aio_write( \
+ struct aiocb32 *aiocbp); }
+257 AUE_NULL NOSTD { int freebsd32_lio_listio(int mode, \
+ struct aiocb32 * const *acb_list, \
+ int nent, struct sigevent *sig); }
258 AUE_NULL UNIMPL nosys
259 AUE_NULL UNIMPL nosys
260 AUE_NULL UNIMPL nosys
@@ -535,13 +539,22 @@
312 AUE_SETRESGID NOPROTO { int setresgid(gid_t rgid, gid_t egid, \
gid_t sgid); }
313 AUE_NULL OBSOL signanosleep
-314 AUE_NULL UNIMPL aio_return
-315 AUE_NULL UNIMPL aio_suspend
-316 AUE_NULL UNIMPL aio_cancel
-317 AUE_NULL UNIMPL aio_error
-318 AUE_NULL UNIMPL aio_read
-319 AUE_NULL UNIMPL aio_write
-320 AUE_NULL UNIMPL lio_listio
+314 AUE_NULL NOSTD { int freebsd32_aio_return( \
+ struct aiocb32 *aiocbp); }
+315 AUE_NULL NOSTD { int freebsd32_aio_suspend( \
+ struct aiocb32 * const * aiocbp, int nent, \
+ const struct timespec32 *timeout); }
+316 AUE_NULL NOSTD { int freebsd32_aio_cancel(int fd, \
+ struct aiocb32 *aiocbp); }
+317 AUE_NULL NOSTD { int freebsd32_aio_error( \
+ struct aiocb32 *aiocbp); }
+318 AUE_NULL NOSTD { int freebsd32_oaio_read( \
+ struct oaiocb32 *aiocbp); }
+319 AUE_NULL NOSTD { int freebsd32_oaio_write( \
+ struct oaiocb32 *aiocbp); }
+320 AUE_NULL NOSTD { int freebsd32_olio_listio(int mode, \
+ struct oaiocb32 * const *acb_list, \
+ int nent, struct osigevent32 *sig); }
321 AUE_NULL NOPROTO { int yield(void); }
322 AUE_NULL OBSOL thr_sleep
323 AUE_NULL OBSOL thr_wakeup
@@ -618,7 +631,9 @@
358 AUE_EXTATTR_DELETE_FILE NOPROTO { int extattr_delete_file( \
const char *path, int attrnamespace, \
const char *attrname); }
-359 AUE_NULL UNIMPL aio_waitcomplete
+359 AUE_NULL NOSTD { int freebsd32_aio_waitcomplete( \
+ struct aiocb32 **aiocbp, \
+ struct timespec32 *timeout); }
360 AUE_GETRESUID NOPROTO { int getresuid(uid_t *ruid, uid_t *euid, \
uid_t *suid); }
361 AUE_GETRESGID NOPROTO { int getresgid(gid_t *rgid, gid_t *egid, \
@@ -766,7 +781,8 @@
462 AUE_NULL UNIMPL kmq_unlink
463 AUE_NULL NOPROTO { int abort2(const char *why, int nargs, void **args); }
464 AUE_NULL NOPROTO { int thr_set_name(long id, const char *name); }
-465 AUE_NULL UNIMPL aio_fsync
+465 AUE_NULL NOSTD { int freebsd32_aio_fsync(int op, \
+ struct aiocb32 *aiocbp); }
466 AUE_RTPRIO NOPROTO { int rtprio_thread(int function, \
lwpid_t lwpid, struct rtprio *rtp); }
467 AUE_NULL UNIMPL nosys
OpenPOWER on IntegriCloud