mirror of
https://github.com/torvalds/linux.git
synced 2026-03-08 03:04:51 +01:00
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: Uros Bizjak <ubizjak@gmail.com> Signed-off-by: Ingo 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
This commit is contained in:
parent
498cb872a1
commit
0dcc51477b
7 changed files with 15 additions and 15 deletions
|
|
@ -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 */
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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");
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@
|
|||
int memcmp(const void *s1, const void *s2, size_t len)
|
||||
{
|
||||
bool diff;
|
||||
asm("repe; cmpsb" CC_SET(nz)
|
||||
asm("repe cmpsb" CC_SET(nz)
|
||||
: CC_OUT(nz) (diff), "+D" (s1), "+S" (s2), "+c" (len));
|
||||
return diff;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -292,7 +292,7 @@ static void restore_screen(void)
|
|||
"shrw %%cx ; "
|
||||
"jnc 1f ; "
|
||||
"stosw \n\t"
|
||||
"1: rep;stosl ; "
|
||||
"1: rep stosl ; "
|
||||
"popw %%es"
|
||||
: "+D" (dst), "+c" (npad)
|
||||
: "bdS" (video_segment),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue