summaryrefslogtreecommitdiff
path: root/src/arch
diff options
context:
space:
mode:
authorAlexandru Gagniuc <mr.nuke.me@gmail.com>2012-08-15 06:45:18 -0500
committerAnton Kochkov <anton.kochkov@gmail.com>2012-08-15 16:08:15 +0200
commitde415ebdd62eced24823edc3d0d2805c8c3fac3b (patch)
treebfbc0672c4448df7d953736d659cbdb3709423e1 /src/arch
parent811d661f3aabaed97e3367dbb45a96244432b3f8 (diff)
coreboot: Dump memory around problem area when encountering exception
When we encounter an x86 exception, we print the problem address, dump the registers and die. This may not be sufficient information for debug. Also dump the memory around the problem instruction. This has proven useful in identifying memory issues, and DRAM burst reordering problems. Change-Id: I6411344e89f946e16d11217d7dbd73812c45d54c Signed-off-by: Alexandru Gagniuc <mr.nuke.me@gmail.com> Reviewed-on: http://review.coreboot.org/1454 Tested-by: build bot (Jenkins) Reviewed-by: Anton Kochkov <anton.kochkov@gmail.com>
Diffstat (limited to 'src/arch')
-rw-r--r--src/arch/x86/lib/exception.c13
1 files changed, 13 insertions, 0 deletions
diff --git a/src/arch/x86/lib/exception.c b/src/arch/x86/lib/exception.c
index 4721bc8b16..97569493fd 100644
--- a/src/arch/x86/lib/exception.c
+++ b/src/arch/x86/lib/exception.c
@@ -475,6 +475,7 @@ void x86_exception(struct eregs *info)
put_packet(out_buffer);
}
#else /* !CONFIG_GDB_STUB */
+#define MDUMP_SIZE 0x80
printk(BIOS_EMERG,
"Unexpected Exception: %d @ %02x:%08x - Halting\n"
"Code: %d eflags: %08x\n"
@@ -484,6 +485,18 @@ void x86_exception(struct eregs *info)
info->error_code, info->eflags,
info->eax, info->ebx, info->ecx, info->edx,
info->edi, info->esi, info->ebp, info->esp);
+ u8 *code = (u8*)((u32)info->eip - (MDUMP_SIZE >>1));
+ /* Align to 8-byte boundary please, and print eight bytes per row.
+ * This is done to make DRAM burst timing/reordering errors more
+ * evident from the looking at the dump */
+ code = (u8*)((u32)code & ~0x7);
+ int i;
+ for(i = 0; i < MDUMP_SIZE; i++)
+ {
+ if( (i & 0x07) == 0 )
+ printk(BIOS_EMERG, "\n%.8x:\t", (int)code + i );
+ printk(BIOS_EMERG, "%.2x ", code[i]);
+ }
die("");
#endif
}