Remove FreeBSD file descriptors due to performance and code complexity reasons.

Update #4475.
---
 freebsd/sys/kern/kern_descrip.c               |  58 +--
 freebsd/sys/kern/kern_event.c                 | 121 ++---
 freebsd/sys/kern/sys_generic.c                | 136 ++++--
 freebsd/sys/kern/uipc_socket.c                |  24 +
 freebsd/sys/kern/uipc_syscalls.c              |  16 +
 freebsd/sys/kern/vfs_cache.c                  |   2 +
 freebsd/sys/kern/vfs_lookup.c                 |   4 +
 freebsd/sys/kern/vfs_mount.c                  |   2 +
 freebsd/sys/kern/vfs_subr.c                   |   4 +
 freebsd/sys/kern/vfs_syscalls.c               |  18 +
 freebsd/sys/opencrypto/cryptodev.c            |  11 +-
 freebsd/sys/sys/file.h                        |  98 +++-
 freebsd/sys/sys/filedesc.h                    |  89 +++-
 freebsd/sys/sys/namei.h                       |   2 +
 freebsd/sys/sys/proc.h                        |   2 +-
 freebsd/sys/sys/socketvar.h                   |  15 +-
 freebsd/sys/sys/syscallsubr.h                 |   5 +
 libbsd.py                                     |   1 +
 .../machine/rtems-bsd-kernel-namespace.h      |  18 -
 .../include/machine/rtems-bsd-kernel-space.h  |   5 -
 rtemsbsd/include/machine/rtems-bsd-libio.h    | 196 +-------
 rtemsbsd/rtems/rtems-bsd-libio.c              |  61 ---
 rtemsbsd/rtems/rtems-bsd-syscall-api.c        | 462 ++++++++----------
 rtemsbsd/rtems/rtems-kernel-fget.c            |  79 +++
 rtemsbsd/rtems/rtems-kernel-init.c            |   7 +-
 25 files changed, 713 insertions(+), 723 deletions(-)
 create mode 100644 rtemsbsd/rtems/rtems-kernel-fget.c

diff --git a/freebsd/sys/kern/kern_descrip.c b/freebsd/sys/kern/kern_descrip.c
index ddc50633..e32201c9 100644
--- a/freebsd/sys/kern/kern_descrip.c
+++ b/freebsd/sys/kern/kern_descrip.c
@@ -76,7 +76,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/syscallsubr.h>
 #include <sys/sysctl.h>
 #include <sys/sysproto.h>
-#include <rtems/bsd/sys/unistd.h>
+#include <sys/unistd.h>
 #include <sys/user.h>
 #include <sys/vnode.h>
 #ifdef KTRACE
@@ -92,6 +92,7 @@ __FBSDID("$FreeBSD$");
 
 #include <ddb/ddb.h>
 
+#ifndef __rtems__
 static MALLOC_DEFINE(M_FILEDESC, "filedesc", "Open file descriptor table");
 static MALLOC_DEFINE(M_FILEDESC_TO_LEADER, "filedesc_to_leader",
     "file desc to leader structures");
@@ -362,7 +363,6 @@ sys_getdtablesize(struct thread *td, struct 
getdtablesize_args *uap)
        return (0);
 }
 
-#ifndef __rtems__
 /*
  * Duplicate a file descriptor to a particular value.
  *
@@ -526,7 +526,6 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
                tmp = arg;
                error = kern_dup(td, FDDUP_FIXED, FDDUP_FLAG_CLOEXEC, fd, tmp);
                break;
-#endif /* __rtems__ */
 
        case F_GETFD:
                error = EBADF;
@@ -551,6 +550,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
                }
                FILEDESC_XUNLOCK(fdp);
                break;
+#endif /* __rtems__ */
 
        case F_GETFL:
                error = fget_fcntl(td, fd, &cap_fcntl_rights, F_GETFL, &fp);
@@ -813,6 +813,7 @@ kern_fcntl(struct thread *td, int fd, int cmd, intptr_t arg)
        return (error);
 }
 
+#ifndef __rtems__
 static int
 getmaxfd(struct thread *td)
 {
@@ -820,7 +821,6 @@ getmaxfd(struct thread *td)
        return (min((int)lim_cur(td, RLIMIT_NOFILE), maxfilesperproc));
 }
 
-#ifndef __rtems__
 /*
  * Common code for dup, dup2, fcntl(F_DUPFD) and fcntl(F_DUP2FD).
  */
@@ -1182,7 +1182,6 @@ fgetown(struct sigio **sigiop)
        SIGIO_UNLOCK();
        return (pgid);
 }
-#endif /* __rtems__ */
 
 /*
  * Function drops the filedesc lock on return.
@@ -1273,7 +1272,6 @@ kern_close(struct thread *td, int fd)
        return (closefp(fdp, fd, fp, td, 1));
 }
 
-#ifndef __rtems__
 /*
  * Close open file descriptors.
  */
@@ -1309,7 +1307,6 @@ sys_closefrom(struct thread *td, struct closefrom_args 
*uap)
        FILEDESC_SUNLOCK(fdp);
        return (0);
 }
-#endif /* __rtems__ */
 
 #if defined(COMPAT_43)
 /*
@@ -1436,7 +1433,6 @@ freebsd11_nfstat(struct thread *td, struct 
freebsd11_nfstat_args *uap)
 }
 #endif /* COMPAT_FREEBSD11 */
 
-#ifndef __rtems__
 /*
  * Return pathconf information about a file descriptor.
  */
@@ -1493,7 +1489,6 @@ out:
        fdrop(fp, td);
        return (error);
 }
-#endif /* __rtems__ */
 
 /*
  * Initialize filecaps structure.
@@ -1628,7 +1623,6 @@ static void
 filecaps_validate(const struct filecaps *fcaps, const char *func)
 {
 
-#ifndef __rtems__
        KASSERT(cap_rights_is_valid(&fcaps->fc_rights),
            ("%s: invalid rights", func));
        KASSERT((fcaps->fc_fcntls & ~CAP_FCNTL_ALL) == 0,
@@ -1642,7 +1636,6 @@ filecaps_validate(const struct filecaps *fcaps, const 
char *func)
        KASSERT(fcaps->fc_nioctls == 0 ||
            cap_rights_is_set(&fcaps->fc_rights, CAP_IOCTL),
            ("%s: ioctls without CAP_IOCTL", func));
-#endif /* __rtems__ */
 }
 
 static void
@@ -1891,12 +1884,10 @@ falloc_noinstall(struct thread *td, struct file 
**resultfp)
            priv_check(td, PRIV_MAXFILES) != 0) ||
            openfiles_new >= maxfiles) {
                atomic_subtract_int(&openfiles, 1);
-#ifndef __rtems__
                if (ppsratecheck(&lastfail, &curfail, 1)) {
                        printf("kern.maxfiles limit exceeded by uid %i, (%s) "
                            "please see tuning(7).\n", td->td_ucred->cr_ruid, 
td->td_proc->p_comm);
                }
-#endif /* __rtems__ */
                return (ENFILE);
        }
        fp = uma_zalloc(file_zone, M_WAITOK);
@@ -2050,7 +2041,6 @@ fdshare(struct filedesc *fdp)
        return (fdp);
 }
 
-#ifndef __rtems__
 /*
  * Unshare a filedesc structure, if necessary by making a copy
  */
@@ -2404,7 +2394,6 @@ fdsetugidsafety(struct thread *td)
                }
        }
 }
-#endif /* __rtems__ */
 
 /*
  * If a specific file object occupies a specific file descriptor, close the
@@ -2427,7 +2416,6 @@ fdclose(struct thread *td, struct file *fp, int idx)
                FILEDESC_XUNLOCK(fdp);
 }
 
-#ifndef __rtems__
 /*
  * Close any files on exec?
  */
@@ -2453,7 +2441,6 @@ fdcloseexec(struct thread *td)
                }
        }
 }
-#endif /* __rtems__ */
 
 /*
  * It is unsafe for set[ug]id processes to be started with file
@@ -2522,7 +2509,6 @@ closef(struct file *fp, struct thread *td)
         */
        if (fp->f_type == DTYPE_VNODE && td != NULL) {
                vp = fp->f_vnode;
-#ifndef __rtems__
                if ((td->td_proc->p_leader->p_flag & P_ADVLOCK) != 0) {
                        lf.l_whence = SEEK_SET;
                        lf.l_start = 0;
@@ -2531,7 +2517,6 @@ closef(struct file *fp, struct thread *td)
                        (void) VOP_ADVLOCK(vp, (caddr_t)td->td_proc->p_leader,
                            F_UNLCK, &lf, F_POSIX);
                }
-#endif /* __rtems__ */
                fdtol = td->td_proc->p_fdtol;
                if (fdtol != NULL) {
                        /*
@@ -2543,10 +2528,8 @@ closef(struct file *fp, struct thread *td)
                        for (fdtol = fdtol->fdl_next;
                            fdtol != td->td_proc->p_fdtol;
                            fdtol = fdtol->fdl_next) {
-#ifndef __rtems__
                                if ((fdtol->fdl_leader->p_flag &
                                    P_ADVLOCK) == 0)
-#endif /* __rtems__ */
                                        continue;
                                fdtol->fdl_holdcount++;
                                FILEDESC_XUNLOCK(fdp);
@@ -2746,18 +2729,6 @@ fget_unlocked(struct filedesc *fdp, int fd, cap_rights_t 
*needrightsp,
                *seqp = seq;
 #endif
        }
-#ifdef __rtems__
-       if (fp->f_io != NULL) {
-               rtems_libio_iop_hold(fp->f_io);
-               if (RTEMS_BSD_DESCRIP_TRACE)
-                       printf("bsd:  fb: fget_unlocked: iop=%p %d (%d)  fp=%p 
(%d) by %p\n",
-                              fp->f_io, fp->f_io->data0, fp->f_io->flags >> 12,
-                              fp, fp->f_count, __builtin_return_address(0));
-       } else if (RTEMS_BSD_DESCRIP_TRACE) {
-               printf("bsd:  fb: fget_unlocked: iop=NULL -1 (0) fp=%p (%d) by 
%p\n",
-                      fp, fp->f_count, __builtin_return_address(0));
-       }
-#endif /* __rtems__ */
        return (0);
 }
 
@@ -2802,13 +2773,11 @@ _fget(struct thread *td, int fd, struct file **fpp, int 
flags,
                if ((fp->f_flag & flags) == 0)
                        error = EBADF;
                break;
-#ifndef __rtems__
        case FEXEC:
                if ((fp->f_flag & (FREAD | FEXEC)) == 0 ||
                    ((fp->f_flag & FWRITE) != 0))
                        error = EBADF;
                break;
-#endif /* __rtems__ */
        case 0:
                break;
        default:
@@ -2831,7 +2800,6 @@ fget(struct thread *td, int fd, cap_rights_t *rightsp, 
struct file **fpp)
        return (_fget(td, fd, fpp, 0, rightsp, NULL));
 }
 
-#ifndef __rtems__
 int
 fget_mmap(struct thread *td, int fd, cap_rights_t *rightsp, u_char *maxprotp,
     struct file **fpp)
@@ -2866,7 +2834,6 @@ fget_mmap(struct thread *td, int fd, cap_rights_t 
*rightsp, u_char *maxprotp,
 #endif
        return (error);
 }
-#endif /* __rtems__ */
 
 int
 fget_read(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
@@ -2986,14 +2953,12 @@ fgetvp_read(struct thread *td, int fd, cap_rights_t 
*rightsp, struct vnode **vpp
        return (_fgetvp(td, fd, FREAD, rightsp, vpp));
 }
 
-#ifndef __rtems__
 int
 fgetvp_exec(struct thread *td, int fd, cap_rights_t *rightsp, struct vnode 
**vpp)
 {
 
        return (_fgetvp(td, fd, FEXEC, rightsp, vpp));
 }
-#endif /* __rtems__ */
 
 #ifdef notyet
 int
@@ -3021,15 +2986,12 @@ _fdrop(struct file *fp, struct thread *td)
        error = fo_close(fp, td);
        atomic_subtract_int(&openfiles, 1);
        crfree(fp->f_cred);
-#ifndef __rtems__
        free(fp->f_advice, M_FADVISE);
-#endif /* __rtems__ */
        uma_zfree(file_zone, fp);
 
        return (error);
 }
 
-#ifndef __rtems__
 /*
  * Apply an advisory lock on a file descriptor.
  *
@@ -3248,7 +3210,6 @@ pwd_chroot(struct thread *td, struct vnode *vp)
        vrele(oldvp);
        return (0);
 }
-#endif /* __rtems__ */
 
 void
 pwd_chdir(struct thread *td, struct vnode *vp)
@@ -3273,7 +3234,6 @@ pwd_chdir(struct thread *td, struct vnode *vp)
 void
 mountcheckdirs(struct vnode *olddp, struct vnode *newdp)
 {
-#ifndef __rtems__
        struct filedesc *fdp;
        struct prison *pr;
        struct proc *p;
@@ -3334,7 +3294,6 @@ mountcheckdirs(struct vnode *olddp, struct vnode *newdp)
        sx_sunlock(&allprison_lock);
        while (nrele--)
                vrele(olddp);
-#endif /* __rtems__ */
 }
 
 struct filedesc_to_leader *
@@ -3362,7 +3321,6 @@ filedesc_to_leader_alloc(struct filedesc_to_leader *old, 
struct filedesc *fdp, s
        return (fdtol);
 }
 
-#ifndef __rtems__
 static int
 sysctl_kern_proc_nfds(SYSCTL_HANDLER_ARGS)
 {
@@ -3861,7 +3819,6 @@ static SYSCTL_NODE(_kern_proc, KERN_PROC_OFILEDESC, 
ofiledesc,
     CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc_ofiledesc,
     "Process ofiledesc entries");
 #endif /* COMPAT_FREEBSD7 */
-#endif /* __rtems__ */
 
 int
 vntype_to_kinfo(int vtype)
@@ -3892,7 +3849,6 @@ vntype_to_kinfo(int vtype)
        return (KF_VTYPE_UNKNOWN);
 }
 
-#ifndef __rtems__
 static SYSCTL_NODE(_kern_proc, KERN_PROC_FILEDESC, filedesc,
     CTLFLAG_RD|CTLFLAG_MPSAFE, sysctl_kern_proc_filedesc,
     "Process filedesc entries");
@@ -3964,7 +3920,6 @@ sysctl_kern_proc_cwd(SYSCTL_HANDLER_ARGS)
 
 static SYSCTL_NODE(_kern_proc, KERN_PROC_CWD, cwd, CTLFLAG_RD|CTLFLAG_MPSAFE,
     sysctl_kern_proc_cwd, "Process current working directory");
-#endif /* __rtems__ */
 
 #ifdef DDB
 /*
@@ -4113,13 +4068,10 @@ filelistinit(void *dummy)
            NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0);
        mtx_init(&sigio_lock, "sigio lock", NULL, MTX_DEF);
 }
-#ifndef __rtems__
 SYSINIT(select, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL);
-#else /* __rtems__ */
-SYSINIT(select_sub_lock, SI_SUB_LOCK, SI_ORDER_FIRST, filelistinit, NULL);
-#endif /* __rtems__ */
 
 /*-------------------------------------------------------------------*/
+#endif /* __rtems__ */
 
 static int
 badfo_readwrite(struct file *fp, struct uio *uio, struct ucred *active_cred,
diff --git a/freebsd/sys/kern/kern_event.c b/freebsd/sys/kern/kern_event.c
index 1c79ace8..f5682b03 100644
--- a/freebsd/sys/kern/kern_event.c
+++ b/freebsd/sys/kern/kern_event.c
@@ -396,12 +396,7 @@ filt_fileattach(struct knote *kn)
 #ifndef __rtems__
        return (fo_kqfilter(kn->kn_fp, kn));
 #else /* __rtems__ */
-       if ((kn->kn_status & KN_FP_IS_IOP) == 0) {
-               return (fo_kqfilter(kn->kn_fp, kn));
-       } else {
-               rtems_libio_t* iop = (rtems_libio_t*) kn->kn_fp;
-               return ((*iop->pathinfo.handlers->kqfilter_h)(iop, kn));
-       }
+       return ((*kn->kn_fp->pathinfo.handlers->kqfilter_h)(kn->kn_fp, kn));
 #endif /* __rtems__ */
 }
 
@@ -412,7 +407,7 @@ kqueue_kqfilter(struct file *fp, struct knote *kn)
 #ifndef __rtems__
        struct kqueue *kq = kn->kn_fp->f_data;
 #else /* __rtems__ */
-       struct kqueue *kq = rtems_bsd_libio_knote_to_kq(kn);
+       struct kqueue *kq = rtems_bsd_knote_to_file(kn);
 #endif /* __rtems__ */
 
        if (kn->kn_filter != EVFILT_READ)
@@ -431,7 +426,7 @@ filt_kqdetach(struct knote *kn)
 #ifndef __rtems__
        struct kqueue *kq = kn->kn_fp->f_data;
 #else /* __rtems__ */
-       struct kqueue *kq = rtems_bsd_libio_knote_to_kq(kn);
+       struct kqueue *kq = rtems_bsd_knote_to_file(kn);
 #endif /* __rtems__ */
 
        knlist_remove(&kq->kq_sel.si_note, kn, 0);
@@ -444,7 +439,7 @@ filt_kqueue(struct knote *kn, long hint)
 #ifndef __rtems__
        struct kqueue *kq = kn->kn_fp->f_data;
 #else /* __rtems__ */
-       struct kqueue *kq = rtems_bsd_libio_knote_to_kq(kn);
+       struct kqueue *kq = rtems_bsd_knote_to_file(kn);
 #endif /* __rtems__ */
 
        kn->kn_data = kq->kq_count;
@@ -1041,11 +1036,17 @@ kern_kqueue(struct thread *td, int flags, struct 
filecaps *fcaps)
        kq->kq_cred = crhold(cred);
 
        FILEDESC_XLOCK(fdp);
+#ifndef __rtems__
        TAILQ_INSERT_HEAD(&fdp->fd_kqlist, kq, kq_list);
+#else /* __rtems__ */
+       TAILQ_INSERT_HEAD(&fd_kqlist, kq, kq_list);
+#endif /* __rtems__ */
        FILEDESC_XUNLOCK(fdp);
 
        finit(fp, FREAD | FWRITE, DTYPE_KQUEUE, kq, &kqueueops);
+#ifndef __rtems__
        fdrop(fp, td);
+#endif /* __rtems__ */
 
        td->td_retval[0] = fd;
        return (0);
@@ -1425,9 +1426,11 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, 
struct thread *td,
     int mflag)
 {
        struct filterops *fops;
+#ifndef __rtems__
        struct file *fp;
-#ifdef __rtems__
-       rtems_libio_t* iop = NULL;
+#else /* __rtems__ */
+       rtems_libio_t *fp;
+       struct file *bsd_fp;
 #endif /* __rtems__ */
        struct knote *kn, *tkn;
        struct knlist *knl;
@@ -1463,22 +1466,26 @@ kqueue_register(struct kqueue *kq, struct kevent *kev, 
struct thread *td,
 findkn:
        if (fops->f_isfd) {
                KASSERT(td != NULL, ("td is NULL"));
+#ifndef __rtems__
                if (kev->ident > INT_MAX)
                        error = EBADF;
                else
-#ifndef __rtems__
                        error = fget(td, kev->ident, &cap_event_rights, &fp);
 #else /* __rtems__ */
-               {
-                       int ffd = rtems_bsd_libio_iop_hold(kev->ident, &iop);
-                       if (ffd < 0)
+               if ((uint32_t)kev->ident < rtems_libio_number_iops) {
+                       unsigned int flags;
+
+                       fp = rtems_libio_iop((int)kev->ident);
+                       flags = rtems_libio_iop_hold(fp);
+
+                       if ((flags & LIBIO_FLAGS_OPEN) != 0) {
+                               error = 0;
+                       } else {
+                               rtems_libio_iop_drop(fp);
                                error = EBADF;
-                       else {
-                               if (iop == NULL)
-                                       error = fget(td, ffd, 
&cap_event_rights, &fp);
-                               else
-                                       fp = NULL;
                        }
+               } else {
+                       error = EBADF;
                }
 #endif /* __rtems__ */
                if (error)
@@ -1486,19 +1493,13 @@ findkn:
 
                if ((kev->flags & EV_ADD) == EV_ADD && kqueue_expand(kq, fops,
                    kev->ident, M_NOWAIT) != 0) {
-#ifndef __rtems__
                        /* try again */
+#ifndef __rtems__
                        fdrop(fp, td);
-                       fp = NULL;
 #else /* __rtems__ */
-                       if (fp != NULL) {
-                               fdrop(fp, td);
-                               fp = NULL;
-                       } else if (iop != NULL) {
-                               rtems_libio_iop_drop(iop);
-                               iop = NULL;
-                       }
+                       rtems_libio_iop_drop(fp);
 #endif /* __rtems__ */
+                       fp = NULL;
                        error = kqueue_expand(kq, fops, kev->ident, mflag);
                        if (error)
                                goto done;
@@ -1508,7 +1509,8 @@ findkn:
 #ifndef __rtems__
                if (fp->f_type == DTYPE_KQUEUE) {
 #else /* __rtems__ */
-               if (fp != NULL && fp->f_type == DTYPE_KQUEUE) {
+               bsd_fp = rtems_bsd_iop_to_file(fp);
+               if (bsd_fp != NULL && bsd_fp->f_type == DTYPE_KQUEUE) {
 #endif /* __rtems__ */
                        /*
                         * If we add some intelligence about what we are doing,
@@ -1517,7 +1519,11 @@ findkn:
                         * getting both the knlist lock and the kq lock since
                         * they are the same thing.
                         */
+#ifndef __rtems__
                        if (fp->f_data == kq) {
+#else /* __rtems__ */
+                       if (bsd_fp->f_data == kq) {
+#endif /* __rtems__ */
                                error = EINVAL;
                                goto done;
                        }
@@ -1579,15 +1585,13 @@ findkn:
                kq->kq_state |= KQ_FLUXWAIT;
                msleep(kq, &kq->kq_lock, PSOCK | PDROP, "kqflxwt", 0);
                if (fp != NULL) {
+#ifndef __rtems__
                        fdrop(fp, td);
+#else /* __rtems__ */
+                       rtems_libio_iop_drop(fp);
+#endif /* __rtems__ */
                        fp = NULL;
                }
-#ifdef __rtems__
-               if (iop != NULL) {
-                       rtems_libio_iop_drop(iop);
-                       iop = NULL;
-               }
-#endif /* __rtems__ */
                goto findkn;
        }
 
@@ -1603,17 +1607,7 @@ findkn:
                                error = ENOMEM;
                                goto done;
                        }
-#ifndef __rtems__
                        kn->kn_fp = fp;
-#else /* __rtems__ */
-                       if (fp != NULL) {
-                               kn->kn_fp = fp;
-                               kn->kn_status = 0;
-                       } else if (iop != NULL) {
-                               rtems_bsd_libio_iop_to_knote(kn, iop);
-                               kn->kn_status = KN_FP_IS_IOP;
-                       }
-#endif /* __rtems__ */
                        kn->kn_kq = kq;
                        kn->kn_fop = fops;
                        /*
@@ -1622,9 +1616,6 @@ findkn:
                         */
                        fops = NULL;
                        fp = NULL;
-#ifdef __rtems__
-                       iop = NULL;
-#endif /* __rtems__ */
 
                        kn->kn_sfflags = kev->fflags;
                        kn->kn_sdata = kev->data;
@@ -1633,11 +1624,7 @@ findkn:
                        kn->kn_kevent = *kev;
                        kn->kn_kevent.flags &= ~(EV_ADD | EV_DELETE |
                            EV_ENABLE | EV_DISABLE | EV_FORCEONESHOT);
-#ifndef __rtems__
                        kn->kn_status = KN_DETACHED;
-#else /* __rtems__ */
-                       kn->kn_status |= KN_DETACHED;
-#endif /* __rtems__ */
                        if ((kev->flags & EV_DISABLE) != 0)
                                kn->kn_status |= KN_DISABLED;
                        kn_enter_flux(kn);
@@ -1729,10 +1716,10 @@ done:
        if (filedesc_unlock)
                FILEDESC_XUNLOCK(td->td_proc->p_fd);
        if (fp != NULL)
+#ifndef __rtems__
                fdrop(fp, td);
-#ifdef __rtems__
-       if (iop != NULL)
-               rtems_libio_iop_drop(iop);
+#else /* __rtems__ */
+               rtems_libio_iop_drop(fp);
 #endif /* __rtems__ */
        knote_free(tkn);
        if (fops != NULL)
@@ -2269,7 +2256,9 @@ static int
 kqueue_close(struct file *fp, struct thread *td)
 {
        struct kqueue *kq = fp->f_data;
+#ifndef __rtems__
        struct filedesc *fdp;
+#endif /* __rtems__ */
        int error;
        int filedesc_unlock;
 
@@ -2277,6 +2266,7 @@ kqueue_close(struct file *fp, struct thread *td)
                return error;
        kqueue_drain(kq, td);
 
+#ifndef __rtems__
        /*
         * We could be called due to the knote_drop() doing fdrop(),
         * called from kqueue_register().  In this case the global
@@ -2293,6 +2283,12 @@ kqueue_close(struct file *fp, struct thread *td)
        TAILQ_REMOVE(&fdp->fd_kqlist, kq, kq_list);
        if (filedesc_unlock)
                FILEDESC_XUNLOCK(fdp);
+#else /* __rtems__ */
+       (void)filedesc_unlock;
+       rtems_libio_lock();
+       TAILQ_REMOVE(&fd_kqlist, kq, kq_list);
+       rtems_libio_unlock();
+#endif /* __rtems__ */
 
        kqueue_destroy(kq);
        chgkqcnt(kq->kq_cred->cr_ruidinfo, -1, 0);
@@ -2674,18 +2670,26 @@ again:          /* need to reacquire lock since we have 
dropped it */
 void
 knote_fdclose(struct thread *td, int fd)
 {
+#ifndef __rtems__
        struct filedesc *fdp = td->td_proc->p_fd;
+#endif /* __rtems__ */
        struct kqueue *kq;
        struct knote *kn;
        int influx;
 
+#ifndef __rtems__
        FILEDESC_XLOCK_ASSERT(fdp);
+#endif /* __rtems__ */
 
        /*
         * We shouldn't have to worry about new kevents appearing on fd
         * since filedesc is locked.
         */
+#ifndef __rtems__
        TAILQ_FOREACH(kq, &fdp->fd_kqlist, kq_list) {
+#else /* __rtems__ */
+       TAILQ_FOREACH(kq, &fd_kqlist, kq_list) {
+#endif /* __rtems__ */
                KQ_LOCK(kq);
 
 again:
@@ -2773,10 +2777,7 @@ knote_drop_detached(struct knote *kn, struct thread *td)
 #ifndef __rtems__
                fdrop(kn->kn_fp, td);
 #else /* __rtems__ */
-               if ((kn->kn_status & KN_FP_IS_IOP) == 0)
-               fdrop(kn->kn_fp, td);
-               else
-                       rtems_libio_iop_drop((rtems_libio_t*) kn->kn_fp);
+               rtems_libio_iop_drop(kn->kn_fp);
 #endif /* __rtems__ */
                kn->kn_fp = NULL;
        }
diff --git a/freebsd/sys/kern/sys_generic.c b/freebsd/sys/kern/sys_generic.c
index 827380ce..1e5351a7 100644
--- a/freebsd/sys/kern/sys_generic.c
+++ b/freebsd/sys/kern/sys_generic.c
@@ -805,12 +805,14 @@ kern_ioctl(struct thread *td, int fd, u_long com, caddr_t 
data)
        }
 
        switch (com) {
+#ifndef __rtems__
        case FIONCLEX:
                fdp->fd_ofiles[fd].fde_flags &= ~UF_EXCLOSE;
                goto out;
        case FIOCLEX:
                fdp->fd_ofiles[fd].fde_flags |= UF_EXCLOSE;
                goto out;
+#endif /* __rtems__ */
        case FIONBIO:
                if ((tmp = *(int *)data))
                        atomic_set_int(&fp->f_flag, FNONBLOCK);
@@ -1236,23 +1238,73 @@ selsetbits(fd_mask **ibits, fd_mask **obits, int idx, 
fd_mask bit, int events)
        return (n);
 }
 
+#ifndef __rtems__
 static __inline int
 getselfd_cap(struct filedesc *fdp, int fd, struct file **fpp)
 {
-#ifdef __rtems__
+
+       return (fget_unlocked(fdp, fd, &cap_event_rights, fpp, NULL));
+}
+#else /* __rtems__ */
+static int
+getselfd_cap(struct filedesc *fdp, int fd, rtems_libio_t **fpp)
+{
        rtems_libio_t *iop;
-       int ffd = rtems_bsd_libio_iop_hold(fd, &iop);
-       if (ffd < 0)
-               return EBADF;
-       if (iop != NULL) {
-               *fpp = NULL;
-               return 0;
+       unsigned int actual_flags;
+
+       (void)fdp;
+
+       if ((uint32_t)fd >= rtems_libio_number_iops) {
+               return (EBADF);
        }
-       fd = ffd;
-#endif /* __rtems__ */
 
-       return (fget_unlocked(fdp, fd, &cap_event_rights, fpp, NULL));
+       iop = rtems_libio_iop(fd);
+       actual_flags = rtems_libio_iop_hold(iop);
+
+       if ((actual_flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) {
+               rtems_libio_iop_drop(iop);
+               return (EBADF);
+       }
+
+       *fpp = iop;
+       return (0);
+}
+
+static inline rtems_libio_t *
+rtems_bsd_get_file_for_poll(int fd)
+{
+       rtems_libio_t *iop;
+       unsigned int actual_flags;
+
+       if ((uint32_t)fd >= rtems_libio_number_iops) {
+               return (NULL);
+       }
+
+       iop = rtems_libio_iop(fd);
+       actual_flags = rtems_libio_iop_hold(iop);
+
+       if ((actual_flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) {
+               rtems_libio_iop_drop(iop);
+               return (NULL);
+       }
+
+       return (iop);
+}
+
+static inline int
+rtems_bsd_fo_poll(rtems_libio_t *iop, int events, struct ucred *active_cred,
+    struct thread *td)
+{
+       int error;
+
+       (void)active_cred;
+       (void)td;
+
+       error = ((*iop->pathinfo.handlers->poll_h)(iop, events));
+       rtems_libio_iop_drop(iop);
+       return (error);
 }
+#endif /* __rtems__ */
 
 /*
  * Traverse the list of fds attached to this thread's seltd and check for
@@ -1266,7 +1318,11 @@ selrescan(struct thread *td, fd_mask **ibits, fd_mask 
**obits)
        struct seltd *stp;
        struct selfd *sfp;
        struct selfd *sfn;
+#ifndef __rtems__
        struct file *fp;
+#else /* __rtems__ */
+       rtems_libio_t *fp;
+#endif /* __rtems__ */
        fd_mask bit;
        int fd, ev, n, idx;
        int error;
@@ -1290,10 +1346,8 @@ selrescan(struct thread *td, fd_mask **ibits, fd_mask 
**obits)
                ev = fo_poll(fp, selflags(ibits, idx, bit), td->td_ucred, td);
                fdrop(fp, td);
 #else /* __rtems__ */
-               ev = rtems_bsd_libio_fo_poll(fd, fp, selflags(ibits, idx, bit),
-                                            td->td_ucred, td);
-               if (fp != NULL)
-                       fdrop(fp, td);
+               ev = rtems_bsd_fo_poll(fp, selflags(ibits, idx, bit),
+                   td->td_ucred, td);
 #endif /* __rtems__ */
                if (ev != 0)
                        n += selsetbits(ibits, obits, idx, bit, ev);
@@ -1311,7 +1365,11 @@ static int
 selscan(struct thread *td, fd_mask **ibits, fd_mask **obits, int nfd)
 {
        struct filedesc *fdp;
+#ifndef __rtems__
        struct file *fp;
+#else /* __rtems__ */
+       rtems_libio_t *fp;
+#endif /* __rtems__ */
        fd_mask bit;
        int ev, flags, end, fd;
        int n, idx;
@@ -1334,11 +1392,8 @@ selscan(struct thread *td, fd_mask **ibits, fd_mask 
**obits, int nfd)
                        ev = fo_poll(fp, flags, td->td_ucred, td);
                        fdrop(fp, td);
 #else /* __rtems__ */
-                       ev = rtems_bsd_libio_fo_poll(fd, fp,
-                                                    selflags(ibits, idx, bit),
-                                                    td->td_ucred, td);
-                       if (fp != NULL)
-                               fdrop(fp, td);
+                       ev = rtems_bsd_fo_poll(fp, flags, td->td_ucred,
+                           td);
 #endif /* __rtems__ */
                        if (ev != 0)
                                n += selsetbits(ibits, obits, idx, bit, ev);
@@ -1507,7 +1562,11 @@ pollrescan(struct thread *td)
        struct selfd *sfn;
        struct selinfo *si;
        struct filedesc *fdp;
+#ifndef __rtems__
        struct file *fp;
+#else /* __rtems__ */
+       rtems_libio_t *fp;
+#endif /* __rtems__ */
        struct pollfd *fd;
        int n;
 
@@ -1524,24 +1583,15 @@ pollrescan(struct thread *td)
                        continue;
 #ifndef __rtems__
                fp = fdp->fd_ofiles[fd->fd].fde_file;
+#else /* __rtems__ */
+               fp = rtems_bsd_get_file_for_poll(fd->fd);
+#endif /* __rtems__ */
 #ifdef CAPABILITIES
                if (fp == NULL ||
                    cap_check(cap_rights(fdp, fd->fd), &cap_event_rights) != 0)
 #else
                if (fp == NULL)
 #endif
-#else /* __rtems__ */
-               rtems_libio_t* iop;
-               int ffd = rtems_bsd_libio_iop_hold(fd->fd, &iop);
-               if (ffd >= 0) {
-                       if (iop == NULL) {
-                               fp = fdp->fd_ofiles[ffd].fde_file;
-                       } else {
-                               fp = NULL;
-                       }
-               }
-               else
-#endif /* __rtems__ */
                {
                        fd->revents = POLLNVAL;
                        n++;
@@ -1555,7 +1605,8 @@ pollrescan(struct thread *td)
 #ifndef __rtems__
                fd->revents = fo_poll(fp, fd->events, td->td_ucred, td);
 #else /* __rtems__ */
-               fd->revents = rtems_bsd_libio_fo_poll(ffd, fp, fd->events, 
td->td_ucred, td);
+               fd->revents = rtems_bsd_fo_poll(fp, fd->events, td->td_ucred,
+                   td);
 #endif /* __rtems__ */
                if (fd->revents != 0)
                        n++;
@@ -1592,7 +1643,11 @@ static int
 pollscan(struct thread *td, struct pollfd *fds, u_int nfd)
 {
        struct filedesc *fdp = td->td_proc->p_fd;
+#ifndef __rtems__
        struct file *fp;
+#else /* __rtems__ */
+        rtems_libio_t *fp;
+#endif /* __rtems__ */
        int i, n = 0;
 
        FILEDESC_SLOCK(fdp);
@@ -1609,24 +1664,15 @@ pollscan(struct thread *td, struct pollfd *fds, u_int 
nfd)
                } else {
 #ifndef __rtems__
                        fp = fdp->fd_ofiles[fds->fd].fde_file;
+#else /* __rtems__ */
+                       fp = rtems_bsd_get_file_for_poll(fds->fd);
+#endif /* __rtems__ */
 #ifdef CAPABILITIES
                        if (fp == NULL ||
                            cap_check(cap_rights(fdp, fds->fd), 
&cap_event_rights) != 0)
 #else
                        if (fp == NULL)
 #endif
-#else /* __rtems__ */
-                       rtems_libio_t* iop;
-                       int ffd = rtems_bsd_libio_iop_hold(fds->fd, &iop);
-                       if (ffd >= 0) {
-                               if (iop == NULL) {
-                                       fp = fdp->fd_ofiles[ffd].fde_file;
-                               } else {
-                                       fp = NULL;
-                               }
-                       }
-                       if (ffd < 0)
-#endif /* __rtems__ */
                        {
                                fds->revents = POLLNVAL;
                                n++;
@@ -1640,7 +1686,7 @@ pollscan(struct thread *td, struct pollfd *fds, u_int nfd)
                                fds->revents = fo_poll(fp, fds->events,
                                    td->td_ucred, td);
 #else /* __rtems__ */
-                               fds->revents = rtems_bsd_libio_fo_poll(ffd, fp, 
fds->events,
+                               fds->revents = rtems_bsd_fo_poll(fp, 
fds->events,
                                    td->td_ucred, td);
 #endif /* __rtems__ */
                                /*
diff --git a/freebsd/sys/kern/uipc_socket.c b/freebsd/sys/kern/uipc_socket.c
index 60f9a69d..9c05a228 100644
--- a/freebsd/sys/kern/uipc_socket.c
+++ b/freebsd/sys/kern/uipc_socket.c
@@ -3384,7 +3384,11 @@ sopoll_generic(struct socket *so, int events, struct 
ucred *active_cred,
 int
 soo_kqfilter(struct file *fp, struct knote *kn)
 {
+#ifndef __rtems__
        struct socket *so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       struct socket *so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
        struct sockbuf *sb;
        struct knlist *knl;
 
@@ -3594,7 +3598,11 @@ pru_sopoll_notsupp(struct socket *so, int events, struct 
ucred *cred,
 static void
 filt_sordetach(struct knote *kn)
 {
+#ifndef __rtems__
        struct socket *so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       struct socket *so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
 
        so_rdknl_lock(so);
        knlist_remove(&so->so_rdsel.si_note, kn, 1);
@@ -3609,7 +3617,11 @@ filt_soread(struct knote *kn, long hint)
 {
        struct socket *so;
 
+#ifndef __rtems__
        so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
 
        if (SOLISTENING(so)) {
                SOCK_LOCK_ASSERT(so);
@@ -3645,7 +3657,11 @@ filt_soread(struct knote *kn, long hint)
 static void
 filt_sowdetach(struct knote *kn)
 {
+#ifndef __rtems__
        struct socket *so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       struct socket *so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
 
        so_wrknl_lock(so);
        knlist_remove(&so->so_wrsel.si_note, kn, 1);
@@ -3660,7 +3676,11 @@ filt_sowrite(struct knote *kn, long hint)
 {
        struct socket *so;
 
+#ifndef __rtems__
        so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
 
        if (SOLISTENING(so))
                return (0);
@@ -3690,7 +3710,11 @@ filt_soempty(struct knote *kn, long hint)
 {
        struct socket *so;
 
+#ifndef __rtems__
        so = kn->kn_fp->f_data;
+#else /* __rtems__ */
+       so = rtems_bsd_knote_to_file(kn)->f_data;
+#endif /* __rtems__ */
 
        if (SOLISTENING(so))
                return (1);
diff --git a/freebsd/sys/kern/uipc_syscalls.c b/freebsd/sys/kern/uipc_syscalls.c
index a2f7d6f8..50413091 100644
--- a/freebsd/sys/kern/uipc_syscalls.c
+++ b/freebsd/sys/kern/uipc_syscalls.c
@@ -113,6 +113,7 @@ getsockaddr_noalloc(struct sockaddr **namp, const struct 
sockaddr *uaddr, size_t
 #endif /* __rtems__ */
 static int sockargs(struct mbuf **, char *, socklen_t, int);
 
+#ifndef __rtems__
 /*
  * Convert a user file descriptor to a kernel file entry and check if required
  * capability rights are present.
@@ -140,6 +141,7 @@ getsock_cap(struct thread *td, int fd, cap_rights_t 
*rightsp,
        *fpp = fp;
        return (0);
 }
+#endif /* __rtems__ */
 
 /*
  * System call interface to the socket abstraction.
@@ -193,7 +195,9 @@ kern_socket(struct thread *td, int domain, int type, int 
protocol)
                        (void) fo_ioctl(fp, FIONBIO, &fflag, td->td_ucred, td);
                td->td_retval[0] = fd;
        }
+#ifndef __rtems__
        fdrop(fp, td);
+#endif /* __rtems__ */
        return (error);
 }
 
@@ -349,7 +353,9 @@ accept1(td, s, uname, anamelen, flags)
                    sizeof(namelen));
        if (error != 0)
                fdclose(td, fp, td->td_retval[0]);
+#ifndef __rtems__
        fdrop(fp, td);
+#endif /* __rtems__ */
        free(name, M_SONAME);
        return (error);
 }
@@ -472,8 +478,10 @@ done:
                } else
                        *fp = NULL;
        }
+#ifndef __rtems__
        if (nfp != NULL)
                fdrop(nfp, td);
+#endif /* __rtems__ */
        fdrop(headfp, td);
        return (error);
 }
@@ -692,15 +700,21 @@ kern_socketpair(struct thread *td, int domain, int type, 
int protocol,
                (void) fo_ioctl(fp1, FIONBIO, &fflag, td->td_ucred, td);
                (void) fo_ioctl(fp2, FIONBIO, &fflag, td->td_ucred, td);
        }
+#ifndef __rtems__
        fdrop(fp1, td);
        fdrop(fp2, td);
+#endif /* __rtems__ */
        return (0);
 free4:
        fdclose(td, fp2, rsv[1]);
+#ifndef __rtems__
        fdrop(fp2, td);
+#endif /* __rtems__ */
 free3:
        fdclose(td, fp1, rsv[0]);
+#ifndef __rtems__
        fdrop(fp1, td);
+#endif /* __rtems__ */
 free2:
        if (so2 != NULL)
                (void)soclose(so2);
@@ -1712,6 +1726,7 @@ getsockaddr(struct sockaddr **namp, caddr_t uaddr, size_t 
len)
 void
 m_dispose_extcontrolm(struct mbuf *m)
 {
+#ifndef __rtems__
        struct cmsghdr *cm;
        struct file *fp;
        struct thread *td;
@@ -1752,4 +1767,5 @@ m_dispose_extcontrolm(struct mbuf *m)
                }
                m_chtype(m, MT_CONTROL);
        }
+#endif /* __rtems__ */
 }
diff --git a/freebsd/sys/kern/vfs_cache.c b/freebsd/sys/kern/vfs_cache.c
index 7ae1de1d..3faf6188 100644
--- a/freebsd/sys/kern/vfs_cache.c
+++ b/freebsd/sys/kern/vfs_cache.c
@@ -2146,6 +2146,7 @@ static int __read_mostly disablecwd;
 SYSCTL_INT(_debug, OID_AUTO, disablecwd, CTLFLAG_RW, &disablecwd, 0,
    "Disable the getcwd syscall");
 
+#ifndef __rtems__
 /* Implementation of the getcwd syscall. */
 int
 sys___getcwd(struct thread *td, struct __getcwd_args *uap)
@@ -2196,6 +2197,7 @@ kern___getcwd(struct thread *td, char *buf, enum uio_seg 
bufseg, size_t buflen,
        free(tmpbuf, M_TEMP);
        return (error);
 }
+#endif /* __rtems__ */
 
 /*
  * Thus begins the fullpath magic.
diff --git a/freebsd/sys/kern/vfs_lookup.c b/freebsd/sys/kern/vfs_lookup.c
index 656ec51d..83b9f713 100644
--- a/freebsd/sys/kern/vfs_lookup.c
+++ b/freebsd/sys/kern/vfs_lookup.c
@@ -381,7 +381,9 @@ namei(struct nameidata *ndp)
        FILEDESC_SLOCK(fdp);
        ndp->ni_rootdir = fdp->fd_rdir;
        vrefact(ndp->ni_rootdir);
+#ifndef __rtems__
        ndp->ni_topdir = fdp->fd_jdir;
+#endif /* __rtems__ */
 
        /*
         * If we are auditing the kernel pathname, save the user pathname.
@@ -837,7 +839,9 @@ dirloop:
                        pr = NULL;
 #endif /* __rtems__ */
                        if (dp == ndp->ni_rootdir || 
+#ifndef __rtems__
                            dp == ndp->ni_topdir || 
+#endif /* __rtems__ */
                            dp == rootvnode ||
                            pr != NULL ||
                            ((dp->v_vflag & VV_ROOT) != 0 &&
diff --git a/freebsd/sys/kern/vfs_mount.c b/freebsd/sys/kern/vfs_mount.c
index 4635857e..2e122a98 100644
--- a/freebsd/sys/kern/vfs_mount.c
+++ b/freebsd/sys/kern/vfs_mount.c
@@ -950,7 +950,9 @@ vfs_domount_first(
        VOP_UNLOCK(vp, 0);
        EVENTHANDLER_DIRECT_INVOKE(vfs_mounted, mp, newdp, td);
        VOP_UNLOCK(newdp, 0);
+#ifndef __rtems__
        mountcheckdirs(vp, newdp);
+#endif /* __rtems__ */
        vrele(newdp);
        if ((mp->mnt_flag & MNT_RDONLY) == 0)
                vfs_allocate_syncvnode(mp);
diff --git a/freebsd/sys/kern/vfs_subr.c b/freebsd/sys/kern/vfs_subr.c
index bc38e770..5f4d09da 100644
--- a/freebsd/sys/kern/vfs_subr.c
+++ b/freebsd/sys/kern/vfs_subr.c
@@ -5365,7 +5365,11 @@ filt_vfsread(struct knote *kn, long hint)
                return (0);
 
        VI_LOCK(vp);
+#ifndef __rtems__
        kn->kn_data = va.va_size - kn->kn_fp->f_offset;
+#else /* __rtems__ */
+       kn->kn_data = va.va_size - rtems_bsd_knote_to_file(kn)->f_offset;
+#endif /* __rtems__ */
        res = (kn->kn_sfflags & NOTE_FILE_POLL) != 0 || kn->kn_data != 0;
        VI_UNLOCK(vp);
        return (res);
diff --git a/freebsd/sys/kern/vfs_syscalls.c b/freebsd/sys/kern/vfs_syscalls.c
index 0b7e054a..7e8e29e4 100644
--- a/freebsd/sys/kern/vfs_syscalls.c
+++ b/freebsd/sys/kern/vfs_syscalls.c
@@ -1050,12 +1050,19 @@ sys_openat(struct thread *td, struct openat_args *uap)
 }
 
 int
+#ifndef __rtems__
 kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg,
     int flags, int mode)
+#else /* __rtems__ */
+kern_openat(struct thread *td, int fd, char *path, enum uio_seg pathseg,
+    int flags, int mode, struct file *fp)
+#endif /* __rtems__ */
 {
        struct proc *p = td->td_proc;
        struct filedesc *fdp = p->p_fd;
+#ifndef __rtems__
        struct file *fp;
+#endif /* __rtems__ */
        struct vnode *vp;
        struct nameidata nd;
        cap_rights_t rights;
@@ -1088,9 +1095,14 @@ kern_openat(struct thread *td, int fd, char *path, enum 
uio_seg pathseg,
         * Allocate a file structure. The descriptor to reference it
         * is allocated and set by finstall() below.
         */
+#ifndef __rtems__
        error = falloc_noinstall(td, &fp);
        if (error != 0)
                return (error);
+#else /* __rtems__ */
+       rtems_libio_iop_hold(fp->f_io);
+       error = 0;
+#endif /* __rtems__ */
        /*
         * An extra reference on `fp' has been held for us by
         * falloc_noinstall().
@@ -1164,12 +1176,15 @@ kern_openat(struct thread *td, int fd, char *path, enum 
uio_seg pathseg,
        }
 
        VOP_UNLOCK(vp, 0);
+#ifndef __rtems__
        if (flags & O_TRUNC) {
                error = fo_truncate(fp, 0, td->td_ucred, td);
                if (error != 0)
                        goto bad;
        }
+#endif /* __rtems__ */
 success:
+#ifndef __rtems__
        /*
         * If we haven't already installed the FD (for dupfdopen), do so now.
         */
@@ -1191,6 +1206,7 @@ success:
        } else {
                filecaps_free(&nd.ni_filecaps);
        }
+#endif /* __rtems__ */
 
        /*
         * Release our private reference, leaving the one associated with
@@ -4372,6 +4388,7 @@ sys_fhreadlink(struct thread *td, struct fhreadlink_args 
*uap)
        return (error);
 }
 
+#ifndef __rtems__
 /*
  * syscall for the rpc.lockd to use to translate a NFS file handle into an
  * open descriptor.
@@ -4459,6 +4476,7 @@ bad:
        td->td_retval[0] = indx;
        return (error);
 }
+#endif /* __rtems__ */
 
 /*
  * Stat an (NFS) file handle.
diff --git a/freebsd/sys/opencrypto/cryptodev.c 
b/freebsd/sys/opencrypto/cryptodev.c
index 71872532..97459559 100644
--- a/freebsd/sys/opencrypto/cryptodev.c
+++ b/freebsd/sys/opencrypto/cryptodev.c
@@ -1513,17 +1513,10 @@ cryptoioctl(struct cdev *dev, u_long cmd, caddr_t data, 
int flag, struct thread
                }
                /* falloc automatically provides an extra reference to 'f'. */
                finit(f, FREAD | FWRITE, DTYPE_CRYPTO, fcr, &cryptofops);
-#ifdef __rtems__
-               fd = rtems_bsd_libio_iop_allocate_with_file(td, fd, 
&rtems_bsd_sysgen_nodeops);
-               if (fd < 0) {
-                       fdclose(td, f, fd);
-                       mtx_destroy(&fcr->lock);
-                       free(fcr, M_XDATA);
-                       return (error);
-               }
-#endif /* __rtems__ */
                *(u_int32_t *)data = fd;
+#ifndef __rtems__
                fdrop(f, td);
+#endif /* __rtems__ */
                break;
        case CRIOFINDDEV:
                error = cryptodev_find((struct crypt_find_op *)data);
diff --git a/freebsd/sys/sys/file.h b/freebsd/sys/sys/file.h
index d48ca0e9..68c33299 100644
--- a/freebsd/sys/sys/file.h
+++ b/freebsd/sys/sys/file.h
@@ -247,6 +247,7 @@ extern int maxfiles;                /* kernel limit on 
number of open files */
 extern int maxfilesperproc;    /* per process limit on number of open files */
 extern volatile int openfiles; /* actual number of open files */
 
+#ifndef __rtems__
 int fget(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp);
 int fget_mmap(struct thread *td, int fd, cap_rights_t *rightsp,
     u_char *maxprotp, struct file **fpp);
@@ -257,6 +258,51 @@ int fget_write(struct thread *td, int fd, cap_rights_t 
*rightsp,
 int fget_fcntl(struct thread *td, int fd, cap_rights_t *rightsp,
     int needfcntl, struct file **fpp);
 int _fdrop(struct file *fp, struct thread *td);
+#else /* __rtems__ */
+int rtems_bsd_fget(int fd, struct file **fpp, int flags);
+
+static inline int
+fget(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
+{
+       struct file *fp;
+
+       (void)td;
+       (void)rightsp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN));
+}
+
+static inline int
+fget_read(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
+{
+       struct file *fp;
+
+       (void)td;
+       (void)rightsp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN | LIBIO_FLAGS_READ));
+}
+
+static inline int
+fget_write(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp)
+{
+       struct file *fp;
+
+       (void)td;
+       (void)rightsp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN | LIBIO_FLAGS_WRITE));
+}
+
+static inline int
+fget_fcntl(struct thread *td, int fd, cap_rights_t *rightsp, int needfcntl,
+    struct file **fpp)
+{
+       struct file *fp;
+
+       (void)td;
+       (void)needfcntl;
+       (void)rightsp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN));
+}
+#endif /* __rtems__ */
 
 fo_rdwr_t      invfo_rdwr;
 fo_truncate_t  invfo_truncate;
@@ -274,7 +320,36 @@ fo_fill_kinfo_t    vn_fill_kinfo;
 int vn_fill_kinfo_vnode(struct vnode *vp, struct kinfo_file *kif);
 #endif /* __rtems__ */
 
+#ifndef __rtems__
 void finit(struct file *, u_int, short, void *, struct fileops *);
+#else /* __rtems__ */
+static inline void
+finit(struct file *fp, u_int flag, short type, void *data, struct fileops *ops)
+{
+       uint32_t libio_flags;
+
+       fp->f_data = data;
+       fp->f_flag = flag;
+       fp->f_type = type;
+       fp->f_ops = ops;
+
+       libio_flags = LIBIO_FLAGS_OPEN;
+
+       if ((flag & FREAD) == FREAD) {
+               libio_flags |= LIBIO_FLAGS_READ;
+       }
+
+       if ((flag & FWRITE) == FWRITE) {
+               libio_flags |= LIBIO_FLAGS_WRITE;
+       }
+
+       if ((flag & FNONBLOCK) == FNONBLOCK) {
+               libio_flags |= LIBIO_FLAGS_NO_DELAY;
+       }
+
+        rtems_libio_iop_flags_set(fp->f_io, libio_flags);
+}
+#endif /* __rtems__ */
 int fgetvp(struct thread *td, int fd, cap_rights_t *rightsp,
     struct vnode **vpp);
 int fgetvp_exec(struct thread *td, int fd, cap_rights_t *rightsp,
@@ -286,6 +361,7 @@ int fgetvp_read(struct thread *td, int fd, cap_rights_t 
*rightsp,
 int fgetvp_write(struct thread *td, int fd, cap_rights_t *rightsp,
     struct vnode **vpp);
 
+#ifndef __rtems__
 static __inline int
 _fnoop(void)
 {
@@ -299,23 +375,19 @@ fhold(struct file *fp)
        return (refcount_acquire_checked(&fp->f_count));
 }
 
-#ifndef __rtems__
 #define        fdrop(fp, td)                                                   
\
        (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : _fnoop())
 #else /* __rtems__ */
-static inline int fdrop(struct file *fp, struct thread *td)
+/*
+ * Must not be called after falloc_caps().  The file reference counting in
+ * RTEMS and FreeBSD work slightly different.
+ */
+static inline void
+fdrop(struct file *fp, struct thread *td)
 {
-       if (fp->f_io != NULL) {
-               if (RTEMS_BSD_DESCRIP_TRACE)
-                 printf("bsd:  fb: fdrop: iop=%p %d (%d) fp=%p (%d) by %p\n",
-                        fp->f_io, fp->f_io->data0, fp->f_io->flags >> 12,
-                        fp, fp->f_count, __builtin_return_address(0));
-               rtems_libio_iop_drop(fp->f_io);
-       } else if (RTEMS_BSD_DESCRIP_TRACE) {
-               printf("bsd:  fb: fdrop: %d %p %d by %p\n",
-                      -1, fp, fp->f_count, __builtin_return_address(0));
-       }
-       return (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : 
_fnoop());
+
+       (void)td;
+       rtems_libio_iop_drop(fp->f_io);
 }
 #endif /* __rtems__ */
 
diff --git a/freebsd/sys/sys/filedesc.h b/freebsd/sys/sys/filedesc.h
index dc132677..634470fb 100644
--- a/freebsd/sys/sys/filedesc.h
+++ b/freebsd/sys/sys/filedesc.h
@@ -77,20 +77,26 @@ struct fdescenttbl {
 #define NDSLOTTYPE     u_long
 
 struct filedesc {
+#ifndef __rtems__
        struct  fdescenttbl *fd_files;  /* open files table */
+#endif /* __rtems__ */
        struct  vnode *fd_cdir;         /* current directory */
        struct  vnode *fd_rdir;         /* root directory */
+#ifndef __rtems__
        struct  vnode *fd_jdir;         /* jail root directory */
        NDSLOTTYPE *fd_map;             /* bitmap of free fds */
        int     fd_lastfile;            /* high-water mark of fd_ofiles */
        int     fd_freefile;            /* approx. next free file */
+#endif /* __rtems__ */
        u_short fd_cmask;               /* mask for file creation */
+#ifndef __rtems__
        int     fd_refcnt;              /* thread reference count */
        int     fd_holdcnt;             /* hold count on structure + mutex */
        struct  sx fd_sx;               /* protects members of this struct */
        struct  kqlist fd_kqlist;       /* list of kqueues on this filedesc */
        int     fd_holdleaderscount;    /* block fdfree() for shared close() */
        int     fd_holdleaderswakeup;   /* fdfree() needs wakeup */
+#endif /* __rtems__ */
 };
 
 /*
@@ -102,6 +108,7 @@ struct filedesc {
  *
  * fdl_refcount and fdl_holdcount are protected by struct filedesc mtx.
  */
+#ifndef __rtems__
 struct filedesc_to_leader {
        int             fdl_refcount;   /* references from struct proc */
        int             fdl_holdcount;  /* temporary hold during closef */
@@ -113,6 +120,9 @@ struct filedesc_to_leader {
 };
 #define        fd_nfiles       fd_files->fdt_nfiles
 #define        fd_ofiles       fd_files->fdt_ofiles
+#else /* __rtems__ */
+struct filedesc_to_leader;
+#endif /* __rtems__ */
 
 /*
  * Per-process open flags.
@@ -120,15 +130,26 @@ struct filedesc_to_leader {
 #define        UF_EXCLOSE      0x01            /* auto-close on exec */
 
 #ifdef _KERNEL
+#ifdef __rtems__
+#include <sys/file.h>
+#include <rtems/libio_.h>
+#endif /* __rtems__ */
 
 /* Lock a file descriptor table. */
 #define        FILEDESC_LOCK_INIT(fdp) sx_init(&(fdp)->fd_sx, "filedesc 
structure")
 #define        FILEDESC_LOCK_DESTROY(fdp)      sx_destroy(&(fdp)->fd_sx)
 #define        FILEDESC_LOCK(fdp)      (&(fdp)->fd_sx)
+#ifndef __rtems__
 #define        FILEDESC_XLOCK(fdp)     sx_xlock(&(fdp)->fd_sx)
 #define        FILEDESC_XUNLOCK(fdp)   sx_xunlock(&(fdp)->fd_sx)
 #define        FILEDESC_SLOCK(fdp)     sx_slock(&(fdp)->fd_sx)
 #define        FILEDESC_SUNLOCK(fdp)   sx_sunlock(&(fdp)->fd_sx)
+#else /* __rtems__ */
+#define        FILEDESC_XLOCK(fdp)     rtems_libio_lock()
+#define        FILEDESC_XUNLOCK(fdp)   rtems_libio_unlock()
+#define        FILEDESC_SLOCK(fdp)     rtems_libio_lock()
+#define        FILEDESC_SUNLOCK(fdp)   rtems_libio_unlock()
+#endif /* __rtems__ */
 
 #define        FILEDESC_LOCK_ASSERT(fdp)       sx_assert(&(fdp)->fd_sx, 
SX_LOCKED | \
                                            SX_NOTRECURSED)
@@ -154,17 +175,42 @@ enum {
 
 struct thread;
 
-void   filecaps_init(struct filecaps *fcaps);
+static __inline void
+filecaps_init(struct filecaps *fcaps)
+{
+
+        bzero(fcaps, sizeof(*fcaps));
+        fcaps->fc_nioctls = -1;
+}
 bool   filecaps_copy(const struct filecaps *src, struct filecaps *dst,
            bool locked);
 void   filecaps_move(struct filecaps *src, struct filecaps *dst);
+#ifndef __rtems__
 void   filecaps_free(struct filecaps *fcaps);
+#else /* __rtems__ */
+#define        filecaps_free(fcaps) do { } while (0)
+#endif /* __rtems__ */
 
 int    closef(struct file *fp, struct thread *td);
 int    dupfdopen(struct thread *td, struct filedesc *fdp, int dfd, int mode,
            int openerror, int *indxp);
+#ifndef __rtems__
 int    falloc_caps(struct thread *td, struct file **resultfp, int *resultfd,
            int flags, struct filecaps *fcaps);
+#else /* __rtems__ */
+int rtems_bsd_falloc(struct file **resultfp, int *resultfd);
+
+static inline int
+falloc_caps(struct thread *td, struct file **resultfp, int *resultfd,
+    int flags, struct filecaps *fcaps)
+{
+
+       (void)td;
+       (void)flags;
+       (void)fcaps;
+       return (rtems_bsd_falloc(resultfp, resultfd));
+}
+#endif /* __rtems__ */
 int    falloc_noinstall(struct thread *td, struct file **resultfp);
 void   _finstall(struct filedesc *fdp, struct file *fp, int fd, int flags,
            struct filecaps *fcaps);
@@ -173,7 +219,20 @@ int        finstall(struct thread *td, struct file *fp, 
int *resultfd, int flags,
 int    fdalloc(struct thread *td, int minfd, int *result);
 int    fdallocn(struct thread *td, int minfd, int *fds, int n);
 int    fdcheckstd(struct thread *td);
+#ifndef __rtems__
 void   fdclose(struct thread *td, struct file *fp, int idx);
+#else /* __rtems__ */
+void rtems_bsd_fdclose(struct file *fp);
+
+static inline void
+fdclose(struct thread *td, struct file *fp, int idx)
+{
+
+       (void)td;
+       (void)idx;
+       rtems_bsd_fdclose(fp);
+}
+#endif /* __rtems__ */
 void   fdcloseexec(struct thread *td);
 void   fdsetugidsafety(struct thread *td);
 struct filedesc *fdcopy(struct filedesc *fdp);
@@ -192,6 +251,7 @@ int getvnode(struct thread *td, int fd, cap_rights_t 
*rightsp,
            struct file **fpp);
 void   mountcheckdirs(struct vnode *olddp, struct vnode *newdp);
 
+#ifndef __rtems__
 int    fget_cap_locked(struct filedesc *fdp, int fd, cap_rights_t *needrightsp,
            struct file **fpp, struct filecaps *havecapsp);
 int    fget_cap(struct thread *td, int fd, cap_rights_t *needrightsp,
@@ -245,7 +305,32 @@ void       pwd_chdir(struct thread *td, struct vnode *vp);
 int    pwd_chroot(struct thread *td, struct vnode *vp);
 void   pwd_ensure_dirs(void);
 
-#ifdef __rtems__
+#else /* __rtems__ */
+static inline int
+fget_cap(struct thread *td, int fd, cap_rights_t *needrightsp,
+    struct file **fpp, struct filecaps *havecapsp)
+{
+
+       (void)td;
+       (void)needrightsp;
+       (void)havecapsp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN));
+}
+
+#define        fget_cap_locked(fdp, fd, needrightsp, fpp, havecapsp) \
+    fget_cap(NULL, fd, needrightsp, fpp, havecapsp)
+
+static inline int
+rtems_bsd_fget_unlocked(int fd, struct file **fpp, seq_t *seqp)
+{
+
+       (void)seqp;
+       return (rtems_bsd_fget(fd, fpp, LIBIO_FLAGS_OPEN));
+}
+
+#define        fget_unlocked(fdp, fd, needrightsp, fpp, seqp) \
+    rtems_bsd_fget_unlocked(fd, fpp, seqp)
+
 #include <machine/rtems-bsd-libio.h>
 #endif /* __rtems__ */
 #endif /* _KERNEL */
diff --git a/freebsd/sys/sys/namei.h b/freebsd/sys/sys/namei.h
index 53814117..500024de 100644
--- a/freebsd/sys/sys/namei.h
+++ b/freebsd/sys/sys/namei.h
@@ -75,7 +75,9 @@ struct nameidata {
         */
        struct  vnode *ni_startdir;     /* starting directory */
        struct  vnode *ni_rootdir;      /* logical root directory */
+#ifndef __rtems__
        struct  vnode *ni_topdir;       /* logical top directory */
+#endif /* __rtems__ */
        int     ni_dirfd;               /* starting directory for *at functions 
*/
        int     ni_lcf;                 /* local call flags */
        /*
diff --git a/freebsd/sys/sys/proc.h b/freebsd/sys/sys/proc.h
index 6ac1025d..4e061de8 100644
--- a/freebsd/sys/sys/proc.h
+++ b/freebsd/sys/sys/proc.h
@@ -633,8 +633,8 @@ struct proc {
 #endif /* __rtems__ */
        struct ucred    *p_ucred;       /* (c) Process owner's identity. */
        struct filedesc *p_fd;          /* (b) Open files. */
-       struct filedesc_to_leader *p_fdtol; /* (b) Tracking node */
 #ifndef __rtems__
+       struct filedesc_to_leader *p_fdtol; /* (b) Tracking node */
        struct pstats   *p_stats;       /* (b) Accounting/statistics (CPU). */
        struct plimit   *p_limit;       /* (c) Resource limits. */
        struct callout  p_limco;        /* (c) Limit callout handle */
diff --git a/freebsd/sys/sys/socketvar.h b/freebsd/sys/sys/socketvar.h
index 96ba4a01..ad57730a 100644
--- a/freebsd/sys/sys/socketvar.h
+++ b/freebsd/sys/sys/socketvar.h
@@ -381,9 +381,22 @@ struct uio;
  */
 #ifndef __rtems__
 int    getsockaddr(struct sockaddr **namp, caddr_t uaddr, size_t len);
-#endif /* __rtems__ */
 int    getsock_cap(struct thread *td, int fd, cap_rights_t *rightsp,
            struct file **fpp, u_int *fflagp, struct filecaps *havecaps);
+#else /* __rtems__ */
+int rtems_bsd_getsock(int fd, struct file **fpp, u_int *fflagp);
+
+static inline int
+getsock_cap(struct thread *td, int fd, cap_rights_t *rightsp,
+    struct file **fpp, u_int *fflagp, struct filecaps *havecaps)
+{
+
+       (void)td;
+       (void)rightsp;
+       (void)havecaps;
+       return (rtems_bsd_getsock(fd, fpp, fflagp));
+}
+#endif /* __rtems__ */
 void   soabort(struct socket *so);
 int    soaccept(struct socket *so, struct sockaddr **nam);
 void   soaio_enqueue(struct task *task);
diff --git a/freebsd/sys/sys/syscallsubr.h b/freebsd/sys/sys/syscallsubr.h
index 677afdd6..f150d7f9 100644
--- a/freebsd/sys/sys/syscallsubr.h
+++ b/freebsd/sys/sys/syscallsubr.h
@@ -191,8 +191,13 @@ int     kern_nanosleep(struct thread *td, struct timespec 
*rqt,
            struct timespec *rmt);
 int    kern_ogetdirentries(struct thread *td, struct ogetdirentries_args *uap,
            long *ploff);
+#ifndef __rtems__
 int    kern_openat(struct thread *td, int fd, char *path,
            enum uio_seg pathseg, int flags, int mode);
+#else /* __rtems__ */
+int    kern_openat(struct thread *td, int fd, char *path,
+           enum uio_seg pathseg, int flags, int mode, struct file *fp);
+#endif /* __rtems__ */
 int    kern_pathconf(struct thread *td, char *path, enum uio_seg pathseg,
            int name, u_long flags, long *valuep);
 int    kern_pipe(struct thread *td, int fildes[2], int flags,
diff --git a/libbsd.py b/libbsd.py
index 983f41a1..ec72b3e2 100644
--- a/libbsd.py
+++ b/libbsd.py
@@ -203,6 +203,7 @@ class rtems(builder.Module):
                 'rtems/rtems-kernel-dev.c',
                 'rtems/rtems-kernel-dirent.c',
                 'rtems/rtems-kernel-epoch.c',
+                'rtems/rtems-kernel-fget.c',
                 'rtems/rtems-kernel-get-file.c',
                 'rtems/rtems-kernel-init.c',
                 'rtems/rtems-kernel-irqs.c',
diff --git a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h 
b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
index a83334b5..dc19c7c2 100644
--- a/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
+++ b/rtemsbsd/include/machine/rtems-bsd-kernel-namespace.h
@@ -1765,8 +1765,6 @@
 #define        eventhandler_prune_list _bsd_eventhandler_prune_list
 #define        eventhandler_register _bsd_eventhandler_register
 #define        extattr_check_cred _bsd_extattr_check_cred
-#define        falloc_caps _bsd_falloc_caps
-#define        falloc_noinstall _bsd_falloc_noinstall
 #define        fb_commonioctl _bsd_fb_commonioctl
 #define        fb_dump_adp_info _bsd_fb_dump_adp_info
 #define        fb_dump_mode_info _bsd_fb_dump_mode_info
@@ -1806,16 +1804,6 @@
 #define        fdt_pinctrl_configure_tree _bsd_fdt_pinctrl_configure_tree
 #define        fdt_pinctrl_register _bsd_fdt_pinctrl_register
 #define        fdt_regsize _bsd_fdt_regsize
-#define        fget _bsd_fget
-#define        fget_cap _bsd_fget_cap
-#define        fget_cap_locked _bsd_fget_cap_locked
-#define        fget_fcntl _bsd_fget_fcntl
-#define        fget_read _bsd_fget_read
-#define        fget_unlocked _bsd_fget_unlocked
-#define        fget_write _bsd_fget_write
-#define        fgetvp _bsd_fgetvp
-#define        fgetvp_read _bsd_fgetvp_read
-#define        fgetvp_rights _bsd_fgetvp_rights
 #define        fha_assign _bsd_fha_assign
 #define        fha_init _bsd_fha_init
 #define        fha_nd_complete _bsd_fha_nd_complete
@@ -1827,15 +1815,9 @@
 #define        fib6_free_nh_ext _bsd_fib6_free_nh_ext
 #define        fib6_lookup_nh_basic _bsd_fib6_lookup_nh_basic
 #define        fib6_lookup_nh_ext _bsd_fib6_lookup_nh_ext
-#define        filecaps_copy _bsd_filecaps_copy
-#define        filecaps_free _bsd_filecaps_free
-#define        filecaps_init _bsd_filecaps_init
-#define        filecaps_move _bsd_filecaps_move
-#define        filedesc_to_leader_alloc _bsd_filedesc_to_leader_alloc
 #define        find_and_ref_tcp_fb _bsd_find_and_ref_tcp_fb
 #define        find_and_ref_tcp_functions _bsd_find_and_ref_tcp_functions
 #define        find_handler _bsd_find_handler
-#define        finit _bsd_finit
 #define        finstall _bsd_finstall
 #define        firewire_broadcastaddr _bsd_firewire_broadcastaddr
 #define        firewire_busreset _bsd_firewire_busreset
diff --git a/rtemsbsd/include/machine/rtems-bsd-kernel-space.h 
b/rtemsbsd/include/machine/rtems-bsd-kernel-space.h
index 37bd701d..7b766538 100644
--- a/rtemsbsd/include/machine/rtems-bsd-kernel-space.h
+++ b/rtemsbsd/include/machine/rtems-bsd-kernel-space.h
@@ -233,11 +233,6 @@ dev_t rtems_bsd__makedev(int _M, int _m);
  */
 #define SIGISMEMBER(set, signo) (0)
 
-/*
- * Special knote status bit to indicate the kn_fp is an iop.
- */
-#define KN_FP_IS_IOP       0x10000000
-
 /*
  * Ensure that padding bytes are zeroed and that the name is NUL-terminated.
  */
diff --git a/rtemsbsd/include/machine/rtems-bsd-libio.h 
b/rtemsbsd/include/machine/rtems-bsd-libio.h
index e662a9ec..3c3a8bbb 100644
--- a/rtemsbsd/include/machine/rtems-bsd-libio.h
+++ b/rtemsbsd/include/machine/rtems-bsd-libio.h
@@ -54,6 +54,8 @@ extern const rtems_filesystem_file_handlers_r 
rtems_bsd_sysgen_imfsnodeops;
 extern const rtems_filesystem_file_handlers_r rtems_bsd_sysgen_dirops;
 extern const rtems_filesystem_file_handlers_r rtems_bsd_sysgen_fileops;
 
+int rtems_bsd_sysgen_close(rtems_libio_t *iop);
+
 static int inline rtems_bsd_error_to_status_and_errno(int error)
 {
        if (error == 0) {
@@ -63,26 +65,6 @@ static int inline rtems_bsd_error_to_status_and_errno(int 
error)
        }
 }
 
-static inline uint32_t
-rtems_bsd_libio_fflag_to_flags(u_int fflag)
-{
-       uint32_t libio_flags = 0;
-
-       if ((fflag & FREAD) == FREAD) {
-               libio_flags |= LIBIO_FLAGS_READ;
-       }
-
-       if ((fflag & FWRITE) == FWRITE) {
-               libio_flags |= LIBIO_FLAGS_WRITE;
-       }
-
-       if ((fflag & FNONBLOCK) == FNONBLOCK) {
-               libio_flags |= LIBIO_FLAGS_NO_DELAY;
-       }
-
-       return (libio_flags);
-}
-
 static inline u_int
 rtems_bsd_libio_flags_to_fflag(uint32_t libio_flags)
 {
@@ -103,20 +85,6 @@ rtems_bsd_libio_flags_to_fflag(uint32_t libio_flags)
        return (fflag);
 }
 
-static inline bool
-rtems_bsd_is_libbsd_nvops(rtems_libio_t *iop)
-{
-       return (iop->pathinfo.handlers == &rtems_bsd_sysgen_dirops ||
-           iop->pathinfo.handlers == &rtems_bsd_sysgen_fileops);
-}
-
-static inline bool
-rtems_bsd_is_libbsd_descriptor(rtems_libio_t *iop)
-{
-       return (iop->pathinfo.handlers == &rtems_bsd_sysgen_nodeops ||
-           rtems_bsd_is_libbsd_nvops(iop));
-}
-
 static inline rtems_libio_t *
 rtems_bsd_libio_loc_to_iop(const rtems_filesystem_location_info_t *loc)
 {
@@ -151,173 +119,19 @@ rtems_bsd_libio_loc_to_vnode_dir(const 
rtems_filesystem_location_info_t *loc)
            ->node_access_2;
 }
 
-static inline void
-rtems_bsd_libio_iop_free(rtems_libio_t *iop)
-{
-       rtems_libio_free(iop);
-}
-
-static int
-rtems_bsd_libio_iop_to_descriptor(rtems_libio_t *iop)
-{
-       return (int)iop->data0;
-}
-
 static struct vnode *
 rtems_bsd_libio_iop_to_vnode(rtems_libio_t *iop)
 {
        return rtems_bsd_libio_loc_to_vnode(&iop->pathinfo);
 }
 
-static int
-rtems_bsd_libio_fd_to_descriptor(int fd)
-{
-       return rtems_bsd_libio_iop_to_descriptor(rtems_libio_iop(fd));
-}
-
 static inline struct file *
-rtems_bsd_libio_iop_to_file_hold(rtems_libio_t *iop, struct thread *td)
-{
-       struct file *fp;
-       int error = fget_unlocked(td->td_proc->p_fd,
-           rtems_bsd_libio_iop_to_descriptor(iop), NULL, &fp, NULL);
-       if (error != 0) {
-               fp = NULL;
-       }
-       return fp;
-}
-
-static inline int
-rtems_bsd_file_to_libio_fd(struct file *fp)
-{
-       return fp->f_io - rtems_libio_iops;
-}
-
-static inline void
-rtems_bsd_libio_iop_set_bsd_descriptor(rtems_libio_t *iop, int fd)
-{
-       iop->data0 = fd;
-       /* if not vnops the fstat passes a loc, need to get the iop to get the
-        * fp */
-       if (!rtems_bsd_is_libbsd_nvops(iop)) {
-               iop->pathinfo.node_access = iop;
-       }
-}
-
-static inline void
-rtems_bsd_libio_iop_set_bsd_file(rtems_libio_t *iop, struct file *fp)
-{
-       fp->f_io = iop;
-}
-
-/*
- * The fd is a libio file descriptor.
- *
- * Return -1 if the descriptor is closed or not valid. The descriptor is not
- * held.
- *
- * If open hold the descriptor. If the descriptor referneces a BSD
- * descriptor return the BSD descriptor else return the libio descriptor.
- *
- * Optionally return the iop in *iopp if the descriptor if a libio descriptor
- * else return NULL.
- */
-static inline int
-rtems_bsd_libio_iop_hold(int fd, rtems_libio_t **iopp)
+rtems_bsd_knote_to_file(const struct knote *kn)
 {
-       rtems_libio_t *iop = NULL;
-       unsigned int flags = 0;
-       int ffd = -1;
-       if (fd < rtems_libio_number_iops) {
-               iop = rtems_libio_iop(fd);
-               flags = rtems_libio_iop_hold(iop);
-               if ((flags & LIBIO_FLAGS_OPEN) != 0) {
-                       if (rtems_bsd_is_libbsd_descriptor(iop)) {
-                               ffd = rtems_bsd_libio_iop_to_descriptor(iop);
-                               if (iopp != NULL) {
-                                       *iopp = NULL;
-                               }
-                       } else {
-                               ffd = fd;
-                               if (iopp != NULL) {
-                                       *iopp = iop;
-                               }
-                       }
-               } else {
-                       rtems_libio_iop_drop(iop);
-               }
-               if (RTEMS_BSD_DESCRIP_TRACE)
-                       flags = iop->flags;
-       } else {
-               *iopp = NULL;
-       }
-       if (RTEMS_BSD_DESCRIP_TRACE)
-               printf("bsd: iop: hold: fd=%d ffd=%d refs=%d iop=%p by %p\n",
-                   fd, ffd, flags >> 12, iop, __builtin_return_address(0));
-       return ffd;
+       return (kn->kn_fp->data1);
 }
 
-static inline int
-rtems_bsd_libio_iop_drop(int fd)
-{
-       if (RTEMS_BSD_DESCRIP_TRACE)
-               printf("bsd: iop: drop: fd=%d refs=%d by %p\n", fd,
-                   rtems_libio_iop(fd)->flags >> 12,
-                   __builtin_return_address(0));
-       rtems_libio_iop_drop(rtems_libio_iop(fd));
-       return 0;
-}
-
-static inline int
-rtems_bsd_libio_fo_poll(int fd, struct file *fp, int events,
-    struct ucred *active_cred, struct thread *td)
-{
-       int error;
-       if (fp == NULL) {
-               rtems_libio_t *iop = rtems_libio_iop(fd);
-               error = (*iop->pathinfo.handlers->poll_h)(iop, events);
-       } else {
-               error = (*fp->f_ops->fo_poll)(fp, events, active_cred, td);
-               fd = rtems_bsd_file_to_libio_fd(fp);
-       }
-       rtems_bsd_libio_iop_drop(fd);
-       return error;
-}
-
-static inline void
-rtems_bsd_libio_iop_to_knote(struct knote *kn, rtems_libio_t *iop)
-{
-       kn->kn_fp = (struct file *)iop;
-}
-
-static inline struct kqueue *
-rtems_bsd_libio_knote_to_kq(struct knote *kn)
-{
-       struct kqueue *kq = kn->kn_kq;
-       if ((kn->kn_status & KN_FP_IS_IOP) == 0) {
-               if (kq != kn->kn_fp->f_data)
-                       panic("libio kq wrong\n");
-       }
-       return kq;
-}
-
-/*
- * Returns an iop with null file system mount or NULL is ENFILE.
- */
-rtems_libio_t *rtems_bsd_libio_iop_allocate(void);
-
-/*
- * Returns the libio descriptor or -1 if ENFILE.
- */
-int rtems_bsd_libio_iop_allocate_with_file(
-    struct thread *td, int fd, const rtems_filesystem_file_handlers_r *ops);
-
-/*
- * Set the BSD file descriptor in the iop. Returns 0 if successful or an error
- * number,
- */
-int rtems_bsd_libio_iop_set_bsd_fd(struct thread *td, int fd,
-    rtems_libio_t *iop, const rtems_filesystem_file_handlers_r *ops);
+struct file *rtems_bsd_iop_to_file(const rtems_libio_t *iop);
 
 /*
  * Set the vnode in the libio location.
diff --git a/rtemsbsd/rtems/rtems-bsd-libio.c b/rtemsbsd/rtems/rtems-bsd-libio.c
index fba82831..59f22feb 100644
--- a/rtemsbsd/rtems/rtems-bsd-libio.c
+++ b/rtemsbsd/rtems/rtems-bsd-libio.c
@@ -45,67 +45,6 @@
 
 #include <rtems/libio.h>
 
-rtems_libio_t *
-rtems_bsd_libio_iop_allocate(void)
-{
-       rtems_libio_t *iop = rtems_libio_allocate();
-       if (iop != NULL) {
-               iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
-               rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
-       }
-       return iop;
-}
-
-int
-rtems_bsd_libio_iop_allocate_with_file(
-    struct thread *td, int fd, const rtems_filesystem_file_handlers_r *ops)
-{
-       rtems_libio_t *iop = rtems_bsd_libio_iop_allocate();
-       int iofd = -1;
-       if (iop != NULL) {
-               int error = rtems_bsd_libio_iop_set_bsd_fd(td, fd, iop, ops);
-               /*
-                * The fp is held and needs to be dropped and that drops the
-                * iop.
-                */
-               if (error == 0) {
-                       rtems_libio_iop_hold(iop);
-                       iofd = rtems_libio_iop_to_descriptor(iop);
-               } else {
-                       rtems_libio_free(iop);
-               }
-       }
-       return iofd;
-}
-
-int
-rtems_bsd_libio_iop_set_bsd_fd(struct thread *td, int fd, rtems_libio_t *iop,
-    const rtems_filesystem_file_handlers_r *ops)
-{
-       struct filedesc *fdp = td->td_proc->p_fd;
-       int error;
-       FILEDESC_XLOCK(fdp);
-       if (fd < fdp->fd_nfiles) {
-               struct file *fp = fget_locked(fdp, fd);
-               if (fp != NULL) {
-                       rtems_bsd_libio_iop_set_bsd_file(iop, fp);
-                       rtems_libio_iop_flags_set(iop,
-                           LIBIO_FLAGS_OPEN |
-                               rtems_bsd_libio_fflag_to_flags(fp->f_flag));
-                       if (ops != NULL)
-                               iop->pathinfo.handlers = ops;
-                       rtems_bsd_libio_iop_set_bsd_descriptor(iop, fd);
-                       error = 0;
-               } else {
-                       error = EBADF;
-               }
-       } else {
-               error = EBADF;
-       }
-       FILEDESC_XUNLOCK(fdp);
-       return error;
-}
-
 void
 rtems_bsd_libio_loc_set_vnode(
     rtems_filesystem_location_info_t *loc, struct vnode *vp)
diff --git a/rtemsbsd/rtems/rtems-bsd-syscall-api.c 
b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
index 5c45d88a..ba8a6b60 100644
--- a/rtemsbsd/rtems/rtems-bsd-syscall-api.c
+++ b/rtemsbsd/rtems/rtems-bsd-syscall-api.c
@@ -43,6 +43,7 @@
 #include <sys/file.h>
 #include <sys/filedesc.h>
 #include <sys/proc.h>
+#include <sys/socketvar.h>
 #include <sys/syscallsubr.h>
 #include <sys/sysproto.h>
 #include <sys/vnode.h>
@@ -63,7 +64,6 @@ static int rtems_bsd_sysgen_opendir(
     rtems_libio_t *iop, const char *path, int oflag, mode_t mode);
 static int rtems_bsd_sysgen_open(
     rtems_libio_t *iop, const char *path, int oflag, mode_t mode);
-static int rtems_bsd_sysgen_close(rtems_libio_t *iop);
 static ssize_t rtems_bsd_sysgen_read(
     rtems_libio_t *iop, void *buffer, size_t count);
 static ssize_t rtems_bsd_sysgen_readv(
@@ -165,6 +165,98 @@ const rtems_filesystem_file_handlers_r 
rtems_bsd_sysgen_imfsnodeops = {
        .mmap_h = rtems_filesystem_default_mmap
 };
 
+int
+rtems_bsd_getsock(int fd, struct file **fpp, u_int *fflagp)
+{
+       int error;
+       rtems_libio_t *iop;
+       unsigned int actual_flags;
+       struct file *fp;
+
+       if ((uint32_t)fd >= rtems_libio_number_iops) {
+               error = EBADF;
+               goto bad;
+       }
+
+       iop = rtems_libio_iop(fd);
+       actual_flags = rtems_libio_iop_hold(iop);
+
+       if ((actual_flags & LIBIO_FLAGS_OPEN) != LIBIO_FLAGS_OPEN) {
+               error = EBADF;
+               goto drop;
+       }
+
+       if (iop->pathinfo.handlers->close_h != rtems_bsd_sysgen_close) {
+               error = ENOTSOCK;
+               goto drop;
+       }
+
+       fp = iop->data1;
+
+       if (fp->f_type != DTYPE_SOCKET) {
+               error = ENOTSOCK;
+               goto drop;
+       }
+
+       if (fflagp != NULL)
+               *fflagp = fp->f_flag;
+       *fpp = fp;
+       return (0);
+
+drop:
+       rtems_libio_iop_drop(iop);
+
+bad:
+       *fpp = NULL;
+       return (error);
+}
+
+struct file *
+rtems_bsd_iop_to_file(const rtems_libio_t *iop)
+{
+
+       if (iop->pathinfo.handlers->close_h != rtems_bsd_sysgen_close) {
+               return (NULL);
+       }
+
+       return (iop->data1);
+}
+
+int
+rtems_bsd_falloc(struct file **resultfp, int *resultfd)
+{
+       struct file *fp;
+       rtems_libio_t *iop;
+
+       fp = malloc(sizeof(*fp), M_TEMP, M_ZERO | M_NOWAIT);
+       *resultfp = fp;
+       if (fp == NULL) {
+               return (ENOMEM);
+       }
+
+       iop = rtems_libio_allocate();
+       if (iop == NULL) {
+               return (ENFILE);
+       }
+
+        fp->f_io = iop;
+        iop->data1 = fp;
+       iop->pathinfo.node_access = iop;
+       iop->pathinfo.handlers = &rtems_bsd_sysgen_nodeops;
+       iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
+       rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
+       *resultfd = rtems_libio_iop_to_descriptor(iop);
+       return (0);
+}
+
+void
+rtems_bsd_fdclose(struct file *fp)
+{
+
+       rtems_libio_free(fp->f_io);
+       free(fp, M_TEMP);
+}
+
 int
 accept(int socket, struct sockaddr *__restrict address,
     socklen_t *__restrict address_len)
@@ -181,37 +273,14 @@ accept(int socket, struct sockaddr *__restrict address,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       int ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.name = address;
        ua.anamelen = address_len;
        error = sys_accept(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
-       if (error != 0) {
-               return rtems_bsd_error_to_status_and_errno(error);
-       }
-       iop = rtems_bsd_libio_iop_allocate();
-       afd = td->td_retval[0];
-       if (iop == NULL) {
-               kern_close(td, afd);
-               return rtems_bsd_error_to_status_and_errno(ENFILE);
-       }
-       error = rtems_bsd_libio_iop_set_bsd_fd(
-           td, afd, iop, &rtems_bsd_sysgen_nodeops);
        if (error != 0) {
-               rtems_bsd_libio_iop_free(iop);
-               kern_close(td, afd);
                return rtems_bsd_error_to_status_and_errno(error);
        }
-       if (RTEMS_BSD_SYSCALL_TRACE) {
-               printf("bsd: sys: accept: %d (%d) => %d -> %d\n", socket, ffd,
-                   rtems_libio_iop_to_descriptor(iop),
-                   rtems_bsd_libio_iop_to_descriptor(iop));
-       }
-       return rtems_libio_iop_to_descriptor(iop);
+       return (td->td_retval[0]);
 }
 
 int
@@ -219,7 +288,6 @@ bind(int socket, const struct sockaddr *address, socklen_t 
address_len)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct bind_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: bind: %d\n", socket);
@@ -227,15 +295,10 @@ bind(int socket, const struct sockaddr *address, 
socklen_t address_len)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd == -1) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.name = address;
        ua.namelen = address_len;
        error = sys_bind(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -244,7 +307,6 @@ connect(int socket, const struct sockaddr *address, 
socklen_t address_len)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct connect_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: connect: %d\n", socket);
@@ -252,15 +314,10 @@ connect(int socket, const struct sockaddr *address, 
socklen_t address_len)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.name = address;
        ua.namelen = address_len;
        error = sys_connect(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -270,7 +327,6 @@ getpeername(int socket, struct sockaddr *__restrict address,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct getpeername_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: getpeername: %d\n", socket);
@@ -278,15 +334,10 @@ getpeername(int socket, struct sockaddr *__restrict 
address,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.fdes = ffd;
+       ua.fdes = socket;
        ua.asa = address;
        ua.alen = address_len;
        error = sys_getpeername(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -296,7 +347,6 @@ getsockname(int socket, struct sockaddr *__restrict address,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct getsockname_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: getsockname: %d\n", socket);
@@ -304,15 +354,10 @@ getsockname(int socket, struct sockaddr *__restrict 
address,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.fdes = ffd;
+       ua.fdes = socket;
        ua.asa = address;
        ua.alen = address_len;
        error = sys_getsockname(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -322,7 +367,6 @@ getsockopt(int socket, int level, int option_name,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct getsockopt_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: getsockopt: %d\n", socket);
@@ -330,17 +374,12 @@ getsockopt(int socket, int level, int option_name,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.level = level;
        ua.name = option_name;
        ua.val = (caddr_t)option_value;
        ua.avalsize = option_len;
        error = sys_getsockopt(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -349,7 +388,6 @@ kqueue(void)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct kqueue_args ua = {};
-       rtems_libio_t *iop;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: kqueue:\n");
@@ -357,28 +395,11 @@ kqueue(void)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       iop = rtems_bsd_libio_iop_allocate();
-       if (iop == NULL) {
-               return rtems_bsd_error_to_status_and_errno(ENFILE);
-       }
        error = sys_kqueue(td, &ua);
        if (error != 0) {
-               goto out;
-       }
-       error = rtems_bsd_libio_iop_set_bsd_fd(
-           td, td->td_retval[0], iop, &rtems_bsd_sysgen_nodeops);
-       if (error == 0) {
-               if (RTEMS_BSD_SYSCALL_TRACE) {
-                       printf("bsd: sys: kqueue: %d -> %d\n",
-                           rtems_libio_iop_to_descriptor(iop),
-                           rtems_bsd_libio_iop_to_descriptor(iop));
-               }
-               return rtems_libio_iop_to_descriptor(iop);
+               return rtems_bsd_error_to_status_and_errno(error);
        }
-       kern_close(td, rtems_libio_iop_to_descriptor(iop));
-out:
-       rtems_bsd_libio_iop_free(iop);
-       return rtems_bsd_error_to_status_and_errno(error);
+       return (td->td_retval[0]);
 }
 
 __weak_reference(kevent, _kevent);
@@ -397,18 +418,13 @@ kevent(int kq, const struct kevent *changelist, int 
nchanges,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(kq, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.fd = ffd;
+       ua.fd = kq;
        ua.changelist = changelist;
        ua.nchanges = nchanges;
        ua.eventlist = eventlist;
        ua.nevents = nevents;
        ua.timeout = timeout;
        error = sys_kevent(td, &ua);
-       rtems_bsd_libio_iop_drop(kq);
        if (error != 0) {
                return rtems_bsd_error_to_status_and_errno(error);
        }
@@ -420,7 +436,6 @@ listen(int socket, int backlog)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct listen_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: listen: %d\n", socket);
@@ -428,14 +443,9 @@ listen(int socket, int backlog)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.backlog = backlog;
        error = sys_listen(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -507,7 +517,6 @@ recvfrom(int socket, void *__restrict buffer, size_t 
length, int flags,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct recvfrom_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: recvfrom: %d\n", socket);
@@ -515,18 +524,13 @@ recvfrom(int socket, void *__restrict buffer, size_t 
length, int flags,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.buf = buffer;
        ua.len = length;
        ua.flags = flags;
        ua.from = address;
        ua.fromlenaddr = address_len;
        error = sys_recvfrom(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        if (error != 0) {
                return rtems_bsd_error_to_status_and_errno(error);
        }
@@ -538,7 +542,6 @@ recvmsg(int socket, struct msghdr *message, int flags)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct recvmsg_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: recvmsg: %d\n", socket);
@@ -546,15 +549,10 @@ recvmsg(int socket, struct msghdr *message, int flags)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.msg = message;
        ua.flags = flags;
        error = sys_recvmsg(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        if (error != 0) {
                return rtems_bsd_error_to_status_and_errno(error);
        }
@@ -591,7 +589,6 @@ sendto(int socket, const void *message, size_t length, int 
flags,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct sendto_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: sendto: %d\n", socket);
@@ -599,18 +596,13 @@ sendto(int socket, const void *message, size_t length, 
int flags,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.buf = (caddr_t)message;
        ua.len = length;
        ua.flags = flags;
        ua.to = dest_addr;
        ua.tolen = dest_len;
        error = sys_sendto(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        if (error != 0) {
                return rtems_bsd_error_to_status_and_errno(error);
        }
@@ -622,7 +614,6 @@ sendmsg(int socket, const struct msghdr *message, int flags)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct sendmsg_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: sendmsg: %d\n", socket);
@@ -630,15 +621,10 @@ sendmsg(int socket, const struct msghdr *message, int 
flags)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.msg = message;
        ua.flags = flags;
        error = sys_sendmsg(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -648,7 +634,6 @@ setsockopt(int socket, int level, int option_name, const 
void *option_value,
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
        struct setsockopt_args ua;
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: setsockopt: %d\n", socket);
@@ -656,17 +641,12 @@ setsockopt(int socket, int level, int option_name, const 
void *option_value,
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       ua.s = ffd;
+       ua.s = socket;
        ua.level = level;
        ua.name = option_name;
        ua.val = __DECONST(void *, option_value);
        ua.valsize = option_len;
        error = sys_setsockopt(td, &ua);
-       rtems_bsd_libio_iop_drop(socket);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -674,7 +654,6 @@ int
 shutdown(int socket, int how)
 {
        struct thread *td = rtems_bsd_get_curthread_or_null();
-       int ffd;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: shutdown: %d\n", socket);
@@ -682,17 +661,8 @@ shutdown(int socket, int how)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       ffd = rtems_bsd_libio_iop_hold(socket, NULL);
-       if (ffd < 0) {
-               return rtems_bsd_error_to_status_and_errno(EBADF);
-       }
-       if (rtems_bsd_is_libbsd_descriptor(rtems_libio_iop(socket))) {
-               struct shutdown_args ua = { .s = ffd, .how = how };
-               error = sys_shutdown(td, &ua);
-       } else {
-               error = ENOTSOCK;
-       }
-       rtems_bsd_libio_iop_drop(socket);
+       struct shutdown_args ua = { .s = socket, .how = how };
+       error = sys_shutdown(td, &ua);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -700,45 +670,26 @@ int
 socket(int domain, int type, int protocol)
 {
        struct thread *td;
-       rtems_libio_t *iop;
        struct socket_args ua;
        int error;
        td = rtems_bsd_get_curthread_or_null();
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       iop = rtems_bsd_libio_iop_allocate();
-       if (iop == NULL) {
-               return rtems_bsd_error_to_status_and_errno(ENFILE);
-       }
        ua.domain = domain;
        ua.type = type;
        ua.protocol = protocol;
        error = sys_socket(td, &ua);
        if (error != 0) {
-               rtems_bsd_libio_iop_free(iop);
-               return rtems_bsd_error_to_status_and_errno(error);
-       }
-       error = rtems_bsd_libio_iop_set_bsd_fd(
-           td, td->td_retval[0], iop, &rtems_bsd_sysgen_nodeops);
-       if (error != 0) {
-               kern_close(td, td->td_retval[0]);
-               rtems_bsd_libio_iop_free(iop);
                return rtems_bsd_error_to_status_and_errno(error);
        }
-       if (RTEMS_BSD_SYSCALL_TRACE) {
-               printf("bsd: sys: socket: %d -> %d\n",
-                   rtems_libio_iop_to_descriptor(iop),
-                   rtems_bsd_libio_iop_to_descriptor(iop));
-       }
-       return rtems_libio_iop_to_descriptor(iop);
+       return (td->td_retval[0]);
 }
 
 int
 socketpair(int domain, int type, int protocol, int *socket_vector)
 {
        struct thread *td;
-       rtems_libio_t *iop[2];
        struct socketpair_args ua;
        int error;
        if (RTEMS_BSD_SYSCALL_TRACE) {
@@ -748,48 +699,15 @@ socketpair(int domain, int type, int protocol, int 
*socket_vector)
        if (td == NULL) {
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       iop[0] = rtems_bsd_libio_iop_allocate();
-       if (iop[0] == NULL) {
-               return rtems_bsd_error_to_status_and_errno(ENFILE);
-       }
-       iop[1] = rtems_bsd_libio_iop_allocate();
-       if (iop[1] == NULL) {
-               rtems_bsd_libio_iop_free(iop[0]);
-               return rtems_bsd_error_to_status_and_errno(ENFILE);
-       }
        ua.domain = domain;
        ua.type = type;
        ua.protocol = protocol;
        ua.rsv = socket_vector;
        error = sys_socketpair(td, &ua);
        if (error != 0) {
-               goto out;
-       }
-       error = rtems_bsd_libio_iop_set_bsd_fd(
-           td, socket_vector[0], iop[0], &rtems_bsd_sysgen_nodeops);
-       if (error != 0) {
-               goto out;
-       }
-       error = rtems_bsd_libio_iop_set_bsd_fd(
-           td, socket_vector[1], iop[1], &rtems_bsd_sysgen_nodeops);
-       if (error == 0) {
-               socket_vector[0] = rtems_libio_iop_to_descriptor(iop[0]);
-               socket_vector[1] = rtems_libio_iop_to_descriptor(iop[1]);
-               if (RTEMS_BSD_SYSCALL_TRACE) {
-                       printf("bsd: sys: socketpair: %d -> %d, %d -> %d\n",
-                           socket_vector[0],
-                           rtems_bsd_libio_iop_to_descriptor(iop[0]),
-                           socket_vector[1],
-                           rtems_bsd_libio_iop_to_descriptor(iop[1]));
-               }
-               return 0;
+               return rtems_bsd_error_to_status_and_errno(error);
        }
-out:
-       kern_close(td, rtems_bsd_libio_iop_to_descriptor(iop[0]));
-       kern_close(td, rtems_bsd_libio_iop_to_descriptor(iop[1]));
-       rtems_bsd_libio_iop_free(iop[0]);
-       rtems_bsd_libio_iop_free(iop[1]);
-       return rtems_bsd_error_to_status_and_errno(error);
+       return (0);
 }
 
 
@@ -814,6 +732,7 @@ rtems_bsd_sysgen_open_node(
        int opathlen;
        int fd;
        int error;
+       struct vnode *vn;
 
        if (td == NULL) {
                if (RTEMS_BSD_SYSCALL_TRACE) {
@@ -822,6 +741,18 @@ rtems_bsd_sysgen_open_node(
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
 
+
+       fp = malloc(sizeof(*fp), M_TEMP, M_ZERO | M_NOWAIT);
+       if (fp == NULL) {
+               return rtems_bsd_error_to_status_and_errno(ENOMEM);
+       }
+
+       refcount_init(&fp->f_count, 1);
+       fp->f_cred = crhold(td->td_ucred);
+       fp->f_ops = &badfileops;
+       fp->f_io = iop;
+       iop->data1 = fp;
+
        fdp = td->td_proc->p_fd;
 
        /*
@@ -890,7 +821,7 @@ rtems_bsd_sysgen_open_node(
        VREF(fdp->fd_cdir);
 
        error = kern_openat(td, AT_FDCWD, RTEMS_DECONST(char *, opath),
-           UIO_USERSPACE, oflag, mode);
+           UIO_USERSPACE, oflag, mode, fp);
 
        vrele(fdp->fd_cdir);
 
@@ -907,19 +838,10 @@ rtems_bsd_sysgen_open_node(
        FILEDESC_XLOCK(fdp);
        fdp->fd_cdir = cdir;
        fdp->fd_rdir = rdir;
-       if (fd < fdp->fd_nfiles) {
-               struct vnode *vn;
-               fp = fget_locked(fdp, fd);
-               if (fp != NULL) {
-                       vn = fp->f_vnode;
-               } else {
-                       vn = NULL;
-               }
-               rtems_bsd_libio_loc_set_vnode(&iop->pathinfo, vn);
-       }
+       rtems_bsd_libio_loc_set_vnode(&iop->pathinfo, fp->f_vnode);
        FILEDESC_XUNLOCK(fdp);
 
-       rtems_bsd_libio_iop_set_bsd_fd(td, fd, iop, &rtems_bsd_sysgen_fileops);
+        iop->pathinfo.handlers = &rtems_bsd_sysgen_fileops;
 
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: open: fd = %d vn=%p\n", fd,
@@ -946,28 +868,42 @@ rtems_bsd_sysgen_open(
 int
 rtems_bsd_sysgen_close(rtems_libio_t *iop)
 {
-       struct thread *td = curthread;
+       struct thread *td;
+       struct file *fp;
        int error;
-       int ffd = rtems_bsd_libio_iop_to_descriptor(iop);
+
        if (RTEMS_BSD_SYSCALL_TRACE) {
-               printf("bsd: sys: close: %d -> %d\n",
-                   rtems_libio_iop_to_descriptor(iop), ffd);
-       }
-       if (td != NULL) {
-               if (ffd >= 0) {
-                       rtems_libio_iop_hold(iop);
-                       error = kern_close(td, ffd);
-               } else {
-                       error = EBADF;
+               printf("bsd: sys: close: %d\n",
+                   rtems_libio_iop_to_descriptor(iop));
+       }
+
+       td = rtems_bsd_get_curthread_or_null();
+       if (td == NULL) {
+               if (RTEMS_BSD_SYSCALL_TRACE) {
+                       printf("bsd: sys: close: no curthread\n");
                }
-       } else {
-               error = ENOMEM;
+               return (rtems_bsd_error_to_status_and_errno(ENOMEM));
        }
-       if (RTEMS_BSD_SYSCALL_TRACE) {
-               printf("bsd: sys: close: %d: %d: %s\n",
-                   rtems_libio_iop_to_descriptor(iop), error, strerror(error));
+
+       fp = iop->data1;
+       BSD_ASSERT(fp->f_count == 1);
+       error = (fo_close(fp, td));
+       if (error != 0) {
+               if (RTEMS_BSD_SYSCALL_TRACE) {
+                       printf("bsd: sys: close: error = %d\n", error);
+               }
+               return (rtems_bsd_error_to_status_and_errno(error));
        }
-       return rtems_bsd_error_to_status_and_errno(error);
+
+       if (RTEMS_BSD_SYSCALL_TRACE) {
+               printf("bsd: sys: close: success\n");
+       }
+       FILEDESC_XLOCK(NULL);
+       knote_fdclose(td, rtems_libio_iop_to_descriptor(iop));
+       FILEDESC_XUNLOCK(NULL);
+       crfree(fp->f_cred);
+       free(fp, M_TEMP);
+       return (0);
 }
 
 ssize_t
@@ -975,7 +911,7 @@ rtems_bsd_sysgen_read(rtems_libio_t *iop, void *buffer, 
size_t count)
 {
        struct thread *td = curthread;
        struct vnode *vp = rtems_bsd_libio_iop_to_vnode(iop);
-       int fd = rtems_bsd_libio_iop_to_descriptor(iop);
+       int fd = rtems_libio_iop_to_descriptor(iop);
        int error;
        ssize_t size = 0;
 
@@ -1046,7 +982,7 @@ rtems_bsd_sysgen_read(rtems_libio_t *iop, void *buffer, 
size_t count)
                        .uio_rw = UIO_READ,
                        .uio_td = td };
                error = kern_readv(
-                   td, rtems_bsd_libio_iop_to_descriptor(iop), &auio);
+                   td, rtems_libio_iop_to_descriptor(iop), &auio);
                if (error == 0)
                        size = td->td_retval[0];
        }
@@ -1091,7 +1027,7 @@ rtems_bsd_sysgen_readv(
        auio.uio_resid = total;
        auio.uio_segflg = UIO_USERSPACE;
 
-       error = kern_readv(td, rtems_bsd_libio_iop_to_descriptor(iop), &auio);
+       error = kern_readv(td, rtems_libio_iop_to_descriptor(iop), &auio);
 
        if (error != 0)
                return rtems_bsd_error_to_status_and_errno(error);
@@ -1129,7 +1065,7 @@ rtems_bsd_sysgen_write(rtems_libio_t *iop, const void 
*buffer, size_t count)
        auio.uio_resid = count;
        auio.uio_segflg = UIO_USERSPACE;
 
-       error = kern_writev(td, rtems_bsd_libio_iop_to_descriptor(iop), &auio);
+       error = kern_writev(td, rtems_libio_iop_to_descriptor(iop), &auio);
 
        if (error != 0)
                return rtems_bsd_error_to_status_and_errno(error);
@@ -1165,7 +1101,7 @@ rtems_bsd_sysgen_writev(
        auio.uio_resid = total;
        auio.uio_segflg = UIO_USERSPACE;
 
-       error = kern_writev(td, rtems_bsd_libio_iop_to_descriptor(iop), &auio);
+       error = kern_writev(td, rtems_libio_iop_to_descriptor(iop), &auio);
 
        if (error != 0)
                return rtems_bsd_error_to_status_and_errno(error);
@@ -1191,7 +1127,7 @@ rtems_bsd_sysgen_ioctl(
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
        error = kern_ioctl(
-           td, rtems_bsd_libio_iop_to_descriptor(iop), com, buffer);
+           td, rtems_libio_iop_to_descriptor(iop), com, buffer);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -1211,7 +1147,7 @@ rtems_bsd_sysgen_lseek(rtems_libio_t *iop, off_t offset, 
int whence)
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
        error = kern_lseek(
-           td, rtems_bsd_libio_iop_to_descriptor(iop), offset, whence);
+           td, rtems_libio_iop_to_descriptor(iop), offset, whence);
        if (error != 0) {
                return rtems_bsd_error_to_status_and_errno(error);
        }
@@ -1253,9 +1189,7 @@ rtems_bsd_sysgen_fstat(
 {
        struct thread *td = curthread;
        rtems_libio_t *iop = rtems_bsd_libio_loc_to_iop(loc);
-       struct filedesc *fdp;
        struct file *fp = NULL;
-       int fd;
        int error;
        if (iop == NULL) {
                if (RTEMS_BSD_SYSCALL_TRACE) {
@@ -1263,22 +1197,13 @@ rtems_bsd_sysgen_fstat(
                }
                return rtems_bsd_error_to_status_and_errno(ENXIO);
        }
-       fd = rtems_bsd_libio_iop_to_descriptor(iop);
-       if (RTEMS_BSD_SYSCALL_TRACE) {
-               printf("bsd: sys: fstat: %d\n", fd);
-       }
        if (td == NULL) {
                if (RTEMS_BSD_SYSCALL_TRACE) {
                        printf("bsd: sys: fstat: no curthread\n");
                }
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       fdp = td->td_proc->p_fd;
-       FILEDESC_XLOCK(fdp);
-       if (fd < fdp->fd_nfiles) {
-               fp = fget_locked(fdp, fd);
-       }
-       FILEDESC_XUNLOCK(fdp);
+       fp = rtems_bsd_iop_to_file(iop);
        if (fp != NULL) {
                error = fo_stat(fp, buf, NULL, td);
        } else {
@@ -1293,11 +1218,9 @@ rtems_bsd_sysgen_imfsfstat(
 {
        struct thread *td = curthread;
        struct socket *so = rtems_bsd_libio_imfs_loc_to_so(loc);
-       struct filedesc *fdp;
        struct file *fp = NULL;
-       struct socket *fd_so = NULL;
-       int fd;
        int error;
+       int fd;
        if (RTEMS_BSD_SYSCALL_TRACE) {
                printf("bsd: sys: imfsfstat: socket=%p\n", so);
        }
@@ -1307,17 +1230,22 @@ rtems_bsd_sysgen_imfsfstat(
                }
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       fdp = td->td_proc->p_fd;
-       FILEDESC_XLOCK(fdp);
-       for (fd = 0; fd < fdp->fd_nfiles; fd++) {
-               fp = fget_locked(fdp, fd);
-               fd_so = fp->f_data;
-               if (so == fd_so) {
+       rtems_libio_lock();
+       for (fd = 0; fd < (int)rtems_libio_number_iops; ++fd) {
+               rtems_libio_t *iop;
+
+               iop = rtems_libio_iop(fd);
+               if (iop->pathinfo.handlers == NULL) {
+                       continue;
+               }
+               fp = rtems_bsd_iop_to_file(iop);
+               if (fp != NULL && fp->f_data == so) {
                        break;
                }
+
                fp = NULL;
        }
-       FILEDESC_XUNLOCK(fdp);
+       rtems_libio_unlock();
        if (fp != NULL) {
                if (RTEMS_BSD_SYSCALL_TRACE) {
                        printf("bsd: sys: imfsfstat: %d\n", fd);
@@ -1344,7 +1272,7 @@ rtems_bsd_sysgen_ftruncate(rtems_libio_t *iop, off_t 
length)
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
        error = kern_ftruncate(
-           td, rtems_bsd_libio_iop_to_descriptor(iop), length);
+           td, rtems_libio_iop_to_descriptor(iop), length);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -1362,7 +1290,7 @@ rtems_bsd_sysgen_fsync(rtems_libio_t *iop)
                }
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       error = kern_fsync(td, rtems_bsd_libio_iop_to_descriptor(iop), true);
+       error = kern_fsync(td, rtems_libio_iop_to_descriptor(iop), true);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -1380,7 +1308,7 @@ rtems_bsd_sysgen_fdatasync(rtems_libio_t *iop)
                }
                return rtems_bsd_error_to_status_and_errno(ENOMEM);
        }
-       error = kern_fsync(td, rtems_bsd_libio_iop_to_descriptor(iop), false);
+       error = kern_fsync(td, rtems_libio_iop_to_descriptor(iop), false);
        return rtems_bsd_error_to_status_and_errno(error);
 }
 
@@ -1416,7 +1344,7 @@ rtems_bsd_sysgen_fcntl(rtems_libio_t *iop, int cmd)
        }
        if (arg >= 0) {
                error = kern_fcntl(
-                   td, rtems_bsd_libio_iop_to_descriptor(iop), cmd, arg);
+                   td, rtems_libio_iop_to_descriptor(iop), cmd, arg);
                /* no return path with the RTEMS API for get calls */
        }
        return rtems_bsd_error_to_status_and_errno(error);
@@ -1425,13 +1353,23 @@ rtems_bsd_sysgen_fcntl(rtems_libio_t *iop, int cmd)
 int
 rtems_bsd_sysgen_poll(rtems_libio_t *iop, int events)
 {
-       printf("rtems_bsd_sysgen_poll called!\n");
-       return rtems_bsd_error_to_status_and_errno(EOPNOTSUPP);
+       struct thread *td;
+       struct file *fp;
+
+       td = rtems_bsd_get_curthread_or_null();
+       if (td == NULL) {
+               return (ENOMEM);
+       }
+
+       fp = iop->data1;
+       return (fo_poll(fp, events, td->td_ucred, td));
 }
 
 int
 rtems_bsd_sysgen_kqfilter(rtems_libio_t *iop, struct knote *kn)
 {
-       printf("rtems_bsd_sysgen_kqfilter called!\n");
-       return rtems_bsd_error_to_status_and_errno(EOPNOTSUPP);
+       struct file *fp;
+
+       fp = iop->data1;
+       return (fo_kqfilter(fp, kn));
 }
diff --git a/rtemsbsd/rtems/rtems-kernel-fget.c 
b/rtemsbsd/rtems/rtems-kernel-fget.c
new file mode 100644
index 00000000..e51ddb57
--- /dev/null
+++ b/rtemsbsd/rtems/rtems-kernel-fget.c
@@ -0,0 +1,79 @@
+/* SPDX-License-Identifier: BSD-2-Clause */
+
+/**
+ * @file
+ *
+ * @ingroup rtems_bsd_rtems
+ *
+ * @brief TODO.
+ */
+
+/*
+ * Copyright (C) 2022 embedded brains GmbH
+ *
+ * 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 COPYRIGHT HOLDERS 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 COPYRIGHT OWNER 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 <machine/rtems-bsd-kernel-space.h>
+
+#include <sys/file.h>
+
+/* Avoid referencing the VFS only through rtems_bsd_fget() */
+__weak_symbol int
+rtems_bsd_sysgen_close(rtems_libio_t *iop)
+{
+
+       (void)iop;
+       return (-1);
+}
+
+int
+rtems_bsd_fget(int fd, struct file **fpp, int flags)
+{
+       rtems_libio_t *iop;
+       unsigned int actual_flags;
+
+       if ((uint32_t)fd >= rtems_libio_number_iops) {
+               goto bad;
+       }
+
+       iop = rtems_libio_iop(fd);
+       actual_flags = rtems_libio_iop_hold(iop);
+
+       if ((actual_flags & flags) != flags) {
+               goto drop;
+       }
+
+       if (iop->pathinfo.handlers->close_h != rtems_bsd_sysgen_close) {
+               goto drop;
+       }
+
+       *fpp = iop->data1;
+       return (0);
+
+drop:
+       rtems_libio_iop_drop(iop);
+
+bad:
+       *fpp = NULL;
+       return (EBADF);
+}
diff --git a/rtemsbsd/rtems/rtems-kernel-init.c 
b/rtemsbsd/rtems/rtems-kernel-init.c
index 90a9c809..454943b3 100644
--- a/rtemsbsd/rtems/rtems-kernel-init.c
+++ b/rtemsbsd/rtems/rtems-kernel-init.c
@@ -141,6 +141,10 @@ cpu_startup(void *dummy)
 }
 SYSINIT(cpu, SI_SUB_CPU, SI_ORDER_FIRST, cpu_startup, NULL);
 
+static struct filedesc p_fd = {
+    .fd_cmask = CMASK
+};
+
 /*
  * Create a single process. RTEMS is a single address, single process OS.
  */
@@ -166,8 +170,7 @@ proc0_init(void *dummy)
        newcred->cr_ruidinfo = uifind(0);
        p->p_ucred = newcred;
        p->p_pid = getpid();
-       p->p_fd = fdinit(NULL, false);
-       p->p_fdtol = NULL;
+       p->p_fd = &p_fd;
        rtems_sysvec.sv_flags = SV_ABI_FREEBSD;
 #ifdef __LP64__
        rtems_sysvec.sv_flags |= SV_LP64;
-- 
2.35.3



_______________________________________________
devel mailing list
devel@rtems.org
http://lists.rtems.org/mailman/listinfo/devel

Reply via email to