Annotation of embedaddon/pciutils/lib/pread.h, revision 1.1

1.1     ! misho       1: /*
        !             2:  *     The PCI Library -- Portable interface to pread() and pwrite()
        !             3:  *
        !             4:  *     Copyright (c) 1997--2003 Martin Mares <mj@ucw.cz>
        !             5:  *
        !             6:  *     Can be freely distributed and used under the terms of the GNU GPL.
        !             7:  */
        !             8: 
        !             9: /*
        !            10:  *  We'd like to use pread/pwrite for configuration space accesses, but
        !            11:  *  unfortunately it isn't simple at all since all libc's until glibc 2.1
        !            12:  *  don't define it.
        !            13:  */
        !            14: 
        !            15: #if defined(__GLIBC__) && __GLIBC__ == 2 && __GLIBC_MINOR__ > 0
        !            16: /* glibc 2.1 or newer -> pread/pwrite supported automatically */
        !            17: 
        !            18: #elif defined(i386) && defined(__GLIBC__)
        !            19: /* glibc 2.0 on i386 -> call syscalls directly */
        !            20: #include <asm/unistd.h>
        !            21: #include <syscall-list.h>
        !            22: #ifndef SYS_pread
        !            23: #define SYS_pread 180
        !            24: #endif
        !            25: static int pread(unsigned int fd, void *buf, size_t size, loff_t where)
        !            26: { return syscall(SYS_pread, fd, buf, size, where); }
        !            27: #ifndef SYS_pwrite
        !            28: #define SYS_pwrite 181
        !            29: #endif
        !            30: static int pwrite(unsigned int fd, void *buf, size_t size, loff_t where)
        !            31: { return syscall(SYS_pwrite, fd, buf, size, where); }
        !            32: 
        !            33: #elif defined(i386)
        !            34: /* old libc on i386 -> call syscalls directly the old way */
        !            35: #include <asm/unistd.h>
        !            36: static _syscall5(int, pread, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi);
        !            37: static _syscall5(int, pwrite, unsigned int, fd, void *, buf, size_t, size, u32, where_lo, u32, where_hi);
        !            38: static int do_read(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pread(fd, buf, size, where, 0); }
        !            39: static int do_write(struct pci_dev *d UNUSED, int fd, void *buf, size_t size, int where) { return pwrite(fd, buf, size, where, 0); }
        !            40: #define PCI_HAVE_DO_READ
        !            41: 
        !            42: #else
        !            43: /* In all other cases we use lseek/read/write instead to be safe */
        !            44: #define make_rw_glue(op) \
        !            45:        static int do_##op(struct pci_dev *d, int fd, void *buf, size_t size, int where)        \
        !            46:        {                                                                                       \
        !            47:          struct pci_access *a = d->access;                                                     \
        !            48:          int r;                                                                                \
        !            49:          if (a->fd_pos != where && lseek(fd, where, SEEK_SET) < 0)                             \
        !            50:            return -1;                                                                          \
        !            51:          r = op(fd, buf, size);                                                                \
        !            52:          if (r < 0)                                                                            \
        !            53:            a->fd_pos = -1;                                                                     \
        !            54:          else                                                                                  \
        !            55:            a->fd_pos = where + r;                                                              \
        !            56:          return r;                                                                             \
        !            57:        }
        !            58: make_rw_glue(read)
        !            59: make_rw_glue(write)
        !            60: #define PCI_HAVE_DO_READ
        !            61: #endif
        !            62: 
        !            63: #ifndef PCI_HAVE_DO_READ
        !            64: #define do_read(d,f,b,l,p) pread(f,b,l,p)
        !            65: #define do_write(d,f,b,l,p) pwrite(f,b,l,p)
        !            66: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>