|
@@ -72,6 +72,25 @@ static void printk_stack_address(unsigned long address, int reliable,
|
|
|
printk("%s %s%pB\n", log_lvl, reliable ? "" : "? ", (void *)address);
|
|
|
}
|
|
|
|
|
|
+/*
|
|
|
+ * There are a couple of reasons for the 2/3rd prologue, courtesy of Linus:
|
|
|
+ *
|
|
|
+ * In case where we don't have the exact kernel image (which, if we did, we can
|
|
|
+ * simply disassemble and navigate to the RIP), the purpose of the bigger
|
|
|
+ * prologue is to have more context and to be able to correlate the code from
|
|
|
+ * the different toolchains better.
|
|
|
+ *
|
|
|
+ * In addition, it helps in recreating the register allocation of the failing
|
|
|
+ * kernel and thus make sense of the register dump.
|
|
|
+ *
|
|
|
+ * What is more, the additional complication of a variable length insn arch like
|
|
|
+ * x86 warrants having longer byte sequence before rIP so that the disassembler
|
|
|
+ * can "sync" up properly and find instruction boundaries when decoding the
|
|
|
+ * opcode bytes.
|
|
|
+ *
|
|
|
+ * Thus, the 2/3rds prologue and 64 byte OPCODE_BUFSIZE is just a random
|
|
|
+ * guesstimate in attempt to achieve all of the above.
|
|
|
+ */
|
|
|
void show_opcodes(u8 *rip, const char *loglvl)
|
|
|
{
|
|
|
unsigned int code_prologue = OPCODE_BUFSIZE * 2 / 3;
|