Browse Source

Take interrupts as soon as interrupts are enabled

Previously, if interrupts were enabled then disabled quickly enough,
no interrupt would ever be taken, resulting in deadlock.
pull/23/head
Andrew Waterman 11 years ago
parent
commit
292fef830d
  1. 2
      riscv/insns/c_addi4.h
  2. 4
      riscv/insns/c_jalr.h
  3. 9
      riscv/processor.cc
  4. 2
      riscv/processor.h

2
riscv/insns/c_addi4.h

@ -1,2 +0,0 @@
require_extension('C');
WRITE_RD(sext_xlen(RVC_RS2 + insn.rvc_lwsp_imm()));

4
riscv/insns/c_jalr.h

@ -1,4 +0,0 @@
require_extension('C');
reg_t tmp = npc;
set_pc(RVC_RS1 & ~reg_t(1));
WRITE_RD(tmp);

9
riscv/processor.cc

@ -230,7 +230,7 @@ void processor_t::step(size_t n)
if (unlikely(pc == PC_SERIALIZE)) { \ if (unlikely(pc == PC_SERIALIZE)) { \
pc = state.pc; \ pc = state.pc; \
state.serialized = true; \ state.serialized = true; \
continue; \ break; \
} }
try try
@ -276,7 +276,7 @@ void processor_t::step(size_t n)
} }
catch(trap_t& t) catch(trap_t& t)
{ {
state.pc = take_trap(t, pc); take_trap(t, pc);
} }
update_timer(&state, instret); update_timer(&state, instret);
@ -307,19 +307,18 @@ void processor_t::pop_privilege_stack()
set_csr(CSR_MSTATUS, s); set_csr(CSR_MSTATUS, s);
} }
reg_t processor_t::take_trap(trap_t& t, reg_t epc) void processor_t::take_trap(trap_t& t, reg_t epc)
{ {
if (debug) if (debug)
fprintf(stderr, "core %3d: exception %s, epc 0x%016" PRIx64 "\n", fprintf(stderr, "core %3d: exception %s, epc 0x%016" PRIx64 "\n",
id, t.name(), epc); id, t.name(), epc);
reg_t tvec = DEFAULT_MTVEC + 0x40 * get_field(state.mstatus, MSTATUS_PRV); state.pc = DEFAULT_MTVEC + 0x40 * get_field(state.mstatus, MSTATUS_PRV);
push_privilege_stack(); push_privilege_stack();
yield_load_reservation(); yield_load_reservation();
state.mcause = t.cause(); state.mcause = t.cause();
state.mepc = epc; state.mepc = epc;
t.side_effects(&state); // might set badvaddr etc. t.side_effects(&state); // might set badvaddr etc.
return tvec;
} }
void processor_t::deliver_ipi() void processor_t::deliver_ipi()

2
riscv/processor.h

@ -119,7 +119,7 @@ private:
std::map<size_t,size_t> pc_histogram; std::map<size_t,size_t> pc_histogram;
void take_interrupt(); // take a trap if any interrupts are pending void take_interrupt(); // take a trap if any interrupts are pending
reg_t take_trap(trap_t& t, reg_t epc); // take an exception void take_trap(trap_t& t, reg_t epc); // take an exception
void disasm(insn_t insn); // disassemble and print an instruction void disasm(insn_t insn); // disassemble and print an instruction
friend class sim_t; friend class sim_t;

Loading…
Cancel
Save