X-Git-Url: https://git.saurik.com/apple/xnu.git/blobdiff_plain/1c79356b52d46aa6b508fb032f5ae709b1f2897b..5eebf7385fedb1517b66b53c28e5aa6bb0a2be50:/bsd/kern/kern_subr.c diff --git a/bsd/kern/kern_subr.c b/bsd/kern/kern_subr.c index 7cd4f6770..cc5b4382e 100644 --- a/bsd/kern/kern_subr.c +++ b/bsd/kern/kern_subr.c @@ -65,6 +65,7 @@ #include #include #include +#include #include @@ -78,6 +79,12 @@ uiomove(cp, n, uio) register caddr_t cp; register int n; register struct uio *uio; +{ + return uiomove64((addr64_t)((unsigned int)cp), n, uio); +} + +int +uiomove64(addr64_t cp, int n, struct uio *uio) { register struct iovec *iov; u_int cnt; @@ -107,22 +114,22 @@ uiomove(cp, n, uio) if (uio->uio_rw == UIO_READ) { KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_START, - cp, iov->iov_base, cnt, 0,0); + (int)cp, (int)iov->iov_base, cnt, 0,0); - error = copyout(cp, iov->iov_base, cnt); + error = copyout( CAST_DOWN(caddr_t, cp), iov->iov_base, cnt ); KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_END, - cp, iov->iov_base, cnt, 0,0); + (int)cp, (int)iov->iov_base, cnt, 0,0); } else { KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_START, - iov->iov_base, cp, cnt, 0,0); + (int)iov->iov_base, (int)cp, cnt, 0,0); - error = copyin(iov->iov_base, cp, cnt); + error = copyin(iov->iov_base, CAST_DOWN(caddr_t, cp), cnt); KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_END, - iov->iov_base, cp, cnt, 0,0); + (int)iov->iov_base, (int)cp, cnt, 0,0); } if (error) return (error); @@ -130,39 +137,66 @@ uiomove(cp, n, uio) case UIO_SYSSPACE: if (uio->uio_rw == UIO_READ) - error = copywithin((caddr_t)cp, iov->iov_base, + error = copywithin(CAST_DOWN(caddr_t, cp), iov->iov_base, cnt); else - error = copywithin(iov->iov_base, (caddr_t)cp, + error = copywithin(iov->iov_base, CAST_DOWN(caddr_t, cp), cnt); break; -#ifdef ppc + case UIO_PHYS_USERSPACE: if (uio->uio_rw == UIO_READ) { KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_START, - cp, iov->iov_base, cnt, 1,0); + (int)cp, (int)iov->iov_base, cnt, 1,0); + + if (error = copypv((addr64_t)cp, (addr64_t)((unsigned int)iov->iov_base), cnt, cppvPsrc | cppvNoRefSrc)) /* Copy physical to virtual */ + error = EFAULT; - error = copyp2v(cp, iov->iov_base, cnt); + KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_END, + (int)cp, (int)iov->iov_base, cnt, 1,0); + } + else + { + KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_START, + (int)iov->iov_base, (int)cp, cnt, 1,0); + if (error = copypv((addr64_t)((unsigned int)iov->iov_base), (addr64_t)cp, cnt, cppvPsnk | cppvNoRefSrc | cppvNoModSnk)) /* Copy virtual to physical */ + error = EFAULT; + + KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_END, + (int)iov->iov_base, (int)cp, cnt, 1,0); + } + if (error) + return (error); + break; + + case UIO_PHYS_SYSSPACE: + if (uio->uio_rw == UIO_READ) + { + KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_START, + (int)cp, (int)iov->iov_base, cnt, 2,0); + + if (error = copypv((addr64_t)cp, (addr64_t)((unsigned int)iov->iov_base), cnt, cppvKmap | cppvPsrc | cppvNoRefSrc)) /* Copy physical to virtual */ + error = EFAULT; KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYOUT)) | DBG_FUNC_END, - cp, iov->iov_base, cnt, 1,0); + (int)cp, (int)iov->iov_base, cnt, 2,0); } else { KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_START, - iov->iov_base, cp, cnt, 1,0); + (int)iov->iov_base, (int)cp, cnt, 2,0); - panic("copyv2p not implemented yet\n"); + if (error = copypv((addr64_t)((unsigned int)iov->iov_base), (addr64_t)cp, cnt, cppvKmap | cppvPsnk | cppvNoRefSrc | cppvNoModSnk)) /* Copy virtual to physical */ + error = EFAULT; KERNEL_DEBUG((FSDBG_CODE(DBG_FSRW, DBG_UIO_COPYIN)) | DBG_FUNC_END, - iov->iov_base, cp, cnt, 1,0); + (int)iov->iov_base, (int)cp, cnt, 2,0); } if (error) return (error); break; -#endif } iov->iov_base += cnt; iov->iov_len -= cnt;