[GIT PULL] x86 debug changes for v4.2

From: Ingo Molnar
Date: Mon Jun 22 2015 - 04:16:00 EST


Please pull the latest x86-debug-for-linus git tree from:

git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git x86-debug-for-linus

# HEAD: 113b5e3720e79ad938374163c1b8e295521dc9cf x86/Documentation: Adapt Ingo's explanation on printing backtraces

Documentation updates about x86 kernel stacks.



Borislav Petkov (3):
x86/Documentation: Move kernel-stacks doc one level up
x86/Documentation: Remove STACKFAULT_STACK bulletpoint
x86/Documentation: Adapt Ingo's explanation on printing backtraces

Documentation/x86/{x86_64 => }/kernel-stacks | 54 ++++++++++++++++++++++++----
1 file changed, 47 insertions(+), 7 deletions(-)
rename Documentation/x86/{x86_64 => }/kernel-stacks (68%)

diff --git a/Documentation/x86/x86_64/kernel-stacks b/Documentation/x86/kernel-stacks
similarity index 68%
rename from Documentation/x86/x86_64/kernel-stacks
rename to Documentation/x86/kernel-stacks
index e3c8a49d1a2f..0f3a6c201943 100644
--- a/Documentation/x86/x86_64/kernel-stacks
+++ b/Documentation/x86/kernel-stacks
@@ -1,3 +1,6 @@
+Kernel stacks on x86-64 bit
Most of the text from Keith Owens, hacked by AK

x86_64 page size (PAGE_SIZE) is 4K.
@@ -56,13 +59,6 @@ If that assumption is ever broken then the stacks will become corrupt.

The currently assigned IST stacks are :-

- Used for interrupt 12 - Stack Fault Exception (#SS).
- This allows the CPU to recover from invalid stack segments. Rarely
- happens.

Used for interrupt 8 - Double Fault Exception (#DF).
@@ -99,3 +95,47 @@ The currently assigned IST stacks are :-
assumptions about the previous state of the kernel stack.

For more details see the Intel IA32 or AMD AMD64 architecture manuals.
+Printing backtraces on x86
+The question about the '?' preceding function names in an x86 stacktrace
+keeps popping up, here's an indepth explanation. It helps if the reader
+stares at print_context_stack() and the whole machinery in and around
+Adapted from Ingo's mail, Message-ID: <20150521101614.GA10889@xxxxxxxxx>:
+We always scan the full kernel stack for return addresses stored on
+the kernel stack(s) [*], from stack top to stack bottom, and print out
+anything that 'looks like' a kernel text address.
+If it fits into the frame pointer chain, we print it without a question
+mark, knowing that it's part of the real backtrace.
+If the address does not fit into our expected frame pointer chain we
+still print it, but we print a '?'. It can mean two things:
+ - either the address is not part of the call chain: it's just stale
+ values on the kernel stack, from earlier function calls. This is
+ the common case.
+ - or it is part of the call chain, but the frame pointer was not set
+ up properly within the function, so we don't recognize it.
+This way we will always print out the real call chain (plus a few more
+entries), regardless of whether the frame pointer was set up correctly
+or not - but in most cases we'll get the call chain right as well. The
+entries printed are strictly in stack order, so you can deduce more
+information from that as well.
+The most important property of this method is that we _never_ lose
+information: we always strive to print _all_ addresses on the stack(s)
+that look like kernel text addresses, so if debug information is wrong,
+we still print out the real call chain as well - just with more question
+marks than ideal.
+[*] For things like IRQ and IST stacks, we also scan those stacks, in
+ the right order, and try to cross from one stack into another
+ reconstructing the call chain. This works most of the time.
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
Please read the FAQ at http://www.tux.org/lkml/