<p>Iru Cai has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/c/coreboot/+/30192">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">mrc_alloc<br><br>Change-Id: I4fd6d50f8a9c45b9204f39954bd3dfc3a2951a11<br>Signed-off-by: Iru Cai <mytbk920423@gmail.com><br>---<br>M src/northbridge/intel/haswell/mrc.asm<br>M src/northbridge/intel/haswell/mrc_main.c<br>2 files changed, 45 insertions(+), 67 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://review.coreboot.org:29418/coreboot refs/changes/92/30192/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/northbridge/intel/haswell/mrc.asm b/src/northbridge/intel/haswell/mrc.asm</span><br><span>index 9bb6b28..a38e385 100644</span><br><span>--- a/src/northbridge/intel/haswell/mrc.asm</span><br><span>+++ b/src/northbridge/intel/haswell/mrc.asm</span><br><span>@@ -4,7 +4,6 @@</span><br><span> </span><br><span> global mrc_entry</span><br><span> global do_raminit</span><br><span style="color: hsl(0, 100%, 40%);">-global heap_check</span><br><span> </span><br><span> extern mrc_printk</span><br><span> extern mrc_setmem</span><br><span>@@ -14,6 +13,7 @@</span><br><span> extern mrc_zeromem</span><br><span> extern mrc_highest_bit</span><br><span> extern mrc_main</span><br><span style="color: hsl(120, 100%, 40%);">+extern mrc_alloc</span><br><span> </span><br><span> mrc_entry:</span><br><span> mov ecx, esp</span><br><span>@@ -2485,57 +2485,6 @@</span><br><span> pop ebp</span><br><span> ret</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-heap_check:</span><br><span style="color: hsl(0, 100%, 40%);">-push ebp</span><br><span style="color: hsl(0, 100%, 40%);">-lea edx, [eax + 3]</span><br><span style="color: hsl(0, 100%, 40%);">-and edx, 0xfffffffc</span><br><span style="color: hsl(0, 100%, 40%);">-mov ebp, esp</span><br><span style="color: hsl(0, 100%, 40%);">-lea esp, [esp - 8]</span><br><span style="color: hsl(0, 100%, 40%);">-mov eax, dword [0xff7d0000]</span><br><span style="color: hsl(0, 100%, 40%);">-test eax, eax</span><br><span style="color: hsl(0, 100%, 40%);">-jne short loc_fffa2959  ; jne 0xfffa2959</span><br><span style="color: hsl(0, 100%, 40%);">-mov dword [0xff7d0004], 0xff7d0008</span><br><span style="color: hsl(0, 100%, 40%);">-jmp short loc_fffa297f  ; jmp 0xfffa297f</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa2959:</span><br><span style="color: hsl(0, 100%, 40%);">-mov ecx, dword [0xff7d0004]</span><br><span style="color: hsl(0, 100%, 40%);">-cmp dword [ecx + eax], 0x900ddea1</span><br><span style="color: hsl(0, 100%, 40%);">-je short loc_fffa297f  ; je 0xfffa297f</span><br><span style="color: hsl(0, 100%, 40%);">-push edx</span><br><span style="color: hsl(0, 100%, 40%);">-push 0x35</span><br><span style="color: hsl(0, 100%, 40%);">-push ref_fffc9e88  ; push 0xfffc9e88</span><br><span style="color: hsl(0, 100%, 40%);">-push ref_fffcc48b  ; push 0xfffcc48b</span><br><span style="color: hsl(0, 100%, 40%);">-call mrc_printk  ; call 0xfffa1253</span><br><span style="color: hsl(0, 100%, 40%);">-add esp, 0x10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa297d:</span><br><span style="color: hsl(0, 100%, 40%);">-jmp short loc_fffa297d  ; jmp 0xfffa297d</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa297f:</span><br><span style="color: hsl(0, 100%, 40%);">-lea ecx, [edx + eax]</span><br><span style="color: hsl(0, 100%, 40%);">-cmp ecx, 0x752c</span><br><span style="color: hsl(0, 100%, 40%);">-ja short loc_fffa29a1  ; ja 0xfffa29a1</span><br><span style="color: hsl(0, 100%, 40%);">-mov edx, dword [0xff7d0004]</span><br><span style="color: hsl(0, 100%, 40%);">-mov dword [0xff7d0000], ecx</span><br><span style="color: hsl(0, 100%, 40%);">-add eax, edx</span><br><span style="color: hsl(0, 100%, 40%);">-mov dword [edx + ecx], 0x900ddea1</span><br><span style="color: hsl(0, 100%, 40%);">-jmp short loc_fffa29b8  ; jmp 0xfffa29b8</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa29a1:</span><br><span style="color: hsl(0, 100%, 40%);">-push edx</span><br><span style="color: hsl(0, 100%, 40%);">-push 0x43</span><br><span style="color: hsl(0, 100%, 40%);">-push ref_fffc9e88  ; push 0xfffc9e88</span><br><span style="color: hsl(0, 100%, 40%);">-push ref_fffcc4ab  ; push 0xfffcc4ab</span><br><span style="color: hsl(0, 100%, 40%);">-call mrc_printk  ; call 0xfffa1253</span><br><span style="color: hsl(0, 100%, 40%);">-add esp, 0x10</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa29b6:</span><br><span style="color: hsl(0, 100%, 40%);">-jmp short loc_fffa29b6  ; jmp 0xfffa29b6</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-loc_fffa29b8:</span><br><span style="color: hsl(0, 100%, 40%);">-leave</span><br><span style="color: hsl(0, 100%, 40%);">-ret</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> fcn_fffa29ba:  ; not directly referenced</span><br><span> push ebp</span><br><span> mov ebp, esp</span><br><span>@@ -2553,7 +2502,7 @@</span><br><span> jne short loc_fffa29f2  ; jne 0xfffa29f2</span><br><span> add eax, 4</span><br><span> mov dword [ebp - 0x1c], edx</span><br><span style="color: hsl(0, 100%, 40%);">-call heap_check  ; call 0xfffa2937</span><br><span style="color: hsl(120, 100%, 40%);">+call mrc_alloc</span><br><span> test eax, eax</span><br><span> mov edx, dword [ebp - 0x1c]</span><br><span> jne short loc_fffa29f4  ; jne 0xfffa29f4</span><br><span>@@ -3761,14 +3710,14 @@</span><br><span> mov eax, ebx</span><br><span> call fcn_fffc7c9d  ; call 0xfffc7c9d</span><br><span> mov eax, 0xc</span><br><span style="color: hsl(0, 100%, 40%);">-call heap_check  ; call 0xfffa2937</span><br><span style="color: hsl(120, 100%, 40%);">+call mrc_alloc</span><br><span> test eax, eax</span><br><span> mov esi, eax</span><br><span> je short loc_fffa3d32  ; je 0xfffa3d32</span><br><span> mov edx, 0xc</span><br><span> call mrc_zeromem</span><br><span> mov eax, 0x28</span><br><span style="color: hsl(0, 100%, 40%);">-call heap_check  ; call 0xfffa2937</span><br><span style="color: hsl(120, 100%, 40%);">+call mrc_alloc</span><br><span> test eax, eax</span><br><span> mov edi, eax</span><br><span> je short loc_fffa3d32  ; je 0xfffa3d32</span><br><span>@@ -3817,7 +3766,7 @@</span><br><span> call mrc_printk  ; call 0xfffa1253</span><br><span> mov eax, 0x10f</span><br><span> mov esi, dword [0xff7d7538]</span><br><span style="color: hsl(0, 100%, 40%);">-call heap_check  ; call 0xfffa2937</span><br><span style="color: hsl(120, 100%, 40%);">+call mrc_alloc</span><br><span> add esp, 0x10</span><br><span> test eax, eax</span><br><span> mov ebx, eax</span><br><span>@@ -53484,9 +53433,6 @@</span><br><span> dd fcn_fffc5b27</span><br><span> dd fcn_fffc5b14</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ref_fffc9e88:</span><br><span style="color: hsl(0, 100%, 40%);">-db 'GlueAllocatePool',0x00,0x00,0x00,0x00</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> ref_fffc9eec:</span><br><span> db 'install_ppi',0x00</span><br><span> </span><br><span>@@ -56083,12 +56029,6 @@</span><br><span> ref_fffcc46a:</span><br><span> db 'Copy SPD for Channel %d Dimm %d',0x0a,0x00</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-ref_fffcc48b:</span><br><span style="color: hsl(0, 100%, 40%);">-db '%s:%d pool cookie corrupted...',0x0a,0x00</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span style="color: hsl(0, 100%, 40%);">-ref_fffcc4ab:</span><br><span style="color: hsl(0, 100%, 40%);">-db '%s:%d failed to allocate %d bytes...',0x0a,0x00</span><br><span style="color: hsl(0, 100%, 40%);">-</span><br><span> ref_fffcc4d1:</span><br><span> db '{%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x}',0x0a,0x00</span><br><span> </span><br><span>diff --git a/src/northbridge/intel/haswell/mrc_main.c b/src/northbridge/intel/haswell/mrc_main.c</span><br><span>index a00abf2..7c2de35 100644</span><br><span>--- a/src/northbridge/intel/haswell/mrc_main.c</span><br><span>+++ b/src/northbridge/intel/haswell/mrc_main.c</span><br><span>@@ -17,8 +17,18 @@</span><br><span> static int *STACK_TOP = (int *)0xff800000;</span><br><span> static int *STACK_BTM = (int *)0xff7d7544;</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct mrc_heap {</span><br><span style="color: hsl(120, 100%, 40%);">+ size_t sz;</span><br><span style="color: hsl(120, 100%, 40%);">+    void *start;</span><br><span style="color: hsl(120, 100%, 40%);">+  int data[0];</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct mrc_heap *HEAP = (struct mrc_heap *)0xff7d0000;</span><br><span style="color: hsl(120, 100%, 40%);">+#define MAX_HEAP_SIZE ((void *)STACK_BTM - (void *)HEAP->data - 16)</span><br><span style="color: hsl(120, 100%, 40%);">+#define POOL_COOKIE 0x900ddea1</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> int __attribute((regparm(1))) do_raminit(struct pei_data *pd);</span><br><span style="color: hsl(0, 100%, 40%);">-int __attribute((regparm(1))) heap_check(int n);</span><br><span style="color: hsl(120, 100%, 40%);">+void *__attribute((regparm(1))) mrc_alloc(int n);</span><br><span> int mrc_main(struct pei_data *pd);</span><br><span> </span><br><span> int mrc_main(struct pei_data *pd)</span><br><span>@@ -51,6 +61,34 @@</span><br><span>         }</span><br><span> </span><br><span>        mrc_printk("Sanity checking heap.\n");</span><br><span style="color: hsl(0, 100%, 40%);">-        heap_check(8);</span><br><span style="color: hsl(120, 100%, 40%);">+        mrc_alloc(8);</span><br><span>        return rv;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void *__attribute((regparm(1))) mrc_alloc(int n)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        size_t alloc = (n + 3) & (-4);</span><br><span style="color: hsl(120, 100%, 40%);">+    size_t sz = HEAP->sz;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (sz == 0) {</span><br><span style="color: hsl(120, 100%, 40%);">+                HEAP->start = HEAP->data;</span><br><span style="color: hsl(120, 100%, 40%);">+       } else {</span><br><span style="color: hsl(120, 100%, 40%);">+              if (*((uint32_t *)(HEAP->start + sz)) != POOL_COOKIE) {</span><br><span style="color: hsl(120, 100%, 40%);">+                    mrc_printk("%s:%d pool cookie corrupted...\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                                      "GlueAllocatePool", 0x35);</span><br><span style="color: hsl(120, 100%, 40%);">+                  while (1)</span><br><span style="color: hsl(120, 100%, 40%);">+                             ;</span><br><span style="color: hsl(120, 100%, 40%);">+             }</span><br><span style="color: hsl(120, 100%, 40%);">+     }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   size_t newsz = alloc + sz;</span><br><span style="color: hsl(120, 100%, 40%);">+    if (newsz <= MAX_HEAP_SIZE) {</span><br><span style="color: hsl(120, 100%, 40%);">+              HEAP->sz = newsz;</span><br><span style="color: hsl(120, 100%, 40%);">+          *((uint32_t *)(HEAP->start + newsz)) = POOL_COOKIE;</span><br><span style="color: hsl(120, 100%, 40%);">+                return HEAP->start + sz;</span><br><span style="color: hsl(120, 100%, 40%);">+   }</span><br><span style="color: hsl(120, 100%, 40%);">+     mrc_printk("%s:%d failed to allocate %d bytes...\n",</span><br><span style="color: hsl(120, 100%, 40%);">+                        "GlueAllocatePool", 0x43);</span><br><span style="color: hsl(120, 100%, 40%);">+  while (1)</span><br><span style="color: hsl(120, 100%, 40%);">+             ;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/c/coreboot/+/30192">change 30192</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/+/30192"/><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: I4fd6d50f8a9c45b9204f39954bd3dfc3a2951a11 </div>
<div style="display:none"> Gerrit-Change-Number: 30192 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Iru Cai <mytbk920423@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Iru Cai <mytbk920423@gmail.com> </div>
<div style="display:none"> Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>