From 4e2686d4ab9bbefee9123f29dc0f5ab8bff8b529 Mon Sep 17 00:00:00 2001 From: Luke Wren Date: Sun, 28 Nov 2021 08:17:23 +0000 Subject: [PATCH] Finish documenting CSRs. Draw a debug topology diagram. --- doc/diagrams/debug_topology.drawio | 1 + doc/diagrams/debug_topology.png | Bin 0 -> 51437 bytes doc/hazard3.adoc | 1 + doc/sections/csr.adoc | 161 +++++++++++++++++++++++++++-- 4 files changed, 156 insertions(+), 7 deletions(-) create mode 100644 doc/diagrams/debug_topology.drawio create mode 100644 doc/diagrams/debug_topology.png diff --git a/doc/diagrams/debug_topology.drawio b/doc/diagrams/debug_topology.drawio new file mode 100644 index 0000000..6a7b74c --- /dev/null +++ b/doc/diagrams/debug_topology.drawio @@ -0,0 +1 @@ +7Vpdc9o6EP01PKbjDzDkEUza9E47kymdSfOo2outW2ExsgjQX98VljG2HOqOcXBmkgcirVayfPborCQYuP5q90mQdfyVh8AGjhXuBu584Dhjb4yfyrDPDKOxNkSChpnJLgwL+hu00dLWDQ0hLTlKzpmk67Ix4EkCgSzZiBB8W3ZbclZ+6ppEYBgWAWGm9ZGGMs6sE2dc2O+BRnH+ZNu7zVpWJHfWb5LGJOTbE5N7N3B9wbnMSqudD0xhl+OS9fv4QutxYgIS2aRD8mMRfBPjL7PHe5lMp58f2dPkxtazfSZso99Yz1bucwgE3yQhqFGsgTvbxlTCYk0C1brFmKMtliuGNRuLIUnjg6+q6LFBSNi9OGv7iAVyCPgKpNijS95houHT/HFudX1bRMPNIY5PIuHmDCKaAdFx7AIkLGic/gUz741hZjfFzLa6wmxsQDZ9mBmoQYhrT1e5kDGPeELYXWGdlXEtfL5wvtYA/g9S7rWQkI3kZaxhR+UP1f3DSNeeTlrmOz3yobLPKwlCcNJJVZ9O24puh1reL5VEyKkSITQEjKQpDXLzR8pYKeLq3c/HG6HiGxHAOWpqhSQiAnnGz6nnjwBGJH0uz+PiXJgYXPjv+/RTf8hgnSXDlYLaIli66wOn+OSjSLjDirBW135GIt2rEvLjNFqoaI2IekwqOaTPWIxUcQ4/NxF6fRckSdcYYSzjFmOD4dfO+OwT/5ohctNPUbVUu7aR8AuotlPNdENTte061fa6Eu26PGfg63MBN+kaArrEhdA0KkgqEEuFZrNgvGeGliLiNMwMw7McvbE+eKOxfua/CRC+LdmfOKyVsKTN9Wk4rGxvK/5D56w/FrIZVHrn0+HLZQrdCJ3z9+3iK9C7v5Sz2ya4ViJXFx1Dru7JbyJCt7G85XnrfK7qWcJxr55w8iNbH4T//C7w7Qi/2074X2kRDo1V+Bmr0/sr7wSc5luBhpGFJMydEp5AZtHtVgeRv/i5wXERFuvkb1QSkVFVHDo+RjgjgznzPjBnfHHm9J8Zt71ihttFYlenncHhqNzPlG5VNsHetVO6Yx4i35W97fptm6tfOHH1a/065p3xu7JfhxnDUa+YYW4WL6fs9pu5L3S9vmm9bd7pLvaphBXavsHhesXyOZ6HOGMgrg5g9cao7vzrvSp+JrH9uX91nIyL6UlDojmdAVWTGvSNi8948Av/z/mK0MTADlGQ1XsxwX+BzxkXReZeojhXTITRKFEyDurqGg0KUxoQNtUNKxqGh1xTF5FyzC7+he9tJUL5qegvTHY72/VZRoAeBA8gTRHS9yBl4NvN5Ka7IJlfxB7lerZJr687lcPMqCbBHbWope5gtfglTrZPKX7O5N79AQ== \ No newline at end of file diff --git a/doc/diagrams/debug_topology.png b/doc/diagrams/debug_topology.png new file mode 100644 index 0000000000000000000000000000000000000000..950bc39d4a9a00528455143ac3cf2f5475326dd2 GIT binary patch literal 51437 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 literal 0 HcmV?d00001 diff --git a/doc/hazard3.adoc b/doc/hazard3.adoc index a17b7f1..72fa7d9 100644 --- a/doc/hazard3.adoc +++ b/doc/hazard3.adoc @@ -13,4 +13,5 @@ include::sections/instruction_timings.adoc[] include::sections/csr.adoc[] +[[debug-chapter]] include::sections/debug.adoc[] diff --git a/doc/sections/csr.adoc b/doc/sections/csr.adoc index 7a53449..c8ada7b 100644 --- a/doc/sections/csr.adoc +++ b/doc/sections/csr.adoc @@ -6,9 +6,10 @@ NOTE: All CSR addresses not listed in this section are unimplemented. Accessing All CSRs are 32-bit; MXLEN is fixed at 32 bits on Hazard3. -=== Standard CSRs -This section does not attempt to supplant the https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMFDQC-and-Priv-v1.11/riscv-privileged-20190608.pdf[RISC-V Privileged Specification], which is the authoritative reference on the RISC-V CSRs. +=== Standard M-mode CSRs + +IMPORTANT: The https://github.com/riscv/riscv-isa-manual/releases/download/Ratified-IMFDQC-and-Priv-v1.11/riscv-privileged-20190608.pdf[RISC-V Privileged Specification] should be your primary reference for writing software to run on Hazard3. This section specifies those details which are left implementation-defined by the RISC-V Privileged Specification, for sake of completeness, but portable RISC-V software should not rely on these details. ==== mvendorid @@ -130,7 +131,7 @@ Address: `0x344` Interrupt pending register. Read-only. -NOTE: The RISC-V specification lists `mip` as a read-write register, but the bits which are readable correspond to lower privilege modes (S- and U-mode) which are not implemented on Hazard3, so it is documented here as read-only. +NOTE: The RISC-V specification lists `mip` as a read-write register, but the bits which are writable correspond to lower privilege modes (S- and U-mode) which are not implemented on Hazard3, so it is documented here as read-only. The table below lists the fields which are _not_ hardwired to 0: @@ -183,7 +184,7 @@ Exception program counter. When entering a trap, the current value of the progra On Hazard3, bits 31:1 of `mepc` are capable of holding all 31-bit values. Bit 0 is hardwired to 0, as per the specification. -All traps on Hazard3 are precise. +All traps on Hazard3 are precise. For example, a load/store bus error will set `mepc` to the exact address of the load/store instruction which encountered the fault. ==== mcause @@ -200,10 +201,12 @@ The most significant bit of `mcause` is set to 1 to indicate an interrupt cause, | Cause | Description | 3 | Software interrupt (`mip.msip`) | 7 | Timer interrupt (`mip.mtip`) -| 11 | External interrupt (`mip.meie`) +| 11 | External interrupt (`mip.meip`) |=== -Higher numbers may be used for distinct external IRQs when expanded vectoring is enabled -- see <>. The following exception causes may be set by Hazard3 hardware: +Numbers >16 are used for to disambiguate between external IRQs when expanded vectoring is enabled -- see <>. + +The following exception causes may be set by Hazard3 hardware: [cols="10h,~", options="header"] |=== @@ -220,17 +223,161 @@ Higher numbers may be used for distinct external IRQs when expanded vectoring is NOTE: Not every instruction fetch bus cycle which returns a bus error leads to an exception. Hazard3 prefetches instructions ahead of execution, and associated bus errors are speculated through to the point the processor actually attempts to decode the instruction. Until this point, the error can be flushed by a branch, with no ill effect. +==== mtval + +Address: `0x343` + +Hardwired to 0. + +==== pmpcfg0...3 + +Address: `0x3a0` through `0x3a3` + +Unimplemented. Access will cause an illegal instruction exception. + +==== pmpaddr0...15 + +Address: `0x3b0` through `0x3bf` + +Unimplemented. Access will cause an illegal instruction exception. + +==== mcycle + +Address: `0xb00` + +Lower half of the 64-bit cycle counter. Readable and writable by software. Increments every cycle, unless `mcountinhibit.cy` is 1, or the processor is in Debug Mode (as <>.`stopcount` is hardwired to 1). + +If written with a value `n` and read on the very next cycle, the value read will be exactly `n + 1` (ignoring wrapping). + +==== mcycleh + +Address: `0xb80` + +Upper half of the 64-bit cycle counter. Readable and writable by software. Increments every time `mcycle` wraps from `0xffffffff` to `0x00000000` upon increment. + +==== minstret + +Address: `0xb02` + +Lower half of the 64-bit instruction retire counter. Readable and writable by software. Increments with every instruction exectued, unless `mcountinhibit.ir` is 1, or the processor is in Debug Mode (as <>.`stopcount` is hardwired to 1). + +==== minstreth + +Address: `0xb82` + +Upper half of the 64-bit instruction retire counter. Readable and writable by software. Increments every time `minstret` wraps from `0xffffffff` to `0x00000000` upon increment. + +==== mhpmcounter3...31 + +Address: `0xb03` through `0xb1f` + +Hardwired to 0. + +==== mhpmcounter3...31h + +Address: `0xb83` through `0xb9f` + +Hardwired to 0. + + [[reg-mcountinhibit]] ==== mcountinhibit +Address: `0x320` +Counter inhibit. Read-write. The table below lists the fields which are _not_ hardwired to 0: +[cols="10h,20h,~", options="header"] +|=== +| Bits | Name | Description +| 2 | `ir` | When 1, inhibit counting of `minstret`/`minstreth` +| 0 | `cy` | When 1, inhibit counting +|=== + +==== mhpmevent3...31 + +Address: `0x323` through `0x33f` + +Hardwired to 0. + +==== tselect + +Address: `0x7a0` + +Unimplemented. Reads as 0, write causes illegal instruction exception. + +==== tdata1...3 + +Address: `0x7a1` through `0x7a3` + +Unimplemented. Access will cause an illegal instruction exception. + +=== Standard Debug Mode CSRs + +This section describes the Debug Mode CSRs, which are follow the 0.13.2 RISC-V debug specification. The <> section gives more detail on the remainder of Hazard3's debug implementation, including the Debug Module. + +All Debug Mode CSRs are 32-bit; DXLEN is always 32. + +==== dcsr + +Address: `0x7b0` + +Debug control and status register. Access outside of Debug Mode will cause an illegal instruction exception. Relevant fields are implemented as follows: + +[cols="10h,20h,~", options="header"] +|=== +| Bits | Name | Description +| 31:28 | `xdebugver` | Hardwired to 4: external debug support as per RISC-V 0.13.2 debug specification. +| 15 | `ebreakm` | When 1, `ebreak` instructions will break to Debug Mode instead of trapping in M mode. +| 11 | `stepie` | Hardwired to 0: no interrupts are taken during hardware single-stepping. +| 10 | `stopcount` | Hardwired to 1: `mcycle`/`mcycleh` and `minstret`/`minstreth` do not increment in Debug Mode. +| 9 | `stoptime` | Hardwired to 1: core-local timers don't increment in debug mode. This requires cooperation of external hardware based on the halt status to implement correctly. +| 8:6 | `cause` | Read-only, set by hardware -- see table below. +| 2 | `step` | When 1, re-enter Debug Mode after each instruction executed in M-mode. +| 1:0 | `prv` | Hardwired to 3, as only M-mode is implemented. +|=== + +Fields not mentioned above are hardwired to 0. + +Hazard3 may set the following `dcsr.cause` values: + +[cols="10h,~", options="header"] +|=== +| Cause | Description +| 1 | Processor entered Debug Mode due to an `ebreak` instruction executed in M-mode. +| 3 | Processor entered Debug Mode due to a halt request, or a reset-halt request present when the core reset was released. +| 4 | Processor entered Debug Mode after executing one instruction with single-stepping enabled. +|=== + +Cause 5 (`resethaltreq`) is never set by hardware. This event is reported as a normal halt, cause 3. Cause 2 (trigger) is never used because there are no triggers. (TODO?) + +==== dpc + +Address: `0x7b1` + +Debug program counter. When entering Debug Mode, `dpc` samples the current program counter, e.g. the address of an `ebreak` which caused Debug Mode entry. When leaving debug mode, the processor jumps to `dpc`. The host may read/write this register whilst in Debug Mode. + +==== dscratch0 + +Address: `0x7b2` + +Not implemented. However, the Debug Module's internal `data0` register is mapped to this CSR address under the following conditions: + +- The core is in Debug Mode +- The Debug Module is _currently executing an abstract command on this core_ + +The Debug Module uses this mapping to exchange data with the core by injecting `csrr`/`csrw` instructions into the prefetch buffer. This in turn is used to implement the Abstract Access Register command. See <>. + +The Debug Module lists the number of scratch registers as 0 in `hartinfo.dscratch`. + +==== dscratch1 + +Not implemented. Access will cause an illegal instruction exception. === Custom CSRs These are all allocated in the space `0xbc0` through `0xbff` which is available for custom read/write M-mode CSRs, and `0xfc0` through `0xfff` which is available for custom read-only M-mode CSRs. -[cols="10h,20h,~", options="header"] [[reg-midcr]] ==== midcr