LCOV - code coverage report
Current view: top level - include/asm-generic - termios.h (source / functions) Hit Total Coverage
Test: coverage.info Lines: 1 1 100.0 %
Date: 2017-01-25 Functions: 0 0 -

          Line data    Source code
       1             : #ifndef _ASM_GENERIC_TERMIOS_H
       2             : #define _ASM_GENERIC_TERMIOS_H
       3             : /*
       4             :  * Most architectures have straight copies of the x86 code, with
       5             :  * varying levels of bug fixes on top. Usually it's a good idea
       6             :  * to use this generic version instead, but be careful to avoid
       7             :  * ABI changes.
       8             :  * New architectures should not provide their own version.
       9             :  */
      10             : 
      11             : #include <asm/termbits.h>
      12             : #include <asm/ioctls.h>
      13             : 
      14             : struct winsize {
      15             :         unsigned short ws_row;
      16             :         unsigned short ws_col;
      17             :         unsigned short ws_xpixel;
      18             :         unsigned short ws_ypixel;
      19             : };
      20             : 
      21             : #define NCC 8
      22             : struct termio {
      23             :         unsigned short c_iflag;         /* input mode flags */
      24             :         unsigned short c_oflag;         /* output mode flags */
      25             :         unsigned short c_cflag;         /* control mode flags */
      26             :         unsigned short c_lflag;         /* local mode flags */
      27             :         unsigned char c_line;           /* line discipline */
      28             :         unsigned char c_cc[NCC];        /* control characters */
      29             : };
      30             : 
      31             : /* modem lines */
      32             : #define TIOCM_LE        0x001
      33             : #define TIOCM_DTR       0x002
      34             : #define TIOCM_RTS       0x004
      35             : #define TIOCM_ST        0x008
      36             : #define TIOCM_SR        0x010
      37             : #define TIOCM_CTS       0x020
      38             : #define TIOCM_CAR       0x040
      39             : #define TIOCM_RNG       0x080
      40             : #define TIOCM_DSR       0x100
      41             : #define TIOCM_CD        TIOCM_CAR
      42             : #define TIOCM_RI        TIOCM_RNG
      43             : #define TIOCM_OUT1      0x2000
      44             : #define TIOCM_OUT2      0x4000
      45             : #define TIOCM_LOOP      0x8000
      46             : 
      47             : /* ioctl (fd, TIOCSERGETLSR, &result) where result may be as below */
      48             : 
      49             : #ifdef __KERNEL__
      50             : 
      51             : #include <asm/uaccess.h>
      52             : 
      53             : /*      intr=^C         quit=^\         erase=del       kill=^U
      54             :         eof=^D          vtime=\0        vmin=\1         sxtc=\0
      55             :         start=^Q        stop=^S         susp=^Z         eol=\0
      56             :         reprint=^R      discard=^U      werase=^W       lnext=^V
      57             :         eol2=\0
      58             : */
      59             : #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
      60             : 
      61             : /*
      62             :  * Translate a "termio" structure into a "termios". Ugh.
      63             :  */
      64             : static inline int user_termio_to_kernel_termios(struct ktermios *termios,
      65             :                                                 const struct termio __user *termio)
      66             : {
      67             :         unsigned short tmp;
      68             : 
      69             :         if (get_user(tmp, &termio->c_iflag) < 0)
      70             :                 goto fault;
      71             :         termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
      72             : 
      73             :         if (get_user(tmp, &termio->c_oflag) < 0)
      74             :                 goto fault;
      75             :         termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
      76             : 
      77             :         if (get_user(tmp, &termio->c_cflag) < 0)
      78             :                 goto fault;
      79             :         termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
      80             : 
      81             :         if (get_user(tmp, &termio->c_lflag) < 0)
      82             :                 goto fault;
      83             :         termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
      84             : 
      85             :         if (get_user(termios->c_line, &termio->c_line) < 0)
      86             :                 goto fault;
      87             : 
      88             :         if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
      89             :                 goto fault;
      90             : 
      91             :         return 0;
      92             : 
      93             :  fault:
      94             :         return -EFAULT;
      95             : }
      96             : 
      97             : /*
      98             :  * Translate a "termios" structure into a "termio". Ugh.
      99             :  */
     100             : static inline int kernel_termios_to_user_termio(struct termio __user *termio,
     101             :                                                 struct ktermios *termios)
     102             : {
     103             :         if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
     104             :             put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
     105             :             put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
     106             :             put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
     107             :             put_user(termios->c_line,  &termio->c_line) < 0 ||
     108             :             copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
     109             :                 return -EFAULT;
     110             : 
     111             :         return 0;
     112             : }
     113             : 
     114             : #ifdef TCGETS2
     115             : static inline int user_termios_to_kernel_termios(struct ktermios *k,
     116             :                                                  struct termios2 __user *u)
     117             : {
     118             :         return copy_from_user(k, u, sizeof(struct termios2));
     119             : }
     120             : 
     121             : static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
     122             :                                                  struct ktermios *k)
     123             : {
     124             :         return copy_to_user(u, k, sizeof(struct termios2));
     125             : }
     126             : 
     127             : static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
     128             :                                                    struct termios __user *u)
     129             : {
     130             :         return copy_from_user(k, u, sizeof(struct termios));
     131             : }
     132             : 
     133             : static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
     134             :                                                    struct ktermios *k)
     135             : {
     136             :         return copy_to_user(u, k, sizeof(struct termios));
     137             : }
     138           1 : #else /* TCGETS2 */
     139             : static inline int user_termios_to_kernel_termios(struct ktermios *k,
     140             :                                                  struct termios __user *u)
     141             : {
     142             :         return copy_from_user(k, u, sizeof(struct termios));
     143             : }
     144             : 
     145             : static inline int kernel_termios_to_user_termios(struct termios __user *u,
     146             :                                                  struct ktermios *k)
     147             : {
     148             :         return copy_to_user(u, k, sizeof(struct termios));
     149             : }
     150             : #endif /* TCGETS2 */
     151             : 
     152             : #endif  /* __KERNEL__ */
     153             : 
     154             : #endif /* _ASM_GENERIC_TERMIOS_H */

Generated by: LCOV version 1.10