/usr/src/linux-headers-5.15.0-181/arch/xtensa/include/asm
NameSizeModeActions
asm-offsets.h350644editdlrm
asm-uaccess.h41800644editdlrm
asmmacro.h47630644editdlrm
atomic.h73010644editdlrm
barrier.h5940644editdlrm
bitops.h53980644editdlrm
bootparam.h14020644editdlrm
cache.h11140644editdlrm
cacheasm.h38560644editdlrm
cacheflush.h59680644editdlrm
checksum.h58930644editdlrm
cmpxchg.h56840644editdlrm
coprocessor.h46230644editdlrm
core.h8300644editdlrm
current.h6790644editdlrm
delay.h16680644editdlrm
dma.h18300644editdlrm
elf.h51150644editdlrm
fixmap.h11060644editdlrm
flat.h4400644editdlrm
ftrace.h9790644editdlrm
futex.h38890644editdlrm
highmem.h21670644editdlrm
hw_breakpoint.h15970644editdlrm
initialize_mmu.h51960644editdlrm
io.h19590644editdlrm
irq.h11270644editdlrm
irqflags.h20690644editdlrm
jump_label.h16550644editdlrm
kasan.h8590644editdlrm
Kbuild2300644editdlrm
kmem_layout.h27900644editdlrm
linkage.h1540644editdlrm
mmu.h4620644editdlrm
mmu_context.h36240644editdlrm
mxregs.h13300644editdlrm
nommu_context.h1560644editdlrm
page.h57930644editdlrm
pci-bridge.h21700644editdlrm
pci.h13020644editdlrm
perf_event.h1080644editdlrm
pgalloc.h14050644editdlrm
pgtable.h144700644editdlrm
platform.h15280644editdlrm
processor.h77050644editdlrm
ptrace.h33210644editdlrm
regs.h40170644editdlrm
seccomp.h2870644editdlrm
serial.h4430644editdlrm
shmparam.h5610644editdlrm
signal.h5020644editdlrm
smp.h9670644editdlrm
spinlock.h4720644editdlrm
spinlock_types.h3170644editdlrm
stackprotector.h11400644editdlrm
stacktrace.h11580644editdlrm
string.h33850644editdlrm
switch_to.h6010644editdlrm
syscall.h21400644editdlrm
sysmem.h4260644editdlrm
thread_info.h39650644editdlrm
timex.h14400644editdlrm
tlb.h4750644editdlrm
tlbflush.h56200644editdlrm
traps.h27790644editdlrm
uaccess.h93750644editdlrm
ucontext.h5400644editdlrm
unistd.h3700644editdlrm
vectors.h32760644editdlrm
vermagic.h4330644editdlrm
vmalloc.h960644editdlrm
Edit: /usr/src/linux-headers-5.15.0-181/arch/xtensa/include/asm/futex.h (3889B)
/* SPDX-License-Identifier: GPL-2.0-only */ /* * Atomic futex routines * * Based on the PowerPC implementataion * * Copyright (C) 2013 TangoTec Ltd. * * Baruch Siach */ #ifndef _ASM_XTENSA_FUTEX_H #define _ASM_XTENSA_FUTEX_H #include #include #include #if XCHAL_HAVE_EXCLUSIVE #define __futex_atomic_op(insn, ret, old, uaddr, arg) \ __asm__ __volatile( \ "1: l32ex %[oldval], %[addr]\n" \ insn "\n" \ "2: s32ex %[newval], %[addr]\n" \ " getex %[newval]\n" \ " beqz %[newval], 1b\n" \ " movi %[newval], 0\n" \ "3:\n" \ " .section .fixup,\"ax\"\n" \ " .align 4\n" \ " .literal_position\n" \ "5: movi %[oldval], 3b\n" \ " movi %[newval], %[fault]\n" \ " jx %[oldval]\n" \ " .previous\n" \ " .section __ex_table,\"a\"\n" \ " .long 1b, 5b, 2b, 5b\n" \ " .previous\n" \ : [oldval] "=&r" (old), [newval] "=&r" (ret) \ : [addr] "r" (uaddr), [oparg] "r" (arg), \ [fault] "I" (-EFAULT) \ : "memory") #elif XCHAL_HAVE_S32C1I #define __futex_atomic_op(insn, ret, old, uaddr, arg) \ __asm__ __volatile( \ "1: l32i %[oldval], %[mem]\n" \ insn "\n" \ " wsr %[oldval], scompare1\n" \ "2: s32c1i %[newval], %[mem]\n" \ " bne %[newval], %[oldval], 1b\n" \ " movi %[newval], 0\n" \ "3:\n" \ " .section .fixup,\"ax\"\n" \ " .align 4\n" \ " .literal_position\n" \ "5: movi %[oldval], 3b\n" \ " movi %[newval], %[fault]\n" \ " jx %[oldval]\n" \ " .previous\n" \ " .section __ex_table,\"a\"\n" \ " .long 1b, 5b, 2b, 5b\n" \ " .previous\n" \ : [oldval] "=&r" (old), [newval] "=&r" (ret), \ [mem] "+m" (*(uaddr)) \ : [oparg] "r" (arg), [fault] "I" (-EFAULT) \ : "memory") #endif static inline int arch_futex_atomic_op_inuser(int op, int oparg, int *oval, u32 __user *uaddr) { #if XCHAL_HAVE_S32C1I || XCHAL_HAVE_EXCLUSIVE int oldval = 0, ret; if (!access_ok(uaddr, sizeof(u32))) return -EFAULT; switch (op) { case FUTEX_OP_SET: __futex_atomic_op("mov %[newval], %[oparg]", ret, oldval, uaddr, oparg); break; case FUTEX_OP_ADD: __futex_atomic_op("add %[newval], %[oldval], %[oparg]", ret, oldval, uaddr, oparg); break; case FUTEX_OP_OR: __futex_atomic_op("or %[newval], %[oldval], %[oparg]", ret, oldval, uaddr, oparg); break; case FUTEX_OP_ANDN: __futex_atomic_op("and %[newval], %[oldval], %[oparg]", ret, oldval, uaddr, ~oparg); break; case FUTEX_OP_XOR: __futex_atomic_op("xor %[newval], %[oldval], %[oparg]", ret, oldval, uaddr, oparg); break; default: ret = -ENOSYS; } if (!ret) *oval = oldval; return ret; #else return -ENOSYS; #endif } static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr, u32 oldval, u32 newval) { #if XCHAL_HAVE_S32C1I || XCHAL_HAVE_EXCLUSIVE unsigned long tmp; int ret = 0; if (!access_ok(uaddr, sizeof(u32))) return -EFAULT; __asm__ __volatile__ ( " # futex_atomic_cmpxchg_inatomic\n" #if XCHAL_HAVE_EXCLUSIVE "1: l32ex %[tmp], %[addr]\n" " s32i %[tmp], %[uval], 0\n" " bne %[tmp], %[oldval], 2f\n" " mov %[tmp], %[newval]\n" "3: s32ex %[tmp], %[addr]\n" " getex %[tmp]\n" " beqz %[tmp], 1b\n" #elif XCHAL_HAVE_S32C1I " wsr %[oldval], scompare1\n" "1: s32c1i %[newval], %[addr], 0\n" " s32i %[newval], %[uval], 0\n" #endif "2:\n" " .section .fixup,\"ax\"\n" " .align 4\n" " .literal_position\n" "4: movi %[tmp], 2b\n" " movi %[ret], %[fault]\n" " jx %[tmp]\n" " .previous\n" " .section __ex_table,\"a\"\n" " .long 1b, 4b\n" #if XCHAL_HAVE_EXCLUSIVE " .long 3b, 4b\n" #endif " .previous\n" : [ret] "+r" (ret), [newval] "+r" (newval), [tmp] "=&r" (tmp) : [addr] "r" (uaddr), [oldval] "r" (oldval), [uval] "r" (uval), [fault] "I" (-EFAULT) : "memory"); return ret; #else return -ENOSYS; #endif } #endif /* _ASM_XTENSA_FUTEX_H */