Xenomai  3.2.4
fd.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2005-2007 Jan Kiszka <[email protected]>
3  * Copyright (C) 2005 Joerg Langenberg <[email protected]>
4  * Copyright (C) 2008,2013,2014 Gilles Chanteperdrix <[email protected]>.
5  *
6  * This program is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU General Public License as
8  * published by the Free Software Foundation; either version 2 of the
9  * License, or (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
19  */
20 #ifndef _COBALT_KERNEL_FD_H
21 #define _COBALT_KERNEL_FD_H
22 
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>
28 
29 struct vm_area_struct;
30 struct rtdm_fd;
31 struct _rtdm_mmap_request;
32 struct _rtdm_setsockaddr_args;
33 struct _rtdm_setsockopt_args;
34 struct xnselector;
35 struct cobalt_ppd;
36 struct rtdm_device;
37 
60 int rtdm_open_handler(struct rtdm_fd *fd, int oflags);
61 
73 int rtdm_socket_handler(struct rtdm_fd *fd, int protocol);
74 
84 void rtdm_close_handler(struct rtdm_fd *fd);
85 
100 int rtdm_ioctl_handler(struct rtdm_fd *fd, unsigned int request, void __user *arg);
101 
116 ssize_t rtdm_read_handler(struct rtdm_fd *fd, void __user *buf, size_t size);
117 
132 ssize_t rtdm_write_handler(struct rtdm_fd *fd, const void __user *buf, size_t size);
133 
149 ssize_t rtdm_recvmsg_handler(struct rtdm_fd *fd, struct user_msghdr *msg, int flags);
150 
166 ssize_t rtdm_sendmsg_handler(struct rtdm_fd *fd, const struct user_msghdr *msg, int flags);
167 
183 int rtdm_select_handler(struct rtdm_fd *fd, struct xnselector *selector,
184  unsigned int type, unsigned int index);
185 
201 int rtdm_mmap_handler(struct rtdm_fd *fd, struct vm_area_struct *vma);
202 
234 unsigned long
236  unsigned long len, unsigned long pgoff,
237  unsigned long flags);
246 struct rtdm_fd_ops {
248  int (*open)(struct rtdm_fd *fd, int oflags);
250  int (*socket)(struct rtdm_fd *fd, int protocol);
252  void (*close)(struct rtdm_fd *fd);
254  int (*ioctl_rt)(struct rtdm_fd *fd,
255  unsigned int request, void __user *arg);
257  int (*ioctl_nrt)(struct rtdm_fd *fd,
258  unsigned int request, void __user *arg);
260  ssize_t (*read_rt)(struct rtdm_fd *fd,
261  void __user *buf, size_t size);
263  ssize_t (*read_nrt)(struct rtdm_fd *fd,
264  void __user *buf, size_t size);
266  ssize_t (*write_rt)(struct rtdm_fd *fd,
267  const void __user *buf, size_t size);
269  ssize_t (*write_nrt)(struct rtdm_fd *fd,
270  const void __user *buf, size_t size);
272  ssize_t (*recvmsg_rt)(struct rtdm_fd *fd,
273  struct user_msghdr *msg, int flags);
275  ssize_t (*recvmsg_nrt)(struct rtdm_fd *fd,
276  struct user_msghdr *msg, int flags);
278  ssize_t (*sendmsg_rt)(struct rtdm_fd *fd,
279  const struct user_msghdr *msg, int flags);
281  ssize_t (*sendmsg_nrt)(struct rtdm_fd *fd,
282  const struct user_msghdr *msg, int flags);
284  int (*select)(struct rtdm_fd *fd,
285  struct xnselector *selector,
286  unsigned int type, unsigned int index);
288  int (*mmap)(struct rtdm_fd *fd,
289  struct vm_area_struct *vma);
291  unsigned long (*get_unmapped_area)(struct rtdm_fd *fd,
292  unsigned long len,
293  unsigned long pgoff,
294  unsigned long flags);
295 };
296 
299 struct rtdm_fd {
300  unsigned int magic;
301  struct rtdm_fd_ops *ops;
302  struct cobalt_ppd *owner;
303  unsigned int refs;
304  int ufd;
305  int minor;
306  int oflags;
307 #ifdef CONFIG_XENO_ARCH_SYS3264
308  int compat;
309 #endif
310  bool stale;
311  struct list_head cleanup;
312  struct list_head next; /* in dev->openfd_list */
313 };
314 
315 #define RTDM_FD_MAGIC 0x52544446
316 
317 #define RTDM_FD_COMPAT __COBALT_COMPAT_BIT
318 #define RTDM_FD_COMPATX __COBALT_COMPATX_BIT
319 
320 int __rtdm_anon_getfd(const char *name, int flags);
321 
322 void __rtdm_anon_putfd(int ufd);
323 
324 static inline struct cobalt_ppd *rtdm_fd_owner(const struct rtdm_fd *fd)
325 {
326  return fd->owner;
327 }
328 
329 static inline int rtdm_fd_ufd(const struct rtdm_fd *fd)
330 {
331  return fd->ufd;
332 }
333 
334 static inline int rtdm_fd_minor(const struct rtdm_fd *fd)
335 {
336  return fd->minor;
337 }
338 
339 static inline int rtdm_fd_flags(const struct rtdm_fd *fd)
340 {
341  return fd->oflags;
342 }
343 
344 #ifdef CONFIG_XENO_ARCH_SYS3264
345 static inline int rtdm_fd_is_compat(const struct rtdm_fd *fd)
346 {
347  return fd->compat;
348 }
349 #else
350 static inline int rtdm_fd_is_compat(const struct rtdm_fd *fd)
351 {
352  return 0;
353 }
354 #endif
355 
356 int rtdm_fd_enter(struct rtdm_fd *rtdm_fd, int ufd,
357  unsigned int magic, struct rtdm_fd_ops *ops);
358 
359 int rtdm_fd_register(struct rtdm_fd *fd, int ufd);
360 
361 struct rtdm_fd *rtdm_fd_get(int ufd, unsigned int magic);
362 
363 int rtdm_fd_lock(struct rtdm_fd *fd);
364 
365 void rtdm_fd_put(struct rtdm_fd *fd);
366 
367 void rtdm_fd_unlock(struct rtdm_fd *fd);
368 
369 int rtdm_fd_fcntl(int ufd, int cmd, ...);
370 
371 int rtdm_fd_ioctl(int ufd, unsigned int request, ...);
372 
373 ssize_t rtdm_fd_read(int ufd, void __user *buf, size_t size);
374 
375 ssize_t rtdm_fd_write(int ufd, const void __user *buf, size_t size);
376 
377 int rtdm_fd_close(int ufd, unsigned int magic);
378 
379 ssize_t rtdm_fd_recvmsg(int ufd, struct user_msghdr *msg, int flags);
380 
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));
386 
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));
391 
392 ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg,
393  int flags);
394 
395 int __rtdm_fd_sendmmsg(int ufd, void __user *u_msgvec, unsigned int vlen,
396  unsigned int flags,
397  int (*get_mmsg)(struct mmsghdr *mmsg, void __user *u_mmsg),
398  int (*put_mmsg)(void __user **u_mmsg_p, const struct mmsghdr *mmsg));
399 
400 int rtdm_fd_mmap(int ufd, struct _rtdm_mmap_request *rma,
401  void **u_addrp);
402 
403 int rtdm_fd_valid_p(int ufd);
404 
405 int rtdm_fd_select(int ufd, struct xnselector *selector,
406  unsigned int type);
407 
408 int rtdm_fd_get_setsockaddr_args(struct rtdm_fd *fd,
409  struct _rtdm_setsockaddr_args *dst,
410  const void *src);
411 
412 int rtdm_fd_get_setsockopt_args(struct rtdm_fd *fd,
413  struct _rtdm_setsockopt_args *dst,
414  const void *src);
415 
416 int rtdm_fd_get_iovec(struct rtdm_fd *fd, struct iovec *iov,
417  const struct user_msghdr *msg, bool rw);
418 
419 int rtdm_fd_put_iovec(struct rtdm_fd *fd, const struct iovec *iov,
420  const struct user_msghdr *msg);
421 
422 int rtdm_device_new_fd(struct rtdm_fd *fd, int ufd,
423  struct rtdm_device *dev);
424 
425 void rtdm_device_flush_fds(struct rtdm_device *dev);
426 
427 void rtdm_fd_cleanup(struct cobalt_ppd *p);
428 
429 void rtdm_fd_init(void);
430 
431 #endif /* _COBALT_KERNEL_FD_H */
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
Definition: fd.h:246
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