<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/30114">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">arch/x86/assembly_entry: Enable long mode in romstage<br><br>* Install page tables for long mode<br>* Activate long mode<br><br>Change-Id: I57974a55f3b778c90b3587f39e86e4eb8692ad48<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M src/arch/x86/assembly_entry.S<br>1 file changed, 58 insertions(+), 0 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/14/30114/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/arch/x86/assembly_entry.S b/src/arch/x86/assembly_entry.S</span><br><span>index 02f492c..08e693b 100644</span><br><span>--- a/src/arch/x86/assembly_entry.S</span><br><span>+++ b/src/arch/x86/assembly_entry.S</span><br><span>@@ -26,6 +26,7 @@</span><br><span>  * variables that are stage specific.</span><br><span>  */</span><br><span> .section ".text._start", "ax", @progbits</span><br><span style="color: hsl(120, 100%, 40%);">+.code32</span><br><span> .global _start</span><br><span> _start:</span><br><span> </span><br><span>@@ -35,6 +36,15 @@</span><br><span>       /* reset stack pointer to CAR stack */</span><br><span>       mov     $_car_stack_end, %esp</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_PAGING_IN_CACHE_AS_RAM)</span><br><span style="color: hsl(120, 100%, 40%);">+   # disable paging, in case page table were in CAR</span><br><span style="color: hsl(120, 100%, 40%);">+      mov     %cr0, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    btr     $31, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+     mov     %eax, %cr0</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /* clear CAR_GLOBAL area as it is not shared */</span><br><span>      cld</span><br><span>  xor     %eax, %eax</span><br><span>@@ -43,6 +53,54 @@</span><br><span>      sub     %edi, %ecx</span><br><span>   rep     stosl</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#ifdef __x86_64__</span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_PAGING_IN_CACHE_AS_RAM)</span><br><span style="color: hsl(120, 100%, 40%);">+   /* Setup long mode: identity map 0-4GiB */</span><br><span style="color: hsl(120, 100%, 40%);">+    movl    $(_pagetables), %ecx</span><br><span style="color: hsl(120, 100%, 40%);">+  xor     %eax, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    /* Generate one PM4LE entry */</span><br><span style="color: hsl(120, 100%, 40%);">+        lea     (0x1000)(%ecx), %edi</span><br><span style="color: hsl(120, 100%, 40%);">+  or      $0x00000623, %edi</span><br><span style="color: hsl(120, 100%, 40%);">+     mov     %edi, (%ecx)</span><br><span style="color: hsl(120, 100%, 40%);">+  mov     %eax, 4(%ecx)</span><br><span style="color: hsl(120, 100%, 40%);">+ /* Generate 4 PDPE entries */</span><br><span style="color: hsl(120, 100%, 40%);">+ lea     (0x1000)(%ecx), %edi</span><br><span style="color: hsl(120, 100%, 40%);">+  movl    $0x000000e3, 0x00(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+       movl    %eax, 0x04(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+      movl    $0x400000e3, 0x08(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+       movl    %eax, 0x0c(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+      movl    $0x800000e3, 0x10(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+       movl    %eax, 0x14(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+      movl    $0xc00000e3, 0x18(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+       movl    %eax, 0x1c(%edi)</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    # load ROM based identity mapped page tables</span><br><span style="color: hsl(120, 100%, 40%);">+  mov     %ecx, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    mov     %eax, %cr3</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # enable PAE</span><br><span style="color: hsl(120, 100%, 40%);">+  mov     %cr4, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    bts     $5, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+      mov     %eax, %cr4</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # enable long mode</span><br><span style="color: hsl(120, 100%, 40%);">+    mov     $0xC0000080, %ecx</span><br><span style="color: hsl(120, 100%, 40%);">+     rdmsr</span><br><span style="color: hsl(120, 100%, 40%);">+ bts     $8, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+      wrmsr</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       # enable paging</span><br><span style="color: hsl(120, 100%, 40%);">+       mov     %cr0, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+    bts     $31, %eax</span><br><span style="color: hsl(120, 100%, 40%);">+     mov     %eax, %cr0</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+  # use call far to switch to 64-bit code segment</span><br><span style="color: hsl(120, 100%, 40%);">+       ljmp $0x18, $1f</span><br><span style="color: hsl(120, 100%, 40%);">+.code64</span><br><span style="color: hsl(120, 100%, 40%);">+1:</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #if ((ENV_VERSTAGE && IS_ENABLED(CONFIG_VERSTAGE_DEBUG_SPINLOOP)) \</span><br><span>        || (ENV_ROMSTAGE && IS_ENABLED(CONFIG_ROMSTAGE_DEBUG_SPINLOOP)))</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/30114">change 30114</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/+/30114"/><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: I57974a55f3b778c90b3587f39e86e4eb8692ad48 </div>
<div style="display:none"> Gerrit-Change-Number: 30114 </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>