[sim] privileged mode support for 32-bit operation
authorAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Tue, 24 Aug 2010 09:18:23 +0000 (02:18 -0700)
committerAndrew Waterman <waterman@s141.Millennium.Berkeley.EDU>
Tue, 24 Aug 2010 09:18:23 +0000 (02:18 -0700)
riscv/insns/mfpcr.h
riscv/insns/mtpcr.h
riscv/processor.cc
riscv/processor.h

index 7808458722cb48d4573bab9f979c12313f7c7e29..853842ecccd1a0c1e653270627ae8bbf11a39901 100644 (file)
@@ -1,29 +1,32 @@
 require_supervisor;
-require64;
+
+reg_t val;
 
 switch(insn.rtype.rb)
 {
   case 0:
-    RA = sr;
+    val = sr;
     break;
   case 1:
-    RA = epc;
+    val = epc;
     break;
   case 2:
-    RA = badvaddr;
+    val = badvaddr;
     break;
   case 3:
-    RA = ebase;
+    val = ebase;
     break;
 
   case 8:
-    RA = MEMSIZE >> 12;
+    val = MEMSIZE >> 12;
     break;
 
   case 17:
-    RA = sim->get_fromhost();
+    val = sim->get_fromhost();
     break;
 
   default:
-    RA = -1;
+    val = -1;
 }
+
+RA = gprlen == 64 ? val : sext32(val);
index 67195a643bee6587dc0ae0159d1241924d65d6cb..01b3e2f558d44bc4dc9385430dddc35759eff809 100644 (file)
@@ -1,19 +1,20 @@
 require_supervisor;
-require64;
+
+reg_t val = gprlen == 64 ? RA : sext32(RA);
 
 switch(insn.rtype.rb)
 {
   case 0:
-    set_sr(RA);
+    set_sr(val);
     break;
   case 1:
-    epc = RA;
+    epc = val;
     break;
   case 3:
-    ebase = RA & ~0xFFF;
+    ebase = val & ~0xFFF;
     break;
 
   case 16:
-    sim->set_tohost(RA);
+    sim->set_tohost(val);
     break;
 }
index 7ca015d765eab95ccf58aff43de81a90aaaf3220..e81884053935d9151480cd16e6890a78d4f60c96 100644 (file)
@@ -18,7 +18,7 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
   ebase = 0;
   epc = 0;
   badvaddr = 0;
-  set_sr(SR_S);
+  set_sr(SR_S | (support_64bit ? SR_KX : 0));
   set_fsr(0);
 
   memset(counters,0,sizeof(counters));
@@ -40,10 +40,9 @@ void processor_t::init(uint32_t _id)
 void processor_t::set_sr(uint32_t val)
 {
   sr = val & ~SR_ZERO;
-  if(support_64bit)
-    sr |= SR_KX;
-  else
+  if(!support_64bit)
     sr &= ~(SR_KX | SR_UX);
+printf("kx,ux now %d,%d %llx\n",!!(sr & SR_KX),!!(sr & SR_UX),pc);
 
   gprlen = ((sr & SR_S) ? (sr & SR_KX) : (sr & SR_UX)) ? 64 : 32;
 }
@@ -79,15 +78,18 @@ void processor_t::step(size_t n, bool noisy)
   catch(trap_t t)
   {
     i++;
-    take_trap(t);
+    take_trap(t,noisy);
   }
 }
 
-void processor_t::take_trap(trap_t t)
+void processor_t::take_trap(trap_t t, bool noisy)
 {
   demand(t < NUM_TRAPS, "internal error: bad trap number %d", int(t));
   demand(sr & SR_ET, "error mode on core %d!\ntrap %s, pc 0x%016llx",
          id, trap_name(t), (unsigned long long)pc);
+  if(noisy)
+    printf("core %3d: trap %s, pc 0x%016llx\n",
+           id, trap_name(t), (unsigned long long)pc);
 
   set_sr((((sr & ~SR_ET) | SR_S) & ~SR_PS) | ((sr & SR_S) ? SR_PS : 0));
   epc = pc;
index 8c64d6d04de3743b7ab655e1d92a31a906d0a180..f2024ff6d799b88ada3dea5daa51dd20b9f7be10 100644 (file)
@@ -39,7 +39,7 @@ private:
   // functions
   void set_sr(uint32_t val);
   void set_fsr(uint32_t val);
-  void take_trap(trap_t t);
+  void take_trap(trap_t t, bool noisy);
   void disasm(insn_t insn, reg_t pc);
 
   friend class sim_t;