diff options
| -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; |
