LCOV - code coverage report
Current view: top level - include/linux - trace_seq.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 0 10 0.0 %
Date: 2022-03-28 16:04:14 Functions: 0 0 -
Branches: 0 78 0.0 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : #ifndef _LINUX_TRACE_SEQ_H
       3                 :            : #define _LINUX_TRACE_SEQ_H
       4                 :            : 
       5                 :            : #include <linux/seq_buf.h>
       6                 :            : 
       7                 :            : #include <asm/page.h>
       8                 :            : 
       9                 :            : /*
      10                 :            :  * Trace sequences are used to allow a function to call several other functions
      11                 :            :  * to create a string of data to use (up to a max of PAGE_SIZE).
      12                 :            :  */
      13                 :            : 
      14                 :            : struct trace_seq {
      15                 :            :         unsigned char           buffer[PAGE_SIZE];
      16                 :            :         struct seq_buf          seq;
      17                 :            :         int                     full;
      18                 :            : };
      19                 :            : 
      20                 :            : static inline void
      21                 :          0 : trace_seq_init(struct trace_seq *s)
      22                 :            : {
      23   [ #  #  #  # ]:          0 :         seq_buf_init(&s->seq, s->buffer, PAGE_SIZE);
      24   [ #  #  #  # ]:          0 :         s->full = 0;
      25                 :          0 : }
      26                 :            : 
      27                 :            : /**
      28                 :            :  * trace_seq_used - amount of actual data written to buffer
      29                 :            :  * @s: trace sequence descriptor
      30                 :            :  *
      31                 :            :  * Returns the amount of data written to the buffer.
      32                 :            :  *
      33                 :            :  * IMPORTANT!
      34                 :            :  *
      35                 :            :  * Use this instead of @s->seq.len if you need to pass the amount
      36                 :            :  * of data from the buffer to another buffer (userspace, or what not).
      37                 :            :  * The @s->seq.len on overflow is bigger than the buffer size and
      38                 :            :  * using it can cause access to undefined memory.
      39                 :            :  */
      40                 :          0 : static inline int trace_seq_used(struct trace_seq *s)
      41                 :            : {
      42   [ #  #  #  #  :          0 :         return seq_buf_used(&s->seq);
             #  #  #  # ]
      43                 :            : }
      44                 :            : 
      45                 :            : /**
      46                 :            :  * trace_seq_buffer_ptr - return pointer to next location in buffer
      47                 :            :  * @s: trace sequence descriptor
      48                 :            :  *
      49                 :            :  * Returns the pointer to the buffer where the next write to
      50                 :            :  * the buffer will happen. This is useful to save the location
      51                 :            :  * that is about to be written to and then return the result
      52                 :            :  * of that write.
      53                 :            :  */
      54                 :            : static inline unsigned char *
      55                 :          0 : trace_seq_buffer_ptr(struct trace_seq *s)
      56                 :            : {
      57   [ #  #  #  #  :          0 :         return s->buffer + seq_buf_used(&s->seq);
                   #  # ]
      58                 :            : }
      59                 :            : 
      60                 :            : /**
      61                 :            :  * trace_seq_has_overflowed - return true if the trace_seq took too much
      62                 :            :  * @s: trace sequence descriptor
      63                 :            :  *
      64                 :            :  * Returns true if too much data was added to the trace_seq and it is
      65                 :            :  * now full and will not take anymore.
      66                 :            :  */
      67                 :          0 : static inline bool trace_seq_has_overflowed(struct trace_seq *s)
      68                 :            : {
      69   [ #  #  #  #  :          0 :         return s->full || seq_buf_has_overflowed(&s->seq);
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
          #  #  #  #  #  
                   #  # ]
      70                 :            : }
      71                 :            : 
      72                 :            : /*
      73                 :            :  * Currently only defined when tracing is enabled.
      74                 :            :  */
      75                 :            : #ifdef CONFIG_TRACING
      76                 :            : extern __printf(2, 3)
      77                 :            : void trace_seq_printf(struct trace_seq *s, const char *fmt, ...);
      78                 :            : extern __printf(2, 0)
      79                 :            : void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args);
      80                 :            : extern void
      81                 :            : trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary);
      82                 :            : extern int trace_print_seq(struct seq_file *m, struct trace_seq *s);
      83                 :            : extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
      84                 :            :                              int cnt);
      85                 :            : extern void trace_seq_puts(struct trace_seq *s, const char *str);
      86                 :            : extern void trace_seq_putc(struct trace_seq *s, unsigned char c);
      87                 :            : extern void trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len);
      88                 :            : extern void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
      89                 :            :                                 unsigned int len);
      90                 :            : extern int trace_seq_path(struct trace_seq *s, const struct path *path);
      91                 :            : 
      92                 :            : extern void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
      93                 :            :                              int nmaskbits);
      94                 :            : 
      95                 :            : extern int trace_seq_hex_dump(struct trace_seq *s, const char *prefix_str,
      96                 :            :                               int prefix_type, int rowsize, int groupsize,
      97                 :            :                               const void *buf, size_t len, bool ascii);
      98                 :            : 
      99                 :            : #else /* CONFIG_TRACING */
     100                 :            : static inline void trace_seq_printf(struct trace_seq *s, const char *fmt, ...)
     101                 :            : {
     102                 :            : }
     103                 :            : static inline void
     104                 :            : trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary)
     105                 :            : {
     106                 :            : }
     107                 :            : 
     108                 :            : static inline void
     109                 :            : trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp,
     110                 :            :                   int nmaskbits)
     111                 :            : {
     112                 :            : }
     113                 :            : 
     114                 :            : static inline int trace_print_seq(struct seq_file *m, struct trace_seq *s)
     115                 :            : {
     116                 :            :         return 0;
     117                 :            : }
     118                 :            : static inline int trace_seq_to_user(struct trace_seq *s, char __user *ubuf,
     119                 :            :                                     int cnt)
     120                 :            : {
     121                 :            :         return 0;
     122                 :            : }
     123                 :            : static inline void trace_seq_puts(struct trace_seq *s, const char *str)
     124                 :            : {
     125                 :            : }
     126                 :            : static inline void trace_seq_putc(struct trace_seq *s, unsigned char c)
     127                 :            : {
     128                 :            : }
     129                 :            : static inline void
     130                 :            : trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len)
     131                 :            : {
     132                 :            : }
     133                 :            : static inline void trace_seq_putmem_hex(struct trace_seq *s, const void *mem,
     134                 :            :                                        unsigned int len)
     135                 :            : {
     136                 :            : }
     137                 :            : static inline int trace_seq_path(struct trace_seq *s, const struct path *path)
     138                 :            : {
     139                 :            :         return 0;
     140                 :            : }
     141                 :            : #endif /* CONFIG_TRACING */
     142                 :            : 
     143                 :            : #endif /* _LINUX_TRACE_SEQ_H */

Generated by: LCOV version 1.14