aboutsummaryrefslogtreecommitdiff
path: root/riscv
diff options
context:
space:
mode:
authorScott Johnson <scott.johnson@arilinc.com>2021-10-06 11:03:36 -0700
committerScott Johnson <scott.johnson@arilinc.com>2021-10-06 11:03:37 -0700
commit4618ca82bea2794dacc8d94ad93561fd94612e1b (patch)
tree6f4c5c59e0c1102be56be332a3f760f08993d88e /riscv
parent2e873ce98e7afc0304cffe8f6ea2d7afea8efc2a (diff)
downloadspike-4618ca82bea2794dacc8d94ad93561fd94612e1b.zip
spike-4618ca82bea2794dacc8d94ad93561fd94612e1b.tar.gz
spike-4618ca82bea2794dacc8d94ad93561fd94612e1b.tar.bz2
Give sstatus_csr_t handles to its base_status_csr_t constituents
So I can add specialized methods to base_status_csr_t next, for use from within sstatus_csr_t.
Diffstat (limited to 'riscv')
-rw-r--r--riscv/csrs.cc6
-rw-r--r--riscv/csrs.h7
2 files changed, 10 insertions, 3 deletions
diff --git a/riscv/csrs.cc b/riscv/csrs.cc
index df54361..82a46ab 100644
--- a/riscv/csrs.cc
+++ b/riscv/csrs.cc
@@ -460,8 +460,10 @@ bool mstatush_csr_t::unlogged_write(const reg_t val) noexcept {
}
// implement class sstatus_csr_t
-sstatus_csr_t::sstatus_csr_t(processor_t* const proc, csr_t_p orig, csr_t_p virt):
- virtualized_csr_t(proc, orig, virt) {
+sstatus_csr_t::sstatus_csr_t(processor_t* const proc, base_status_csr_t_p orig, base_status_csr_t_p virt):
+ virtualized_csr_t(proc, orig, virt),
+ orig_sstatus(orig),
+ virt_sstatus(virt) {
}
void sstatus_csr_t::dirty(const reg_t dirties) {
diff --git a/riscv/csrs.h b/riscv/csrs.h
index cfd766e..3eb6bf5 100644
--- a/riscv/csrs.h
+++ b/riscv/csrs.h
@@ -190,6 +190,8 @@ class base_status_csr_t: public csr_t {
reg_t compute_sstatus_write_mask() const noexcept;
};
+typedef std::shared_ptr<base_status_csr_t> base_status_csr_t_p;
+
// For vsstatus, which is its own separate architectural register
// (unlike sstatus)
@@ -245,12 +247,15 @@ class mstatush_csr_t: public csr_t {
class sstatus_csr_t: public virtualized_csr_t {
public:
- sstatus_csr_t(processor_t* const proc, csr_t_p orig, csr_t_p virt);
+ sstatus_csr_t(processor_t* const proc, base_status_csr_t_p orig, base_status_csr_t_p virt);
// Set FS, VS, or XS bits to dirty
void dirty(const reg_t dirties);
// Return true if the specified bits are not 00 (Off)
bool enabled(const reg_t which);
+ private:
+ base_status_csr_t_p orig_sstatus;
+ base_status_csr_t_p virt_sstatus;
};
typedef std::shared_ptr<sstatus_csr_t> sstatus_csr_t_p;