From c45decfcd0fdc524dc1fbe8ea841648a98c4c683 Mon Sep 17 00:00:00 2001
From: Roberto Hexsel <roberto@inf.ufpr.br>
Date: Thu, 20 Aug 2015 12:08:29 -0300
Subject: [PATCH] LD script allocates to RAM and ROM

---
 cMIPS/bin/edMemory.sh        |  2 +-
 cMIPS/include/cMIPS.ld       | 37 +++++++++++++++++++++---------------
 cMIPS/include/cMIPS.s        |  4 ++--
 cMIPS/include/start.s        |  9 +++++----
 cMIPS/vhdl/packageMemory.vhd |  2 +-
 5 files changed, 31 insertions(+), 23 deletions(-)

diff --git a/cMIPS/bin/edMemory.sh b/cMIPS/bin/edMemory.sh
index da4f8d1..ed3c4db 100755
--- a/cMIPS/bin/edMemory.sh
+++ b/cMIPS/bin/edMemory.sh
@@ -76,7 +76,7 @@ then
   cp "${lnk}" "${lnk}"~
   for VAR in $VARIABLES ; do
     NEW=$(egrep -h ${VAR} "${dfn}" | sed -n -e '/reg32/s/.*x"\(.*\)".*/\1/p')
-    OLD=$(egrep -h ${VAR} "${lnk}" | sed -n -e 's/.* = 0x\(.*\);.*/\1/p')
+    OLD=$(egrep -h ${VAR} "${lnk}" | sed -n -e 's/.* = 0x\(.*\), .*/\1/p')
     # echo -n -e "$NEW $OLD\n"
     if [ -n "$OLD" ] ; then
 	sed -i -e '/'$VAR'/s/'$OLD'/'$NEW'/' "${lnk}"
diff --git a/cMIPS/include/cMIPS.ld b/cMIPS/include/cMIPS.ld
index a3ee7a0..8c65855 100644
--- a/cMIPS/include/cMIPS.ld
+++ b/cMIPS/include/cMIPS.ld
@@ -1,32 +1,39 @@
 OUTPUT_ARCH(mips)
 ENTRY(_start)
+
+MEMORY
+{
+        rom (rx)  : ORIGIN = 0x00000000, /* x_INST_BASE_ADDR */
+                    LENGTH = 0x00004000, /* x_INST_MEM_SZ */
+        ram (!rx) : ORIGIN = 0x00040000, /* x_DATA_BASE_ADDR */
+                    LENGTH = 0x00040000  /* x_DATA_MEM_SZ */
+}
+
 SECTIONS
 {
-       . = 0x00000000; /* x_INST_BASE_ADDR */
        .text :
        {
           *(.text .text.*)
           _etext = . ;         /* end of text constant (from Xinu) */
 
-       }
-       . = 0x00040000; /* x_DATA_BASE_ADDR */
-       .rodata  : { *(.rodata .rodata.*) }
-       .rodata1 : { *(.rodata1) }
-       .data    : 
+       }                                   > rom
+
+       .rodata  : { *(.rodata .rodata.*) } > ram
+       .rodata1 : { *(.rodata1) }          > ram
+       .data ALIGN(0x10) : 
        {
           *(.data .data.*) 
           _edata = . ;         /* end of data constant  (from Xinu) */
-
-       }
-       .data1   : { *(.data1) }
-       .sdata   : { *(.sdata .sdata.*) }
-       .lit8    : { *(.lit8) }
-       .lit4    : { *(.lit4) }
-       .sbss    : { *(.sbss .sbss.*) *(.scommon .scommon.*) }
-       .bss     :
+       }                                   > ram
+       .data1   : { *(.data1) }            > ram
+       .sdata   : { *(.sdata .sdata.*) }   > ram
+       .lit8    : { *(.lit8) }             > ram
+       .lit4    : { *(.lit4) }             > ram
+       .sbss    : { *(.sbss .sbss.*) *(.scommon .scommon.*) }  > ram
+       .bss ALIGN(0x10) :
        {
           *(.bss .bss.*) *(COMMON) 
           _end = . ;           /* end of image constant  (from Xinu) */
 
-       }
+       }                                   > ram
 }
diff --git a/cMIPS/include/cMIPS.s b/cMIPS/include/cMIPS.s
index 70eef73..c21398c 100644
--- a/cMIPS/include/cMIPS.s
+++ b/cMIPS/include/cMIPS.s
@@ -1,10 +1,10 @@
 
 	# see vhdl/packageMemory.vhd for addresses
         .set x_INST_BASE_ADDR,0x00000000
-        .set x_INST_MEM_SZ,0x00002000
+        .set x_INST_MEM_SZ,0x00004000
 
         .set x_DATA_BASE_ADDR,0x00040000
-        .set x_DATA_MEM_SZ,0x00002000
+        .set x_DATA_MEM_SZ,0x00004000
 	
         .set x_IO_BASE_ADDR,0x0F000000
         .set x_IO_MEM_SZ,0x00002000
diff --git a/cMIPS/include/start.s b/cMIPS/include/start.s
index 042e402..253956c 100644
--- a/cMIPS/include/start.s
+++ b/cMIPS/include/start.s
@@ -32,7 +32,7 @@ _start:
 
 	#  then set another mapping onto TLB[4], to avoid replicated entries
 	li    $a0, ( (x_DATA_BASE_ADDR + 8*4096) >>12 )
-	sll   $a2, $a0, 12	# tag for RAM[0,1] double-page
+	sll   $a2, $a0, 12	# tag for RAM[8,9] double-page
 	mtc0  $a2, cop0_EntryHi
 
 	li    $a0, ((x_DATA_BASE_ADDR + 8*4096) >>12 )
@@ -75,8 +75,8 @@ _start:
 	li   $k0, 4
 	mtc0 $k0, cop0_Wired
 
-	# initialize SP: ramTop-8
-	li   $sp,(x_DATA_BASE_ADDR+x_DATA_MEM_SZ-8)
+	# initialize SP at top of RAM: ramTop - 8
+	li   $sp, ((x_DATA_BASE_ADDR+x_DATA_MEM_SZ) - 8)
 	
 	# set STATUS, cop0, hw interrupt IRQ7,IRQ6,IRQ5 enabled, user mode
         li   $k0, 0x1000e011
@@ -122,6 +122,7 @@ _excp_0000:
 	##
 	##================================================================
 	## exception vector_0100 Cache Error (hw not implemented)
+	##   print CAUSE and stop simulation
 	##
 	.org x_EXCEPTION_0100,0
 	.ent _excp_0100
@@ -150,7 +151,7 @@ _excp_0100:
         .comm   _excp_saves 16*4
         # _excp_saves[0]=CAUSE, [1]=STATUS, [2]=ASID,
 	#            [8]=$ra, [9]=$a0, [10]=$a1, [11]=$a2, [12]=$a3
-	
+	#            [13]=$sp [14]=$fp [15]=$at 
         .text
         .set noreorder
 	.set noat
diff --git a/cMIPS/vhdl/packageMemory.vhd b/cMIPS/vhdl/packageMemory.vhd
index 5070aa9..a0f54b5 100644
--- a/cMIPS/vhdl/packageMemory.vhd
+++ b/cMIPS/vhdl/packageMemory.vhd
@@ -43,7 +43,7 @@ package p_MEMORY is
   constant x_INST_BASE_ADDR : reg32   := x"00000000";
   constant x_INST_MEM_SZ    : reg32   := x"00004000";
   constant x_DATA_BASE_ADDR : reg32   := x"00040000";
-  constant x_DATA_MEM_SZ    : reg32   := x"00008000";
+  constant x_DATA_MEM_SZ    : reg32   := x"00004000";
   constant x_IO_BASE_ADDR   : reg32   := x"0F000000";
   constant x_IO_MEM_SZ      : reg32   := x"00002000";
   constant x_IO_ADDR_RANGE  : reg32   := x"00000020";
-- 
GitLab