I get an assertion failure:

build/RISCV/mem/page_table.cc:190: Fault
PageTableBase::translate(RequestPtr): Assertion `pageAlign(req->getVaddr()
+ req->getSize() - 1) == pageAlign(req->getVaddr())' failed.

I can't tell from my debug trace (with Exec and Commit flags on) if this is
happening during exec or commit.  I can see that there's an ld instruction
preceding the ret instruction that is supposed to load the correct address
into the return-address register, but for some reason is unable to commit.
A more complete trace looks like this:

...
ret <------------ this ret appears to execute properly
ld ra,24(sp) <--- this never commits
li a0,0
ld s0,16(sp)
ld s1,8(sp)
addi sp,sp,32
ret
ld s1,0(a1) <---- this is executed speculatively, but a1 isn't a valid
address
...

Register a1 contains -1 at this point.

The commit log doesn't show me any information about that last instruction
except for when it is inserted into the ROB, which is why I originally
thought the error was happening during speculation.

On Fri, Mar 10, 2017 at 4:45 PM, Steve Reinhardt <ste...@gmail.com> wrote:

> The instruction should be marked as causing a fault, but the fault action
> should not be invoked until the instruction is committed. Because it's a
> mis-speculated instruction, it will never be committed, so the fault should
> never be observed. I'm not sure what you mean by "crashes", so I'm not sure
> what part of this process is not operating properly for you.
>
> Steve
>
>
> On Fri, Mar 10, 2017 at 1:40 PM, Alec Roelke <ar...@virginia.edu> wrote:
>
> > Hello Everyone,
> >
> > I'm trying to debug RISC-V running on the O3 model, and I've encountered
> a
> > problem where the CPU tries to speculatively execute a load instruction
> > (which is actually along a branch that ends up not being taken) in which
> > the data crosses a page boundary and causes a fault.
> >
> > The specific section of code looks like this:
> >
> > ...
> > ret
> > ld s1,0(a1)
> > ...
> >
> > If you're not familiar with RISC-V, ret is a pseudo-instruction that just
> > jumps to whatever address is stored in the return-address register, and
> ld
> > loads a 64-bit value from memory.
> >
> > The problem I'm encountering is that the value stored in register a1 is
> not
> > a valid address as that instruction is not supposed to be executed, and
> it
> > just so happens that the word it points to crosses a page boundary.  When
> > gem5 speculatively executes this, it crashes.
> >
> > How can I prevent gem5 from doing this?  I know I could flag load and
> store
> > instructions as being nonspeculative, but that will slow down execution
> and
> > affect output stats.  I'm working on top of these four patches:
> >
> >    - https://gem5-review.googlesource.com/c/2304/
> >    - https://gem5-review.googlesource.com/c/2305/5
> >    - https://gem5-review.googlesource.com/c/2340/2
> >    - https://gem5-review.googlesource.com/c/2341/2
> >
> > Thanks,
> > Alec Roelke
> > _______________________________________________
> > 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

Reply via email to