Changeset c9db0f5 in rtems-libbsd


Ignore:
Timestamp:
Oct 10, 2013, 11:27:01 AM (6 years ago)
Author:
Sebastian Huber <sebastian.huber@…>
Branches:
4.11, c1e05b9ea378b2971e3d7704779112b4bc4296da, freebsd-9.3, 4a77611a223ea883fb548679b516d326a020d447
Children:
5003e8f
Parents:
8eb42e8
git-author:
Sebastian Huber <sebastian.huber@…> (10/10/13 11:27:01)
git-committer:
Sebastian Huber <sebastian.huber@…> (10/31/13 12:18:46)
Message:

Use RTEMS API for file handling

Files:
1 added
7 edited

Legend:

Unmodified
Added
Removed
  • Makefile

    r8eb42e8 rc9db0f5  
    5858LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-delay.c
    5959LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-descrip.c
     60LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-get-file.c
    6061LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-init.c
    6162LIB_C_FILES += rtemsbsd/rtems/rtems-bsd-init-with-irq.c
  • freebsd-to-rtems.py

    r8eb42e8 rc9db0f5  
    615615                'rtems/rtems-bsd-delay.c',
    616616                'rtems/rtems-bsd-descrip.c',
     617                'rtems/rtems-bsd-get-file.c',
    617618                'rtems/rtems-bsd-init.c',
    618619                'rtems/rtems-bsd-init-with-irq.c',
  • freebsd/sys/kern/sys_generic.c

    r8eb42e8 rc9db0f5  
    852852    fd_set *fd_ex, struct timeval *tvp, int abi_nfdbits)
    853853{
     854#ifndef __rtems__
    854855        struct filedesc *fdp;
     856#endif /* __rtems__ */
    855857        /*
    856858         * The magic 2048 here is chosen to be just enough for FD_SETSIZE
     
    871873        if (nd < 0)
    872874                return (EINVAL);
     875#ifndef __rtems__
    873876        fdp = td->td_proc->p_fd;
    874877        if (nd > fdp->fd_lastfile + 1)
    875878                nd = fdp->fd_lastfile + 1;
     879#else /* __rtems__ */
     880        if (nd > rtems_libio_number_iops)
     881                nd = rtems_libio_number_iops;
     882#endif /* __rtems__ */
    876883
    877884        /*
  • freebsd/sys/sys/file.h

    r8eb42e8 rc9db0f5  
    103103
    104104#if defined(_KERNEL) || defined(_WANT_FILE)
     105#ifdef __rtems__
     106#include <rtems/libio_.h>
     107#include <sys/fcntl.h>
     108#endif /* __rtems__ */
    105109/*
    106110 * Kernel descriptor table.
     
    115119
    116120struct file {
     121#ifndef __rtems__
    117122        void            *f_data;        /* file descriptor specific data */
    118123        struct fileops  *f_ops;         /* File operations */
     
    137142         */
    138143        void            *f_label;       /* Place-holder for MAC label. */
     144#else /* __rtems__ */
     145        rtems_libio_t   f_io;
     146#endif /* __rtems__ */
    139147};
     148#ifdef __rtems__
     149#define f_data f_io.pathinfo.node_access
     150
     151static inline struct file *
     152rtems_bsd_iop_to_fp(rtems_libio_t *iop)
     153{
     154        return (struct file *) iop;
     155}
     156
     157static inline struct file *
     158rtems_bsd_fd_to_fp(int fd)
     159{
     160        return rtems_bsd_iop_to_fp(&rtems_libio_iops[fd]);
     161}
     162
     163static inline int
     164rtems_bsd_fp_to_fd(struct file *fp)
     165{
     166        return fp - rtems_bsd_iop_to_fp(&rtems_libio_iops[0]);
     167}
     168
     169static inline void *
     170rtems_bsd_loc_to_f_data(const rtems_filesystem_location_info_t *loc)
     171{
     172        return loc->node_access;
     173}
     174
     175static inline uint32_t
     176rtems_bsd_fflag_to_libio_flags(u_int fflag)
     177{
     178        uint32_t libio_flags = 0;
     179
     180        if ((fflag & FREAD) == FREAD) {
     181                libio_flags |= LIBIO_FLAGS_READ;
     182        }
     183
     184        if ((fflag & FWRITE) == FWRITE) {
     185                libio_flags |= LIBIO_FLAGS_WRITE;
     186        }
     187
     188        if ((fflag & FNONBLOCK) == FNONBLOCK) {
     189                libio_flags |= LIBIO_FLAGS_NO_DELAY;
     190        }
     191
     192        return (libio_flags);
     193}
     194
     195static inline u_int
     196rtems_bsd_libio_flags_to_fflag(uint32_t libio_flags)
     197{
     198        u_int fflag = 0;
     199
     200        if ((libio_flags & LIBIO_FLAGS_READ) == LIBIO_FLAGS_READ) {
     201                fflag |= FREAD;
     202        }
     203
     204        if ((libio_flags & LIBIO_FLAGS_WRITE) == LIBIO_FLAGS_WRITE) {
     205                fflag |= FWRITE;
     206        }
     207
     208        if ((libio_flags & LIBIO_FLAGS_NO_DELAY) == LIBIO_FLAGS_NO_DELAY) {
     209                fflag |= FNONBLOCK;
     210        }
     211
     212        return (fflag);
     213}
     214
     215static int inline
     216rtems_bsd_error_to_status_and_errno(int error)
     217{
     218        if (error == 0) {
     219                return 0;
     220        } else {
     221                rtems_set_errno_and_return_minus_one(error);
     222        }
     223}
     224#endif /* __rtems__ */
    140225
    141226#define FOFFSET_LOCKED       0x1
     
    175260extern volatile int openfiles;  /* actual number of open files */
    176261
     262#ifndef __rtems__
    177263int fget(struct thread *td, int fd, struct file **fpp);
     264#else /* __rtems__ */
     265struct file *rtems_bsd_get_file(int fd);
     266
     267static inline int
     268fget(struct thread *td, int fd, struct file **fpp)
     269{
     270        struct file *fp = rtems_bsd_get_file(fd);
     271
     272        (void) td;
     273
     274        *fpp = fp;
     275
     276        return fp != NULL ? 0 : EBADF;
     277}
     278#endif /* __rtems__ */
    178279int fget_read(struct thread *td, int fd, struct file **fpp);
    179280int fget_write(struct thread *td, int fd, struct file **fpp);
     
    194295fo_close_t      soo_close;
    195296
     297#ifndef __rtems__
    196298void finit(struct file *, u_int, short, void *, struct fileops *);
     299#else /* __rtems__ */
     300static inline void
     301finit(struct file *fp, u_int fflag, short type, void *data,
     302    const rtems_filesystem_file_handlers_r *ops)
     303{
     304        rtems_filesystem_location_info_t *pathinfo = &fp->f_io.pathinfo;
     305
     306        (void) type;
     307
     308        fp->f_data = data;
     309        fp->f_io.flags |= rtems_bsd_fflag_to_libio_flags(fflag);
     310
     311        pathinfo->handlers = ops;
     312        pathinfo->mt_entry = &rtems_filesystem_null_mt_entry;
     313        rtems_filesystem_location_add_to_mt_entry(pathinfo);
     314}
     315#endif /* __rtems__ */
    197316int fgetvp(struct thread *td, int fd, struct vnode **vpp);
    198317int fgetvp_read(struct thread *td, int fd, struct vnode **vpp);
     
    204323#define fhold(fp)                                                       \
    205324        (refcount_acquire(&(fp)->f_count))
     325#ifndef __rtems__
    206326#define fdrop(fp, td)                                                   \
    207327        (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : 0)
    208 
     328#else /* __rtems__ */
     329#define fdrop(fp, td) do { } while (0)
     330#endif /* __rtems__ */
     331
     332#ifndef __rtems__
    209333static __inline fo_rdwr_t       fo_read;
    210334static __inline fo_rdwr_t       fo_write;
     
    250374        return ((*fp->f_ops->fo_truncate)(fp, length, active_cred, td));
    251375}
     376#endif /* __rtems__ */
    252377
    253378static __inline int
     
    260385{
    261386
     387#ifndef __rtems__
    262388        return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td));
    263 }
    264 
     389#else /* __rtems__ */
     390        int rv;
     391
     392        (void) active_cred;
     393        (void) td;
     394
     395        errno = 0;
     396        rv = ((*fp->f_io.pathinfo.handlers->ioctl_h)(&fp->f_io, com, data));
     397        if (rv == 0) {
     398                return (0);
     399        } else {
     400                return (errno);
     401        }
     402#endif /* __rtems__ */
     403}
     404
     405#ifndef __rtems__
    265406static __inline int
    266407fo_poll(fp, events, active_cred, td)
     
    302443        return ((*fp->f_ops->fo_kqfilter)(fp, kn));
    303444}
     445#endif /* __rtems__ */
    304446
    305447#endif /* _KERNEL */
  • freebsd/sys/sys/filedesc.h

    r8eb42e8 rc9db0f5  
    4848#define NDSLOTTYPE      u_long
    4949
     50#ifndef __rtems__
    5051struct filedesc {
    5152        struct  file **fd_ofiles;       /* file structures for open files */
     
    6667        int     fd_holdleaderswakeup;   /* fdfree() needs wakeup */
    6768};
     69#else /* __rtems__ */
     70struct filedesc;
     71#endif /* __rtems__ */
    6872
    6973/*
     
    7680 * fdl_refcount and fdl_holdcount are protected by struct filedesc mtx.
    7781 */
     82#ifndef __rtems__
    7883struct filedesc_to_leader {
    7984        int             fdl_refcount;   /* references from struct proc */
     
    8590        struct filedesc_to_leader *fdl_next;
    8691};
     92#else /* __rtems__ */
     93struct filedesc_to_leader;
     94#endif /* __rtems__ */
    8795
    8896/*
     
    92100
    93101#ifdef _KERNEL
     102#ifdef __rtems__
     103#include <sys/file.h>
     104#include <rtems/libio_.h>
     105#endif /* __rtems__ */
    94106
    95107/* Lock a file descriptor table. */
     
    97109#define FILEDESC_LOCK_DESTROY(fdp)      sx_destroy(&(fdp)->fd_sx)
    98110#define FILEDESC_LOCK(fdp)      (&(fdp)->fd_sx)
     111#ifndef __rtems__
    99112#define FILEDESC_XLOCK(fdp)     sx_xlock(&(fdp)->fd_sx)
    100113#define FILEDESC_XUNLOCK(fdp)   sx_xunlock(&(fdp)->fd_sx)
    101114#define FILEDESC_SLOCK(fdp)     sx_slock(&(fdp)->fd_sx)
    102115#define FILEDESC_SUNLOCK(fdp)   sx_sunlock(&(fdp)->fd_sx)
     116#else /* __rtems__ */
     117#define FILEDESC_XLOCK(fdp)     do { } while (0)
     118#define FILEDESC_XUNLOCK(fdp)   do { } while (0)
     119#define FILEDESC_SLOCK(fdp)     do { } while (0)
     120#define FILEDESC_SUNLOCK(fdp)   do { } while (0)
     121#endif /* __rtems__ */
    103122
    104123#define FILEDESC_LOCK_ASSERT(fdp)       sx_assert(&(fdp)->fd_sx, SX_LOCKED | \
     
    112131int     dupfdopen(struct thread *td, struct filedesc *fdp, int indx, int dfd,
    113132            int mode, int error);
     133#ifndef __rtems__
    114134int     falloc(struct thread *td, struct file **resultfp, int *resultfd);
     135#else /* __rtems__ */
     136static inline int
     137falloc(struct thread *td, struct file **resultfp, int *resultfd)
     138{
     139        rtems_libio_t *iop = rtems_libio_allocate();
     140
     141        (void) td;
     142
     143        *resultfp = rtems_bsd_iop_to_fp(iop);
     144
     145        if (iop != NULL) {
     146                iop->pathinfo.mt_entry = &rtems_filesystem_null_mt_entry;
     147                rtems_filesystem_location_add_to_mt_entry(&iop->pathinfo);
     148                *resultfd = rtems_libio_iop_to_descriptor(iop);
     149
     150                return (0);
     151        } else {
     152                return (ENFILE);
     153        }
     154}
     155#endif /* __rtems__ */
    115156int     fdalloc(struct thread *td, int minfd, int *result);
    116157int     fdavail(struct thread *td, int n);
    117158int     fdcheckstd(struct thread *td);
     159#ifndef __rtems__
    118160void    fdclose(struct filedesc *fdp, struct file *fp, int idx, struct thread *td);
     161#else /* __rtems__ */
     162static inline void
     163rtems_bsd_fdclose(struct file *fp, int idx, struct thread *td)
     164{
     165        (void) idx;
     166        (void) td;
     167
     168        rtems_libio_free(&fp->f_io);
     169}
     170
     171#define fdclose(fdp, fp, idx, td) rtems_bsd_fdclose(fp, idx, td)
     172#endif /* __rtems__ */
    119173void    fdcloseexec(struct thread *td);
    120174struct  filedesc *fdcopy(struct filedesc *fdp);
     
    131185
    132186/* Return a referenced file from an unlocked descriptor. */
     187#ifndef __rtems__
    133188struct file *fget_unlocked(struct filedesc *fdp, int fd);
    134 
     189#else /* __rtems__ */
     190static inline struct file *
     191fget_unlocked(struct filedesc *fdp, int fd)
     192{
     193        (void) fdp;
     194
     195        return rtems_bsd_get_file(fd);
     196}
     197#endif /* __rtems__ */
     198
     199#ifndef __rtems__
    135200/* Requires a FILEDESC_{S,X}LOCK held and returns without a ref. */
    136201static __inline struct file *
     
    140205        return (fd < 0 || fd >= fdp->fd_nfiles ? NULL : fdp->fd_ofiles[fd]);
    141206}
     207#endif /* __rtems__ */
    142208
    143209#endif /* _KERNEL */
  • freebsd/sys/sys/proc.h

    r8eb42e8 rc9db0f5  
    482482        struct mtx      p_slock;        /* process spin lock */
    483483        struct ucred    *p_ucred;       /* (c) Process owner's identity. */
    484 #endif /* __rtems__ */
    485484        struct filedesc *p_fd;          /* (b) Open files. */
    486 #ifndef __rtems__
    487485        struct filedesc_to_leader *p_fdtol; /* (b) Tracking node */
    488486        struct pstats   *p_stats;       /* (b) Accounting/statistics (CPU). */
  • rtemsbsd/rtems/rtems-bsd-thread.c

    r8eb42e8 rc9db0f5  
    6161static struct ucred FIXME_ucred = {
    6262  .cr_ref = 1                          /* reference count */
    63 };
    64 static struct filedesc FIXME_fd = {
    65   .fd_ofiles = NULL    /* file structures for open files */
    6663};
    6764static struct proc  FIXME_proc = {
     
    223220        FIXME_proc.p_pid = getpid();
    224221        FIXME_proc.p_fibnum = 0;
    225         FIXME_proc.p_fd = &FIXME_fd;
    226         sx_init_flags(&FIXME_fd.fd_sx, "config SX thread lock", SX_DUPOK);
    227222}
    228223
Note: See TracChangeset for help on using the changeset viewer.