From ab8a5631c39300c8ecb24635b16d50d19398dbdd Mon Sep 17 00:00:00 2001 From: Tim Newsome Date: Sat, 25 Feb 2017 10:17:14 -0800 Subject: [PATCH] Update bits to latest spec. --- riscv/debug_defines.h | 1953 +++++++++++++++++++++-------------------- riscv/debug_module.cc | 20 +- riscv/debug_module.h | 10 +- 3 files changed, 990 insertions(+), 993 deletions(-) diff --git a/riscv/debug_defines.h b/riscv/debug_defines.h index 2a78bdf..2e0c192 100644 --- a/riscv/debug_defines.h +++ b/riscv/debug_defines.h @@ -1,52 +1,139 @@ -#define AC_ACCESS_REGISTER None +#define DTM_IDCODE 0x01 /* -* 2: Access the lowest 32 bits of the register. +* Identifies the release version of this part. + */ +#define DTM_IDCODE_VERSION_OFFSET 28 +#define DTM_IDCODE_VERSION_LENGTH 4 +#define DTM_IDCODE_VERSION (0xf << DTM_IDCODE_VERSION_OFFSET) +/* +* Identifies the designer's part number of this part. + */ +#define DTM_IDCODE_PARTNUMBER_OFFSET 12 +#define DTM_IDCODE_PARTNUMBER_LENGTH 16 +#define DTM_IDCODE_PARTNUMBER (0xffff << DTM_IDCODE_PARTNUMBER_OFFSET) +/* +* Identifies the designer/manufacturer of this part. Bits 6:0 must be +* bits 6:0 of the designer/manufacturer's Identification Code as +* assigned by JEDEC Standard JEP106. Bits 10:7 contain the modulo-16 +* count of the number of continuation characters (0x7f) in that same +* Identification Code. + */ +#define DTM_IDCODE_MANUFID_OFFSET 1 +#define DTM_IDCODE_MANUFID_LENGTH 11 +#define DTM_IDCODE_MANUFID (0x7ff << DTM_IDCODE_MANUFID_OFFSET) +#define DTM_IDCODE_1_OFFSET 0 +#define DTM_IDCODE_1_LENGTH 1 +#define DTM_IDCODE_1 (0x1 << DTM_IDCODE_1_OFFSET) +#define DTM_DTMCONTROL 0x10 +/* +* Writing 1 to this bit resets the DMI controller, clearing any +* sticky error state. + */ +#define DTM_DTMCONTROL_DMIRESET_OFFSET 16 +#define DTM_DTMCONTROL_DMIRESET_LENGTH 1 +#define DTM_DTMCONTROL_DMIRESET (0x1 << DTM_DTMCONTROL_DMIRESET_OFFSET) +/* +* This is the minimum number of cycles a debugger should spend in +* Run-Test/Idle after every DMI scan to avoid a 'busy' +* return code (\Fdmistat of 3). A debugger must still +* check \Fdmistat when necessary. * -* 3: Access the lowest 64 bits of the register. +* 0: It is not necessary to enter Run-Test/Idle at all. * -* 4: Access the lowest 128 bits of the register. +* 1: Enter Run-Test/Idle and leave it immediately. * -* If \Fsize specifies a size larger than the register is, then the -* access must fail. If a register is accessible, then \Fsize matching -* the register's actual size must be supported. +* 2: Enter Run-Test/Idle and stay there for 1 cycle before leaving. +* +* And so on. */ -#define AC_ACCESS_REGISTER_SIZE_OFFSET 19 -#define AC_ACCESS_REGISTER_SIZE_LENGTH 3 -#define AC_ACCESS_REGISTER_SIZE (0x7 << AC_ACCESS_REGISTER_SIZE_OFFSET) +#define DTM_DTMCONTROL_IDLE_OFFSET 12 +#define DTM_DTMCONTROL_IDLE_LENGTH 3 +#define DTM_DTMCONTROL_IDLE (0x7 << DTM_DTMCONTROL_IDLE_OFFSET) /* -* When 1, execute the program in the Program Buffer exactly once -* before performing the read/write. +* 0: No error. +* +* 1: Reserved. Interpret the same as 2. +* +* 2: An operation failed (resulted in \Fop of 2). +* +* 3: An operation was attempted while a DMI access was still in +* progress (resulted in \Fop of 3). */ -#define AC_ACCESS_REGISTER_PREEXEC_OFFSET 18 -#define AC_ACCESS_REGISTER_PREEXEC_LENGTH 1 -#define AC_ACCESS_REGISTER_PREEXEC (0x1 << AC_ACCESS_REGISTER_PREEXEC_OFFSET) +#define DTM_DTMCONTROL_DMISTAT_OFFSET 10 +#define DTM_DTMCONTROL_DMISTAT_LENGTH 2 +#define DTM_DTMCONTROL_DMISTAT (0x3 << DTM_DTMCONTROL_DMISTAT_OFFSET) /* -* When 1, execute the program in the Program Buffer exactly once -* after performing the read/write. +* The size of \Faddress in \Rdmi. */ -#define AC_ACCESS_REGISTER_POSTEXEC_OFFSET 17 -#define AC_ACCESS_REGISTER_POSTEXEC_LENGTH 1 -#define AC_ACCESS_REGISTER_POSTEXEC (0x1 << AC_ACCESS_REGISTER_POSTEXEC_OFFSET) +#define DTM_DTMCONTROL_ABITS_OFFSET 4 +#define DTM_DTMCONTROL_ABITS_LENGTH 6 +#define DTM_DTMCONTROL_ABITS (0x3f << DTM_DTMCONTROL_ABITS_OFFSET) /* -* 0: Copy data from {\tt arg0} portion of {\tt data} into the -* specified register. +* 0: Version described in spec version 0.11. * -* 1: Copy data from the specified register into {\tt arg0} portion -* of {\tt data}. +* 1: Version described in spec version 0.12 (and later?), which +* reduces the DMI data width to 32 bits. +* +* Other values are reserved for future use. */ -#define AC_ACCESS_REGISTER_WRITE_OFFSET 16 -#define AC_ACCESS_REGISTER_WRITE_LENGTH 1 -#define AC_ACCESS_REGISTER_WRITE (0x1 << AC_ACCESS_REGISTER_WRITE_OFFSET) +#define DTM_DTMCONTROL_VERSION_OFFSET 0 +#define DTM_DTMCONTROL_VERSION_LENGTH 4 +#define DTM_DTMCONTROL_VERSION (0xf << DTM_DTMCONTROL_VERSION_OFFSET) +#define DTM_DMI 0x11 /* -* Number of the register to access, as described in Table~\ref{tab:regno}. +* Address used for DMI access. In Update-DR this value is used +* to access the DM over the DMI. */ -#define AC_ACCESS_REGISTER_REGNO_OFFSET 0 -#define AC_ACCESS_REGISTER_REGNO_LENGTH 16 -#define AC_ACCESS_REGISTER_REGNO (0xffff << AC_ACCESS_REGISTER_REGNO_OFFSET) -#define AC_QUICK_ACCESS None -#define AC_QUICK_ACCESS_1_OFFSET 24 -#define AC_QUICK_ACCESS_1_LENGTH 8 -#define AC_QUICK_ACCESS_1 (0xff << AC_QUICK_ACCESS_1_OFFSET) +#define DTM_DMI_ADDRESS_OFFSET 34 +#define DTM_DMI_ADDRESS_LENGTH abits +#define DTM_DMI_ADDRESS (((1L<= DMI_IBUF0 && address < DMI_IBUF0 + progsize) { - result = read32(program_buffer, address - DMI_IBUF0); + } else if (address >= DMI_PROGBUF0 && address < DMI_PROGBUF0 + progsize) { + result = read32(program_buffer, address - DMI_PROGBUF0); } else { switch (address) { case DMI_DMCONTROL: @@ -252,13 +251,14 @@ bool debug_module_t::dmi_read(unsigned address, uint32_t *value) dmcontrol.hartstatus = dmcontrol.HARTSTATUS_NOTEXIST; } result = set_field(result, DMI_DMCONTROL_HALTREQ, dmcontrol.haltreq); - result = set_field(result, DMI_DMCONTROL_RESET, dmcontrol.reset); - result = set_field(result, DMI_DMCONTROL_DMACTIVE, dmcontrol.dmactive); + result = set_field(result, DMI_DMCONTROL_RESUMEREQ, dmcontrol.resumereq); result = set_field(result, DMI_DMCONTROL_HARTSTATUS, dmcontrol.hartstatus); result = set_field(result, DMI_DMCONTROL_HARTSEL, dmcontrol.hartsel); + result = set_field(result, DMI_DMCONTROL_HARTRESET, dmcontrol.hartreset); + result = set_field(result, DMI_DMCONTROL_DMACTIVE, dmcontrol.dmactive); + result = set_field(result, DMI_DMCONTROL_RESET, dmcontrol.reset); result = set_field(result, DMI_DMCONTROL_AUTHENTICATED, dmcontrol.authenticated); result = set_field(result, DMI_DMCONTROL_AUTHBUSY, dmcontrol.authbusy); - result = set_field(result, DMI_DMCONTROL_AUTHTYPE, dmcontrol.authtype); result = set_field(result, DMI_DMCONTROL_VERSION, dmcontrol.version); } break; @@ -275,8 +275,8 @@ bool debug_module_t::dmi_read(unsigned address, uint32_t *value) result = set_field(result, DMI_ABSTRACTCS_BUSY, abstractcs.busy); result = set_field(result, DMI_ABSTRACTCS_DATACOUNT, abstractcs.datacount); break; - case DMI_ACCESSCS: - result = progsize << DMI_ACCESSCS_PROGSIZE_OFFSET; + case DMI_PROGBUFCS: + result = progsize << DMI_PROGBUFCS_PROGSIZE_OFFSET; break; case DMI_COMMAND: result = 0; @@ -395,8 +395,8 @@ bool debug_module_t::dmi_write(unsigned address, uint32_t value) } return true; - } else if (address >= DMI_IBUF0 && address < DMI_IBUF0 + progsize) { - write32(program_buffer, address - DMI_IBUF0, value); + } else if (address >= DMI_PROGBUF0 && address < DMI_PROGBUF0 + progsize) { + write32(program_buffer, address - DMI_PROGBUF0, value); return true; } else { switch (address) { diff --git a/riscv/debug_module.h b/riscv/debug_module.h index e881776..eaaf06e 100644 --- a/riscv/debug_module.h +++ b/riscv/debug_module.h @@ -11,8 +11,6 @@ class sim_t; typedef struct { bool haltreq; bool resumereq; - bool reset; - bool dmactive; enum { HARTSTATUS_HALTED, HARTSTATUS_RUNNING, @@ -20,13 +18,11 @@ typedef struct { HARTSTATUS_NOTEXIST } hartstatus; unsigned hartsel; + bool hartreset; + bool dmactive; + bool reset; bool authenticated; bool authbusy; - enum { - AUTHTYPE_NOAUTH, - AUTHTYPE_PASSWORD, - AUTHTYPE_CHALLENGE - } authtype; unsigned version; } dmcontrol_t; -- 2.30.2