[PATCH 00/20] x86: Cleanup alternative_io() and friends, prep for asm_call()

Josh Poimboeuf posted 20 patches 9 months, 1 week ago
arch/x86/boot/bitops.h               |  2 +-
arch/x86/boot/boot.h                 |  4 +-
arch/x86/boot/string.c               |  2 +-
arch/x86/include/asm/alternative.h   | 31 +++++-----
arch/x86/include/asm/apic.h          |  7 ++-
arch/x86/include/asm/archrandom.h    |  2 -
arch/x86/include/asm/asm.h           | 21 +++----
arch/x86/include/asm/atomic64_32.h   | 93 +++++++++++++++-------------
arch/x86/include/asm/barrier.h       | 23 +++++--
arch/x86/include/asm/bitops.h        |  6 --
arch/x86/include/asm/cmpxchg.h       |  4 --
arch/x86/include/asm/cmpxchg_32.h    |  2 -
arch/x86/include/asm/cmpxchg_64.h    |  1 -
arch/x86/include/asm/msr.h           | 13 ++--
arch/x86/include/asm/page_64.h       | 16 ++---
arch/x86/include/asm/percpu.h        |  4 --
arch/x86/include/asm/processor.h     | 22 ++++---
arch/x86/include/asm/rmwcc.h         | 24 +------
arch/x86/include/asm/segment.h       |  5 +-
arch/x86/include/asm/sev.h           |  1 -
arch/x86/include/asm/signal.h        |  2 +-
arch/x86/include/asm/smap.h          | 18 +++---
arch/x86/include/asm/special_insns.h |  9 ++-
arch/x86/include/asm/uaccess.h       |  1 -
arch/x86/include/asm/uaccess_64.h    |  8 +--
tools/arch/x86/include/asm/asm.h     | 10 +--
tools/perf/bench/find-bit-bench.c    |  4 --
27 files changed, 153 insertions(+), 182 deletions(-)
[PATCH 00/20] x86: Cleanup alternative_io() and friends, prep for asm_call()
Posted by Josh Poimboeuf 9 months, 1 week ago
Make the alternative_io() interface more straightforward and flexible,
and get rid of alternative_input().

These patches are a prereq for another set[1] which will get rid of
ASM_CALL_CONSTRAINT[2] in favor of a much more flexible asm_call()
interface similar to the new alternative_io().

[1] Additional 20+ patches not posted yet to avoid flooding inboxes

[2] ASM_CALL_CONSTRAINT is semi-broken with Clang+KCOV+KMSAN.
    https://lore.kernel.org/174108458465.14745.15292444415957816824.tip-bot2@tip-bot2/
    https://lore.kernel.org/174099976188.10177.7153571701278544000.tip-bot2@tip-bot2

Josh Poimboeuf (20):
  x86/cpu: Use named asm operands in prefetch[w]()
  x86/apic: Use named asm operands in native_apic_mem_write()
  x86/mm: Use named asm operands in task_size_max()
  x86/cpu: Use named asm operands in clflushopt()
  x86/asm: Always use flag output operands
  x86/asm: Remove CC_SET()
  x86/alternative: Remove operand numbering restrictions
  x86/asm: Replace ASM_{OUTPUT,INPUT}() with ARG()
  x86/alternative: Simplify alternative_io() interface
  x86/alternative: Add alternative_2_io()
  x86/alternative: Make alternative() a wrapper around alternative_io()
  x86/cpu: Use alternative_io() in prefetch[w]()
  x86/alternative: Remove alternative_input()
  x86/barrier: Use alternative_io() in 32-bit barrier functions
  x86/cpu/amd: Use named asm operands in asm_clear_divider()
  x86/cpu: Use alternative_io() in amd_clear_divider()
  x86/smap: Use named asm operands in smap_{save,restore}()
  x86/smap: Use alternative_io() in smap_{save,restore}()
  x86/uaccess: Use alternative_io() in __untagged_addr()
  x86/msr: Use alternative_2_io() in rdtsc_ordered()

 arch/x86/boot/bitops.h               |  2 +-
 arch/x86/boot/boot.h                 |  4 +-
 arch/x86/boot/string.c               |  2 +-
 arch/x86/include/asm/alternative.h   | 31 +++++-----
 arch/x86/include/asm/apic.h          |  7 ++-
 arch/x86/include/asm/archrandom.h    |  2 -
 arch/x86/include/asm/asm.h           | 21 +++----
 arch/x86/include/asm/atomic64_32.h   | 93 +++++++++++++++-------------
 arch/x86/include/asm/barrier.h       | 23 +++++--
 arch/x86/include/asm/bitops.h        |  6 --
 arch/x86/include/asm/cmpxchg.h       |  4 --
 arch/x86/include/asm/cmpxchg_32.h    |  2 -
 arch/x86/include/asm/cmpxchg_64.h    |  1 -
 arch/x86/include/asm/msr.h           | 13 ++--
 arch/x86/include/asm/page_64.h       | 16 ++---
 arch/x86/include/asm/percpu.h        |  4 --
 arch/x86/include/asm/processor.h     | 22 ++++---
 arch/x86/include/asm/rmwcc.h         | 24 +------
 arch/x86/include/asm/segment.h       |  5 +-
 arch/x86/include/asm/sev.h           |  1 -
 arch/x86/include/asm/signal.h        |  2 +-
 arch/x86/include/asm/smap.h          | 18 +++---
 arch/x86/include/asm/special_insns.h |  9 ++-
 arch/x86/include/asm/uaccess.h       |  1 -
 arch/x86/include/asm/uaccess_64.h    |  8 +--
 tools/arch/x86/include/asm/asm.h     | 10 +--
 tools/perf/bench/find-bit-bench.c    |  4 --
 27 files changed, 153 insertions(+), 182 deletions(-)

-- 
2.48.1
Re: [PATCH 00/20] x86: Cleanup alternative_io() and friends, prep for asm_call()
Posted by Josh Poimboeuf 9 months, 1 week ago
On Fri, Mar 14, 2025 at 02:41:13PM -0700, Josh Poimboeuf wrote:
> Make the alternative_io() interface more straightforward and flexible,
> and get rid of alternative_input().
> 
> These patches are a prereq for another set[1] which will get rid of
> ASM_CALL_CONSTRAINT[2] in favor of a much more flexible asm_call()
> interface similar to the new alternative_io().
> 
> [1] Additional 20+ patches not posted yet to avoid flooding inboxes

The rest of the patches are here if anybody wants to see where this is
going:

  git://git.kernel.org/pub/scm/linux/kernel/git/jpoimboe/linux.git asm-call

-- 
Josh
Re: [PATCH 00/20] x86: Cleanup alternative_io() and friends, prep for asm_call()
Posted by Uros Bizjak 9 months, 1 week ago
On Fri, Mar 14, 2025 at 11:25 PM Josh Poimboeuf <jpoimboe@kernel.org> wrote:
>
> On Fri, Mar 14, 2025 at 02:41:13PM -0700, Josh Poimboeuf wrote:
> > Make the alternative_io() interface more straightforward and flexible,
> > and get rid of alternative_input().
> >
> > These patches are a prereq for another set[1] which will get rid of
> > ASM_CALL_CONSTRAINT[2] in favor of a much more flexible asm_call()
> > interface similar to the new alternative_io().
> >
> > [1] Additional 20+ patches not posted yet to avoid flooding inboxes
>
> The rest of the patches are here if anybody wants to see where this is
> going:
>
>   git://git.kernel.org/pub/scm/linux/kernel/git/jpoimboe/linux.git asm-call

FYI, you missed one conversion of asm involving ALTERNATIVE in
arch/x86/include/asm/nospec-branch.h:

void alternative_msr_write(unsigned int msr, u64 val, unsigned int feature)
{
asm volatile(ALTERNATIVE("", "wrmsr", %c[feature])
: : "c" (msr),
   "a" ((u32)val),
   "d" ((u32)(val >> 32)),
   [feature] "i" (feature)
: "memory");

Uros.