Index: lib/libc/gen/Makefile.inc =========================================================================== --- lib/libc/gen/Makefile.inc 2007/07/01 05:44:30 #48 +++ lib/libc/gen/Makefile.inc 2007/07/01 05:44:30 @@ -4,7 +4,8 @@ # machine-independent gen sources .PATH: ${.CURDIR}/${MACHINE_ARCH}/gen ${.CURDIR}/gen -SRCS+= __xuname.c _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \ +SRCS+= __getosreldate.c __xuname.c \ + _pthread_stubs.c _rand48.c _spinlock_stub.c _thread_init.c \ alarm.c arc4random.c assert.c basename.c check_utility_compat.c \ clock.c closedir.c confstr.c \ crypt.c ctermid.c daemon.c devname.c dirname.c disklabel.c \ Index: lib/libc/gen/__getosreldate.c =========================================================================== *** /dev/null Sun Jul 1 05:44:01 2007 --- lib/libc/gen/__getosreldate.c Sun Jul 1 05:44:35 2007 *************** *** 0 **** --- 1,61 ---- + /*- + * Copyright (c) 2007 Peter Wemm + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + + #include + __FBSDID("$FreeBSD$"); + + #include + #include + + /* + * This is private to libc. It is intended for wrapping syscall stubs in order + * to avoid having to put SIGSYS signal handlers in place to test for presence + * of new syscalls. This caches the result in order to be as quick as possible. + * + * Use getosreldate(3) for public use as it respects the $OSVERSION environment + * variable. + */ + + int + __getosreldate(void) + { + static int osreldate; + size_t len; + int oid[2]; + int error, osrel; + + if (osreldate != 0) + return (osreldate); + + oid[0] = CTL_KERN; + oid[1] = KERN_OSRELDATE; + osrel = 0; + len = sizeof(osrel); + error = sysctl(oid, 2, &osrel, &len, NULL, 0); + if (error == 0 && osrel > 0 && len == sizeof(osrel)) + osreldate = osrel; + return (osreldate); + } Index: lib/libc/include/libc_private.h =========================================================================== --- lib/libc/include/libc_private.h 2007/07/01 05:44:30 #11 +++ lib/libc/include/libc_private.h 2007/07/01 05:44:30 @@ -169,4 +169,18 @@ */ extern void (*__cleanup)(void); +/* + * Get kern.osreldate to detect ABI revisions. Explicitly + * ignores value of $OSVERSION and caches result. Prototypes + * for the wrapped "new" pad-less syscalls are here for now. + */ +extern int __getosreldate(void); +#include +extern __off_t __new_lseek(int, __off_t, int); +extern int __new_ftruncate(int, __off_t); +extern int __new_truncate(const char *, __off_t); +extern __ssize_t __new_pread(int, void *, __size_t, __off_t); +extern __ssize_t __new_pwrite(int, void *, __size_t, __off_t); +extern void * __new_mmap(void *, __size_t, int, int, int, __off_t); + #endif /* _LIBC_PRIVATE_H_ */ Index: lib/libc/sys/ftruncate.c =========================================================================== --- lib/libc/sys/ftruncate.c 2007/07/01 05:44:30 #3 +++ lib/libc/sys/ftruncate.c 2007/07/01 05:44:30 @@ -36,6 +36,7 @@ #include #include #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -47,5 +48,8 @@ off_t length; { - return(__syscall((quad_t)SYS_ftruncate, fd, 0, length)); + if (__getosreldate() >= 700049) + return(_new_ftruncate(fd, length)); + else + return(__syscall((quad_t)SYS_ftruncate, fd, 0, length)); } Index: lib/libc/sys/lseek.c =========================================================================== --- lib/libc/sys/lseek.c 2007/07/01 05:44:30 #3 +++ lib/libc/sys/lseek.c 2007/07/01 05:44:30 @@ -36,6 +36,7 @@ #include #include #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -47,5 +48,9 @@ off_t offset; int whence; { - return(__syscall((quad_t)SYS_lseek, fd, 0, offset, whence)); + + if (__getosreldate() >= 700049) + return(_new_lseek(fd, offset, whence)); + else + return(__syscall((quad_t)SYS_lseek, fd, 0, offset, whence)); } Index: lib/libc/sys/mmap.c =========================================================================== --- lib/libc/sys/mmap.c 2007/07/01 05:44:30 #4 +++ lib/libc/sys/mmap.c 2007/07/01 05:44:30 @@ -37,6 +37,7 @@ #include #include #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -52,6 +53,10 @@ off_t offset; { - return ((void *)(intptr_t)__syscall((quad_t)SYS_mmap, addr, len, prot, - flags, fd, 0, offset)); + if (__getosreldate() >= 700049) + return (_new_mmap(addr, len, prot, flags, fd, offset)); + else + + return ((void *)(intptr_t)__syscall((quad_t)SYS_mmap, addr, len, prot, + flags, fd, 0, offset)); } Index: lib/libc/sys/pread.c =========================================================================== --- lib/libc/sys/pread.c 2007/07/01 05:44:30 #3 +++ lib/libc/sys/pread.c 2007/07/01 05:44:30 @@ -36,6 +36,7 @@ #include #include #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -48,5 +49,9 @@ size_t nbyte; off_t offset; { - return ((ssize_t)__syscall((quad_t)SYS_pread, fd, buf, nbyte, 0, offset)); + + if (__getosreldate() >= 700049) + return (_new_pread(fd, buf, nbyte, offset)); + else + return ((ssize_t)__syscall((quad_t)SYS_pread, fd, buf, nbyte, 0, offset)); } Index: lib/libc/sys/pwrite.c =========================================================================== --- lib/libc/sys/pwrite.c 2007/07/01 05:44:30 #3 +++ lib/libc/sys/pwrite.c 2007/07/01 05:44:30 @@ -36,6 +36,7 @@ #include #include #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -48,5 +49,8 @@ size_t nbyte; off_t offset; { - return ((ssize_t)__syscall((quad_t)SYS_pwrite, fd, buf, nbyte, 0, offset)); + if (__getosreldate() >= 700049) + return (_new_pwrite(fd, buf, nbyte, offset)); + else + return ((ssize_t)__syscall((quad_t)SYS_pwrite, fd, buf, nbyte, 0, offset)); } Index: lib/libc/sys/truncate.c =========================================================================== --- lib/libc/sys/truncate.c 2007/07/01 05:44:30 #3 +++ lib/libc/sys/truncate.c 2007/07/01 05:44:30 @@ -35,8 +35,8 @@ #include #include - #include +#include "libc_private.h" /* * This function provides 64-bit offset padding that @@ -48,5 +48,8 @@ off_t length; { - return(__syscall((quad_t)SYS_truncate, path, 0, length)); + if (__getosreldate() >= 700049) + return(_new_truncate(path, length)); + else + return(__syscall((quad_t)SYS_truncate, path, 0, length)); } Index: sys/compat/freebsd32/freebsd32_misc.c =========================================================================== --- sys/compat/freebsd32/freebsd32_misc.c 2007/07/01 05:44:30 #55 +++ sys/compat/freebsd32/freebsd32_misc.c 2007/07/01 05:44:30 @@ -475,6 +475,22 @@ return (mmap(td, &ap)); } +int +freebsd32_new_mmap(struct thread *td, struct freebsd32_new_mmap_args *uap) +{ + struct freebsd32_mmap_args ap; + + ap.addr = uap->addr; + ap.len = uap->len; + ap.prot = uap->prot; + ap.flags = uap->flags; + ap.fd = uap->fd; + ap.poslo = uap->poslo; + ap.poshi = uap->poshi; + + return (freebsd32_mmap(td, &ap)); +} + struct itimerval32 { struct timeval32 it_interval; struct timeval32 it_value; @@ -1616,6 +1632,69 @@ return (ftruncate(td, &ap)); } +/* versions without the 'int pad' argument */ +int +freebsd32_new_pread(struct thread *td, struct freebsd32_new_pread_args *uap) +{ + struct pread_args ap; + + ap.fd = uap->fd; + ap.buf = uap->buf; + ap.nbyte = uap->nbyte; + ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + return (pread(td, &ap)); +} + +int +freebsd32_new_pwrite(struct thread *td, struct freebsd32_new_pwrite_args *uap) +{ + struct pwrite_args ap; + + ap.fd = uap->fd; + ap.buf = uap->buf; + ap.nbyte = uap->nbyte; + ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + return (pwrite(td, &ap)); +} + +int +freebsd32_new_lseek(struct thread *td, struct freebsd32_new_lseek_args *uap) +{ + int error; + struct lseek_args ap; + off_t pos; + + ap.fd = uap->fd; + ap.offset = (uap->offsetlo | ((off_t)uap->offsethi << 32)); + ap.whence = uap->whence; + error = lseek(td, &ap); + /* Expand the quad return into two parts for eax and edx */ + pos = *(off_t *)(td->td_retval); + td->td_retval[0] = pos & 0xffffffff; /* %eax */ + td->td_retval[1] = pos >> 32; /* %edx */ + return error; +} + +int +freebsd32_new_truncate(struct thread *td, struct freebsd32_new_truncate_args *uap) +{ + struct truncate_args ap; + + ap.path = uap->path; + ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + return (truncate(td, &ap)); +} + +int +freebsd32_new_ftruncate(struct thread *td, struct freebsd32_new_ftruncate_args *uap) +{ + struct ftruncate_args ap; + + ap.fd = uap->fd; + ap.length = (uap->lengthlo | ((off_t)uap->lengthhi << 32)); + return (ftruncate(td, &ap)); +} + struct sf_hdtr32 { uint32_t headers; int hdr_cnt; Index: sys/compat/freebsd32/freebsd32_proto.h =========================================================================== --- sys/compat/freebsd32/freebsd32_proto.h 2007/07/01 05:44:30 #66 +++ sys/compat/freebsd32/freebsd32_proto.h 2007/07/01 05:44:30 @@ -322,6 +322,45 @@ char param_l_[PADL_(struct thr_param32 *)]; struct thr_param32 * param; char param_r_[PADR_(struct thr_param32 *)]; char param_size_l_[PADL_(int)]; int param_size; char param_size_r_[PADR_(int)]; }; +struct freebsd32_new_pread_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; + char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; + char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)]; + char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)]; +}; +struct freebsd32_new_pwrite_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)]; + char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; + char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)]; + char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)]; +}; +struct freebsd32_new_mmap_args { + char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; + char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)]; + char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)]; + char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char poslo_l_[PADL_(u_int32_t)]; u_int32_t poslo; char poslo_r_[PADR_(u_int32_t)]; + char poshi_l_[PADL_(u_int32_t)]; u_int32_t poshi; char poshi_r_[PADR_(u_int32_t)]; +}; +struct freebsd32_new_lseek_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char offsetlo_l_[PADL_(u_int32_t)]; u_int32_t offsetlo; char offsetlo_r_[PADR_(u_int32_t)]; + char offsethi_l_[PADL_(u_int32_t)]; u_int32_t offsethi; char offsethi_r_[PADR_(u_int32_t)]; + char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)]; +}; +struct freebsd32_new_truncate_args { + char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; + char lengthlo_l_[PADL_(u_int32_t)]; u_int32_t lengthlo; char lengthlo_r_[PADR_(u_int32_t)]; + char lengthhi_l_[PADL_(u_int32_t)]; u_int32_t lengthhi; char lengthhi_r_[PADR_(u_int32_t)]; +}; +struct freebsd32_new_ftruncate_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char lengthlo_l_[PADL_(u_int32_t)]; u_int32_t lengthlo; char lengthlo_r_[PADR_(u_int32_t)]; + char lengthhi_l_[PADL_(u_int32_t)]; u_int32_t lengthhi; char lengthhi_r_[PADR_(u_int32_t)]; +}; int freebsd32_wait4(struct thread *, struct freebsd32_wait4_args *); int freebsd32_recvmsg(struct thread *, struct freebsd32_recvmsg_args *); int freebsd32_sendmsg(struct thread *, struct freebsd32_sendmsg_args *); @@ -377,6 +416,12 @@ int freebsd32_thr_suspend(struct thread *, struct freebsd32_thr_suspend_args *); int freebsd32_umtx_op(struct thread *, struct freebsd32_umtx_op_args *); int freebsd32_thr_new(struct thread *, struct freebsd32_thr_new_args *); +int freebsd32_new_pread(struct thread *, struct freebsd32_new_pread_args *); +int freebsd32_new_pwrite(struct thread *, struct freebsd32_new_pwrite_args *); +int freebsd32_new_mmap(struct thread *, struct freebsd32_new_mmap_args *); +int freebsd32_new_lseek(struct thread *, struct freebsd32_new_lseek_args *); +int freebsd32_new_truncate(struct thread *, struct freebsd32_new_truncate_args *); +int freebsd32_new_ftruncate(struct thread *, struct freebsd32_new_ftruncate_args *); #ifdef COMPAT_43 @@ -521,6 +566,12 @@ #define FREEBSD32_SYS_AUE_freebsd32_thr_suspend AUE_NULL #define FREEBSD32_SYS_AUE_freebsd32_umtx_op AUE_NULL #define FREEBSD32_SYS_AUE_freebsd32_thr_new AUE_NULL +#define FREEBSD32_SYS_AUE_freebsd32_new_pread AUE_PREAD +#define FREEBSD32_SYS_AUE_freebsd32_new_pwrite AUE_PWRITE +#define FREEBSD32_SYS_AUE_freebsd32_new_mmap AUE_MMAP +#define FREEBSD32_SYS_AUE_freebsd32_new_lseek AUE_LSEEK +#define FREEBSD32_SYS_AUE_freebsd32_new_truncate AUE_TRUNCATE +#define FREEBSD32_SYS_AUE_freebsd32_new_ftruncate AUE_FTRUNCATE #undef PAD_ #undef PADL_ Index: sys/compat/freebsd32/freebsd32_syscall.h =========================================================================== --- sys/compat/freebsd32/freebsd32_syscall.h 2007/07/01 05:44:30 #64 +++ sys/compat/freebsd32/freebsd32_syscall.h 2007/07/01 05:44:30 @@ -331,4 +331,10 @@ #define FREEBSD32_SYS_sctp_generic_sendmsg 472 #define FREEBSD32_SYS_sctp_generic_sendmsg_iov 473 #define FREEBSD32_SYS_sctp_generic_recvmsg 474 -#define FREEBSD32_SYS_MAXSYSCALL 475 +#define FREEBSD32_SYS_freebsd32_new_pread 475 +#define FREEBSD32_SYS_freebsd32_new_pwrite 476 +#define FREEBSD32_SYS_freebsd32_new_mmap 477 +#define FREEBSD32_SYS_freebsd32_new_lseek 478 +#define FREEBSD32_SYS_freebsd32_new_truncate 479 +#define FREEBSD32_SYS_freebsd32_new_ftruncate 480 +#define FREEBSD32_SYS_MAXSYSCALL 481 Index: sys/compat/freebsd32/freebsd32_syscalls.c =========================================================================== --- sys/compat/freebsd32/freebsd32_syscalls.c 2007/07/01 05:44:30 #64 +++ sys/compat/freebsd32/freebsd32_syscalls.c 2007/07/01 05:44:30 @@ -482,4 +482,10 @@ "sctp_generic_sendmsg", /* 472 = sctp_generic_sendmsg */ "sctp_generic_sendmsg_iov", /* 473 = sctp_generic_sendmsg_iov */ "sctp_generic_recvmsg", /* 474 = sctp_generic_recvmsg */ + "freebsd32_new_pread", /* 475 = freebsd32_new_pread */ + "freebsd32_new_pwrite", /* 476 = freebsd32_new_pwrite */ + "freebsd32_new_mmap", /* 477 = freebsd32_new_mmap */ + "freebsd32_new_lseek", /* 478 = freebsd32_new_lseek */ + "freebsd32_new_truncate", /* 479 = freebsd32_new_truncate */ + "freebsd32_new_ftruncate", /* 480 = freebsd32_new_ftruncate */ }; Index: sys/compat/freebsd32/freebsd32_sysent.c =========================================================================== --- sys/compat/freebsd32/freebsd32_sysent.c 2007/07/01 05:44:30 #64 +++ sys/compat/freebsd32/freebsd32_sysent.c 2007/07/01 05:44:30 @@ -507,4 +507,10 @@ { AS(sctp_generic_sendmsg_args), (sy_call_t *)sctp_generic_sendmsg, AUE_NULL, NULL, 0, 0 }, /* 472 = sctp_generic_sendmsg */ { AS(sctp_generic_sendmsg_iov_args), (sy_call_t *)sctp_generic_sendmsg_iov, AUE_NULL, NULL, 0, 0 }, /* 473 = sctp_generic_sendmsg_iov */ { AS(sctp_generic_recvmsg_args), (sy_call_t *)sctp_generic_recvmsg, AUE_NULL, NULL, 0, 0 }, /* 474 = sctp_generic_recvmsg */ + { AS(freebsd32_new_pread_args), (sy_call_t *)freebsd32_new_pread, AUE_PREAD, NULL, 0, 0 }, /* 475 = freebsd32_new_pread */ + { AS(freebsd32_new_pwrite_args), (sy_call_t *)freebsd32_new_pwrite, AUE_PWRITE, NULL, 0, 0 }, /* 476 = freebsd32_new_pwrite */ + { AS(freebsd32_new_mmap_args), (sy_call_t *)freebsd32_new_mmap, AUE_MMAP, NULL, 0, 0 }, /* 477 = freebsd32_new_mmap */ + { AS(freebsd32_new_lseek_args), (sy_call_t *)freebsd32_new_lseek, AUE_LSEEK, NULL, 0, 0 }, /* 478 = freebsd32_new_lseek */ + { AS(freebsd32_new_truncate_args), (sy_call_t *)freebsd32_new_truncate, AUE_TRUNCATE, NULL, 0, 0 }, /* 479 = freebsd32_new_truncate */ + { AS(freebsd32_new_ftruncate_args), (sy_call_t *)freebsd32_new_ftruncate, AUE_FTRUNCATE, NULL, 0, 0 }, /* 480 = freebsd32_new_ftruncate */ }; Index: sys/compat/freebsd32/syscalls.master =========================================================================== --- sys/compat/freebsd32/syscalls.master 2007/07/01 05:44:30 #66 +++ sys/compat/freebsd32/syscalls.master 2007/07/01 05:44:30 @@ -778,3 +778,19 @@ 474 AUE_NULL NOPROTO { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ struct sockaddr * from, __socklen_t *fromlenaddr, \ struct sctp_sndrcvinfo *sinfo, int *msg_flags); } +475 AUE_PREAD STD { ssize_t freebsd32_new_pread(int fd, \ + void *buf,size_t nbyte, \ + u_int32_t offsetlo, u_int32_t offsethi); } +476 AUE_PWRITE STD { ssize_t freebsd32_new_pwrite(int fd, \ + const void *buf, size_t nbyte, \ + u_int32_t offsetlo, u_int32_t offsethi); } +477 AUE_MMAP STD { caddr_t freebsd32_new_mmap(caddr_t addr, \ + size_t len, int prot, int flags, int fd, \ + u_int32_t poslo, u_int32_t poshi); } +478 AUE_LSEEK STD { off_t freebsd32_new_lseek(int fd, \ + u_int32_t offsetlo, u_int32_t offsethi, \ + int whence); } +479 AUE_TRUNCATE STD { int freebsd32_new_truncate(char *path, \ + u_int32_t lengthlo, u_int32_t lengthhi); } +480 AUE_FTRUNCATE STD { int freebsd32_new_ftruncate(int fd, \ + u_int32_t lengthlo, u_int32_t lengthhi); } Index: sys/kern/init_sysent.c =========================================================================== --- sys/kern/init_sysent.c 2007/07/01 05:44:30 #126 +++ sys/kern/init_sysent.c 2007/07/01 05:44:30 @@ -504,4 +504,10 @@ { AS(sctp_generic_sendmsg_args), (sy_call_t *)sctp_generic_sendmsg, AUE_NULL, NULL, 0, 0 }, /* 472 = sctp_generic_sendmsg */ { AS(sctp_generic_sendmsg_iov_args), (sy_call_t *)sctp_generic_sendmsg_iov, AUE_NULL, NULL, 0, 0 }, /* 473 = sctp_generic_sendmsg_iov */ { AS(sctp_generic_recvmsg_args), (sy_call_t *)sctp_generic_recvmsg, AUE_NULL, NULL, 0, 0 }, /* 474 = sctp_generic_recvmsg */ + { AS(_new_pread_args), (sy_call_t *)_new_pread, AUE_PREAD, NULL, 0, 0 }, /* 475 = _new_pread */ + { AS(_new_pwrite_args), (sy_call_t *)_new_pwrite, AUE_PWRITE, NULL, 0, 0 }, /* 476 = _new_pwrite */ + { AS(_new_mmap_args), (sy_call_t *)_new_mmap, AUE_MMAP, NULL, 0, 0 }, /* 477 = _new_mmap */ + { AS(_new_lseek_args), (sy_call_t *)_new_lseek, AUE_LSEEK, NULL, 0, 0 }, /* 478 = _new_lseek */ + { AS(_new_truncate_args), (sy_call_t *)_new_truncate, AUE_TRUNCATE, NULL, 0, 0 }, /* 479 = _new_truncate */ + { AS(_new_ftruncate_args), (sy_call_t *)_new_ftruncate, AUE_FTRUNCATE, NULL, 0, 0 }, /* 480 = _new_ftruncate */ }; Index: sys/kern/sys_generic.c =========================================================================== --- sys/kern/sys_generic.c 2007/07/01 05:44:30 #78 +++ sys/kern/sys_generic.c 2007/07/01 05:44:30 @@ -142,6 +142,21 @@ return(error); } +int +_new_pread(td, uap) + struct thread *td; + struct _new_pread_args *uap; +{ + struct pread_args oargs; + + oargs.fd = uap->fd; + oargs.buf = uap->buf; + oargs.nbyte = uap->nbyte; + oargs.pad = 0; + oargs.offset = uap->offset; + return (pread(td, &oargs)); +} + /* * Scatter read system call. */ @@ -337,6 +352,21 @@ return(error); } +int +_new_pwrite(td, uap) + struct thread *td; + struct _new_pwrite_args *uap; +{ + struct pwrite_args oargs; + + oargs.fd = uap->fd; + oargs.buf = uap->buf; + oargs.nbyte = uap->nbyte; + oargs.pad = 0; + oargs.offset = uap->offset; + return (pwrite(td, &oargs)); +} + /* * Gather write system call. */ Index: sys/kern/syscalls.c =========================================================================== --- sys/kern/syscalls.c 2007/07/01 05:44:30 #122 +++ sys/kern/syscalls.c 2007/07/01 05:44:30 @@ -482,4 +482,10 @@ "sctp_generic_sendmsg", /* 472 = sctp_generic_sendmsg */ "sctp_generic_sendmsg_iov", /* 473 = sctp_generic_sendmsg_iov */ "sctp_generic_recvmsg", /* 474 = sctp_generic_recvmsg */ + "_new_pread", /* 475 = _new_pread */ + "_new_pwrite", /* 476 = _new_pwrite */ + "_new_mmap", /* 477 = _new_mmap */ + "_new_lseek", /* 478 = _new_lseek */ + "_new_truncate", /* 479 = _new_truncate */ + "_new_ftruncate", /* 480 = _new_ftruncate */ }; Index: sys/kern/syscalls.master =========================================================================== --- sys/kern/syscalls.master 2007/07/01 05:44:30 #138 +++ sys/kern/syscalls.master 2007/07/01 05:44:30 @@ -835,5 +838,15 @@ 474 AUE_NULL STD { int sctp_generic_recvmsg(int sd, struct iovec *iov, int iovlen, \ struct sockaddr * from, __socklen_t *fromlenaddr, \ struct sctp_sndrcvinfo *sinfo, int *msg_flags); } +475 AUE_PREAD STD { ssize_t _new_pread(int fd, void *buf, \ + size_t nbyte, off_t offset); } +476 AUE_PWRITE STD { ssize_t _new_pwrite(int fd, const void *buf, \ + size_t nbyte, off_t offset); } +477 AUE_MMAP STD { caddr_t _new_mmap(caddr_t addr, size_t len, \ + int prot, int flags, int fd, off_t pos); } +478 AUE_LSEEK STD { off_t _new_lseek(int fd, off_t offset, \ + int whence); } +479 AUE_TRUNCATE STD { int _new_truncate(char *path, off_t length); } +480 AUE_FTRUNCATE STD { int _new_ftruncate(int fd, off_t length); } ; Please copy any additions and changes to the following compatability tables: ; sys/compat/freebsd32/syscalls.master Index: sys/kern/systrace_args.c =========================================================================== --- sys/kern/systrace_args.c 2007/07/01 05:44:30 #12 +++ sys/kern/systrace_args.c 2007/07/01 05:44:30 @@ -2805,6 +2832,63 @@ *n_args = 7; break; } + /* _new_pread */ + case 475: { + struct _new_pread_args *p = params; + iarg[0] = p->fd; /* int */ + uarg[1] = (intptr_t) p->buf; /* void * */ + uarg[2] = p->nbyte; /* size_t */ + iarg[3] = p->offset; /* off_t */ + *n_args = 4; + break; + } + /* _new_pwrite */ + case 476: { + struct _new_pwrite_args *p = params; + iarg[0] = p->fd; /* int */ + uarg[1] = (intptr_t) p->buf; /* const void * */ + uarg[2] = p->nbyte; /* size_t */ + iarg[3] = p->offset; /* off_t */ + *n_args = 4; + break; + } + /* _new_mmap */ + case 477: { + struct _new_mmap_args *p = params; + uarg[0] = (intptr_t) p->addr; /* caddr_t */ + uarg[1] = p->len; /* size_t */ + iarg[2] = p->prot; /* int */ + iarg[3] = p->flags; /* int */ + iarg[4] = p->fd; /* int */ + iarg[5] = p->pos; /* off_t */ + *n_args = 6; + break; + } + /* _new_lseek */ + case 478: { + struct _new_lseek_args *p = params; + iarg[0] = p->fd; /* int */ + iarg[1] = p->offset; /* off_t */ + iarg[2] = p->whence; /* int */ + *n_args = 3; + break; + } + /* _new_truncate */ + case 479: { + struct _new_truncate_args *p = params; + uarg[0] = (intptr_t) p->path; /* char * */ + iarg[1] = p->length; /* off_t */ + *n_args = 2; + break; + } + /* _new_ftruncate */ + case 480: { + struct _new_ftruncate_args *p = params; + iarg[0] = p->fd; /* int */ + iarg[1] = p->length; /* off_t */ + *n_args = 2; + break; + } default: *n_args = 0; break; Index: sys/kern/vfs_syscalls.c =========================================================================== --- sys/kern/vfs_syscalls.c 2007/07/01 05:44:30 #239 +++ sys/kern/vfs_syscalls.c 2007/07/01 05:44:30 @@ -1785,16 +1785,29 @@ off_t offset; int whence; } */ nuap; - int error; nuap.fd = uap->fd; nuap.offset = uap->offset; nuap.whence = uap->whence; - error = lseek(td, &nuap); - return (error); + return (lseek(td, &nuap)); } #endif /* COMPAT_43 */ +/* Skip the 'pad' argument */ +int +_new_lseek(td, uap) + struct thread *td; + register struct _new_lseek_args *uap; +{ + struct lseek_args ouap; + + ouap.fd = uap->fd; + ouap.pad = 0; + ouap.offset = uap->offset; + ouap.whence = uap->whence; + return (lseek(td, &ouap)); +} + /* * Check access permissions using passed credentials. */ @@ -3150,6 +3238,33 @@ } #endif /* COMPAT_43 */ +/* Versions without the pad argument */ +int +_new_truncate(td, uap) + struct thread *td; + register struct _new_truncate_args *uap; +{ + struct truncate_args ouap; + + ouap.path = uap->path; + ouap.pad = 0; + ouap.length = uap->length; + return (truncate(td, &ouap)); +} + +int +_new_ftruncate(td, uap) + struct thread *td; + register struct _new_ftruncate_args *uap; +{ + struct ftruncate_args ouap; + + ouap.fd = uap->fd; + ouap.pad = 0; + ouap.length = uap->length; + return (ftruncate(td, &ouap)); +} + /* * Sync an open file. */ Index: sys/sys/param.h =========================================================================== --- sys/sys/param.h 2007/07/01 05:44:30 #207 +++ sys/sys/param.h 2007/07/01 05:44:30 @@ -57,7 +57,7 @@ * is created, otherwise 1. */ #undef __FreeBSD_version -#define __FreeBSD_version 700048 /* Master, propagated to newvers */ +#define __FreeBSD_version 700049 /* Master, propagated to newvers */ #ifndef LOCORE #include Index: sys/sys/syscall.h =========================================================================== --- sys/sys/syscall.h 2007/07/01 05:44:30 #121 +++ sys/sys/syscall.h 2007/07/01 05:44:30 @@ -394,4 +397,10 @@ #define SYS_sctp_generic_sendmsg 472 #define SYS_sctp_generic_sendmsg_iov 473 #define SYS_sctp_generic_recvmsg 474 -#define SYS_MAXSYSCALL 475 +#define SYS__new_pread 475 +#define SYS__new_pwrite 476 +#define SYS__new_mmap 477 +#define SYS__new_lseek 478 +#define SYS__new_truncate 479 +#define SYS__new_ftruncate 480 +#define SYS_MAXSYSCALL 481 Index: sys/sys/syscall.mk =========================================================================== --- sys/sys/syscall.mk 2007/07/01 05:44:30 #122 +++ sys/sys/syscall.mk 2007/07/01 05:44:30 @@ -335,4 +338,10 @@ sctp_peeloff.o \ sctp_generic_sendmsg.o \ sctp_generic_sendmsg_iov.o \ - sctp_generic_recvmsg.o + sctp_generic_recvmsg.o \ + _new_pread.o \ + _new_pwrite.o \ + _new_mmap.o \ + _new_lseek.o \ + _new_truncate.o \ + _new_ftruncate.o Index: sys/sys/sysproto.h =========================================================================== --- sys/sys/sysproto.h 2007/07/01 05:44:30 #135 +++ sys/sys/sysproto.h 2007/07/01 05:44:30 @@ -1482,6 +1497,39 @@ char sinfo_l_[PADL_(struct sctp_sndrcvinfo *)]; struct sctp_sndrcvinfo * sinfo; char sinfo_r_[PADR_(struct sctp_sndrcvinfo *)]; char msg_flags_l_[PADL_(int *)]; int * msg_flags; char msg_flags_r_[PADR_(int *)]; }; +struct _new_pread_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char buf_l_[PADL_(void *)]; void * buf; char buf_r_[PADR_(void *)]; + char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; + char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)]; +}; +struct _new_pwrite_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char buf_l_[PADL_(const void *)]; const void * buf; char buf_r_[PADR_(const void *)]; + char nbyte_l_[PADL_(size_t)]; size_t nbyte; char nbyte_r_[PADR_(size_t)]; + char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)]; +}; +struct _new_mmap_args { + char addr_l_[PADL_(caddr_t)]; caddr_t addr; char addr_r_[PADR_(caddr_t)]; + char len_l_[PADL_(size_t)]; size_t len; char len_r_[PADR_(size_t)]; + char prot_l_[PADL_(int)]; int prot; char prot_r_[PADR_(int)]; + char flags_l_[PADL_(int)]; int flags; char flags_r_[PADR_(int)]; + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char pos_l_[PADL_(off_t)]; off_t pos; char pos_r_[PADR_(off_t)]; +}; +struct _new_lseek_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char offset_l_[PADL_(off_t)]; off_t offset; char offset_r_[PADR_(off_t)]; + char whence_l_[PADL_(int)]; int whence; char whence_r_[PADR_(int)]; +}; +struct _new_truncate_args { + char path_l_[PADL_(char *)]; char * path; char path_r_[PADR_(char *)]; + char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)]; +}; +struct _new_ftruncate_args { + char fd_l_[PADL_(int)]; int fd; char fd_r_[PADR_(int)]; + char length_l_[PADL_(off_t)]; off_t length; char length_r_[PADR_(off_t)]; +}; int nosys(struct thread *, struct nosys_args *); void sys_exit(struct thread *, struct sys_exit_args *); int fork(struct thread *, struct fork_args *); @@ -1814,6 +1865,12 @@ int sctp_generic_sendmsg(struct thread *, struct sctp_generic_sendmsg_args *); int sctp_generic_sendmsg_iov(struct thread *, struct sctp_generic_sendmsg_iov_args *); int sctp_generic_recvmsg(struct thread *, struct sctp_generic_recvmsg_args *); +int _new_pread(struct thread *, struct _new_pread_args *); +int _new_pwrite(struct thread *, struct _new_pwrite_args *); +int _new_mmap(struct thread *, struct _new_mmap_args *); +int _new_lseek(struct thread *, struct _new_lseek_args *); +int _new_truncate(struct thread *, struct _new_truncate_args *); +int _new_ftruncate(struct thread *, struct _new_ftruncate_args *); #ifdef COMPAT_43 @@ -2365,6 +2425,12 @@ #define SYS_AUE_sctp_generic_sendmsg AUE_NULL #define SYS_AUE_sctp_generic_sendmsg_iov AUE_NULL #define SYS_AUE_sctp_generic_recvmsg AUE_NULL +#define SYS_AUE__new_pread AUE_PREAD +#define SYS_AUE__new_pwrite AUE_PWRITE +#define SYS_AUE__new_mmap AUE_MMAP +#define SYS_AUE__new_lseek AUE_LSEEK +#define SYS_AUE__new_truncate AUE_TRUNCATE +#define SYS_AUE__new_ftruncate AUE_FTRUNCATE #undef PAD_ #undef PADL_ Index: sys/vm/vm_mmap.c =========================================================================== --- sys/vm/vm_mmap.c 2007/07/01 05:44:30 #88 +++ sys/vm/vm_mmap.c 2007/07/01 05:44:30 @@ -392,6 +392,23 @@ return (error); } +int +_new_mmap(td, uap) + struct thread *td; + struct _new_mmap_args *uap; +{ + struct mmap_args oargs; + + oargs.addr = uap->addr; + oargs.len = uap->len; + oargs.prot = uap->prot; + oargs.flags = uap->flags; + oargs.fd = uap->fd; + oargs.pad = 0; + oargs.pos = uap->pos; + return (mmap(td, &oargs)); +} + #ifdef COMPAT_43 #ifndef _SYS_SYSPROTO_H_ struct ommap_args { Index: usr.bin/kdump/kdump.c =========================================================================== --- usr.bin/kdump/kdump.c 2007/07/01 05:44:30 #17 +++ usr.bin/kdump/kdump.c 2007/07/01 05:44:30 @@ -308,10 +308,14 @@ int narg = ktr->ktr_narg; register_t *ip; - if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0) + if (ktr->ktr_code >= nsyscalls || ktr->ktr_code < 0) { (void)printf("[%d]", ktr->ktr_code); - else - (void)printf("%s", syscallnames[ktr->ktr_code]); + } else { + if (strncmp(syscallnames[ktr->ktr_code], "_new_", 5) == 0) + (void)printf("%s", syscallnames[ktr->ktr_code] + 5); + else + (void)printf("%s", syscallnames[ktr->ktr_code]); + } ip = &ktr->ktr_args[0]; if (narg) { char c = '('; @@ -464,6 +468,17 @@ mmapflagsname ((int)*ip); ip++; narg--; + } else if (ktr->ktr_code == SYS__new_mmap) { + print_number(ip,narg,c); + print_number(ip,narg,c); + (void)putchar(','); + mmapprotname ((int)*ip); + (void)putchar(','); + ip++; + narg--; + mmapflagsname ((int)*ip); + ip++; + narg--; } else if (ktr->ktr_code == SYS_mprotect) { print_number(ip,narg,c); print_number(ip,narg,c); @@ -534,6 +549,15 @@ whencename ((int)*ip); ip++; narg--; + } else if (ktr->ktr_code == SYS__new_lseek) { + print_number(ip,narg,c); + /* Hidden 'pad' argument, not in lseek(2) */ + print_number(ip,narg,c); + (void)putchar(','); + whencename ((int)*ip); + ip++; + narg--; + } else if (ktr->ktr_code == SYS_flock) { print_number(ip,narg,c); (void)putchar(','); @@ -747,10 +771,14 @@ int error = ktr->ktr_error; int code = ktr->ktr_code; - if (code >= nsyscalls || code < 0) + if (code >= nsyscalls || code < 0) { (void)printf("[%d] ", code); - else - (void)printf("%s ", syscallnames[code]); + } else { + if (strncmp(syscallnames[code], "_new_", 5) == 0) + (void)printf("%s ", syscallnames[code] + 5); + else + (void)printf("%s ", syscallnames[code]); + } if (error == 0) { if (fancy) {