summaryrefslogtreecommitdiff
path: root/src/lib
diff options
context:
space:
mode:
authorDuncan Laurie <dlaurie@chromium.org>2012-06-23 13:33:32 -0700
committerRonald G. Minnich <rminnich@gmail.com>2012-07-24 23:44:19 +0200
commitf5e9ac48c65bba2876d1dd7f103cd15c5e33c7df (patch)
tree33b180cf13d9fd999ed72a3129a2bf5cf29202c3 /src/lib
parent7d2b81c18d891a11420088c37cb17bb1c8d73ba9 (diff)
SMM: Add support for malloc in SMM if using TSEG
This is used by the SPI driver and ELOG. It requires SMM TSEG and a _heap/_eheap region defined in the linker script. The first time malloc is called in SMM the start and end pointers to the heap region will be relocated for the TSEG region. Enable SPI flash and ELOG in SMM and successfully allocate memory. The allocated addresses are verified to be sure they are within the TSEG heap region: smm.elf:00014000 B _eheap smm.elf:00010000 B _heap TSEG base is 0xad000000 Memory allocated in ELOG: ELOG: MEM @0xad018030 Change-Id: I5cca38e4888d597cbbfcd9983cd6a7ae3600c2a3 Signed-off-by: Duncan Laurie <dlaurie@chromium.org> Reviewed-on: http://review.coreboot.org/1312 Tested-by: build bot (Jenkins) Reviewed-by: Ronald G. Minnich <rminnich@gmail.com>
Diffstat (limited to 'src/lib')
-rw-r--r--src/lib/Makefile.inc1
-rw-r--r--src/lib/malloc.c9
2 files changed, 10 insertions, 0 deletions
diff --git a/src/lib/Makefile.inc b/src/lib/Makefile.inc
index a3235a2062..ec57bc2d2f 100644
--- a/src/lib/Makefile.inc
+++ b/src/lib/Makefile.inc
@@ -32,6 +32,7 @@ endif
ramstage-y += memcmp.c
ramstage-y += memmove.c
ramstage-y += malloc.c
+smm-$(CONFIG_SMM_TSEG) += malloc.c
ramstage-y += delay.c
ramstage-y += fallback_boot.c
ramstage-y += compute_ip_checksum.c
diff --git a/src/lib/malloc.c b/src/lib/malloc.c
index d2011a10d0..43e514af58 100644
--- a/src/lib/malloc.c
+++ b/src/lib/malloc.c
@@ -1,5 +1,8 @@
#include <stdlib.h>
#include <console/console.h>
+#ifdef __SMM__
+#include <cpu/x86/smm.h>
+#endif
#if CONFIG_DEBUG_MALLOC
#define MALLOCDBG(x...) printk(BIOS_SPEW, x)
@@ -43,5 +46,11 @@ void *memalign(size_t boundary, size_t size)
void *malloc(size_t size)
{
+#if CONFIG_SMM_TSEG && defined(__SMM__)
+ if (!free_mem_ptr) {
+ free_mem_ptr = &_heap + smi_get_tseg_base();
+ free_mem_end_ptr = &_eheap + smi_get_tseg_base();
+ }
+#endif
return memalign(sizeof(u64), size);
}