Parameterize debug ROM contents on XLEN
authorAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 23 Jun 2016 06:29:16 +0000 (23:29 -0700)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Thu, 23 Jun 2016 06:29:16 +0000 (23:29 -0700)
debug_rom/.gitignore
debug_rom/Makefile
debug_rom/debug_rom.S
debug_rom/debug_rom.h

index 7c986a13a28e9526816c669c5018cf43948a3ba7..98bd13e4dd46718c20555faee5827b53011c23cd 100644 (file)
@@ -1,2 +1,5 @@
 /debug_rom
-/debug_rom.raw
+/debug_rom32
+/debug_rom64
+/debug_rom32.h
+/debug_rom64.h
index ed4cb9324cedd18d4d7db6d6dd6720d528b90337..b72f37db7b6193bff825d0e0974302bc4aab66a8 100644 (file)
@@ -4,17 +4,27 @@
 CC = $(RISCV)/bin/riscv64-unknown-elf-gcc
 OBJCOPY = $(RISCV)/bin/riscv64-unknown-elf-objcopy
 
-%.o:   %.S
-       $(CC) -I.. -c $<
+COMPILE = $(CC) -nostdlib -nostartfiles -I.. -Tlink.ld
 
-debug_rom.h:   debug_rom.raw
+ELFS = debug_rom debug_rom32 debug_rom64
+DEPS = debug_rom.S link.ld
+
+all: $(patsubst %,%.h,$(ELFS))
+
+%.h:   %.raw
        xxd -i $^ | sed "s/^unsigned/static const unsigned/" > $@
 
-debug_rom.raw: debug_rom
-       $(OBJCOPY) -O binary --only-section .text debug_rom debug_rom.raw
+%.raw: %
+       $(OBJCOPY) -O binary --only-section .text $^ $@
+
+debug_rom:     $(DEPS)
+       $(COMPILE) -DRV32 -DRV64 -o $@ $^
+
+debug_rom32:   $(DEPS)
+       $(COMPILE) -DRV32 -DDEBUG_RAM_SIZE=28 -o $@ $^
 
-debug_rom:     debug_rom.o link.ld
-       $(CC) -nostdlib -nostartfiles -Tlink.ld -o $@ $^
+debug_rom64:   $(DEPS)
+       $(COMPILE) -DRV64 -o $@ $^
 
 clean:
-       rm -f debug_rom debug_rom.o debug_rom.raw debug_rom.h
+       rm -f $(ELFS) debug_rom*.raw debug_rom*.h
index 2219bff173664ddb3eb52e62fc28855ebd23cfc1..74a934b201a94a31be63b24dd7c68a1149dcdecc 100755 (executable)
@@ -6,11 +6,19 @@
 # TODO: Update these constants once they're finalized in the doc.
 
 #define DEBUG_RAM               0x400
-#define DEBUG_RAM_SIZE          64
+#ifndef DEBUG_RAM_SIZE
+# define DEBUG_RAM_SIZE          64
+#endif
 
 #define CLEARDEBINT             0x100
 #define SETHALTNOT              0x10c
 
+#if (defined(RV32) + defined(RV64) + defined(RV128)) > 1
+# define MULTI_XLEN
+#elif (defined(RV32) + defined(RV64) + defined(RV128)) == 0
+# error define one or more of RV32, RV64, RV128
+#endif
+
         .global entry
         .global resume
         .global exception
@@ -33,19 +41,39 @@ _resume2:
         fence
 
         # Restore s1.
+#ifdef MULTI_XLEN
         csrr    s1, CSR_MISA
+#endif
+
+#ifdef RV32
+# ifdef MULTI_XLEN
         bltz    s1, restore_not_32
+# endif
+
 restore_32:
         lw      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 4)(zero)
+# if defined(RV64) || defined(RV128)
         j       finish_restore
+# endif
+#endif
+
 restore_not_32:
+#if defined(RV64) && defined(RV128)
         slli    s1, s1, 1
         bltz    s1, restore_128
+#endif
+
+#ifdef RV64
 restore_64:
         ld      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 8)(zero)
+#endif
+#if defined(RV64) && defined(RV128)
         j       finish_restore
+#endif
+#ifdef RV128
 restore_128:
-        nop     #lq      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 16)(zero)
+        lq      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 16)(zero)
+#endif
 
 finish_restore:
         # s0 contains ~0 if we got here through an exception, and 0 otherwise.
@@ -60,8 +88,7 @@ finish_restore:
 check_halt:
         csrr    s0, CSR_DCSR
         andi    s0, s0, DCSR_HALT
-        beqz    s0, exit
-        j       wait_for_interrupt
+        bnez    s0, wait_for_interrupt
 
 exit:
         # Restore s0.
@@ -81,20 +108,36 @@ _entry:
 
 jdebugram:
         # Save s1 so that the debug program can use two registers.
+#ifdef MULTI_XLEN
         csrr    s0, CSR_MISA
+#endif
+
+#ifdef RV32
+# ifdef MULTI_XLEN
         bltz    s0, save_not_32
+# endif
 save_32:
         sw      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 4)(zero)
         jr      zero, DEBUG_RAM
+#endif
+
 save_not_32:
+#if defined(RV64) && defined(RV128)
         slli    s0, s0, 1
         bltz    s0, save_128
+#endif
+
+#ifdef RV64
 save_64:
         sd      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 8)(zero)
         jr      zero, DEBUG_RAM
+#endif
+
+#ifdef RV128
 save_128:
-        nop     #sq      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 16)(zero)
+        sq      s1, (DEBUG_RAM + DEBUG_RAM_SIZE - 16)(zero)
         jr      zero, DEBUG_RAM
+#endif
 
 spontaneous_halt:
         csrr    s0, CSR_MHARTID
index b4ee2dd8487421a0dcf2f5a53ff1d3a9ba172888..b93a98fd45c1b904184477c0590bbb99d4fbe047 100644 (file)
@@ -1,19 +1,16 @@
 static const unsigned char debug_rom_raw[] = {
-  0x6f, 0x00, 0x00, 0x06, 0x6f, 0x00, 0xc0, 0x00, 0x13, 0x04, 0xf0, 0xff,
+  0x6f, 0x00, 0xc0, 0x04, 0x6f, 0x00, 0xc0, 0x00, 0x13, 0x04, 0xf0, 0xff,
   0x6f, 0x00, 0x80, 0x00, 0x13, 0x04, 0x00, 0x00, 0x0f, 0x00, 0xf0, 0x0f,
   0xf3, 0x24, 0x00, 0xf1, 0x63, 0xc6, 0x04, 0x00, 0x83, 0x24, 0xc0, 0x43,
-  0x6f, 0x00, 0x80, 0x01, 0x93, 0x94, 0x14, 0x00, 0x63, 0xc6, 0x04, 0x00,
-  0x83, 0x34, 0x80, 0x43, 0x6f, 0x00, 0x80, 0x00, 0x13, 0x00, 0x00, 0x00,
-  0x23, 0x2e, 0x80, 0x42, 0x73, 0x24, 0x40, 0xf1, 0x23, 0x20, 0x80, 0x10,
-  0x73, 0x24, 0x00, 0x7b, 0x13, 0x74, 0x84, 0x00, 0x63, 0x04, 0x04, 0x00,
-  0x6f, 0x00, 0x80, 0x05, 0x73, 0x24, 0x20, 0x7b, 0x73, 0x00, 0x20, 0x7b,
-  0x73, 0x10, 0x24, 0x7b, 0x73, 0x24, 0x00, 0x7b, 0x13, 0x74, 0x04, 0x1c,
-  0x13, 0x04, 0x04, 0xf4, 0x63, 0x18, 0x04, 0x02, 0x0f, 0x10, 0x00, 0x00,
+  0x6f, 0x00, 0x80, 0x00, 0x83, 0x34, 0x80, 0x43, 0x23, 0x2e, 0x80, 0x42,
+  0x73, 0x24, 0x40, 0xf1, 0x23, 0x20, 0x80, 0x10, 0x73, 0x24, 0x00, 0x7b,
+  0x13, 0x74, 0x84, 0x00, 0x63, 0x12, 0x04, 0x04, 0x73, 0x24, 0x20, 0x7b,
+  0x73, 0x00, 0x20, 0x7b, 0x73, 0x10, 0x24, 0x7b, 0x73, 0x24, 0x00, 0x7b,
+  0x13, 0x74, 0x04, 0x1c, 0x13, 0x04, 0x04, 0xf4, 0x63, 0x1e, 0x04, 0x00,
   0x73, 0x24, 0x00, 0xf1, 0x63, 0x46, 0x04, 0x00, 0x23, 0x2e, 0x90, 0x42,
-  0x67, 0x00, 0x00, 0x40, 0x13, 0x14, 0x14, 0x00, 0x63, 0x46, 0x04, 0x00,
-  0x23, 0x3c, 0x90, 0x42, 0x67, 0x00, 0x00, 0x40, 0x13, 0x00, 0x00, 0x00,
-  0x67, 0x00, 0x00, 0x40, 0x73, 0x24, 0x40, 0xf1, 0x23, 0x26, 0x80, 0x10,
-  0x73, 0x60, 0x04, 0x7b, 0x73, 0x24, 0x00, 0x7b, 0x13, 0x74, 0x04, 0x02,
-  0xe3, 0x0c, 0x04, 0xfe, 0x6f, 0xf0, 0xdf, 0xfb
+  0x67, 0x00, 0x00, 0x40, 0x23, 0x3c, 0x90, 0x42, 0x67, 0x00, 0x00, 0x40,
+  0x73, 0x24, 0x40, 0xf1, 0x23, 0x26, 0x80, 0x10, 0x73, 0x60, 0x04, 0x7b,
+  0x73, 0x24, 0x00, 0x7b, 0x13, 0x74, 0x04, 0x02, 0xe3, 0x0c, 0x04, 0xfe,
+  0x6f, 0xf0, 0x1f, 0xfd
 };
-static const unsigned int debug_rom_raw_len = 188;
+static const unsigned int debug_rom_raw_len = 148;