* [PATCH 2.6.27] [POWERPC] Invalidate all TLB entries in a specified range
@ 2008-08-14 13:11 Rocky Craig
2008-08-14 22:28 ` Benjamin Herrenschmidt
0 siblings, 1 reply; 2+ messages in thread
From: Rocky Craig @ 2008-08-14 13:11 UTC (permalink / raw)
To: linuxppc-dev; +Cc: paulus, Linux Kernel
From: Rocky Craig <rocky.craig@hp.com>
The apparent intent of "flush_tlbs" is to invalidate TLB entries that
might match in the address range 0 to 0x00400000. A loop counter is
set up at the high value and decremented by page size. However, the
loop is only done once as the sense of the conditional branch at the
loop end does not match the setup/decrement.
Signed-off-by: Rocky Craig <rocky.craig@hp.com>
---
Source is from 2.6.27 development, but the bug appears as far back as 2.4.0.
The small user-space program below demonstrates the loop behavior. It was
compiled via crosstool gcc 3.4.5 / glibc 2.3.6 for an MPC8347 target.
int main()
{
long endval; // 16(r31)
__asm__ __volatile__(
" lis 10,0x40\n"
"1: addic. 10,10,-0x1000\n"
" bgt 1b\n"
" stw 10,16(31)\n"); // endval
printf("end value = 0x%08lx\n", endval);
}
This might win the prize for "Smallest actual code patch ever".
--- a/arch/powerpc/kernel/head_32.S.orig 2008-07-24 19:25:09.000000000 -0600
+++ a/arch/powerpc/kernel/head_32.S 2008-07-24 19:25:22.000000000 -0600
@@ -1155,7 +1155,7 @@ flush_tlbs:
lis r10, 0x40
1: addic. r10, r10, -0x1000
tlbie r10
- blt 1b
+ bgt 1b
sync
blr
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH 2.6.27] [POWERPC] Invalidate all TLB entries in a specified range
2008-08-14 13:11 [PATCH 2.6.27] [POWERPC] Invalidate all TLB entries in a specified range Rocky Craig
@ 2008-08-14 22:28 ` Benjamin Herrenschmidt
0 siblings, 0 replies; 2+ messages in thread
From: Benjamin Herrenschmidt @ 2008-08-14 22:28 UTC (permalink / raw)
To: Rocky Craig; +Cc: linuxppc-dev, paulus, Linux Kernel
On Thu, 2008-08-14 at 07:11 -0600, Rocky Craig wrote:
> From: Rocky Craig <rocky.craig@hp.com>
>
> The apparent intent of "flush_tlbs" is to invalidate TLB entries that
> might match in the address range 0 to 0x00400000. A loop counter is
> set up at the high value and decremented by page size. However, the
> loop is only done once as the sense of the conditional branch at the
> loop end does not match the setup/decrement.
>
> Signed-off-by: Rocky Craig <rocky.craig@hp.com>
> ---
>
> Source is from 2.6.27 development, but the bug appears as far back as 2.4.0.
> The small user-space program below demonstrates the loop behavior. It was
> compiled via crosstool gcc 3.4.5 / glibc 2.3.6 for an MPC8347 target.
Heh nice, that's a bug as old as the port I would say :-)
Ben.
> int main()
> {
> long endval; // 16(r31)
>
> __asm__ __volatile__(
> " lis 10,0x40\n"
> "1: addic. 10,10,-0x1000\n"
> " bgt 1b\n"
> " stw 10,16(31)\n"); // endval
>
> printf("end value = 0x%08lx\n", endval);
> }
>
> This might win the prize for "Smallest actual code patch ever".
>
> --- a/arch/powerpc/kernel/head_32.S.orig 2008-07-24 19:25:09.000000000 -0600
> +++ a/arch/powerpc/kernel/head_32.S 2008-07-24 19:25:22.000000000 -0600
> @@ -1155,7 +1155,7 @@ flush_tlbs:
> lis r10, 0x40
> 1: addic. r10, r10, -0x1000
> tlbie r10
> - blt 1b
> + bgt 1b
> sync
> blr
>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2008-08-14 22:28 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2008-08-14 13:11 [PATCH 2.6.27] [POWERPC] Invalidate all TLB entries in a specified range Rocky Craig
2008-08-14 22:28 ` Benjamin Herrenschmidt
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).