--- freebsd/sys/sys/conf.h | 4 ++-- freebsd/sys/sys/file.h | 20 +++++++++++++++++ rtemsbsd/sys/fs/devfs/devfs_devs.c | 46 ++++++++++++++++++++++++++++++++++++++ 3 files changed, 68 insertions(+), 2 deletions(-)
diff --git a/freebsd/sys/sys/conf.h b/freebsd/sys/sys/conf.h index d5ced5c..6ae0f52 100644 --- a/freebsd/sys/sys/conf.h +++ b/freebsd/sys/sys/conf.h @@ -202,8 +202,8 @@ struct cdevsw { d_write_t *d_write; d_ioctl_t *d_ioctl; d_poll_t *d_poll; -#ifndef __rtems__ d_mmap_t *d_mmap; +#ifndef __rtems__ d_strategy_t *d_strategy; dumper_t *d_dump; #endif /* __rtems__ */ diff --git a/freebsd/sys/sys/file.h b/freebsd/sys/sys/file.h index c52dc7a..673a102 100644 --- a/freebsd/sys/sys/file.h +++ b/freebsd/sys/sys/file.h @@ -555,6 +555,7 @@ fo_fill_kinfo(struct file *fp, struct kinfo_file *kif, struct filedesc *fdp) return ((*fp->f_ops->fo_fill_kinfo)(fp, kif, fdp)); } +#endif /* __rtems__ */ static __inline int fo_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size, @@ -562,12 +563,31 @@ fo_mmap(struct file *fp, vm_map_t map, vm_offset_t *addr, vm_size_t size, struct thread *td) { +#ifndef __rtems__ if (fp->f_ops->fo_mmap == NULL) return (ENODEV); return ((*fp->f_ops->fo_mmap)(fp, map, addr, size, prot, cap_maxprot, flags, foff, td)); +#else /* __rtems__ */ + int rv; + + (void) map; + (void) cap_maxprot; + (void) flags; + (void) td; + + errno = 0; + rv = ((*fp->f_io.pathinfo.handlers->mmap_h)(&fp->f_io, (void**)&addr, + (size_t)size, (int)prot, (off_t)foff)); + if (rv == 0) { + return (0); + } else { + return (errno); + } +#endif /* __rtems__ */ } +#ifndef __rtems__ static __inline int fo_aio_queue(struct file *fp, struct kaiocb *job) { diff --git a/rtemsbsd/sys/fs/devfs/devfs_devs.c b/rtemsbsd/sys/fs/devfs/devfs_devs.c index 7d89c49..4e6dfe0 100644 --- a/rtemsbsd/sys/fs/devfs/devfs_devs.c +++ b/rtemsbsd/sys/fs/devfs/devfs_devs.c @@ -386,6 +386,51 @@ devfs_imfs_kqfilter(rtems_libio_t *iop, struct knote *kn) return error; } +static int +devfs_imfs_mmap(rtems_libio_t *iop, void **addr, size_t len, int prot, off_t off) +{ + struct cdev *cdev = devfs_imfs_get_context_by_iop(iop); + struct file *fp = rtems_bsd_iop_to_fp(iop); + struct thread *td = rtems_bsd_get_curthread_or_null(); + struct file *fpop; + struct cdevsw *dsw; + int error, ref; + vm_object_t object; + vm_paddr_t paddr; + + if (td != 0) { + if (cdev == NULL) { + error = ENXIO; + goto err; + } + if (cdev->si_flags & SI_ALIAS) { + cdev = cdev->si_parent; + } + dsw = dev_refthread(cdev, &ref); + if (dsw == NULL) { + error = ENXIO; + goto err; + } + fpop = td->td_fpop; + curthread->td_fpop = fp; + error = dsw->d_mmap(cdev, (vm_ooffset_t)off, &paddr, prot, &object); + *addr = paddr; + td->td_fpop = fpop; + dev_relthread(cdev, ref); + } else { + error = ENOMEM; + } + +err: + return rtems_bsd_error_to_status_and_errno(error); +} + +typedef int d_mmap_t(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, + int nprot, vm_memattr_t *memattr); +typedef int d_mmap_single_t(struct cdev *cdev, vm_ooffset_t *offset, + vm_size_t size, struct vm_object **object, int nprot); + + static const rtems_filesystem_file_handlers_r devfs_imfs_handlers = { .open_h = devfs_imfs_open, .close_h = devfs_imfs_close, @@ -400,6 +445,7 @@ static const rtems_filesystem_file_handlers_r devfs_imfs_handlers = { .fcntl_h = rtems_filesystem_default_fcntl, .poll_h = devfs_imfs_poll, .kqfilter_h = devfs_imfs_kqfilter, + .mmap_h = devfs_imfs_mmap, .readv_h = devfs_imfs_readv, .writev_h = devfs_imfs_writev, }; -- 1.9.1 _______________________________________________ devel mailing list devel@rtems.org http://lists.rtems.org/mailman/listinfo/devel