[PATCH 0/8] Fix 8xx MMU/TLB
Joakim Tjernlund
joakim.tjernlund at transmode.se
Sat Oct 17 22:24:18 EST 2009
Rex Feany <RFeany at mrv.com> wrote on 16/10/2009 22:25:41:
>
> Thus spake Joakim Tjernlund (joakim.tjernlund at transmode.se):
>
> > Right, it is the pte table walk that is blowing up.
> > I just noted that 2.6 lacks a tophys() call in its table walk
> > so I removed that one(there is one more tophys call but I don't think
> > it should be removed).
> > Try this addon patch:
>
> no difference
OK, thinking a bit more, this part should not be executed as
copy_tofrom_user executes in kernel space.
Any chance you can stick a HW breakpoint on FixupDAR?
Perhaps there is something different with kernel
virtual address to phys address?
A simple topys() works in 2.4, but perhaps not in 2.6?
this is the part of interest:
FixupDAR: /* Entry point for dcbx workaround. */
/* fetch instruction from memory. */
mfspr r10, SPRN_SRR0
andis. r11, r10, 0x8000
tophys (r11, r10)
beq- 139b /* Branch if user space address */
140: lwz r11,0(r11)
If not kernel dcbX works, you could see if user space does.
Here is a start:
#include <errno.h>
#include <sys/mman.h>
#include <stdio.h>
dcbz(void const *ptr)
{
__asm__ ("dcbz 0, %0" : : "r" (ptr) : "memory");
}
dcbf(void const *ptr)
{
__asm__ ("dcbf 0, %0" : : "r" (ptr) : "memory");
}
dcbi(void const *ptr)
{
__asm__ ("dcbi 0, %0" : : "r" (ptr) : "memory");
}
dcbst(void const *ptr)
{
__asm__ ("dcbst 0, %0" : : "r" (ptr) : "memory");
}
icbi(void const *ptr)
{
__asm__ ("icbi 0, %0" : : "r" (ptr) : "memory");
}
dcbt(void const *ptr) /* no TLB Miss */
{
__asm__ ("dcbt 0, %0" : : "r" (ptr) : "memory");
}
dcbtst(void const *ptr) /* no TLB Miss */
{
__asm__ ("dcbtst 0, %0" : : "r" (ptr) : "memory");
}
static const unsigned long const a[16*4094] ;
main()
{
volatile unsigned long b, *ptr = &a[10*4096], *mptr;
b = *ptr;
mptr = mmap(NULL, 16*4094, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (mptr == MAP_FAILED)
printf("mmap failed:%s\n", strerror(errno));
ptr = mptr;
#if 0
dcbst(&a[2*4096]);
b = *ptr;
dcbf(&a[6*4096]);
b = *ptr;
dcbz(&a[4*4096]);
b = *ptr;
dcbst(&a[8*4096]);
dcbst(&a[8*4096]);
#endif
*ptr = 17;
printf("dcbst(ptr)\n"); fflush(stdout);
dcbst(ptr);
*(ptr+3+1024) = 18;
printf("dcbst(ptr+3*1024)\n"); fflush(stdout);
dcbst(ptr+3*1024);
printf("dcbt(ptr+5*1024)\n"); fflush(stdout);
dcbt(ptr+5*1024);
printf("dcbz(ptr+2*1024)\n"); fflush(stdout);
dcbf(&a[6*4096]);
printf("dcbz(&a[4*4096])\n"); fflush(stdout);
dcbz(&a[4*4096]); fflush(stdout);
printf("dcbf(&a[6*4096])\n"); fflush(stdout);
dcbf(&a[6*4096]);
//dcbz(ptr+2*1024);
//dcbi(&a[6*4096]);
//icbi(&a[8*4096]);
}
More information about the Linuxppc-dev
mailing list