Browse Source

[xcc,sim] eliminated vectored traps

now, the evec register holds the address that all traps vector to,
and the cause register is set with the trap number.
cs250
Andrew Waterman 16 years ago
parent
commit
a359d7b81a
  1. 5
      riscv/insns/mfpcr.h
  2. 2
      riscv/insns/mtpcr.h
  3. 4
      riscv/mmu.h
  4. 6
      riscv/processor.cc
  5. 3
      riscv/processor.h

5
riscv/insns/mfpcr.h

@ -14,7 +14,7 @@ switch(insn.rtype.rs2)
val = badvaddr;
break;
case 3:
val = ebase;
val = evec;
break;
case 4:
val = count;
@ -22,6 +22,9 @@ switch(insn.rtype.rs2)
case 5:
val = compare;
break;
case 6:
val = cause;
break;
case 8:
val = MEMSIZE >> 12;

2
riscv/insns/mtpcr.h

@ -9,7 +9,7 @@ switch(insn.rtype.rs2)
epc = RS1;
break;
case 3:
ebase = RS1 & ~0xFFF;
evec = RS1;
break;
case 4:
count = RS1;

4
riscv/mmu.h

@ -50,9 +50,9 @@ private:
{
if(addr & (size-1))
{
badvaddr = addr;
if(fetch)
throw trap_instruction_address_misaligned;
badvaddr = addr;
throw trap_data_address_misaligned;
}
}
@ -61,9 +61,9 @@ private:
{
if(addr >= memsz || addr + size > memsz)
{
badvaddr = addr;
if(fetch)
throw trap_instruction_access_fault;
badvaddr = addr;
throw store ? trap_store_access_fault : trap_load_access_fault;
}
}

6
riscv/processor.cc

@ -15,9 +15,10 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
memset(R,0,sizeof(R));
memset(FR,0,sizeof(FR));
pc = 0;
ebase = 0;
evec = 0;
epc = 0;
badvaddr = 0;
cause = 0;
tid = 0;
pcr_k0 = 0;
pcr_k1 = 0;
@ -109,8 +110,9 @@ void processor_t::take_trap(trap_t t, bool noisy)
id, trap_name(t), (unsigned long long)pc);
set_sr((((sr & ~SR_ET) | SR_S) & ~SR_PS) | ((sr & SR_S) ? SR_PS : 0));
cause = t;
epc = pc;
pc = ebase + t*128;
pc = evec;
badvaddr = mmu.get_badvaddr();
}

3
riscv/processor.h

@ -26,7 +26,8 @@ private:
reg_t pc;
reg_t epc;
reg_t badvaddr;
reg_t ebase;
reg_t cause;
reg_t evec;
reg_t tohost;
reg_t fromhost;
reg_t pcr_k0;

Loading…
Cancel
Save