I think I've finally got malloc working right.
authorTim Newsome <tim@sifive.com>
Fri, 1 Jul 2016 01:57:24 +0000 (18:57 -0700)
committerTim Newsome <tim@sifive.com>
Tue, 19 Jul 2016 18:24:25 +0000 (11:24 -0700)
Now gdb can call functions and change strings.

debug/gdbserver.py
debug/programs/debug.c
debug/programs/entry.S
debug/targets/m2gl_m2s/link.lds
debug/targets/spike/link.lds

index d2508533e4866b07e9e00c69584a19bf4ee5db51..0f5c28e50430b3a38257630909dc83c87e1000fd 100755 (executable)
@@ -169,20 +169,27 @@ class DebugTest(DeleteServer):
         self.gdb.load()
         self.gdb.b("_exit")
 
-    def exit(self):
+    def exit(self, expected_result = 0xc86455d4):
         output = self.gdb.c()
         self.assertIn("Breakpoint", output)
-        #TODO self.assertIn("_exit", output)
-        #TODO self.assertEqual(self.gdb.p("status"), 0xc86455d4)
-        # Use a0 until gdb can resolve "status"
-        self.assertEqual(self.gdb.p("$a0") & 0xffffffff, 0xc86455d4)
+        self.assertIn("_exit", output)
+        self.assertEqual(self.gdb.p("status"), expected_result)
 
     def test_function_call(self):
+        self.gdb.b("main:start")
+        self.gdb.c()
         text = "Howdy, Earth!"
         gdb_length = self.gdb.p('strlen("%s")' % text)
         self.assertEqual(gdb_length, len(text))
         self.exit()
 
+    def test_change_string(self):
+        text = "This little piggy went to the market."
+        self.gdb.b("main:start")
+        self.gdb.c()
+        self.gdb.p('fox = "%s"' % text)
+        self.exit(0x43b497b8)
+
     def test_turbostep(self):
         """Single step a bunch of times."""
         self.gdb.command("p i=0");
index 2010eaa898a6c7ccbd272a99f942ea9c62608be1..20b1cdcf29f18d6e042884f18c3f86ad915dde5a 100644 (file)
@@ -1,11 +1,10 @@
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
+#include <stdlib.h>
 
 unsigned int crc32a(uint8_t *message, unsigned int size);
 
-char __malloc_start[512];
-
 void rot13(char *buf)
 {
     while (*buf) {
@@ -28,8 +27,12 @@ size_t strlen(const char *buf)
     return len;
 }
 
+extern void *__malloc_freelist;
+
 int main()
 {
+    __malloc_freelist = 0;
+
     volatile int i = 0;
     int j = 0;
     char *fox = "The quick brown fox jumps of the lazy dog.";
index 480b404b148f1b3a4316ea04d5f7414d086dd3d5..80904cdb38191967deb1958e18955c4365fc1c91 100755 (executable)
@@ -3,7 +3,7 @@
 
 #include "encoding.h"
 
-#define STACK_SIZE 128
+#define STACK_SIZE 512
 
 #ifdef __riscv64
 # define LREG ld
@@ -124,9 +124,9 @@ trap_entry:
   addi sp, sp, 32*REGBYTES
   mret
 
-  .bss
+  // Fill the stack with data so we can see if it was overrun.
   .align 4
 stack_bottom:
-  .skip STACK_SIZE
+  .fill STACK_SIZE/4, 4, 0x22446688
 stack_top:
 #endif
index a922b410c00eb7bc637eba9490cec07f3e737429..1dbb99c4777d2e3ff014f0e84929306e51082aa0 100755 (executable)
@@ -13,7 +13,7 @@ SECTIONS
   .data : { *(.data) }
 
   .sdata : {
-    _gp = .;
+    _gp = . + 0x800;
     *(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2)
     *(.srodata*)
     *(.sdata .sdata.* .gnu.linkonce.s.*)
@@ -26,7 +26,9 @@ SECTIONS
   }
   .bss : { *(.bss) }
 
+  __malloc_start = .;
+  . = . + 512;
+
   /* End of uninitalized data segement */
   _end = .;
-  _heap_end = .;
 }
index 029a332da1280b9f6a3c94b503e79f61a6cb85d2..52e4472e19b4d730de565354d02554dc8cc4301e 100755 (executable)
@@ -28,8 +28,9 @@ SECTIONS
   }
   .bss : { *(.bss) }
 
+  __malloc_start = .;
+  . = . + 512;
+
   /* End of uninitalized data segement */
   _end = .;
-  _heap_end = .;
 }
-