Prechádzať zdrojové kódy

fw: move the malloc heap to DRAM

Move the malloc() heap to DRAM. The stack is still in SRAM.
H. Peter Anvin 3 rokov pred
rodič
commit
0dfe406919

BIN
fpga/output_files/max80.jbc


BIN
fpga/output_files/max80.jic


BIN
fpga/output_files/max80.pof


BIN
fpga/output_files/max80.sof


Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 4782 - 4782
fw/boot.mif


+ 7 - 0
fw/max80.ld

@@ -175,4 +175,11 @@ SECTIONS
 	. = ALIGN(8);
 	__dram_bss_end = .;
 	__dram_bss_len = __dram_bss_end - __dram_bss_start;
+
+	/* No need to zero the heap */
+	.heap (NOLOAD) : ALIGN(8) {
+		*(.heap)
+	} >DRAM
+
+	__dram_end = .;
 }

+ 9 - 5
fw/sbrk.c

@@ -7,17 +7,21 @@
 #include "sys.h"
 #include "fw.h"
 
+#define HEAP_SIZE	(4 << 20) /* 4 MB */
+
+static char __attribute__((section(".heap"))) __heap[HEAP_SIZE];
+static char *cur_brk = __heap;
+
 void *_sbrk(size_t increment)
 {
-    static size_t cur_brk = (size_t)_end;
-    size_t old_brk = cur_brk;
-    size_t new_brk = old_brk + increment;
+    char *old_brk = cur_brk;
+    char *new_brk = old_brk + increment;
 
-    if (unlikely(new_brk > SRAM_SIZE - STACK_SIZE)) {
+    if (unlikely(new_brk > &__heap[HEAP_SIZE])) {
 	errno = ENOMEM;
 	return (void *)(-1);
     }
 
     cur_brk = new_brk;
-    return (void *)old_brk;
+    return old_brk;
 }

+ 5 - 5
fw/testdata.S

@@ -1,13 +1,13 @@
 	.section ".dram.rodata","a"
 	.globl testdata
 testdata:
-	x = 0x00001111
-	y = 0
+	.Lx = 0x00001111
+	.Ly = 0
 
 	.rept 0x20000
-	.long x
-	x = ((x * 0x89abcdef) + ((x * 0x89abcdef) >> 32) + (y * 0x76543210)) & 0xffffffff
-	y = y + 1
+	.long .Lx
+	.Lx = ((.Lx * 0x89abcdef) + ((.Lx * 0x89abcdef) >> 32) + (.Ly * 0x76543210)) & 0xffffffff
+	.Ly = .Ly + 1
 	.endr
 
 	.type testdata,@object

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov