1 #ifndef _LINUX_TRACE_SEQ_H 2 #define _LINUX_TRACE_SEQ_H 3 4 #include <linux/fs.h> 5 6 #include <asm/page.h> 7 8 /* 9 * Trace sequences are used to allow a function to call several other functions 10 * to create a string of data to use (up to a max of PAGE_SIZE). 11 */ 12 13 struct trace_seq { 14 unsigned char buffer[PAGE_SIZE]; 15 unsigned int len; 16 unsigned int readpos; 17 int full; 18 }; 19 20 static inline void 21 trace_seq_init(struct trace_seq *s) 22 { 23 s->len = 0; 24 s->readpos = 0; 25 s->full = 0; 26 } 27 28 /** 29 * trace_seq_buffer_ptr - return pointer to next location in buffer 30 * @s: trace sequence descriptor 31 * 32 * Returns the pointer to the buffer where the next write to 33 * the buffer will happen. This is useful to save the location 34 * that is about to be written to and then return the result 35 * of that write. 36 */ 37 static inline unsigned char * 38 trace_seq_buffer_ptr(struct trace_seq *s) 39 { 40 return s->buffer + s->len; 41 } 42 43 /** 44 * trace_seq_has_overflowed - return true if the trace_seq took too much 45 * @s: trace sequence descriptor 46 * 47 * Returns true if too much data was added to the trace_seq and it is 48 * now full and will not take anymore. 49 */ 50 static inline bool trace_seq_has_overflowed(struct trace_seq *s) 51 { 52 return s->full || s->len > PAGE_SIZE - 1; 53 } 54 55 /* 56 * Currently only defined when tracing is enabled. 57 */ 58 #ifdef CONFIG_TRACING 59 extern __printf(2, 3) 60 void trace_seq_printf(struct trace_seq *s, const char *fmt, ...); 61 extern __printf(2, 0) 62 void trace_seq_vprintf(struct trace_seq *s, const char *fmt, va_list args); 63 extern void 64 trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary); 65 extern int trace_print_seq(struct seq_file *m, struct trace_seq *s); 66 extern int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, 67 int cnt); 68 extern void trace_seq_puts(struct trace_seq *s, const char *str); 69 extern void trace_seq_putc(struct trace_seq *s, unsigned char c); 70 extern void trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len); 71 extern void trace_seq_putmem_hex(struct trace_seq *s, const void *mem, 72 unsigned int len); 73 extern int trace_seq_path(struct trace_seq *s, const struct path *path); 74 75 extern void trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, 76 int nmaskbits); 77 78 #else /* CONFIG_TRACING */ 79 static inline void trace_seq_printf(struct trace_seq *s, const char *fmt, ...) 80 { 81 } 82 static inline void 83 trace_seq_bprintf(struct trace_seq *s, const char *fmt, const u32 *binary) 84 { 85 } 86 87 static inline void 88 trace_seq_bitmask(struct trace_seq *s, const unsigned long *maskp, 89 int nmaskbits) 90 { 91 } 92 93 static inline int trace_print_seq(struct seq_file *m, struct trace_seq *s) 94 { 95 return 0; 96 } 97 static inline int trace_seq_to_user(struct trace_seq *s, char __user *ubuf, 98 int cnt) 99 { 100 return 0; 101 } 102 static inline void trace_seq_puts(struct trace_seq *s, const char *str) 103 { 104 } 105 static inline void trace_seq_putc(struct trace_seq *s, unsigned char c) 106 { 107 } 108 static inline void 109 trace_seq_putmem(struct trace_seq *s, const void *mem, unsigned int len) 110 { 111 } 112 static inline void trace_seq_putmem_hex(struct trace_seq *s, const void *mem, 113 unsigned int len) 114 { 115 } 116 static inline int trace_seq_path(struct trace_seq *s, const struct path *path) 117 { 118 return 0; 119 } 120 #endif /* CONFIG_TRACING */ 121 122 #endif /* _LINUX_TRACE_SEQ_H */ 123