[coreboot] New patch to review for coreboot: 8455ac8 coreboot: Dump memory around problem area when encountering exception

Alexandru Gagniuc (mr.nuke.me@gmail.com) gerrit at coreboot.org
Wed Aug 15 13:49:01 CEST 2012


Alexandru Gagniuc (mr.nuke.me at gmail.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/1454

-gerrit

commit 8455ac802e133d0fc7bfec98b1e72300ffb15d36
Author: Alexandru Gagniuc <mr.nuke.me at gmail.com>
Date:   Wed Aug 15 06:45:18 2012 -0500

    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 at gmail.com>
---
 src/arch/x86/lib/exception.c | 13 +++++++++++++
 1 file changed, 13 insertions(+)

diff --git a/src/arch/x86/lib/exception.c b/src/arch/x86/lib/exception.c
index 4721bc8..d9a6776 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
 }




More information about the coreboot mailing list