* [PATCH] Fix prefetch patching in 2.5-bk
@ 2003-05-01 0:15 Andi Kleen
2003-05-01 1:21 ` Linus Torvalds
0 siblings, 1 reply; 3+ messages in thread
From: Andi Kleen @ 2003-05-01 0:15 UTC (permalink / raw)
To: torvalds; +Cc: linux-kernel
Brown paperbag time. I forgot to take the modrm byte in account
with the prefetch patch replacement. With 3.2 it worked because
it used the right registers in my configuration.
But gcc 2.96 uses a different register in __dpath and the prefetch becomes
4 bytes with modrm and the original nop needs to be as long as that too.
If your machine BUG()s in apply_alternatives at booting
or module loading you need this patch.
Linus please apply.
-Andi
Index: linux/include/asm-i386/processor.h
===================================================================
RCS file: /home/cvs/linux-2.5/include/asm-i386/processor.h,v
retrieving revision 1.48
diff -u -u -r1.48 processor.h
--- linux/include/asm-i386/processor.h 30 Apr 2003 14:32:05 -0000 1.48
+++ linux/include/asm-i386/processor.h 30 Apr 2003 22:48:26 -0000
@@ -564,7 +564,7 @@
#define ARCH_HAS_PREFETCH
extern inline void prefetch(const void *x)
{
- alternative_input(ASM_NOP3,
+ alternative_input(ASM_NOP4,
"prefetchnta (%1)",
X86_FEATURE_XMM,
"r" (x));
@@ -578,7 +578,7 @@
spinlocks to avoid one state transition in the cache coherency protocol. */
extern inline void prefetchw(const void *x)
{
- alternative_input(ASM_NOP3,
+ alternative_input(ASM_NOP4,
"prefetchw (%1)",
X86_FEATURE_3DNOW,
"r" (x));
^ permalink raw reply [flat|nested] 3+ messages in thread* Re: [PATCH] Fix prefetch patching in 2.5-bk
2003-05-01 0:15 [PATCH] Fix prefetch patching in 2.5-bk Andi Kleen
@ 2003-05-01 1:21 ` Linus Torvalds
2003-05-01 1:51 ` Andi Kleen
0 siblings, 1 reply; 3+ messages in thread
From: Linus Torvalds @ 2003-05-01 1:21 UTC (permalink / raw)
To: Andi Kleen; +Cc: linux-kernel
On Thu, 1 May 2003, Andi Kleen wrote:
>
> If your machine BUG()s in apply_alternatives at booting
> or module loading you need this patch.
I applied it, but I don't have to like it..
How about doing this differently, and having something like this:
#define nop_alternative(newinstr, feature) \
".section .altinstructions,\"a\"\n" \
" .align 4\n"
" .long 660f\n"
" .long 663f\n"
" .byte %c0\n"
" .byte 0\n"
" .byte 664f-663f\n"
".previous\n"
".section .altinstr_replacement",\"ax\"\n"
"663:\n\t" newinstr "\n664:\n"
".previous"
"660:\n\t"
".rept 664b-663b, 0x90\n\t"
and making "sourcelen==0" a special case for replacement (replace with the
proper destination length nop, instead of having that "0x90 0x90 0x90"
sequence).
This allows you to use arbitrary-sized things without having to worry
about having to have the size right, or without having to use
unnecessarily long nop-sequences. You'll always get the right-size nop.
Linus
^ permalink raw reply [flat|nested] 3+ messages in thread
* Re: [PATCH] Fix prefetch patching in 2.5-bk
2003-05-01 1:21 ` Linus Torvalds
@ 2003-05-01 1:51 ` Andi Kleen
0 siblings, 0 replies; 3+ messages in thread
From: Andi Kleen @ 2003-05-01 1:51 UTC (permalink / raw)
To: Linus Torvalds; +Cc: Andi Kleen, linux-kernel
On Thu, May 01, 2003 at 03:21:52AM +0200, Linus Torvalds wrote:
> and making "sourcelen==0" a special case for replacement (replace with the
> proper destination length nop, instead of having that "0x90 0x90 0x90"
> sequence).
Note sure what you mean with 0x90 sequence.
My original implementation used .rept to generate the correct number of
(single byte) nops based on the label length of the other case.
But it didn't work because I ran into at least one weird assembler bug (it internally
got confused on something and gave an impossible error message about a
missing label). Also it only generated single byte nops.
In any case you need to pad the code to the correct number of bytes,
I'm not sure how it can be done otherwise.
-Andi
^ permalink raw reply [flat|nested] 3+ messages in thread
end of thread, other threads:[~2003-05-01 1:39 UTC | newest]
Thread overview: 3+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2003-05-01 0:15 [PATCH] Fix prefetch patching in 2.5-bk Andi Kleen
2003-05-01 1:21 ` Linus Torvalds
2003-05-01 1:51 ` Andi Kleen
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox