diff options
Diffstat (limited to 'kernel/stacktrace.c')
| -rw-r--r-- | kernel/stacktrace.c | 32 | 
1 files changed, 32 insertions, 0 deletions
diff --git a/kernel/stacktrace.c b/kernel/stacktrace.c index 00fe55cc5a82..b6e4c16377c7 100644 --- a/kernel/stacktrace.c +++ b/kernel/stacktrace.c @@ -25,6 +25,38 @@ void print_stack_trace(struct stack_trace *trace, int spaces)  }  EXPORT_SYMBOL_GPL(print_stack_trace); +int snprint_stack_trace(char *buf, size_t size, +			struct stack_trace *trace, int spaces) +{ +	int i; +	unsigned long ip; +	int generated; +	int total = 0; + +	if (WARN_ON(!trace->entries)) +		return 0; + +	for (i = 0; i < trace->nr_entries; i++) { +		ip = trace->entries[i]; +		generated = snprintf(buf, size, "%*c[<%p>] %pS\n", +				1 + spaces, ' ', (void *) ip, (void *) ip); + +		total += generated; + +		/* Assume that generated isn't a negative number */ +		if (generated >= size) { +			buf += size; +			size = 0; +		} else { +			buf += generated; +			size -= generated; +		} +	} + +	return total; +} +EXPORT_SYMBOL_GPL(snprint_stack_trace); +  /*   * Architectures that do not implement save_stack_trace_tsk or   * save_stack_trace_regs get this weak alias and a once-per-bootup warning  |