Xenomai 3.3.2
Loading...
Searching...
No Matches
fd.h
Go to the documentation of this file.
1/*
2 * Copyright (C) 2005-2007 Jan Kiszka <jan.kiszka@web.de>
3 * Copyright (C) 2005 Joerg Langenberg <joerg.langenberg@gmx.net>
4 * Copyright (C) 2008,2013,2014 Gilles Chanteperdrix <gch@xenomai.org>.
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
29struct vm_area_struct;
30struct rtdm_fd;
31struct _rtdm_mmap_request;
32struct _rtdm_setsockaddr_args;
33struct _rtdm_setsockopt_args;
34struct xnselector;
35struct cobalt_ppd;
36struct rtdm_device;
37
60int rtdm_open_handler(struct rtdm_fd *fd, int oflags);
61
73int rtdm_socket_handler(struct rtdm_fd *fd, int protocol);
74
84void rtdm_close_handler(struct rtdm_fd *fd);
85
100int rtdm_ioctl_handler(struct rtdm_fd *fd, unsigned int request, void __user *arg);
101
116ssize_t rtdm_read_handler(struct rtdm_fd *fd, void __user *buf, size_t size);
117
132ssize_t rtdm_write_handler(struct rtdm_fd *fd, const void __user *buf, size_t size);
133
149ssize_t rtdm_recvmsg_handler(struct rtdm_fd *fd, struct user_msghdr *msg, int flags);
150
166ssize_t rtdm_sendmsg_handler(struct rtdm_fd *fd, const struct user_msghdr *msg, int flags);
167
183int rtdm_select_handler(struct rtdm_fd *fd, struct xnselector *selector,
184 unsigned int type, unsigned int index);
185
201int rtdm_mmap_handler(struct rtdm_fd *fd, struct vm_area_struct *vma);
202
234unsigned long
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);
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
299struct 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
320int __rtdm_anon_getfd(const char *name, int flags);
321
322void __rtdm_anon_putfd(int ufd);
323
324static inline struct cobalt_ppd *rtdm_fd_owner(const struct rtdm_fd *fd)
325{
326 return fd->owner;
327}
328
329static inline int rtdm_fd_ufd(const struct rtdm_fd *fd)
330{
331 return fd->ufd;
332}
333
334static inline int rtdm_fd_minor(const struct rtdm_fd *fd)
335{
336 return fd->minor;
337}
338
339static inline int rtdm_fd_flags(const struct rtdm_fd *fd)
340{
341 return fd->oflags;
342}
343
344#ifdef CONFIG_XENO_ARCH_SYS3264
345static inline int rtdm_fd_is_compat(const struct rtdm_fd *fd)
346{
347 return fd->compat;
348}
349#else
350static inline int rtdm_fd_is_compat(const struct rtdm_fd *fd)
351{
352 return 0;
353}
354#endif
355
356int rtdm_fd_enter(struct rtdm_fd *rtdm_fd, int ufd,
357 unsigned int magic, struct rtdm_fd_ops *ops);
358
359int rtdm_fd_register(struct rtdm_fd *fd, int ufd);
360
361struct rtdm_fd *rtdm_fd_get(int ufd, unsigned int magic);
362
363int rtdm_fd_lock(struct rtdm_fd *fd);
364
365void rtdm_fd_put(struct rtdm_fd *fd);
366
367void rtdm_fd_unlock(struct rtdm_fd *fd);
368
369int rtdm_fd_fcntl(int ufd, int cmd, ...);
370
371int rtdm_fd_ioctl(int ufd, unsigned int request, ...);
372
373ssize_t rtdm_fd_read(int ufd, void __user *buf, size_t size);
374
375ssize_t rtdm_fd_write(int ufd, const void __user *buf, size_t size);
376
377int rtdm_fd_close(int ufd, unsigned int magic);
378
379ssize_t rtdm_fd_recvmsg(int ufd, struct user_msghdr *msg, int flags);
380
381int __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
387int __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
392ssize_t rtdm_fd_sendmsg(int ufd, const struct user_msghdr *msg,
393 int flags);
394
395int __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
400int rtdm_fd_mmap(int ufd, struct _rtdm_mmap_request *rma,
401 void **u_addrp);
402
403int rtdm_fd_valid_p(int ufd);
404
405int rtdm_fd_select(int ufd, struct xnselector *selector,
406 unsigned int type);
407
408int rtdm_fd_get_setsockaddr_args(struct rtdm_fd *fd,
409 struct _rtdm_setsockaddr_args *dst,
410 const void *src);
411
412int rtdm_fd_get_setsockopt_args(struct rtdm_fd *fd,
413 struct _rtdm_setsockopt_args *dst,
414 const void *src);
415
416int rtdm_fd_get_iovec(struct rtdm_fd *fd, struct iovec *iov,
417 const struct user_msghdr *msg, bool rw);
418
419int rtdm_fd_put_iovec(struct rtdm_fd *fd, const struct iovec *iov,
420 const struct user_msghdr *msg);
421
422int rtdm_device_new_fd(struct rtdm_fd *fd, int ufd,
423 struct rtdm_device *dev);
424
425void rtdm_device_flush_fds(struct rtdm_device *dev);
426
427void rtdm_fd_cleanup(struct cobalt_ppd *p);
428
429void rtdm_fd_init(void);
430
431#endif /* _COBALT_KERNEL_FD_H */
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:985
void rtdm_fd_unlock(struct rtdm_fd *fd)
Drop a reference on a RTDM file descriptor.
Definition fd.c:417
int rtdm_fd_lock(struct rtdm_fd *fd)
Hold a reference on a RTDM file descriptor.
Definition fd.c:391
struct rtdm_fd * rtdm_fd_get(int ufd, unsigned int magic)
Retrieve and lock a RTDM file descriptor.
Definition fd.c:248
void rtdm_fd_put(struct rtdm_fd *fd)
Release a RTDM file descriptor obtained via rtdm_fd_get()
Definition fd.c:368
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