<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/30117">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">[WIP]arch/x86: Support x86_64 exceptions<br><br>* Seems to have alignment issues<br><br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>Change-Id: Idd12c90a95cc2989eb9b2a718740a84222193f48<br>---<br>M src/arch/x86/exception.c<br>M src/arch/x86/idt.S<br>M src/arch/x86/include/arch/registers.h<br>3 files changed, 90 insertions(+), 12 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/17/30117/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/exception.c b/src/arch/x86/exception.c</span><br><span>index 0f42fdf..e89215f 100644</span><br><span>--- a/src/arch/x86/exception.c</span><br><span>+++ b/src/arch/x86/exception.c</span><br><span>@@ -502,12 +502,31 @@</span><br><span> put_packet(out_buffer);</span><br><span> }</span><br><span> #else /* !CONFIG_GDB_STUB */</span><br><span style="color: hsl(0, 100%, 40%);">-#define MDUMP_SIZE 0x80</span><br><span> unsigned int logical_processor = 0;</span><br><span> </span><br><span> #if ENV_RAMSTAGE</span><br><span> logical_processor = cpu_index();</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+ u8 *code;</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+#define MDUMP_SIZE 0x100</span><br><span style="color: hsl(120, 100%, 40%);">+ printk(BIOS_EMERG,</span><br><span style="color: hsl(120, 100%, 40%);">+ "CPU Index %d - APIC %d Unexpected Exception:\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "%lld @ %02llx:%016llx - Halting\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "Code: %lld rflags: %016llx cr2: %016llx\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "rax: %016llx rbx: %016llx\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "rcx: %016llx rdx: %016llx\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "rdi: %016llx rsi: %016llx\n"</span><br><span style="color: hsl(120, 100%, 40%);">+ "rbp: %016llx rsp: %016llx\n",</span><br><span style="color: hsl(120, 100%, 40%);">+ logical_processor, (unsigned int)lapicid(),</span><br><span style="color: hsl(120, 100%, 40%);">+ info->vector, info->cs, info->rip,</span><br><span style="color: hsl(120, 100%, 40%);">+ info->error_code, info->rflags, read_cr2(),</span><br><span style="color: hsl(120, 100%, 40%);">+ info->rax, info->rbx, info->rcx, info->rdx,</span><br><span style="color: hsl(120, 100%, 40%);">+ info->rdi, info->rsi, info->rbp, info->rsp);</span><br><span style="color: hsl(120, 100%, 40%);">+ code = (u8 *)((uintptr_t)info->rip - (MDUMP_SIZE >> 2));</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span style="color: hsl(120, 100%, 40%);">+#define MDUMP_SIZE 0x80</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> printk(BIOS_EMERG,</span><br><span> "CPU Index %d - APIC %d Unexpected Exception:"</span><br><span> "%d @ %02x:%08x - Halting\n"</span><br><span>@@ -519,7 +538,8 @@</span><br><span> info->error_code, info->eflags, read_cr2(),</span><br><span> info->eax, info->ebx, info->ecx, info->edx,</span><br><span> info->edi, info->esi, info->ebp, info->esp);</span><br><span style="color: hsl(0, 100%, 40%);">- u8 *code = (u8 *)((uintptr_t)info->eip - (MDUMP_SIZE >> 1));</span><br><span style="color: hsl(120, 100%, 40%);">+ code = (u8 *)((uintptr_t)info->eip - (MDUMP_SIZE >> 1));</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> /* Align to 8-byte boundary please, and print eight bytes per row.</span><br><span> * This is done to make DRAM burst timing/reordering errors more</span><br><span> * evident from the looking at the dump */</span><br><span>diff --git a/src/arch/x86/idt.S b/src/arch/x86/idt.S</span><br><span>index 9c36d81..8a3706d 100644</span><br><span>--- a/src/arch/x86/idt.S</span><br><span>+++ b/src/arch/x86/idt.S</span><br><span>@@ -120,26 +120,34 @@</span><br><span> </span><br><span> .global int_hand</span><br><span> int_hand:</span><br><span style="color: hsl(0, 100%, 40%);">- /* At this point, on x86-32, on the stack there is:</span><br><span style="color: hsl(0, 100%, 40%);">- * 0(%esp) vector</span><br><span style="color: hsl(0, 100%, 40%);">- * 4(%esp) error code</span><br><span style="color: hsl(0, 100%, 40%);">- * 8(%esp) eip</span><br><span style="color: hsl(0, 100%, 40%);">- * 12(%esp) cs</span><br><span style="color: hsl(0, 100%, 40%);">- * 16(%esp) eflags</span><br><span style="color: hsl(0, 100%, 40%);">- */</span><br><span> #ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+ /* At this point, on x86-64, on the stack there is:</span><br><span style="color: hsl(120, 100%, 40%);">+ * 0(%rsp) vector</span><br><span style="color: hsl(120, 100%, 40%);">+ * 8(%rsp) error code</span><br><span style="color: hsl(120, 100%, 40%);">+ * 16(%rsp) rip</span><br><span style="color: hsl(120, 100%, 40%);">+ * 24(%rsp) cs</span><br><span style="color: hsl(120, 100%, 40%);">+ * 32(%rsp) rflags</span><br><span style="color: hsl(120, 100%, 40%);">+ * 40(%rsp) rsp</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> push %rdi</span><br><span> push %rsi</span><br><span> push %rbp</span><br><span> /* Original stack pointer */</span><br><span style="color: hsl(0, 100%, 40%);">- lea 32(%rsp), %rbp</span><br><span style="color: hsl(120, 100%, 40%);">+ lea 64(%rsp), %rbp</span><br><span> push %rbp</span><br><span> push %rbx</span><br><span> push %rdx</span><br><span> push %rcx</span><br><span> push %rax</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- push %rsp /* Pointer to structure on the stack */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Save pointer to eregs structure */</span><br><span style="color: hsl(120, 100%, 40%);">+ mov %rsp, %rbp</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Align stack to 16 bytes. */</span><br><span style="color: hsl(120, 100%, 40%);">+ and $(~0xf), %rsp</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Save original stack pointer while keeping stack alignment. This</span><br><span style="color: hsl(120, 100%, 40%);">+ value is also the eregs argument x86_exception(). */</span><br><span style="color: hsl(120, 100%, 40%);">+ sub $8, %rsp</span><br><span style="color: hsl(120, 100%, 40%);">+ push %rbp /* Pointer to structure on the stack */</span><br><span> call x86_exception</span><br><span> pop %rax /* Drop the pointer */</span><br><span> </span><br><span>@@ -152,8 +160,15 @@</span><br><span> pop %rsi</span><br><span> pop %rdi</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">- add $8, %rsp /* pop of the vector and error code */</span><br><span style="color: hsl(120, 100%, 40%);">+ add $16, %rsp /* pop of the vector and error code */</span><br><span> #else</span><br><span style="color: hsl(120, 100%, 40%);">+ /* At this point, on x86-32, on the stack there is:</span><br><span style="color: hsl(120, 100%, 40%);">+ * 0(%esp) vector</span><br><span style="color: hsl(120, 100%, 40%);">+ * 4(%esp) error code</span><br><span style="color: hsl(120, 100%, 40%);">+ * 8(%esp) eip</span><br><span style="color: hsl(120, 100%, 40%);">+ * 12(%esp) cs</span><br><span style="color: hsl(120, 100%, 40%);">+ * 16(%esp) eflags</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span> pushl %edi</span><br><span> pushl %esi</span><br><span> pushl %ebp</span><br><span>diff --git a/src/arch/x86/include/arch/registers.h b/src/arch/x86/include/arch/registers.h</span><br><span>index 1d3b90a..20fc683 100644</span><br><span>--- a/src/arch/x86/include/arch/registers.h</span><br><span>+++ b/src/arch/x86/include/arch/registers.h</span><br><span>@@ -19,6 +19,38 @@</span><br><span> #if !defined(__ASSEMBLER__)</span><br><span> #include <stdint.h></span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+#define DOWNTO8(A) \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct { \</span><br><span style="color: hsl(120, 100%, 40%);">+ union { \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct { \</span><br><span style="color: hsl(120, 100%, 40%);">+ union { \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct { \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t A##l; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint8_t A##h; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t A##x; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t h##A##x; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t e##A##x; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t r##A##x; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#define DOWNTO16(A) \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct {\</span><br><span style="color: hsl(120, 100%, 40%);">+ union { \</span><br><span style="color: hsl(120, 100%, 40%);">+ struct { \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t A; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint16_t h##A; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint32_t e##A; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed; \</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t r##A; \</span><br><span style="color: hsl(120, 100%, 40%);">+ } __packed;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span> #define DOWNTO8(A) \</span><br><span> union { \</span><br><span> struct { \</span><br><span>@@ -43,6 +75,9 @@</span><br><span> uint32_t e##A; \</span><br><span> } __packed;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct eregs {</span><br><span> DOWNTO8(a);</span><br><span> DOWNTO8(c);</span><br><span>@@ -52,11 +87,19 @@</span><br><span> DOWNTO16(bp);</span><br><span> DOWNTO16(si);</span><br><span> DOWNTO16(di);</span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t vector;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t error_code;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t rip;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t cs;</span><br><span style="color: hsl(120, 100%, 40%);">+ uint64_t rflags;</span><br><span style="color: hsl(120, 100%, 40%);">+#else</span><br><span> uint32_t vector;</span><br><span> uint32_t error_code;</span><br><span> uint32_t eip;</span><br><span> uint32_t cs;</span><br><span> uint32_t eflags;</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span> };</span><br><span> #endif // !ASSEMBLER</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/30117">change 30117</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://review.coreboot.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://review.coreboot.org/c/coreboot/+/30117"/><meta itemprop="name" content="View Change"/></div></div>
<div style="display:none"> Gerrit-Project: coreboot </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: Idd12c90a95cc2989eb9b2a718740a84222193f48 </div>
<div style="display:none"> Gerrit-Change-Number: 30117 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>