<p>Patrick Rudolph has uploaded this change for <strong>review</strong>.</p><p><a href="https://review.coreboot.org/23583">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">libpayload/x86/malloc: Add methods to allocate low memory<br><br>Add implementation of low_malloc to allocate heap below 1MiB.<br><br>Change-Id: I5b303863a4a41a07f3b7c01e3e85706ae105ec87<br>Signed-off-by: Patrick Rudolph <siro@das-labor.org><br>---<br>M payloads/libpayload/arch/x86/main.c<br>M payloads/libpayload/arch/x86/sysinfo.c<br>M payloads/libpayload/include/stdlib.h<br>M payloads/libpayload/libc/malloc.c<br>4 files changed, 80 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/83/23583/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/payloads/libpayload/arch/x86/main.c b/payloads/libpayload/arch/x86/main.c</span><br><span>index 5f7f505..e5534b8 100644</span><br><span>--- a/payloads/libpayload/arch/x86/main.c</span><br><span>+++ b/payloads/libpayload/arch/x86/main.c</span><br><span>@@ -57,6 +57,8 @@</span><br><span> </span><br><span>         exception_init();</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ init_low_memory();</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>         /*</span><br><span>    * Any other system init that has to happen before the</span><br><span>        * user gets control goes here.</span><br><span>diff --git a/payloads/libpayload/arch/x86/sysinfo.c b/payloads/libpayload/arch/x86/sysinfo.c</span><br><span>index ddd6550..45b30ff 100644</span><br><span>--- a/payloads/libpayload/arch/x86/sysinfo.c</span><br><span>+++ b/payloads/libpayload/arch/x86/sysinfo.c</span><br><span>@@ -81,3 +81,10 @@</span><br><span> </span><br><span>        return ret;</span><br><span> }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+void lib_sysinfo_get_memranges(struct memrange **ranges,</span><br><span style="color: hsl(120, 100%, 40%);">+                         uint64_t *nranges)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  *ranges = &lib_sysinfo.memrange[0];</span><br><span style="color: hsl(120, 100%, 40%);">+       *nranges = lib_sysinfo.n_memranges;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span>diff --git a/payloads/libpayload/include/stdlib.h b/payloads/libpayload/include/stdlib.h</span><br><span>index 658fe61..f9563c7 100644</span><br><span>--- a/payloads/libpayload/include/stdlib.h</span><br><span>+++ b/payloads/libpayload/include/stdlib.h</span><br><span>@@ -150,10 +150,13 @@</span><br><span> void *memalign(size_t align, size_t size);</span><br><span> void *dma_malloc(size_t size);</span><br><span> void *dma_memalign(size_t align, size_t size);</span><br><span style="color: hsl(120, 100%, 40%);">+void *low_malloc(size_t size);</span><br><span style="color: hsl(120, 100%, 40%);">+void *low_memalign(size_t align, size_t size);</span><br><span> #endif</span><br><span> void init_dma_memory(void *start, u32 size);</span><br><span> int dma_initialized(void);</span><br><span> int dma_coherent(void *ptr);</span><br><span style="color: hsl(120, 100%, 40%);">+int init_low_memory(void);</span><br><span> </span><br><span> static inline void *xmalloc_work(size_t size, const char *file,</span><br><span>                              const char *func, int line)</span><br><span>diff --git a/payloads/libpayload/libc/malloc.c b/payloads/libpayload/libc/malloc.c</span><br><span>index 595af63..84b310c 100644</span><br><span>--- a/payloads/libpayload/libc/malloc.c</span><br><span>+++ b/payloads/libpayload/libc/malloc.c</span><br><span>@@ -64,6 +64,7 @@</span><br><span>    };</span><br><span> static struct memory_type *const heap = &default_type;</span><br><span> static struct memory_type *dma = &default_type;</span><br><span style="color: hsl(120, 100%, 40%);">+static struct memory_type *low_mem = NULL;</span><br><span> </span><br><span> typedef u64 hdrtype_t;</span><br><span> #define HDRSIZE (sizeof(hdrtype_t))</span><br><span>@@ -124,6 +125,57 @@</span><br><span>      return !dma_initialized() || (dma->start <= ptr && dma->end > ptr);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+int init_low_memory(void)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        uint64_t nranges;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct memrange *ranges;</span><br><span style="color: hsl(120, 100%, 40%);">+      unsigned long long start;</span><br><span style="color: hsl(120, 100%, 40%);">+     unsigned long long size;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    if (low_mem) {</span><br><span style="color: hsl(120, 100%, 40%);">+                printf("ERROR: %s called twice!\n", __func__);</span><br><span style="color: hsl(120, 100%, 40%);">+              return 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%);">+   lib_sysinfo_get_memranges(&ranges, &nranges);</span><br><span style="color: hsl(120, 100%, 40%);">+ if (!nranges)</span><br><span style="color: hsl(120, 100%, 40%);">+         return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   start = 0x100000ULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  size = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     for (size_t i = 0; i < nranges; i++) {</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ranges[i].type != CB_MEM_RAM)</span><br><span style="color: hsl(120, 100%, 40%);">+                     continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ranges[i].base > start)</span><br><span style="color: hsl(120, 100%, 40%);">+                        continue;</span><br><span style="color: hsl(120, 100%, 40%);">+             if (ranges[i].size < size)</span><br><span style="color: hsl(120, 100%, 40%);">+                 continue;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+           size = ranges[i].size;</span><br><span style="color: hsl(120, 100%, 40%);">+                start = ranges[i].base;</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%);">+   if (!size)</span><br><span style="color: hsl(120, 100%, 40%);">+            return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   low_mem = malloc(sizeof(*low_mem));</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!low_mem)</span><br><span style="color: hsl(120, 100%, 40%);">+         return 1;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   low_mem->start = (void *)(uintptr_t)start;</span><br><span style="color: hsl(120, 100%, 40%);">+ low_mem->end = (void *)(uintptr_t)(start + size);</span><br><span style="color: hsl(120, 100%, 40%);">+  low_mem->align_regions = NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#if IS_ENABLED(CONFIG_LP_DEBUG_MALLOC)</span><br><span style="color: hsl(120, 100%, 40%);">+   low_mem->minimal_free = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+ low_mem->magic_initialized = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+    low_mem->name = "LOW";</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ printf("Initialized low memory at [%p:%p]\n", start, start + size);</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ return 0;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> static void *alloc(int len, struct memory_type *type)</span><br><span> {</span><br><span>         hdrtype_t header;</span><br><span>@@ -259,6 +311,14 @@</span><br><span>     return alloc(size, heap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void *low_malloc(size_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+  if (!low_mem)</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return alloc(size, low_mem);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void *dma_malloc(size_t size)</span><br><span> {</span><br><span>      return alloc(size, dma);</span><br><span>@@ -533,6 +593,14 @@</span><br><span>      return alloc_aligned(align, size, heap);</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void *low_memalign(size_t align, size_t size)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+   if (!low_mem)</span><br><span style="color: hsl(120, 100%, 40%);">+         return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        return alloc_aligned(align, size, low_mem);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> void *dma_memalign(size_t align, size_t size)</span><br><span> {</span><br><span>       return alloc_aligned(align, size, dma);</span><br><span></span><br></pre><p>To view, visit <a href="https://review.coreboot.org/23583">change 23583</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/23583"/><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-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: I5b303863a4a41a07f3b7c01e3e85706ae105ec87 </div>
<div style="display:none"> Gerrit-Change-Number: 23583 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: Patrick Rudolph <siro@das-labor.org> </div>