]> Git Repo - linux.git/commitdiff
Merge tag 'x86_paravirt_for_v6.1_rc1' of git://git.kernel.org/pub/scm/linux/kernel...
authorLinus Torvalds <[email protected]>
Tue, 4 Oct 2022 17:03:40 +0000 (10:03 -0700)
committerLinus Torvalds <[email protected]>
Tue, 4 Oct 2022 17:03:40 +0000 (10:03 -0700)
Pull x86 paravirt fix from Borislav Petkov:

 - Ensure paravirt patching site descriptors are aligned properly so
   that code can do proper arithmetic with their addresses

* tag 'x86_paravirt_for_v6.1_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip:
  x86/paravirt: Ensure proper alignment

1  2 
arch/x86/include/asm/paravirt_types.h

index b1ab5d94881b165d12b7770fa9061273eb65d712,27b036a15f70e9ec0bb69d13e14f5aa1477f3cb7..f3d601574730ce117295d4f69bc43202f635b599
@@@ -294,6 -294,7 +294,7 @@@ extern struct paravirt_patch_template p
        "  .byte " type "\n"                            \
        "  .byte 772b-771b\n"                           \
        "  .short " clobber "\n"                        \
+       _ASM_ALIGN "\n"                                 \
        ".popsection\n"
  
  /* Generate patchable code, with the default asm parameters. */
@@@ -328,7 -329,7 +329,7 @@@ int paravirt_disable_iospace(void)
   * Unfortunately, this is a relatively slow operation for modern CPUs,
   * because it cannot necessarily determine what the destination
   * address is.  In this case, the address is a runtime constant, so at
 - * the very least we can patch the call to e a simple direct call, or
 + * the very least we can patch the call to a simple direct call, or,
   * ideally, patch an inline implementation into the callsite.  (Direct
   * calls are essentially free, because the call and return addresses
   * are completely predictable.)
   * on the stack.  All caller-save registers (eax,edx,ecx) are expected
   * to be modified (either clobbered or used for return values).
   * X86_64, on the other hand, already specifies a register-based calling
 - * conventions, returning at %rax, with parameters going on %rdi, %rsi,
 + * conventions, returning at %rax, with parameters going in %rdi, %rsi,
   * %rdx, and %rcx. Note that for this reason, x86_64 does not need any
   * special handling for dealing with 4 arguments, unlike i386.
 - * However, x86_64 also have to clobber all caller saved registers, which
 + * However, x86_64 also has to clobber all caller saved registers, which
   * unfortunately, are quite a bit (r8 - r11)
   *
   * The call instruction itself is marked by placing its start address
   * There are 5 sets of PVOP_* macros for dealing with 0-4 arguments.
   * It could be extended to more arguments, but there would be little
   * to be gained from that.  For each number of arguments, there are
 - * the two VCALL and CALL variants for void and non-void functions.
 + * two VCALL and CALL variants for void and non-void functions.
   *
   * When there is a return value, the invoker of the macro must specify
   * the return type.  The macro then uses sizeof() on that type to
 - * determine whether its a 32 or 64 bit value, and places the return
 + * determine whether it's a 32 or 64 bit value and places the return
   * in the right register(s) (just %eax for 32-bit, and %edx:%eax for
 - * 64-bit). For x86_64 machines, it just returns at %rax regardless of
 + * 64-bit). For x86_64 machines, it just returns in %rax regardless of
   * the return value size.
   *
 - * 64-bit arguments are passed as a pair of adjacent 32-bit arguments
 + * 64-bit arguments are passed as a pair of adjacent 32-bit arguments;
   * i386 also passes 64-bit arguments as a pair of adjacent 32-bit arguments
   * in low,high order
   *
   * Small structures are passed and returned in registers.  The macro
   * calling convention can't directly deal with this, so the wrapper
 - * functions must do this.
 + * functions must do it.
   *
   * These PVOP_* macros are only defined within this header.  This
   * means that all uses must be wrapped in inline functions.  This also
                                "=c" (__ecx)
  #define PVOP_CALL_CLOBBERS    PVOP_VCALL_CLOBBERS, "=a" (__eax)
  
 -/* void functions are still allowed [re]ax for scratch */
 +/*
 + * void functions are still allowed [re]ax for scratch.
 + *
 + * The ZERO_CALL_USED REGS feature may end up zeroing out callee-saved
 + * registers. Make sure we model this with the appropriate clobbers.
 + */
 +#ifdef CONFIG_ZERO_CALL_USED_REGS
 +#define PVOP_VCALLEE_CLOBBERS "=a" (__eax), PVOP_VCALL_CLOBBERS
 +#else
  #define PVOP_VCALLEE_CLOBBERS "=a" (__eax)
 +#endif
  #define PVOP_CALLEE_CLOBBERS  PVOP_VCALLEE_CLOBBERS
  
  #define EXTRA_CLOBBERS         , "r8", "r9", "r10", "r11"
This page took 0.068811 seconds and 4 git commands to generate.