Browse Source

[sim,pk] added interrupt-pending field to cause reg

cs250
Andrew Waterman 16 years ago
parent
commit
75d9ab427d
  1. 5
      riscv/decode.h
  2. 2
      riscv/insns/mtpcr.h
  3. 16
      riscv/processor.cc
  4. 1
      riscv/processor.h
  5. 2
      riscv/trap.h

5
riscv/decode.h

@ -44,6 +44,11 @@ const int JUMP_ALIGN_BITS = 1;
#define SR_IM_SHIFT 8 #define SR_IM_SHIFT 8
#define TIMER_IRQ 7 #define TIMER_IRQ 7
#define CAUSE_EXCCODE 0x000000FF
#define CAUSE_IP 0x0000FF00
#define CAUSE_EXCCODE_SHIFT 0
#define CAUSE_IP_SHIFT 8
#define FP_RD_NE 0 #define FP_RD_NE 0
#define FP_RD_0 1 #define FP_RD_0 1
#define FP_RD_DN 2 #define FP_RD_DN 2

2
riscv/insns/mtpcr.h

@ -15,7 +15,7 @@ switch(insn.rtype.rs2)
count = RS1; count = RS1;
break; break;
case 5: case 5:
interrupts_pending &= ~(1 << TIMER_IRQ); cause &= ~(1 << (TIMER_IRQ+CAUSE_IP_SHIFT));
compare = RS1; compare = RS1;
break; break;

16
riscv/processor.cc

@ -25,7 +25,6 @@ processor_t::processor_t(sim_t* _sim, char* _mem, size_t _memsz)
fromhost = 0; fromhost = 0;
count = 0; count = 0;
compare = 0; compare = 0;
interrupts_pending = 0;
set_sr(SR_S | SR_SX); // SX ignored if 64b mode not supported set_sr(SR_S | SR_SX); // SX ignored if 64b mode not supported
set_fsr(0); set_fsr(0);
@ -70,13 +69,10 @@ void processor_t::step(size_t n, bool noisy)
{ {
for( ; i < n; i++) for( ; i < n; i++)
{ {
uint32_t interrupts = interrupts_pending & ((sr & SR_IM) >> SR_IM_SHIFT); uint32_t interrupts = (cause & CAUSE_IP) >> CAUSE_IP_SHIFT;
if((sr & SR_ET) && interrupts) interrupts &= (sr & SR_IM) >> SR_IM_SHIFT;
{ if(interrupts && (sr & SR_ET))
for(int i = 0; interrupts; i++, interrupts >>= 1) take_trap(trap_interrupt,noisy);
if(interrupts & 1)
throw trap_t(16+i);
}
insn_t insn = mmu.load_insn(pc); insn_t insn = mmu.load_insn(pc);
@ -91,7 +87,7 @@ void processor_t::step(size_t n, bool noisy)
XPR[0] = 0; XPR[0] = 0;
if(count++ == compare) if(count++ == compare)
interrupts_pending |= 1 << TIMER_IRQ; cause |= 1 << (TIMER_IRQ+CAUSE_IP_SHIFT);
} }
return; return;
} }
@ -112,7 +108,7 @@ void processor_t::take_trap(trap_t t, bool noisy)
id, trap_name(t), (unsigned long long)pc); id, trap_name(t), (unsigned long long)pc);
set_sr((((sr & ~SR_ET) | SR_S) & ~SR_PS) | ((sr & SR_S) ? SR_PS : 0)); set_sr((((sr & ~SR_ET) | SR_S) & ~SR_PS) | ((sr & SR_S) ? SR_PS : 0));
cause = t; cause = (cause & ~CAUSE_EXCCODE) | (t << CAUSE_EXCCODE_SHIFT);
epc = pc; epc = pc;
pc = evec; pc = evec;
badvaddr = mmu.get_badvaddr(); badvaddr = mmu.get_badvaddr();

1
riscv/processor.h

@ -36,7 +36,6 @@ private:
uint32_t sr; uint32_t sr;
uint32_t count; uint32_t count;
uint32_t compare; uint32_t compare;
uint32_t interrupts_pending;
// unprivileged control registers // unprivileged control registers
uint32_t fsr; uint32_t fsr;

2
riscv/trap.h

@ -8,7 +8,7 @@
DECLARE_TRAP(privileged_instruction), \ DECLARE_TRAP(privileged_instruction), \
DECLARE_TRAP(fp_disabled), \ DECLARE_TRAP(fp_disabled), \
DECLARE_TRAP(syscall), \ DECLARE_TRAP(syscall), \
DECLARE_TRAP(breakpoint), \ DECLARE_TRAP(interrupt), \
DECLARE_TRAP(data_address_misaligned), \ DECLARE_TRAP(data_address_misaligned), \
DECLARE_TRAP(load_access_fault), \ DECLARE_TRAP(load_access_fault), \
DECLARE_TRAP(store_access_fault), \ DECLARE_TRAP(store_access_fault), \

Loading…
Cancel
Save