20 #ifndef _COBALT_KERNEL_FD_H
21 #define _COBALT_KERNEL_FD_H
23 #include <linux/types.h>
24 #include <linux/socket.h>
25 #include <linux/file.h>
26 #include <cobalt/kernel/tree.h>
27 #include <asm-generic/xenomai/syscall.h>
29 struct vm_area_struct;
31 struct _rtdm_mmap_request;
32 struct _rtdm_setsockaddr_args;
33 struct _rtdm_setsockopt_args;
184 unsigned int type,
unsigned int index);
236 unsigned long len,
unsigned long pgoff,
237 unsigned long flags);
248 int (*
open)(
struct rtdm_fd *fd,
int oflags);
250 int (*
socket)(
struct rtdm_fd *fd,
int protocol);
255 unsigned int request,
void __user *arg);
258 unsigned int request,
void __user *arg);
261 void __user *buf,
size_t size);
264 void __user *buf,
size_t size);
267 const void __user *buf,
size_t size);
270 const void __user *buf,
size_t size);
273 struct user_msghdr *msg,
int flags);
276 struct user_msghdr *msg,
int flags);
279 const struct user_msghdr *msg,
int flags);
282 const struct user_msghdr *msg,
int flags);
285 struct xnselector *selector,
286 unsigned int type,
unsigned int index);
288 int (*
mmap)(
struct rtdm_fd *fd,
289 struct vm_area_struct *vma);
294 unsigned long flags);
302 struct cobalt_ppd *owner;
307 #ifdef CONFIG_XENO_ARCH_SYS3264
311 struct list_head cleanup;
312 struct list_head next;
315 #define RTDM_FD_MAGIC 0x52544446
317 #define RTDM_FD_COMPAT __COBALT_COMPAT_BIT
318 #define RTDM_FD_COMPATX __COBALT_COMPATX_BIT
320 int __rtdm_anon_getfd(
const char *name,
int flags);
322 void __rtdm_anon_putfd(
int ufd);
324 static inline struct cobalt_ppd *rtdm_fd_owner(
const struct rtdm_fd *fd)
329 static inline int rtdm_fd_ufd(
const struct rtdm_fd *fd)
334 static inline int rtdm_fd_minor(
const struct rtdm_fd *fd)
339 static inline int rtdm_fd_flags(
const struct rtdm_fd *fd)
344 #ifdef CONFIG_XENO_ARCH_SYS3264
345 static inline int rtdm_fd_is_compat(
const struct rtdm_fd *fd)
350 static inline int rtdm_fd_is_compat(
const struct rtdm_fd *fd)
356 int rtdm_fd_enter(
struct rtdm_fd *rtdm_fd,
int ufd,
359 int rtdm_fd_register(
struct rtdm_fd *fd,
int ufd);
361 struct rtdm_fd *
rtdm_fd_get(
int ufd,
unsigned int magic);
369 int rtdm_fd_fcntl(
int ufd,
int cmd, ...);
371 int rtdm_fd_ioctl(
int ufd,
unsigned int request, ...);
373 ssize_t rtdm_fd_read(
int ufd,
void __user *buf,
size_t size);
375 ssize_t rtdm_fd_write(
int ufd,
const void __user *buf,
size_t size);
377 int rtdm_fd_close(
int ufd,
unsigned int magic);
379 ssize_t rtdm_fd_recvmsg(
int ufd,
struct user_msghdr *msg,
int flags);
381 int __rtdm_fd_recvmmsg(
int ufd,
void __user *u_msgvec,
unsigned int vlen,
382 unsigned int flags,
void __user *u_timeout,
383 int (*get_mmsg)(
struct mmsghdr *mmsg,
void __user *u_mmsg),
384 int (*put_mmsg)(
void __user **u_mmsg_p,
const struct mmsghdr *mmsg),
385 int (*get_timespec)(
struct timespec64 *ts,
const void __user *u_ts));
387 int __rtdm_fd_recvmmsg64(
int ufd,
void __user *u_msgvec,
unsigned int vlen,
388 unsigned int flags,
void __user *u_timeout,
389 int (*get_mmsg)(
struct mmsghdr *mmsg,
void __user *u_mmsg),
390 int (*put_mmsg)(
void __user **u_mmsg_p,
const struct mmsghdr *mmsg));
392 ssize_t rtdm_fd_sendmsg(
int ufd,
const struct user_msghdr *msg,
395 int __rtdm_fd_sendmmsg(
int ufd,
void __user *u_msgvec,
unsigned int vlen,
397 int (*get_mmsg)(
struct mmsghdr *mmsg,
void __user *u_mmsg),
398 int (*put_mmsg)(
void __user **u_mmsg_p,
const struct mmsghdr *mmsg));
400 int rtdm_fd_mmap(
int ufd,
struct _rtdm_mmap_request *rma,
403 int rtdm_fd_valid_p(
int ufd);
408 int rtdm_fd_get_setsockaddr_args(
struct rtdm_fd *fd,
409 struct _rtdm_setsockaddr_args *dst,
412 int rtdm_fd_get_setsockopt_args(
struct rtdm_fd *fd,
413 struct _rtdm_setsockopt_args *dst,
416 int rtdm_fd_get_iovec(
struct rtdm_fd *fd,
struct iovec *iov,
417 const struct user_msghdr *msg,
bool rw);
419 int rtdm_fd_put_iovec(
struct rtdm_fd *fd,
const struct iovec *iov,
420 const struct user_msghdr *msg);
422 int rtdm_device_new_fd(
struct rtdm_fd *fd,
int ufd,
425 void rtdm_device_flush_fds(
struct rtdm_device *dev);
427 void rtdm_fd_cleanup(
struct cobalt_ppd *p);
429 void rtdm_fd_init(
void);
struct rtdm_fd * rtdm_fd_get(int ufd, unsigned int magic)
Retrieve and lock a RTDM file descriptor.
Definition: fd.c:247
int rtdm_fd_select(int ufd, struct xnselector *selector, unsigned int type)
Bind a selector to specified event types of a given file descriptor.
Definition: fd.c:981
void rtdm_fd_unlock(struct rtdm_fd *fd)
Drop a reference on a RTDM file descriptor.
Definition: fd.c:421
int rtdm_fd_lock(struct rtdm_fd *fd)
Hold a reference on a RTDM file descriptor.
Definition: fd.c:395
void rtdm_fd_put(struct rtdm_fd *fd)
Release a RTDM file descriptor obtained via rtdm_fd_get()
Definition: fd.c:372
int rtdm_open_handler(struct rtdm_fd *fd, int oflags)
Open handler for named devices.
int rtdm_socket_handler(struct rtdm_fd *fd, int protocol)
Socket creation handler for protocol devices.
int rtdm_select_handler(struct rtdm_fd *fd, struct xnselector *selector, unsigned int type, unsigned int index)
Select handler.
void rtdm_close_handler(struct rtdm_fd *fd)
Close handler.
int rtdm_mmap_handler(struct rtdm_fd *fd, struct vm_area_struct *vma)
Memory mapping handler.
ssize_t rtdm_read_handler(struct rtdm_fd *fd, void __user *buf, size_t size)
Read handler.
unsigned long rtdm_get_unmapped_area_handler(struct rtdm_fd *fd, unsigned long len, unsigned long pgoff, unsigned long flags)
Allocate mapping region in address space.
ssize_t rtdm_recvmsg_handler(struct rtdm_fd *fd, struct user_msghdr *msg, int flags)
Receive message handler.
ssize_t rtdm_write_handler(struct rtdm_fd *fd, const void __user *buf, size_t size)
Write handler.
int rtdm_ioctl_handler(struct rtdm_fd *fd, unsigned int request, void __user *arg)
IOCTL handler.
ssize_t rtdm_sendmsg_handler(struct rtdm_fd *fd, const struct user_msghdr *msg, int flags)
Transmit message handler.
RTDM device.
Definition: driver.h:340
ssize_t(* recvmsg_rt)(struct rtdm_fd *fd, struct user_msghdr *msg, int flags)
See rtdm_recvmsg_handler().
Definition: fd.h:272
int(* mmap)(struct rtdm_fd *fd, struct vm_area_struct *vma)
See rtdm_mmap_handler().
Definition: fd.h:288
ssize_t(* sendmsg_rt)(struct rtdm_fd *fd, const struct user_msghdr *msg, int flags)
See rtdm_sendmsg_handler().
Definition: fd.h:278
unsigned long(* get_unmapped_area)(struct rtdm_fd *fd, unsigned long len, unsigned long pgoff, unsigned long flags)
See rtdm_get_unmapped_area_handler().
Definition: fd.h:291
int(* ioctl_nrt)(struct rtdm_fd *fd, unsigned int request, void __user *arg)
See rtdm_ioctl_handler().
Definition: fd.h:257
void(* close)(struct rtdm_fd *fd)
See rtdm_close_handler().
Definition: fd.h:252
int(* open)(struct rtdm_fd *fd, int oflags)
See rtdm_open_handler().
Definition: fd.h:248
ssize_t(* read_nrt)(struct rtdm_fd *fd, void __user *buf, size_t size)
See rtdm_read_handler().
Definition: fd.h:263
ssize_t(* recvmsg_nrt)(struct rtdm_fd *fd, struct user_msghdr *msg, int flags)
See rtdm_recvmsg_handler().
Definition: fd.h:275
int(* ioctl_rt)(struct rtdm_fd *fd, unsigned int request, void __user *arg)
See rtdm_ioctl_handler().
Definition: fd.h:254
ssize_t(* read_rt)(struct rtdm_fd *fd, void __user *buf, size_t size)
See rtdm_read_handler().
Definition: fd.h:260
int(* select)(struct rtdm_fd *fd, struct xnselector *selector, unsigned int type, unsigned int index)
See rtdm_select_handler().
Definition: fd.h:284
int(* socket)(struct rtdm_fd *fd, int protocol)
See rtdm_socket_handler().
Definition: fd.h:250
ssize_t(* write_rt)(struct rtdm_fd *fd, const void __user *buf, size_t size)
See rtdm_write_handler().
Definition: fd.h:266
ssize_t(* sendmsg_nrt)(struct rtdm_fd *fd, const struct user_msghdr *msg, int flags)
See rtdm_sendmsg_handler().
Definition: fd.h:281
ssize_t(* write_nrt)(struct rtdm_fd *fd, const void __user *buf, size_t size)
See rtdm_write_handler().
Definition: fd.h:269