aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86/kernel/dumpstack.c
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/kernel/dumpstack.c')
-rw-r--r--arch/x86/kernel/dumpstack.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/arch/x86/kernel/dumpstack.c b/arch/x86/kernel/dumpstack.c
index ee344030fd0a..666a284116ac 100644
--- a/arch/x86/kernel/dumpstack.c
+++ b/arch/x86/kernel/dumpstack.c
@@ -72,6 +72,25 @@ static void printk_stack_address(unsigned long address, int reliable,
72 printk("%s %s%pB\n", log_lvl, reliable ? "" : "? ", (void *)address); 72 printk("%s %s%pB\n", log_lvl, reliable ? "" : "? ", (void *)address);
73} 73}
74 74
75/*
76 * There are a couple of reasons for the 2/3rd prologue, courtesy of Linus:
77 *
78 * In case where we don't have the exact kernel image (which, if we did, we can
79 * simply disassemble and navigate to the RIP), the purpose of the bigger
80 * prologue is to have more context and to be able to correlate the code from
81 * the different toolchains better.
82 *
83 * In addition, it helps in recreating the register allocation of the failing
84 * kernel and thus make sense of the register dump.
85 *
86 * What is more, the additional complication of a variable length insn arch like
87 * x86 warrants having longer byte sequence before rIP so that the disassembler
88 * can "sync" up properly and find instruction boundaries when decoding the
89 * opcode bytes.
90 *
91 * Thus, the 2/3rds prologue and 64 byte OPCODE_BUFSIZE is just a random
92 * guesstimate in attempt to achieve all of the above.
93 */
75void show_opcodes(u8 *rip, const char *loglvl) 94void show_opcodes(u8 *rip, const char *loglvl)
76{ 95{
77 unsigned int code_prologue = OPCODE_BUFSIZE * 2 / 3; 96 unsigned int code_prologue = OPCODE_BUFSIZE * 2 / 3;