New definitions of misa/marchid/mvendorid
authorAndrew Waterman <waterman@cs.berkeley.edu>
Mon, 29 Feb 2016 04:40:11 +0000 (20:40 -0800)
committerAndrew Waterman <waterman@cs.berkeley.edu>
Wed, 2 Mar 2016 20:15:25 +0000 (12:15 -0800)
riscv/encoding.h
riscv/processor.cc
riscv/processor.h
riscv/sim.cc

index b2ef0bfdb2aa7bf6f39296f4e0a7b8d6cc3bb00e..411a7af478eb7efd6b15b19937d63cfe277ae94c 100644 (file)
@@ -64,8 +64,6 @@
 #define IRQ_COP      8
 #define IRQ_HOST     9
 
-#define IMPL_ROCKET 1
-
 #define DEFAULT_RSTVEC 0x0
 #define DEFAULT_NMIVEC 0x4
 #define DEFAULT_MTVEC  0x8
 #define CSR_UARCH14 0xcce
 #define CSR_UARCH15 0xccf
 #define CSR_SSTATUS 0x100
-#define CSR_STVEC 0x101
 #define CSR_SIE 0x104
+#define CSR_STVEC 0x105
 #define CSR_SSCRATCH 0x140
 #define CSR_SEPC 0x141
 #define CSR_SCAUSE 0x142
 #define CSR_STIME 0xd01
 #define CSR_STIMEW 0xa01
 #define CSR_MSTATUS 0x300
-#define CSR_MTVEC 0x301
 #define CSR_MEDELEG 0x302
 #define CSR_MIDELEG 0x303
 #define CSR_MIE 0x304
+#define CSR_MTVEC 0x305
 #define CSR_MTIMECMP 0x321
 #define CSR_MSCRATCH 0x340
 #define CSR_MEPC 0x341
 #define CSR_MIP 0x344
 #define CSR_MIPI 0x345
 #define CSR_MTIME 0x701
-#define CSR_MCPUID 0xf00
-#define CSR_MIMPID 0xf01
+#define CSR_MISA 0xf00
+#define CSR_MVENDORID 0xf01
+#define CSR_MARCHID 0xf02
+#define CSR_MIMPID 0xf03
+#define CSR_MCFGADDR 0xf04
 #define CSR_MHARTID 0xf10
 #define CSR_MTOHOST 0x7c0
 #define CSR_MFROMHOST 0x7c1
 #define CSR_MRESET 0x7c2
-#define CSR_MIOBASE 0x7c4
 #define CSR_CYCLEH 0xc80
 #define CSR_TIMEH 0xc81
 #define CSR_INSTRETH 0xc82
@@ -949,8 +949,8 @@ DECLARE_CSR(uarch13, CSR_UARCH13)
 DECLARE_CSR(uarch14, CSR_UARCH14)
 DECLARE_CSR(uarch15, CSR_UARCH15)
 DECLARE_CSR(sstatus, CSR_SSTATUS)
-DECLARE_CSR(stvec, CSR_STVEC)
 DECLARE_CSR(sie, CSR_SIE)
+DECLARE_CSR(stvec, CSR_STVEC)
 DECLARE_CSR(sscratch, CSR_SSCRATCH)
 DECLARE_CSR(sepc, CSR_SEPC)
 DECLARE_CSR(scause, CSR_SCAUSE)
@@ -964,10 +964,10 @@ DECLARE_CSR(instretw, CSR_INSTRETW)
 DECLARE_CSR(stime, CSR_STIME)
 DECLARE_CSR(stimew, CSR_STIMEW)
 DECLARE_CSR(mstatus, CSR_MSTATUS)
-DECLARE_CSR(mtvec, CSR_MTVEC)
 DECLARE_CSR(medeleg, CSR_MEDELEG)
 DECLARE_CSR(mideleg, CSR_MIDELEG)
 DECLARE_CSR(mie, CSR_MIE)
+DECLARE_CSR(mtvec, CSR_MTVEC)
 DECLARE_CSR(mtimecmp, CSR_MTIMECMP)
 DECLARE_CSR(mscratch, CSR_MSCRATCH)
 DECLARE_CSR(mepc, CSR_MEPC)
@@ -976,13 +976,15 @@ DECLARE_CSR(mbadaddr, CSR_MBADADDR)
 DECLARE_CSR(mip, CSR_MIP)
 DECLARE_CSR(mipi, CSR_MIPI)
 DECLARE_CSR(mtime, CSR_MTIME)
-DECLARE_CSR(mcpuid, CSR_MCPUID)
+DECLARE_CSR(misa, CSR_MISA)
+DECLARE_CSR(mvendorid, CSR_MVENDORID)
+DECLARE_CSR(marchid, CSR_MARCHID)
 DECLARE_CSR(mimpid, CSR_MIMPID)
+DECLARE_CSR(mcfgaddr, CSR_MCFGADDR)
 DECLARE_CSR(mhartid, CSR_MHARTID)
 DECLARE_CSR(mtohost, CSR_MTOHOST)
 DECLARE_CSR(mfromhost, CSR_MFROMHOST)
 DECLARE_CSR(mreset, CSR_MRESET)
-DECLARE_CSR(miobase, CSR_MIOBASE)
 DECLARE_CSR(cycleh, CSR_CYCLEH)
 DECLARE_CSR(timeh, CSR_TIMEH)
 DECLARE_CSR(instreth, CSR_INSTRETH)
index 067378700982f44f12d2ddd662be5baabfa8af55..f60d00a9ac145765b2b2a78243ab09ab0b990410 100644 (file)
@@ -64,10 +64,10 @@ void processor_t::parse_isa_string(const char* str)
   const char* all_subsets = "imafdc";
 
   max_xlen = 64;
-  cpuid = reg_t(2) << 62;
+  isa = reg_t(2) << 62;
 
   if (strncmp(p, "rv32", 4) == 0)
-    max_xlen = 32, cpuid = 0, p += 4;
+    max_xlen = 32, isa = 0, p += 4;
   else if (strncmp(p, "rv64", 4) == 0)
     p += 4;
   else if (strncmp(p, "rv", 2) == 0)
@@ -82,11 +82,11 @@ void processor_t::parse_isa_string(const char* str)
     bad_isa_string(str);
   }
 
-  isa = "rv" + std::to_string(max_xlen) + p;
-  cpuid |= 1L << ('s' - 'a'); // advertise support for supervisor mode
+  isa_string = "rv" + std::to_string(max_xlen) + p;
+  isa |= 1L << ('s' - 'a'); // advertise support for supervisor mode
 
   while (*p) {
-    cpuid |= 1L << (*p - 'a');
+    isa |= 1L << (*p - 'a');
 
     if (auto next = strchr(all_subsets, *p)) {
       all_subsets = next + 1;
@@ -104,6 +104,15 @@ void processor_t::parse_isa_string(const char* str)
 
   if (supports_extension('D') && !supports_extension('F'))
     bad_isa_string(str);
+
+  // if we have IMAFD, advertise G, too
+  if (supports_extension('I') && supports_extension('M') &&
+      supports_extension('A') && supports_extension('D'))
+    isa |= 1L << ('g' - 'a');
+
+  // advertise support for supervisor and user modes
+  isa |= 1L << ('s' - 'a');
+  isa |= 1L << ('u' - 'a');
 }
 
 void state_t::reset()
@@ -473,8 +482,10 @@ reg_t processor_t::get_csr(int which)
     case CSR_MCAUSE: return state.mcause;
     case CSR_MBADADDR: return state.mbadaddr;
     case CSR_MTIMECMP: return state.mtimecmp;
-    case CSR_MCPUID: return cpuid;
-    case CSR_MIMPID: return IMPL_ROCKET;
+    case CSR_MISA: return isa;
+    case CSR_MARCHID: return 0;
+    case CSR_MIMPID: return 0;
+    case CSR_MVENDORID: return 0;
     case CSR_MHARTID: return id;
     case CSR_MTVEC: return DEFAULT_MTVEC;
     case CSR_MEDELEG: return state.medeleg;
@@ -485,7 +496,7 @@ reg_t processor_t::get_csr(int which)
     case CSR_MFROMHOST:
       sim->get_htif()->tick(); // not necessary, but faster
       return state.fromhost;
-    case CSR_MIOBASE: return sim->memsz;
+    case CSR_MCFGADDR: return sim->memsz;
     case CSR_UARCH0:
     case CSR_UARCH1:
     case CSR_UARCH2:
index 80cea366c94d6509f524b981807064163a9a910d..b01d5bfb3405b00d3df4509a08ab6ec96709bf95 100644 (file)
@@ -95,7 +95,7 @@ public:
   extension_t* get_extension() { return ext; }
   bool supports_extension(unsigned char ext) {
     if (ext >= 'a' && ext <= 'z') ext += 'A' - 'a';
-    return ext >= 'A' && ext <= 'Z' && ((cpuid >> (ext - 'A')) & 1);
+    return ext >= 'A' && ext <= 'Z' && ((isa >> (ext - 'A')) & 1);
   }
   void set_privilege(reg_t);
   void yield_load_reservation() { state.load_reservation = (reg_t)-1; }
@@ -114,11 +114,11 @@ private:
   extension_t* ext;
   disassembler_t* disassembler;
   state_t state;
-  reg_t cpuid;
   uint32_t id;
   unsigned max_xlen;
   unsigned xlen;
-  std::string isa;
+  reg_t isa;
+  std::string isa_string;
   bool run; // !reset
   bool debug;
   bool histogram_enabled;
index 69d5e19e8af8f23ae8d6414582fd4fd812a49a01..5de93f294c287b1d7fb040cd259f36a348ea604c 100644 (file)
@@ -179,7 +179,7 @@ void sim_t::make_device_tree()
         dt.begin_node(buf);
           dt.add_prop("device_type", "cpu");
           dt.add_prop("compatible", "riscv");
-          dt.add_prop("isa", procs[i]->isa);
+          dt.add_prop("isa", procs[i]->isa_string);
           dt.add_reg({cpu_addr});
         dt.end_node();