Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/66671?usp=email )

Change subject: dev: Introduce a reset() method on RegisterBank and Register classes.
......................................................................

dev: Introduce a reset() method on RegisterBank and Register classes.

This will make it much easier to implement reset behaviors on devices
which have RegisterBanks in them.

Change-Id: I73fe9874fcb69feed33611a320dcca85c0de2d0e
---
M src/dev/reg_bank.hh
M src/dev/serial/uart8250.hh
2 files changed, 58 insertions(+), 2 deletions(-)



diff --git a/src/dev/reg_bank.hh b/src/dev/reg_bank.hh
index 31c0ce5..66d668b 100644
--- a/src/dev/reg_bank.hh
+++ b/src/dev/reg_bank.hh
@@ -117,6 +117,11 @@
  * RegisterBankLE and RegisterBankBE aliases to make it a little easier to
  * refer to one or the other version.
  *
+ * A RegisterBank also has a reset() method which will (by default) call the + * reset() method on each register within it. This method is virtual, and so + * can be overridden if something additional or different needs to be done to
+ * reset the hardware model.
+ *
  *
  * == Register interface ==
  *
@@ -145,6 +150,12 @@
* it still has to implement these methods, but they don't have to actually do
  * anything.
  *
+ * Each register also has a "reset" method, which will reset the register as + * if its containing device is being reset. By default, this will just restore
+ * the initial value of the register, but can be overridden to implement
+ * additional behavior like resetting other aspects of the device which are
+ * controlled by the value of the register.
+ *
  *
  * == Basic Register types ==
  *
@@ -360,6 +371,9 @@
         // Methods for implementing serialization for checkpoints.
         virtual void serialize(std::ostream &os) const = 0;
         virtual bool unserialize(const std::string &s) = 0;
+
+        // Reset the register.
+        virtual void reset() = 0;
     };

     // Filler registers which return a fixed pattern.
@@ -388,6 +402,9 @@

         void serialize(std::ostream &os) const override {}
         bool unserialize(const std::string &s) override { return true; }
+
+        // Resetting a read only register doesn't need to do anything.
+        void reset() override {}
     };

     // Register which reads as all zeroes.
@@ -453,6 +470,10 @@
         void serialize(std::ostream &os) const override {}
         bool unserialize(const std::string &s) override { return true; }

+        // Assume since the buffer is managed externally, it will be reset
+        // externally.
+        void reset() override {}
+
       protected:
         /**
* This method exists so that derived classes that need to initialize
@@ -516,6 +537,8 @@

             return true;
         }
+
+        void reset() override { buffer = std::array<uint8_t, BufBytes>{}; }
     };

     template <typename Data, ByteOrder RegByteOrder=BankByteOrder>
@@ -534,6 +557,7 @@

       private:
         Data _data = {};
+        Data _resetData = {};
         Data _writeMask = mask(sizeof(Data) * 8);

         ReadFunc _reader = defaultReader;
@@ -602,11 +626,13 @@

         // Constructor and move constructor with an initial data value.
constexpr Register(const std::string &new_name, const Data &new_data) :
-            RegisterBase(new_name, sizeof(Data)), _data(new_data)
+            RegisterBase(new_name, sizeof(Data)), _data(new_data),
+            _resetData(new_data)
         {}
         constexpr Register(const std::string &new_name,
                            const Data &&new_data) :
-            RegisterBase(new_name, sizeof(Data)), _data(new_data)
+            RegisterBase(new_name, sizeof(Data)), _data(new_data),
+            _resetData(new_data)
         {}

         // Set which bits of the register are writeable.
@@ -789,6 +815,9 @@
         {
             return ParseParam<Data>::parse(s, get());
         }
+
+        // Reset our data to its initial value.
+        void reset() override { get() = _resetData; }
     };

   private:
@@ -984,6 +1013,14 @@
             }
         }
     }
+
+    // By default, reset all the registers in the bank.
+    virtual void
+    reset()
+    {
+        for (auto &[offset, reg]: _offsetMap)
+            reg.get().reset();
+    }
 };

 using RegisterBankLE = RegisterBank<ByteOrder::little>;
diff --git a/src/dev/serial/uart8250.hh b/src/dev/serial/uart8250.hh
index c55d889..5774f78 100644
--- a/src/dev/serial/uart8250.hh
+++ b/src/dev/serial/uart8250.hh
@@ -113,6 +113,13 @@

             void serialize(std::ostream &os) const override {}
bool unserialize(const std::string &s) override { return true; }
+
+            void
+            reset() override
+            {
+                _reg1.reset();
+                _reg2.reset();
+            }
         };

         class BankedRegister : public PairedRegister

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/66671?usp=email To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I73fe9874fcb69feed33611a320dcca85c0de2d0e
Gerrit-Change-Number: 66671
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-CC: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to