LCOV - code coverage report
Current view: top level - include/asm-generic - termios.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 4 34 11.8 %
Date: 2022-04-01 13:59:58 Functions: 2 6 33.3 %
Branches: 2 36 5.6 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : #ifndef _ASM_GENERIC_TERMIOS_H
       3                 :            : #define _ASM_GENERIC_TERMIOS_H
       4                 :            : 
       5                 :            : 
       6                 :            : #include <linux/uaccess.h>
       7                 :            : #include <uapi/asm-generic/termios.h>
       8                 :            : 
       9                 :            : /*      intr=^C         quit=^\         erase=del       kill=^U
      10                 :            :         eof=^D          vtime=\0        vmin=\1         sxtc=\0
      11                 :            :         start=^Q        stop=^S         susp=^Z         eol=\0
      12                 :            :         reprint=^R      discard=^U      werase=^W       lnext=^V
      13                 :            :         eol2=\0
      14                 :            : */
      15                 :            : #define INIT_C_CC "\003\034\177\025\004\0\1\0\021\023\032\0\022\017\027\026\0"
      16                 :            : 
      17                 :            : /*
      18                 :            :  * Translate a "termio" structure into a "termios". Ugh.
      19                 :            :  */
      20                 :          0 : static inline int user_termio_to_kernel_termios(struct ktermios *termios,
      21                 :            :                                                 const struct termio __user *termio)
      22                 :            : {
      23                 :          0 :         unsigned short tmp;
      24                 :            : 
      25         [ #  # ]:          0 :         if (get_user(tmp, &termio->c_iflag) < 0)
      26                 :          0 :                 goto fault;
      27                 :          0 :         termios->c_iflag = (0xffff0000 & termios->c_iflag) | tmp;
      28                 :            : 
      29         [ #  # ]:          0 :         if (get_user(tmp, &termio->c_oflag) < 0)
      30                 :          0 :                 goto fault;
      31                 :          0 :         termios->c_oflag = (0xffff0000 & termios->c_oflag) | tmp;
      32                 :            : 
      33         [ #  # ]:          0 :         if (get_user(tmp, &termio->c_cflag) < 0)
      34                 :          0 :                 goto fault;
      35                 :          0 :         termios->c_cflag = (0xffff0000 & termios->c_cflag) | tmp;
      36                 :            : 
      37         [ #  # ]:          0 :         if (get_user(tmp, &termio->c_lflag) < 0)
      38                 :          0 :                 goto fault;
      39                 :          0 :         termios->c_lflag = (0xffff0000 & termios->c_lflag) | tmp;
      40                 :            : 
      41         [ #  # ]:          0 :         if (get_user(termios->c_line, &termio->c_line) < 0)
      42                 :          0 :                 goto fault;
      43                 :            : 
      44   [ #  #  #  # ]:          0 :         if (copy_from_user(termios->c_cc, termio->c_cc, NCC) != 0)
      45                 :          0 :                 goto fault;
      46                 :            : 
      47                 :            :         return 0;
      48                 :            : 
      49                 :            :  fault:
      50                 :            :         return -EFAULT;
      51                 :            : }
      52                 :            : 
      53                 :            : /*
      54                 :            :  * Translate a "termios" structure into a "termio". Ugh.
      55                 :            :  */
      56                 :          0 : static inline int kernel_termios_to_user_termio(struct termio __user *termio,
      57                 :            :                                                 struct ktermios *termios)
      58                 :            : {
      59         [ #  # ]:          0 :         if (put_user(termios->c_iflag, &termio->c_iflag) < 0 ||
      60         [ #  # ]:          0 :             put_user(termios->c_oflag, &termio->c_oflag) < 0 ||
      61         [ #  # ]:          0 :             put_user(termios->c_cflag, &termio->c_cflag) < 0 ||
      62         [ #  # ]:          0 :             put_user(termios->c_lflag, &termio->c_lflag) < 0 ||
      63   [ #  #  #  # ]:          0 :             put_user(termios->c_line,  &termio->c_line) < 0 ||
      64         [ #  # ]:          0 :             copy_to_user(termio->c_cc, termios->c_cc, NCC) != 0)
      65                 :          0 :                 return -EFAULT;
      66                 :            : 
      67                 :            :         return 0;
      68                 :            : }
      69                 :            : 
      70                 :            : #ifdef TCGETS2
      71                 :          0 : static inline int user_termios_to_kernel_termios(struct ktermios *k,
      72                 :            :                                                  struct termios2 __user *u)
      73                 :            : {
      74         [ #  # ]:          0 :         return copy_from_user(k, u, sizeof(struct termios2));
      75                 :            : }
      76                 :            : 
      77                 :          0 : static inline int kernel_termios_to_user_termios(struct termios2 __user *u,
      78                 :            :                                                  struct ktermios *k)
      79                 :            : {
      80         [ #  # ]:          0 :         return copy_to_user(u, k, sizeof(struct termios2));
      81                 :            : }
      82                 :            : 
      83                 :         78 : static inline int user_termios_to_kernel_termios_1(struct ktermios *k,
      84                 :            :                                                    struct termios __user *u)
      85                 :            : {
      86         [ +  - ]:         78 :         return copy_from_user(k, u, sizeof(struct termios));
      87                 :            : }
      88                 :            : 
      89                 :       7209 : static inline int kernel_termios_to_user_termios_1(struct termios __user *u,
      90                 :            :                                                    struct ktermios *k)
      91                 :            : {
      92         [ +  - ]:       7209 :         return copy_to_user(u, k, sizeof(struct termios));
      93                 :            : }
      94                 :            : #else /* TCGETS2 */
      95                 :            : static inline int user_termios_to_kernel_termios(struct ktermios *k,
      96                 :            :                                                  struct termios __user *u)
      97                 :            : {
      98                 :            :         return copy_from_user(k, u, sizeof(struct termios));
      99                 :            : }
     100                 :            : 
     101                 :            : static inline int kernel_termios_to_user_termios(struct termios __user *u,
     102                 :            :                                                  struct ktermios *k)
     103                 :            : {
     104                 :            :         return copy_to_user(u, k, sizeof(struct termios));
     105                 :            : }
     106                 :            : #endif /* TCGETS2 */
     107                 :            : 
     108                 :            : #endif /* _ASM_GENERIC_TERMIOS_H */

Generated by: LCOV version 1.14