dcbz works on 862 everywhere!
Joakim Tjernlund
joakim.tjernlund at lumentis.se
Sat Apr 5 01:09:01 EST 2003
> > The current implementation relies on TLB Miss always setting EPN
> > (and other hardware assist registers) correctly, and TLB Error
> > relies on DAR being set correctly. Everything works fine until
> > you get a TLB Error on a dcbz/dcbt that doesn't properly update DAR.
> > In this case EPN isn't set correctly either.
>
> I just want to point out(again) that TLB Miss caused by most of the
> dcxx(dcbf, dcbi, dcbst, dcbz) instructions that end up in the slow path(DataAccess)
> don't work with the current impl. since DAR isn't set. The code fragment below
> will fix that(from my earlier patch). This won't affect the fast path at all
> since it all of it can be in the slow path.
>
> + /* Copy 20 msb from EPN to DAR since the dcxx instructions fails
> + * update the DAR when they cause a DTLB Miss.
> + */
> + mfspr r21, MD_EPN
> + rlwinm r21, r21, 0, 0, 19
> + mfspr r20, DAR
> + rlwinm r20, r20, 0, 20, 31
> + or r20, r20, r21
> + mtspr DAR, r20
>
> It is hard to end up in slow path for kernel space addresses, but
> it's not impossible I guess. Comments?
hmm, no response from the maintainer(s). You don't agree?
Did another test. I tagged DAR with a bad address(0xdead0000) in
the TLB Miss handler(after the mtspr MD_RPN, r20) shortly before
rfi.
Now the kernel won't boot. It turns out it's consistent_alloc that is
doing a invalidate_dcache_range(). According to a comment, memory is allocated
from the vmalloc memory space. Doing a invalidate_dcache_range() on this memory
causes a DTLB error with the change bit cleared and since DAR isn't set by
dcbi, linux hangs.
Clearly, the DTLB exeception procedure still is buggy.
Jocke
** Sent via the linuxppc-embedded mail list. See http://lists.linuxppc.org/
More information about the Linuxppc-embedded
mailing list