<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>