Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/49772 )

Change subject: arch-riscv: Revamp int regs.
......................................................................

arch-riscv: Revamp int regs.

Change-Id: Ie4773178843757acede4fe9e77ca327f7b024270
---
M src/arch/riscv/isa.cc
M src/arch/riscv/isa/formats/standard.isa
M src/arch/riscv/linux/fs_workload.cc
M src/arch/riscv/linux/linux.hh
M src/arch/riscv/linux/se_workload.cc
M src/arch/riscv/process.cc
M src/arch/riscv/regs/int.hh
M src/arch/riscv/remote_gdb.cc
M src/arch/riscv/remote_gdb.hh
M src/arch/riscv/se_workload.hh
M src/arch/riscv/utility.hh
11 files changed, 93 insertions(+), 32 deletions(-)



diff --git a/src/arch/riscv/isa.cc b/src/arch/riscv/isa.cc
index 3a566f5..5d920a5 100644
--- a/src/arch/riscv/isa.cc
+++ b/src/arch/riscv/isa.cc
@@ -187,7 +187,7 @@

 ISA::ISA(const Params &p) : BaseISA(p)
 {
-    _regClasses.emplace_back(NumIntRegs, debug::IntRegs);
+    _regClasses.emplace_back(int_reg::NumRegs, debug::IntRegs);
     _regClasses.emplace_back(NumFloatRegs, debug::FloatRegs);
     _regClasses.emplace_back(1, debug::IntRegs); // Not applicable to RISCV
     _regClasses.emplace_back(2, debug::IntRegs); // Not applicable to RISCV
@@ -203,8 +203,10 @@
 ISA::copyRegsFrom(ThreadContext *src)
 {
     // First loop through the integer registers.
-    for (int i = 0; i < NumIntRegs; ++i)
-        tc->setIntReg(i, src->readIntReg(i));
+    for (int i = 0; i < int_reg::NumRegs; ++i) {
+        RegId reg(IntRegClass, i);
+        tc->setReg(reg, src->getReg(reg));
+    }

     // Second loop through the float registers.
     for (int i = 0; i < NumFloatRegs; ++i)
diff --git a/src/arch/riscv/isa/formats/standard.isa b/src/arch/riscv/isa/formats/standard.isa
index dad2c2b..b6ef95a 100644
--- a/src/arch/riscv/isa/formats/standard.isa
+++ b/src/arch/riscv/isa/formats/standard.isa
@@ -255,7 +255,7 @@
     %(class_name)s::branchTarget(ThreadContext *tc) const
     {
         PCState pc = tc->pcState();
-        pc.set((tc->readIntReg(srcRegIdx(0).index()) + imm)&~0x1);
+        pc.set((tc->getReg(srcRegIdx(0)) + imm) & ~0x1);
         return pc;
     }

diff --git a/src/arch/riscv/linux/fs_workload.cc b/src/arch/riscv/linux/fs_workload.cc
index 2e92245..4a4a381 100644
--- a/src/arch/riscv/linux/fs_workload.cc
+++ b/src/arch/riscv/linux/fs_workload.cc
@@ -63,7 +63,7 @@
         delete dtb_file;

         for (auto *tc: system->threads) {
-            tc->setIntReg(11, params().dtb_addr);
+            tc->setReg(int_reg::A1, params().dtb_addr);
         }
     } else {
         warn("No DTB file specified\n");
diff --git a/src/arch/riscv/linux/linux.hh b/src/arch/riscv/linux/linux.hh
index 9c99d1b..4672475 100644
--- a/src/arch/riscv/linux/linux.hh
+++ b/src/arch/riscv/linux/linux.hh
@@ -203,9 +203,9 @@
     {
         ctc->getIsaPtr()->copyRegsFrom(ptc);
         if (flags & TGT_CLONE_SETTLS)
-            ctc->setIntReg(RiscvISA::ThreadPointerReg, tls);
+            ctc->setReg(RiscvISA::ThreadPointerReg, tls);
         if (stack)
-            ctc->setIntReg(RiscvISA::StackPointerReg, stack);
+            ctc->setReg(RiscvISA::StackPointerReg, stack);
     }
 };

@@ -372,7 +372,7 @@
     {
         ctc->getIsaPtr()->copyRegsFrom(ptc);
         if (stack)
-            ctc->setIntReg(RiscvISA::StackPointerReg, stack);
+            ctc->setReg(RiscvISA::StackPointerReg, stack);
     }
 };

diff --git a/src/arch/riscv/linux/se_workload.cc b/src/arch/riscv/linux/se_workload.cc
index 18627a7..8d68bcd 100644
--- a/src/arch/riscv/linux/se_workload.cc
+++ b/src/arch/riscv/linux/se_workload.cc
@@ -86,7 +86,7 @@
     // This will move into the base SEWorkload function at some point.
     process->Process::syscall(tc);

-    RegVal num = tc->readIntReg(RiscvISA::SyscallNumReg);
+    RegVal num = tc->getReg(RiscvISA::SyscallNumReg);
     if (dynamic_cast<RiscvProcess64 *>(process))
         syscallDescs64.get(num)->doSyscall(tc);
     else
diff --git a/src/arch/riscv/process.cc b/src/arch/riscv/process.cc
index bdbb7cc..c0c0a0c 100644
--- a/src/arch/riscv/process.cc
+++ b/src/arch/riscv/process.cc
@@ -244,7 +244,7 @@
     }

     ThreadContext *tc = system->threads[contextIds[0]];
-    tc->setIntReg(StackPointerReg, memState->getStackMin());
+    tc->setReg(StackPointerReg, memState->getStackMin());
     tc->pcState(getStartPC());

     memState->setStackMin(roundDown(memState->getStackMin(), pageSize));
diff --git a/src/arch/riscv/regs/int.hh b/src/arch/riscv/regs/int.hh
index ef8f141..5d60416 100644
--- a/src/arch/riscv/regs/int.hh
+++ b/src/arch/riscv/regs/int.hh
@@ -49,27 +49,71 @@
 #include <string>
 #include <vector>

+#include "cpu/reg_class.hh"
+
 namespace gem5
 {

 namespace RiscvISA
 {

-const int NumIntArchRegs = 32;
-const int NumMicroIntRegs = 1;
-const int NumIntRegs = NumIntArchRegs + NumMicroIntRegs;
+namespace int_reg
+{

-// Semantically meaningful register indices
-const int ReturnAddrReg = 1;
-const int StackPointerReg = 2;
-const int ThreadPointerReg = 4;
-const int ReturnValueReg = 10;
-const std::vector<int> ArgumentRegs = {10, 11, 12, 13, 14, 15, 16, 17};
-const int AMOTempReg = 32;
+enum : RegIndex
+{
+    _ZeroIdx, _RaIdx, _SpIdx,  _GpIdx,
+    _TpIdx,   _T0Idx, _T1Idx,  _T2Idx,
+    _S0Idx,   _S1Idx, _A0Idx,  _A1Idx,
+    _A2Idx,   _A3Idx, _A4Idx,  _A5Idx,
+    _A6Idx,   _A7Idx, _S2Idx,  _S3Idx,
+    _S4Idx,   _S5Idx, _S6Idx,  _S7Idx,
+    _S8Idx,   _S9Idx, _S10Idx, _S11Idx,
+    _T3Idx,   _T4Idx, _T5Idx,  _T6Idx,

-const int SyscallNumReg = 17;
+    NumArchRegs,

-const std::vector<std::string> IntRegNames = {
+    _Ureg0Idx = NumArchRegs,
+
+    NumRegs
+};
+
+inline constexpr RegId
+    Zero(IntRegClass, _ZeroIdx),
+    Ra(IntRegClass, _RaIdx),
+    Sp(IntRegClass, _SpIdx),
+    Gp(IntRegClass, _GpIdx),
+    Tp(IntRegClass, _TpIdx),
+    T0(IntRegClass, _T0Idx),
+    T1(IntRegClass, _T1Idx),
+    T2(IntRegClass, _T2Idx),
+    S0(IntRegClass, _S0Idx),
+    S1(IntRegClass, _S1Idx),
+    A0(IntRegClass, _A0Idx),
+    A1(IntRegClass, _A1Idx),
+    A2(IntRegClass, _A2Idx),
+    A3(IntRegClass, _A3Idx),
+    A4(IntRegClass, _A4Idx),
+    A5(IntRegClass, _A5Idx),
+    A6(IntRegClass, _A6Idx),
+    A7(IntRegClass, _A7Idx),
+    S2(IntRegClass, _S2Idx),
+    S3(IntRegClass, _S3Idx),
+    S4(IntRegClass, _S4Idx),
+    S5(IntRegClass, _S5Idx),
+    S6(IntRegClass, _S6Idx),
+    S7(IntRegClass, _S7Idx),
+    S8(IntRegClass, _S8Idx),
+    S9(IntRegClass, _S9Idx),
+    S10(IntRegClass, _S10Idx),
+    S11(IntRegClass, _S11Idx),
+    T3(IntRegClass, _T3Idx),
+    T4(IntRegClass, _T4Idx),
+    T5(IntRegClass, _T5Idx),
+    T6(IntRegClass, _T6Idx),
+    Ureg0(IntRegClass, _Ureg0Idx);
+
+const std::vector<std::string> RegNames = {
     "zero", "ra", "sp", "gp",
     "tp", "t0", "t1", "t2",
     "s0", "s1", "a0", "a1",
@@ -80,6 +124,22 @@
     "t3", "t4", "t5", "t6"
 };

+} // namespace int_reg
+
+// Semantically meaningful register indices
+inline constexpr auto
+    &ReturnAddrReg = int_reg::Ra,
+    &StackPointerReg = int_reg::Sp,
+    &ThreadPointerReg = int_reg::Tp,
+    &ReturnValueReg = int_reg::A0,
+    &AMOTempReg = int_reg::Ureg0,
+    &SyscallNumReg = int_reg::A7;
+
+inline constexpr RegId ArgumentRegs[] = {
+    int_reg::A0, int_reg::A1, int_reg::A2, int_reg::A3,
+    int_reg::A4, int_reg::A5, int_reg::A6, int_reg::A7
+};
+
 } // namespace RiscvISA
 } // namespace gem5

diff --git a/src/arch/riscv/remote_gdb.cc b/src/arch/riscv/remote_gdb.cc
index ec3eb5a..e730060 100644
--- a/src/arch/riscv/remote_gdb.cc
+++ b/src/arch/riscv/remote_gdb.cc
@@ -191,9 +191,8 @@
     DPRINTF(GDBAcc, "getregs in remotegdb, size %lu\n", size());

     // General registers
-    for (int i = 0; i < NumIntArchRegs; i++)
-    {
-        r.gpr[i] = context->readIntReg(i);
+    for (int i = 0; i < int_reg::NumArchRegs; i++) {
+        r.gpr[i] = context->getReg(RegId(IntRegClass, i));
     }
     r.pc = context->pcState().pc();

@@ -303,8 +302,8 @@
     RegVal newVal;

     DPRINTF(GDBAcc, "setregs in remotegdb \n");
-    for (int i = 0; i < NumIntArchRegs; i++)
-        context->setIntReg(i, r.gpr[i]);
+    for (int i = 0; i < int_reg::NumArchRegs; i++)
+        context->setReg(RegId(IntRegClass, i), r.gpr[i]);
     context->pcState(r.pc);

     // Floating point registers
diff --git a/src/arch/riscv/remote_gdb.hh b/src/arch/riscv/remote_gdb.hh
index 40fe821..fab945f 100644
--- a/src/arch/riscv/remote_gdb.hh
+++ b/src/arch/riscv/remote_gdb.hh
@@ -72,7 +72,7 @@
          */
         struct
         {
-            uint64_t gpr[NumIntArchRegs];
+            uint64_t gpr[int_reg::NumArchRegs];
             uint64_t pc;
             uint64_t fpu[NumFloatRegs];
             uint32_t fflags;
diff --git a/src/arch/riscv/se_workload.hh b/src/arch/riscv/se_workload.hh
index 5152c58..9a2b6ac 100644
--- a/src/arch/riscv/se_workload.hh
+++ b/src/arch/riscv/se_workload.hh
@@ -78,10 +78,10 @@

         if (ret.successful()) {
             // no error
-            tc->setIntReg(RiscvISA::ReturnValueReg, ret.returnValue());
+            tc->setReg(RiscvISA::ReturnValueReg, ret.returnValue());
         } else {
             // got an error, return details
-            tc->setIntReg(RiscvISA::ReturnValueReg, ret.encodedValue());
+            tc->setReg(RiscvISA::ReturnValueReg, ret.encodedValue());
         }
     }
 };
diff --git a/src/arch/riscv/utility.hh b/src/arch/riscv/utility.hh
index d1355fc..7ccbad0 100644
--- a/src/arch/riscv/utility.hh
+++ b/src/arch/riscv/utility.hh
@@ -106,7 +106,7 @@
 registerName(RegId reg)
 {
     if (reg.is(IntRegClass)) {
-        if (reg.index() >= NumIntArchRegs) {
+        if (reg.index() >= int_reg::NumArchRegs) {
             /*
* This should only happen if a instruction is being speculatively
              * executed along a not-taken branch, and if that instruction's
@@ -120,7 +120,7 @@
             str << "?? (x" << reg.index() << ')';
             return str.str();
         }
-        return IntRegNames[reg.index()];
+        return int_reg::RegNames[reg.index()];
     } else {
         if (reg.index() >= NumFloatRegs) {
             std::stringstream str;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49772
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: Ie4773178843757acede4fe9e77ca327f7b024270
Gerrit-Change-Number: 49772
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to