Commit 0dcc5147 authored by Uros Bizjak's avatar Uros Bizjak Committed by Ingo Molnar
Browse files

x86/boot: Remove semicolon from "rep" prefixes



Minimum version of binutils required to compile the kernel is 2.25.
This version correctly handles the "rep" prefixes, so it is possible
to remove the semicolon, which was used to support ancient versions
of GNU as.

Due to the semicolon, the compiler considers "rep; insn" (or its
alternate "rep\n\tinsn" form) as two separate instructions. Removing
the semicolon makes asm length calculations more accurate, consequently
making scheduling and inlining decisions of the compiler more accurate.

Removing the semicolon also enables assembler checks involving "rep"
prefixes. Trying to assemble e.g. "rep addl %eax, %ebx" results in:

  Error: invalid instruction `add' after `rep'

Signed-off-by: default avatarUros Bizjak <ubizjak@gmail.com>
Signed-off-by: default avatarIngo Molnar <mingo@kernel.org>
Cc: Andy Lutomirski <luto@kernel.org>
Cc: Brian Gerst <brgerst@gmail.com>
Cc: H. Peter Anvin <hpa@zytor.com>
Cc: Josh Poimboeuf <jpoimboe@redhat.com>
Cc: Juergen Gross <jgross@suse.com>
Cc: Kees Cook <keescook@chromium.org>
Cc: Linus Torvalds <torvalds@linux-foundation.org>
Cc: Martin Mares <mj@ucw.cz>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: https://lore.kernel.org/r/20250418071437.4144391-1-ubizjak@gmail.com
parent 498cb872
Loading
Loading
Loading
Loading
+2 −2
Original line number Diff line number Diff line
@@ -32,7 +32,7 @@ intcall:
	movw	%dx, %si
	movw	%sp, %di
	movw	$11, %cx
	rep; movsl
	rep movsl

	/* Pop full state from the stack */
	popal
@@ -67,7 +67,7 @@ intcall:
	jz	4f
	movw	%sp, %si
	movw	$11, %cx
	rep; movsl
	rep movsl
4:	addw	$44, %sp

	/* Restore state and return */
+2 −2
Original line number Diff line number Diff line
@@ -155,14 +155,14 @@ static inline void wrgs32(u32 v, addr_t addr)
static inline bool memcmp_fs(const void *s1, addr_t s2, size_t len)
{
	bool diff;
	asm volatile("fs; repe; cmpsb" CC_SET(nz)
	asm volatile("fs repe cmpsb" CC_SET(nz)
		     : CC_OUT(nz) (diff), "+D" (s1), "+S" (s2), "+c" (len));
	return diff;
}
static inline bool memcmp_gs(const void *s1, addr_t s2, size_t len)
{
	bool diff;
	asm volatile("gs; repe; cmpsb" CC_SET(nz)
	asm volatile("gs repe cmpsb" CC_SET(nz)
		     : CC_OUT(nz) (diff), "+D" (s1), "+S" (s2), "+c" (len));
	return diff;
}
+4 −4
Original line number Diff line number Diff line
@@ -15,9 +15,9 @@ static void *____memcpy(void *dest, const void *src, size_t n)
{
	int d0, d1, d2;
	asm volatile(
		"rep ; movsl\n\t"
		"rep movsl\n\t"
		"movl %4,%%ecx\n\t"
		"rep ; movsb\n\t"
		"rep movsb"
		: "=&c" (d0), "=&D" (d1), "=&S" (d2)
		: "0" (n >> 2), "g" (n & 3), "1" (dest), "2" (src)
		: "memory");
@@ -29,9 +29,9 @@ static void *____memcpy(void *dest, const void *src, size_t n)
{
	long d0, d1, d2;
	asm volatile(
		"rep ; movsq\n\t"
		"rep movsq\n\t"
		"movq %4,%%rcx\n\t"
		"rep ; movsb\n\t"
		"rep movsb"
		: "=&c" (d0), "=&D" (d1), "=&S" (d2)
		: "0" (n >> 3), "g" (n & 7), "1" (dest), "2" (src)
		: "memory");
+4 −4
Original line number Diff line number Diff line
@@ -22,10 +22,10 @@ SYM_FUNC_START_NOALIGN(memcpy)
	movw	%dx, %si
	pushw	%cx
	shrw	$2, %cx
	rep; movsl
	rep movsl
	popw	%cx
	andw	$3, %cx
	rep; movsb
	rep movsb
	popw	%di
	popw	%si
	retl
@@ -38,10 +38,10 @@ SYM_FUNC_START_NOALIGN(memset)
	imull	$0x01010101,%eax
	pushw	%cx
	shrw	$2, %cx
	rep; stosl
	rep stosl
	popw	%cx
	andw	$3, %cx
	rep; stosb
	rep stosb
	popw	%di
	retl
SYM_FUNC_END(memset)
+1 −1
Original line number Diff line number Diff line
@@ -585,7 +585,7 @@ start_of_setup:
	xorl	%eax, %eax
	subw	%di, %cx
	shrw	$2, %cx
	rep; stosl
	rep stosl

# Jump to C code (should not return)
	calll	main
Loading