Sure: https://gem5.atlassian.net/browse/GEM5-367
Best regards, Nils On 2/24/20 5:51 PM, Jason Lowe-Power wrote: > Hi Nils, > > This is awesome! Getting closer to full system support for RISC-V is really > cool! I'm excited to dig into the code. > > Could you create an Epic about this on the Jira instance: > https://gem5.atlassian.net/projects/GEM5/issues. This will make it > easier to track the progress, etc. > > Cheers, > Jason > > On Mon, Feb 24, 2020 at 4:57 AM Nils Asmussen <n...@os.inf.tu-dresden.de> > wrote: > >> Hi all, >> >> I've just pushed a couple of patches that add full system support to >> RISC-V and a also few bug fixes. We cannot run Linux yet (I didn't try), >> but we can run software that uses virtual memory :) >> >> The status is that all tests of the RISC-V test suite work in the p, ps >> and v environment, except for: >> - fence.i tests: these tests fail, because we currently don't invalidate >> the icache for that instruction, so that self-modifying code doesn't >> work. >> - floating point tests: there are still several issues with floating >> point instructions that I didn't look into. >> - some tests fail with the MinorCPU, but I think that is expected. >> - in the rv64mi-illegal test, I disabled the waiting for a timer IRQ, >> because we don't have a timer. >> Note also that none of these worked before my patches. >> >> I have a couple of questions and comments to the patches: >> >> - The commit "tests: call sys.exit() on failure in Simulation::run." >> exits the simulation with the exit code given by exit_event. This >> is necessary to report success/failure for the RISC-V tests. I am >> not sure if it has side effects on other tests or so. >> >> - The RISC-V unprivileged ISA manual states: >> >> CSR access are performed in program order with respect to those >> instructions whose execution behavior is affected by the state of the >> accessed CSR. In particular, a CSR access is performed after the >> execution of any prior instructions in program order whose behavior >> modifies or is modified by the CSR state and before the execution of any >> subsequent instructions in program order whose behavior modifies or is >> modified by the CSR state. >> >> My current patch ("arch-riscv: make accesses to CSRs SerializeAfter.") >> makes them simply SerializeAfter, which works in all tests. However, >> shouldn't a CSR access also be executed *after* all instructions >> before? Because what if the instruction before a CSR write relies on >> the CSR state before the change and the O3 CPU executes these >> instructions in the opposite order? >> >> I noticed that there is IsSerializeBefore as well, but apparently, an >> instruction cannot really be both, because IsSerializeBefore is >> preferred over the other and thus effectively disables >> IsSerializeAfter (see rename_impl.hh, line 721ff). >> >> Did I misunderstand that or is there indeed something not entirely >> correct? >> >> - Since I based the implementation of the TLB and page table walker on >> x86, I noticed that accessed/dirty flag setting seems to be broken on >> x86. At first, the dirty flag is not set at all, as far as I can see. >> And second, the accessed flag is not set for leaf PTEs, because if >> doEndWalk is true, doWrite (to update the PTE) is not considered. >> >> - Another problem I ran into with RISC-V is a page fault caused by an >> atomic instruction. As it seems, the instruction is stuck in the >> IEW stage and thus can never be commited. I did a bit of trial and >> error and found that the attached workaround solves the problem. >> However, this is of course a stupid fix. Does anybody know how to fix >> it properly? >> >> Best regards, >> Nils >> >> --- >> >> diff --git a/src/cpu/o3/iew_impl.hh b/src/cpu/o3/iew_impl.hh >> index 99dfd19c3..369d3ee71 100644 >> --- a/src/cpu/o3/iew_impl.hh >> +++ b/src/cpu/o3/iew_impl.hh >> @@ -1278,6 +1278,18 @@ DefaultIEW<Impl>::executeInsts() >> instQueue.deferMemInst(inst); >> continue; >> } >> + >> + // If the AMO had a fault then it may not have a mem req >> + if (fault != NoFault && >> + strcmp(fault->name(), "panic fault") != 0) { >> + // If the instruction faulted, then we need to send it >> + // along to commit without the instruction >> completing. Send >> + // this instruction to commit, also make sure iew >> stage >> + // realizes there is activity. >> + inst->setExecuted(); >> + instToCommit(inst); >> + activityThisCycle(); >> + } >> } else if (inst->isLoad()) { >> // Loads will mark themselves as executed, and their >> writeback >> // event adds the instruction to the queue to commit >> _______________________________________________ >> gem5-dev mailing list >> gem5-dev@gem5.org >> http://m5sim.org/mailman/listinfo/gem5-dev > _______________________________________________ > gem5-dev mailing list > gem5-dev@gem5.org > http://m5sim.org/mailman/listinfo/gem5-dev > _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev