Subject: Re: Kernel copyin/out optimizations for ARM...
To: David Laight <david@l8s.co.uk>
From: Richard Earnshaw <rearnsha@buzzard.freeserve.co.uk>
List: port-arm
Date: 03/14/2002 01:27:17
> IIRC the SA1100 will access data in its cache without looking at the
> TLB/PTE entry. Now unless the permissions from the TLB are saved
> with the cache line (Richard might be able to find out) this would
> allow users to write to kernel data that is in the d-cache! [1]
I've never heard anything to suggest this was the case before. If true,
it would indeed be horrible. It certainly is the case that the SA110
caches also hold the physical address of the cache line, so that the
write-backs can take place without a further look up. Of course, a simple
kernel test should suffice:
ldr r0, [some_cacheable_kernel_address]
ldrt r0, [same_kernel_address]
which should trap on the second access.
Are you sure that you aren't confusing the mini-cache on the 1100 with the
main Dcache? That could well be different (and, of course, specific to
the 1100 parts). Either way, I've asked a colleague who was more
intimately involved what the situation really is. No answer yet...
>
> However valid user addresses are know to be a bounded range (8k to
> maybe 0xc0000000 - or similar) so this can be checked quite cheaply.
> Allowing the kernel permissions to be used for the copy.
Yes, the fusuxxx routines already do this.
>
> The PTE check is actually checking for the 'copy on write' case,
> not the 'page not present' case. This may have something to do
> with the problems Jason? was having with COW on XSCALE.
> My guess is that the cpu wasn't faulting the write to cache! Just the
> writeback of the cacheline - which would be asynchonous! [2]
Nah! far more likely that the original author didn't know about ldrt!
Otherwise, the absence of a comment explaining why they aren't used is
unforgivable.
The SA can never abort on a cache write-back. There's just no way for it
to do that. It can abort on a cache-line fetch, but only if the aborting
word occurs before the required word is fetched. After that, the core
will have continued, and the cache line will just be discarded (so says
the data sheet).
R.