[RFC][PATCH 02/22] x86,mmx_32: Remove .fixup usage

Peter Zijlstra
2021-11-04T16:57:02Z

This code puts an exception table entry on the "PREFIX" instruction to
overwrite it with a jmp.d8 when it triggers an exception. Except of
course, our code is no longer writable, also SMP.

Replace it with ALTERNATIVE, the novel

XXX: arguably we should just delete this code

Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
---
arch/x86/lib/mmx_32.c | 83 ++++++++++++++++----------------------------------
1 file changed, 27 insertions(+), 56 deletions(-)

--- a/arch/x86/lib/mmx_32.c
+++ b/arch/x86/lib/mmx_32.c
@@ -50,23 +50,17 @@ void *_mmx_memcpy(void *to, const void *
kernel_fpu_begin_mask(KFPU_387);

__asm__ __volatile__ (
- "1: prefetch (%0)\n" /* This set is 28 bytes */
- " prefetch 64(%0)\n"
- " prefetch 128(%0)\n"
- " prefetch 192(%0)\n"
- " prefetch 256(%0)\n"
- "2: \n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b)
- : : "r" (from));
+ ALTERNATIVE "",
+ "prefetch (%0)\n"
+ "prefetch 64(%0)\n"
+ "prefetch 128(%0)\n"
+ "prefetch 192(%0)\n"
+ "prefetch 256(%0)\n", X86_FEATURE_3DNOW
+ : : "r" (from));

for ( ; i > 5; i--) {
__asm__ __volatile__ (
- "1: prefetch 320(%0)\n"
- "2: movq (%0), %%mm0\n"
+ " movq (%0), %%mm0\n"
" movq 8(%0), %%mm1\n"
" movq 16(%0), %%mm2\n"
" movq 24(%0), %%mm3\n"
@@ -82,11 +76,6 @@ void *_mmx_memcpy(void *to, const void *
" movq %%mm1, 40(%1)\n"
" movq %%mm2, 48(%1)\n"
" movq %%mm3, 56(%1)\n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b)
: : "r" (from), "r" (to) : "memory");

from += 64;
@@ -177,22 +166,17 @@ static void fast_copy_page(void *to, voi
* but that is for later. -AV
*/
__asm__ __volatile__(
- "1: prefetch (%0)\n"
- " prefetch 64(%0)\n"
- " prefetch 128(%0)\n"
- " prefetch 192(%0)\n"
- " prefetch 256(%0)\n"
- "2: \n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b) : : "r" (from));
+ ALTERNATIVE "",
+ "prefetch (%0)\n"
+ "prefetch 64(%0)\n"
+ "prefetch 128(%0)\n"
+ "prefetch 192(%0)\n"
+ "prefetch 256(%0)\n", X86_FEATURE_3DNOW
+ : : "r" (from));

for (i = 0; i < (4096-320)/64; i++) {
__asm__ __volatile__ (
- "1: prefetch 320(%0)\n"
- "2: movq (%0), %%mm0\n"
+ " movq (%0), %%mm0\n"
" movntq %%mm0, (%1)\n"
" movq 8(%0), %%mm1\n"
" movntq %%mm1, 8(%1)\n"
@@ -208,11 +192,7 @@ static void fast_copy_page(void *to, voi
" movntq %%mm6, 48(%1)\n"
" movq 56(%0), %%mm7\n"
" movntq %%mm7, 56(%1)\n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b) : : "r" (from), "r" (to) : "memory");
+ : : "r" (from), "r" (to) : "memory");

from += 64;
to += 64;
@@ -220,7 +200,7 @@ static void fast_copy_page(void *to, voi

for (i = (4096-320)/64; i < 4096/64; i++) {
__asm__ __volatile__ (
- "2: movq (%0), %%mm0\n"
+ " movq (%0), %%mm0\n"
" movntq %%mm0, (%1)\n"
" movq 8(%0), %%mm1\n"
" movntq %%mm1, 8(%1)\n"
@@ -237,6 +217,7 @@ static void fast_copy_page(void *to, voi
" movq 56(%0), %%mm7\n"
" movntq %%mm7, 56(%1)\n"
: : "r" (from), "r" (to) : "memory");
+
from += 64;
to += 64;
}
@@ -295,22 +276,17 @@ static void fast_copy_page(void *to, voi
kernel_fpu_begin_mask(KFPU_387);

__asm__ __volatile__ (
- "1: prefetch (%0)\n"
- " prefetch 64(%0)\n"
- " prefetch 128(%0)\n"
- " prefetch 192(%0)\n"
- " prefetch 256(%0)\n"
- "2: \n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b) : : "r" (from));
+ ALTERNATIVE "",
+ "prefetch (%0)\n"
+ "prefetch 64(%0)\n"
+ "prefetch 128(%0)\n"
+ "prefetch 192(%0)\n"
+ "prefetch 256(%0)\n", X86_FEATURE_3DNOW
+ : : "r" (from));

for (i = 0; i < 4096/64; i++) {
__asm__ __volatile__ (
- "1: prefetch 320(%0)\n"
- "2: movq (%0), %%mm0\n"
+ " movq (%0), %%mm0\n"
" movq 8(%0), %%mm1\n"
" movq 16(%0), %%mm2\n"
" movq 24(%0), %%mm3\n"
@@ -326,11 +302,6 @@ static void fast_copy_page(void *to, voi
" movq %%mm1, 40(%1)\n"
" movq %%mm2, 48(%1)\n"
" movq %%mm3, 56(%1)\n"
- ".section .fixup, \"ax\"\n"
- "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
- " jmp 2b\n"
- ".previous\n"
- _ASM_EXTABLE(1b, 3b)
: : "r" (from), "r" (to) : "memory");

from += 64;