diff options
Diffstat (limited to 'arch/x86/kernel/dumpstack.c')
-rw-r--r-- | arch/x86/kernel/dumpstack.c | 19 |
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 | */ | ||
75 | void show_opcodes(u8 *rip, const char *loglvl) | 94 | void 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; |