b24413180f560 lib/seq_buf.c (Greg Kroah-Hartman 2017-11-01 15:07:57 +0100 1) // SPDX-License-Identifier: GPL-2.0
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 2) /*
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 3) * seq_buf.c
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 4) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 5) * Copyright (C) 2014 Red Hat Inc, Steven Rostedt <srostedt@redhat.com>
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 6) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 7) * The seq_buf is a handy tool that allows you to pass a descriptor around
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 8) * to a buffer that other functions can write to. It is similar to the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 9) * seq_file functionality but has some differences.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 10) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 11) * To use it, the seq_buf must be initialized with seq_buf_init().
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 12) * This will set up the counters within the descriptor. You can call
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 13) * seq_buf_init() more than once to reset the seq_buf to start
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 14) * from scratch.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 15) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 16) #include <linux/uaccess.h>
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 17) #include <linux/seq_file.h>
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 18) #include <linux/seq_buf.h>
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 19)
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 20) /**
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 21) * seq_buf_can_fit - can the new data fit in the current buffer?
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 22) * @s: the seq_buf descriptor
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 23) * @len: The length to see if it can fit in the current buffer
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 24) *
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 25) * Returns true if there's enough unused space in the seq_buf buffer
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 26) * to fit the amount of new data according to @len.
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 27) */
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 28) static bool seq_buf_can_fit(struct seq_buf *s, size_t len)
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 29) {
8cd709ae7658a kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 15:26:09 -0400 30) return s->len + len <= s->size;
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 31) }
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 32)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 33) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 34) * seq_buf_print_seq - move the contents of seq_buf into a seq_file
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 35) * @m: the seq_file descriptor that is the destination
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 36) * @s: the seq_buf descriptor that is the source.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 37) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 38) * Returns zero on success, non zero otherwise
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 39) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 40) int seq_buf_print_seq(struct seq_file *m, struct seq_buf *s)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 41) {
eeab98154dc0b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-06 16:38:28 -0500 42) unsigned int len = seq_buf_used(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 43)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 44) return seq_write(m, s->buffer, len);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 45) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 46)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 47) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 48) * seq_buf_vprintf - sequence printing of information.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 49) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 50) * @fmt: printf format string
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 51) * @args: va_list of arguments from a printf() type function
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 52) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 53) * Writes a vnprintf() format into the sequencce buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 54) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 55) * Returns zero on success, -1 on overflow.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 56) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 57) int seq_buf_vprintf(struct seq_buf *s, const char *fmt, va_list args)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 58) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 59) int len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 60)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 61) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 62)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 63) if (s->len < s->size) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 64) len = vsnprintf(s->buffer + s->len, s->size - s->len, fmt, args);
4a8fe4e1811c9 lib/seq_buf.c (Steven Rostedt (Red Hat) 2015-03-04 09:56:02 -0500 65) if (s->len + len < s->size) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 66) s->len += len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 67) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 68) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 69) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 70) seq_buf_set_overflow(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 71) return -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 72) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 73)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 74) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 75) * seq_buf_printf - sequence printing of information
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 76) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 77) * @fmt: printf format string
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 78) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 79) * Writes a printf() format into the sequence buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 80) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 81) * Returns zero on success, -1 on overflow.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 82) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 83) int seq_buf_printf(struct seq_buf *s, const char *fmt, ...)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 84) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 85) va_list ap;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 86) int ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 87)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 88) va_start(ap, fmt);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 89) ret = seq_buf_vprintf(s, fmt, ap);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 90) va_end(ap);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 91)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 92) return ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 93) }
97c02c723bcef lib/seq_buf.c (Vaibhav Jain 2020-06-15 18:14:03 +0530 94) EXPORT_SYMBOL_GPL(seq_buf_printf);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 95)
2448913ed2aa7 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-03 18:53:50 -0500 96) #ifdef CONFIG_BINARY_PRINTF
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 97) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 98) * seq_buf_bprintf - Write the printf string from binary arguments
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 99) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 100) * @fmt: The format string for the @binary arguments
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 101) * @binary: The binary arguments for @fmt.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 102) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 103) * When recording in a fast path, a printf may be recorded with just
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 104) * saving the format and the arguments as they were passed to the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 105) * function, instead of wasting cycles converting the arguments into
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 106) * ASCII characters. Instead, the arguments are saved in a 32 bit
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 107) * word array that is defined by the format string constraints.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 108) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 109) * This function will take the format and the binary array and finish
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 110) * the conversion into the ASCII string within the buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 111) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 112) * Returns zero on success, -1 on overflow.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 113) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 114) int seq_buf_bprintf(struct seq_buf *s, const char *fmt, const u32 *binary)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 115) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 116) unsigned int len = seq_buf_buffer_left(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 117) int ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 118)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 119) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 120)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 121) if (s->len < s->size) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 122) ret = bstr_printf(s->buffer + s->len, len, fmt, binary);
4d4eb4d4fbd94 lib/seq_buf.c (Steven Rostedt (Red Hat) 2015-03-04 23:30:45 -0500 123) if (s->len + ret < s->size) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 124) s->len += ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 125) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 126) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 127) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 128) seq_buf_set_overflow(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 129) return -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 130) }
2448913ed2aa7 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-03 18:53:50 -0500 131) #endif /* CONFIG_BINARY_PRINTF */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 132)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 133) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 134) * seq_buf_puts - sequence printing of simple string
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 135) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 136) * @str: simple string to record
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 137) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 138) * Copy a simple string into the sequence buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 139) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 140) * Returns zero on success, -1 on overflow
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 141) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 142) int seq_buf_puts(struct seq_buf *s, const char *str)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 143) {
29924e5030969 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:09 +1100 144) size_t len = strlen(str);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 145)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 146) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 147)
0464ed2438090 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:08 +1100 148) /* Add 1 to len for the trailing null byte which must be there */
0464ed2438090 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:08 +1100 149) len += 1;
0464ed2438090 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:08 +1100 150)
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 151) if (seq_buf_can_fit(s, len)) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 152) memcpy(s->buffer + s->len, str, len);
0464ed2438090 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:08 +1100 153) /* Don't count the trailing null byte against the capacity */
0464ed2438090 lib/seq_buf.c (Michael Ellerman 2018-10-19 15:21:08 +1100 154) s->len += len - 1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 155) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 156) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 157) seq_buf_set_overflow(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 158) return -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 159) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 160)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 161) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 162) * seq_buf_putc - sequence printing of simple character
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 163) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 164) * @c: simple character to record
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 165) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 166) * Copy a single character into the sequence buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 167) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 168) * Returns zero on success, -1 on overflow
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 169) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 170) int seq_buf_putc(struct seq_buf *s, unsigned char c)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 171) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 172) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 173)
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 174) if (seq_buf_can_fit(s, 1)) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 175) s->buffer[s->len++] = c;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 176) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 177) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 178) seq_buf_set_overflow(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 179) return -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 180) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 181)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 182) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 183) * seq_buf_putmem - write raw data into the sequenc buffer
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 184) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 185) * @mem: The raw memory to copy into the buffer
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 186) * @len: The length of the raw memory to copy (in bytes)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 187) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 188) * There may be cases where raw memory needs to be written into the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 189) * buffer and a strcpy() would not work. Using this function allows
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 190) * for such cases.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 191) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 192) * Returns zero on success, -1 on overflow
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 193) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 194) int seq_buf_putmem(struct seq_buf *s, const void *mem, unsigned int len)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 195) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 196) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 197)
9b77215382b42 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-11-14 16:18:14 -0500 198) if (seq_buf_can_fit(s, len)) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 199) memcpy(s->buffer + s->len, mem, len);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 200) s->len += len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 201) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 202) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 203) seq_buf_set_overflow(s);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 204) return -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 205) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 206)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 207) #define MAX_MEMHEX_BYTES 8U
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 208) #define HEX_CHARS (MAX_MEMHEX_BYTES*2 + 1)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 209)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 210) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 211) * seq_buf_putmem_hex - write raw memory into the buffer in ASCII hex
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 212) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 213) * @mem: The raw memory to write its hex ASCII representation of
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 214) * @len: The length of the raw memory to copy (in bytes)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 215) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 216) * This is similar to seq_buf_putmem() except instead of just copying the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 217) * raw memory into the buffer it writes its ASCII representation of it
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 218) * in hex characters.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 219) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 220) * Returns zero on success, -1 on overflow
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 221) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 222) int seq_buf_putmem_hex(struct seq_buf *s, const void *mem,
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 223) unsigned int len)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 224) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 225) unsigned char hex[HEX_CHARS];
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 226) const unsigned char *data = mem;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 227) unsigned int start_len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 228) int i, j;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 229)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 230) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 231)
d57fcab190b60 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:55 +0800 232) BUILD_BUG_ON(MAX_MEMHEX_BYTES * 2 >= HEX_CHARS);
d57fcab190b60 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:55 +0800 233)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 234) while (len) {
d57fcab190b60 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:55 +0800 235) start_len = min(len, MAX_MEMHEX_BYTES);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 236) #ifdef __BIG_ENDIAN
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 237) for (i = 0, j = 0; i < start_len; i++) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 238) #else
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 239) for (i = start_len-1, j = 0; i >= 0; i--) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 240) #endif
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 241) hex[j++] = hex_asc_hi(data[i]);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 242) hex[j++] = hex_asc_lo(data[i]);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 243) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 244) if (WARN_ON_ONCE(j == 0 || j/2 > len))
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 245) break;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 246)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 247) /* j increments twice per loop */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 248) hex[j++] = ' ';
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 249)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 250) seq_buf_putmem(s, hex, j);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 251) if (seq_buf_has_overflowed(s))
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 252) return -1;
468e5a5c9d087 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:56 +0800 253)
468e5a5c9d087 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:56 +0800 254) len -= start_len;
468e5a5c9d087 lib/seq_buf.c (Yun Zhou 2021-06-26 11:21:56 +0800 255) data += start_len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 256) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 257) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 258) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 259)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 260) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 261) * seq_buf_path - copy a path into the sequence buffer
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 262) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 263) * @path: path to write into the sequence buffer.
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 264) * @esc: set of characters to escape in the output
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 265) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 266) * Write a path name into the sequence buffer.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 267) *
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 268) * Returns the number of written bytes on success, -1 on overflow
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 269) */
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 270) int seq_buf_path(struct seq_buf *s, const struct path *path, const char *esc)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 271) {
01cb06a4c2299 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 17:30:50 -0400 272) char *buf;
01cb06a4c2299 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 17:30:50 -0400 273) size_t size = seq_buf_get_buf(s, &buf);
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 274) int res = -1;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 275)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 276) WARN_ON(s->size == 0);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 277)
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 278) if (size) {
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 279) char *p = d_path(path, buf, size);
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 280) if (!IS_ERR(p)) {
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 281) char *end = mangle_path(buf, p, esc);
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 282) if (end)
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 283) res = end - buf;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 284) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 285) }
01cb06a4c2299 kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 17:30:50 -0400 286) seq_buf_commit(s, res);
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 287)
dd23180aacf4b kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-10-29 13:48:37 -0400 288) return res;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 289) }
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 290)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 291) /**
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 292) * seq_buf_to_user - copy the squence buffer to user space
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 293) * @s: seq_buf descriptor
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 294) * @ubuf: The userspace memory location to copy to
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 295) * @cnt: The amount to copy
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 296) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 297) * Copies the sequence buffer into the userspace memory pointed to
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 298) * by @ubuf. It starts from the last read position (@s->readpos)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 299) * and writes up to @cnt characters or till it reaches the end of
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 300) * the content in the buffer (@s->len), which ever comes first.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 301) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 302) * On success, it returns a positive number of the number of bytes
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 303) * it copied.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 304) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 305) * On failure it returns -EBUSY if all of the content in the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 306) * sequence has been already read, which includes nothing in the
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 307) * sequence (@s->len == @s->readpos).
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 308) *
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 309) * Returns -EFAULT if the copy to userspace fails.
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 310) */
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 311) int seq_buf_to_user(struct seq_buf *s, char __user *ubuf, int cnt)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 312) {
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 313) int len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 314) int ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 315)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 316) if (!cnt)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 317) return 0;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 318)
ff078d8fc6447 lib/seq_buf.c (Jerry Snitselaar 2015-11-16 12:57:28 -0700 319) len = seq_buf_used(s);
ff078d8fc6447 lib/seq_buf.c (Jerry Snitselaar 2015-11-16 12:57:28 -0700 320)
ff078d8fc6447 lib/seq_buf.c (Jerry Snitselaar 2015-11-16 12:57:28 -0700 321) if (len <= s->readpos)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 322) return -EBUSY;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 323)
ff078d8fc6447 lib/seq_buf.c (Jerry Snitselaar 2015-11-16 12:57:28 -0700 324) len -= s->readpos;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 325) if (cnt > len)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 326) cnt = len;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 327) ret = copy_to_user(ubuf, s->buffer + s->readpos, cnt);
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 328) if (ret == cnt)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 329) return -EFAULT;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 330)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 331) cnt -= ret;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 332)
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 333) s->readpos += cnt;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 334) return cnt;
3a161d99c43ce kernel/trace/seq_buf.c (Steven Rostedt (Red Hat) 2014-06-25 15:54:42 -0400 335) }
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 336)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 337) /**
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 338) * seq_buf_hex_dump - print formatted hex dump into the sequence buffer
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 339) * @s: seq_buf descriptor
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 340) * @prefix_str: string to prefix each line with;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 341) * caller supplies trailing spaces for alignment if desired
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 342) * @prefix_type: controls whether prefix of an offset, address, or none
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 343) * is printed (%DUMP_PREFIX_OFFSET, %DUMP_PREFIX_ADDRESS, %DUMP_PREFIX_NONE)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 344) * @rowsize: number of bytes to print per line; must be 16 or 32
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 345) * @groupsize: number of bytes to print at a time (1, 2, 4, 8; default = 1)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 346) * @buf: data blob to dump
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 347) * @len: number of bytes in the @buf
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 348) * @ascii: include ASCII after the hex output
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 349) *
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 350) * Function is an analogue of print_hex_dump() and thus has similar interface.
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 351) *
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 352) * linebuf size is maximal length for one line.
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 353) * 32 * 3 - maximum bytes per line, each printed into 2 chars + 1 for
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 354) * separating space
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 355) * 2 - spaces separating hex dump and ascii representation
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 356) * 32 - ascii representation
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 357) * 1 - terminating '\0'
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 358) *
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 359) * Returns zero on success, -1 on overflow
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 360) */
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 361) int seq_buf_hex_dump(struct seq_buf *s, const char *prefix_str, int prefix_type,
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 362) int rowsize, int groupsize,
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 363) const void *buf, size_t len, bool ascii)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 364) {
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 365) const u8 *ptr = buf;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 366) int i, linelen, remaining = len;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 367) unsigned char linebuf[32 * 3 + 2 + 32 + 1];
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 368) int ret;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 369)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 370) if (rowsize != 16 && rowsize != 32)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 371) rowsize = 16;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 372)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 373) for (i = 0; i < len; i += rowsize) {
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 374) linelen = min(remaining, rowsize);
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 375) remaining -= rowsize;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 376)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 377) hex_dump_to_buffer(ptr + i, linelen, rowsize, groupsize,
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 378) linebuf, sizeof(linebuf), ascii);
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 379)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 380) switch (prefix_type) {
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 381) case DUMP_PREFIX_ADDRESS:
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 382) ret = seq_buf_printf(s, "%s%p: %s\n",
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 383) prefix_str, ptr + i, linebuf);
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 384) break;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 385) case DUMP_PREFIX_OFFSET:
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 386) ret = seq_buf_printf(s, "%s%.8x: %s\n",
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 387) prefix_str, i, linebuf);
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 388) break;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 389) default:
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 390) ret = seq_buf_printf(s, "%s%s\n", prefix_str, linebuf);
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 391) break;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 392) }
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 393) if (ret)
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 394) return ret;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 395) }
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 396) return 0;
353cade3149c2 lib/seq_buf.c (Piotr Maziarz 2019-11-07 13:45:37 +0100 397) }