mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00

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
79 lines
1.4 KiB
ArmAsm
79 lines
1.4 KiB
ArmAsm
/* SPDX-License-Identifier: GPL-2.0-or-later */
|
|
/* -----------------------------------------------------------------------
|
|
*
|
|
* Copyright 2009-2014 Intel Corporation; author H. Peter Anvin
|
|
*
|
|
* ----------------------------------------------------------------------- */
|
|
|
|
/*
|
|
* "Glove box" for BIOS calls. Avoids the constant problems with BIOSes
|
|
* touching registers they shouldn't be.
|
|
*/
|
|
|
|
.code16
|
|
.section ".inittext","ax"
|
|
.globl intcall
|
|
.type intcall, @function
|
|
intcall:
|
|
/* Self-modify the INT instruction. Ugly, but works. */
|
|
cmpb %al, 3f
|
|
je 1f
|
|
movb %al, 3f
|
|
jmp 1f /* Synchronize pipeline */
|
|
1:
|
|
/* Save state */
|
|
pushfl
|
|
pushw %fs
|
|
pushw %gs
|
|
pushal
|
|
|
|
/* Copy input state to stack frame */
|
|
subw $44, %sp
|
|
movw %dx, %si
|
|
movw %sp, %di
|
|
movw $11, %cx
|
|
rep movsl
|
|
|
|
/* Pop full state from the stack */
|
|
popal
|
|
popw %gs
|
|
popw %fs
|
|
popw %es
|
|
popw %ds
|
|
popfl
|
|
|
|
/* Actual INT */
|
|
.byte 0xcd /* INT opcode */
|
|
3: .byte 0
|
|
|
|
/* Push full state to the stack */
|
|
pushfl
|
|
pushw %ds
|
|
pushw %es
|
|
pushw %fs
|
|
pushw %gs
|
|
pushal
|
|
|
|
/* Re-establish C environment invariants */
|
|
cld
|
|
movzwl %sp, %esp
|
|
movw %cs, %ax
|
|
movw %ax, %ds
|
|
movw %ax, %es
|
|
|
|
/* Copy output state from stack frame */
|
|
movw 68(%esp), %di /* Original %cx == 3rd argument */
|
|
andw %di, %di
|
|
jz 4f
|
|
movw %sp, %si
|
|
movw $11, %cx
|
|
rep movsl
|
|
4: addw $44, %sp
|
|
|
|
/* Restore state and return */
|
|
popal
|
|
popw %gs
|
|
popw %fs
|
|
popfl
|
|
retl
|
|
.size intcall, .-intcall
|