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