Parameterize debug ROM contents on XLEN

This commit is contained in:
Andrew Waterman
2016-06-22 23:29:16 -07:00
parent 965571945c
commit 8861244f8d
4 changed files with 81 additions and 28 deletions

View File

@@ -1,2 +1,5 @@
/debug_rom
/debug_rom.raw
/debug_rom32
/debug_rom64
/debug_rom32.h
/debug_rom64.h

View 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: debug_rom.o link.ld
$(CC) -nostdlib -nostartfiles -Tlink.ld -o $@ $^
debug_rom: $(DEPS)
$(COMPILE) -DRV32 -DRV64 -o $@ $^
debug_rom32: $(DEPS)
$(COMPILE) -DRV32 -DDEBUG_RAM_SIZE=28 -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

View File

@@ -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

View 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;