/usr/src/linux-headers-5.15.0-181/arch/riscv/include/asm
NameSizeModeActions
vdso/-0755rm
alternative-macros.h46580644editdlrm
alternative.h9300644editdlrm
asm-offsets.h350644editdlrm
asm-prototypes.h10400644editdlrm
asm.h15580644editdlrm
atomic.h110280644editdlrm
barrier.h24580644editdlrm
bitops.h58090644editdlrm
bug.h21860644editdlrm
cache.h5160644editdlrm
cacheflush.h13070644editdlrm
cacheinfo.h5110644editdlrm
clint.h7970644editdlrm
clocksource.h1360644editdlrm
cmpxchg.h95370644editdlrm
cpu_ops.h14940644editdlrm
csr.h60620644editdlrm
current.h9400644editdlrm
delay.h4710644editdlrm
efi.h11500644editdlrm
elf.h27260644editdlrm
errata_list.h10740644editdlrm
fence.h2790644editdlrm
fixmap.h18060644editdlrm
ftrace.h30860644editdlrm
futex.h29060644editdlrm
gdb_xml.h56010644editdlrm
hugetlb.h3600644editdlrm
hwcap.h12450644editdlrm
image.h16730644editdlrm
io.h53220644editdlrm
irq.h3470644editdlrm
irqflags.h11750644editdlrm
irq_work.h2250644editdlrm
jump_label.h14400644editdlrm
kasan.h13900644editdlrm
Kbuild1780644editdlrm
kdebug.h1580644editdlrm
kexec.h13490644editdlrm
kfence.h13120644editdlrm
kgdb.h24940644editdlrm
kprobes.h11360644editdlrm
linkage.h2670644editdlrm
mmio.h53470644editdlrm
mmiowb.h3980644editdlrm
mmu.h6100644editdlrm
mmu_context.h8980644editdlrm
mmzone.h2660644editdlrm
module.h29840644editdlrm
module.lds.h2070644editdlrm
numa.h1650644editdlrm
page.h52640644editdlrm
parse_asm.h72650644editdlrm
patch.h3140644editdlrm
pci.h10620644editdlrm
perf_event.h22040644editdlrm
pgalloc.h18010644editdlrm
pgtable-32.h4980644editdlrm
pgtable-64.h18980644editdlrm
pgtable-bits.h15520644editdlrm
pgtable.h180860644editdlrm
probes.h5630644editdlrm
processor.h21380644editdlrm
ptdump.h3380644editdlrm
ptrace.h43040644editdlrm
sbi.h42230644editdlrm
seccomp.h5040644editdlrm
sections.h8830644editdlrm
set_memory.h18690644editdlrm
smp.h24270644editdlrm
soc.h6270644editdlrm
sparsemem.h2630644editdlrm
spinlock.h25080644editdlrm
spinlock_types.h5300644editdlrm
stackprotector.h7680644editdlrm
stacktrace.h4960644editdlrm
string.h10780644editdlrm
switch_to.h21070644editdlrm
syscall.h21630644editdlrm
thread_info.h39550644editdlrm
timex.h18590644editdlrm
tlb.h4030644editdlrm
tlbflush.h18030644editdlrm
uaccess.h139550644editdlrm
unistd.h3280644editdlrm
uprobes.h8280644editdlrm
vdso.h8680644editdlrm
vendorid_list.h1720644editdlrm
vermagic.h2130644editdlrm
vmalloc.h930644editdlrm
word-at-a-time.h11040644editdlrm
Edit: /usr/src/linux-headers-5.15.0-181/arch/riscv/include/asm/bitops.h (5809B)
/* SPDX-License-Identifier: GPL-2.0-only */ /* * Copyright (C) 2012 Regents of the University of California */ #ifndef _ASM_RISCV_BITOPS_H #define _ASM_RISCV_BITOPS_H #ifndef _LINUX_BITOPS_H #error "Only can be included directly" #endif /* _LINUX_BITOPS_H */ #include #include #include #include #include #include #include #include #include #include #include #include #include #if (BITS_PER_LONG == 64) #define __AMO(op) "amo" #op ".d" #elif (BITS_PER_LONG == 32) #define __AMO(op) "amo" #op ".w" #else #error "Unexpected BITS_PER_LONG" #endif #define __test_and_op_bit_ord(op, mod, nr, addr, ord) \ ({ \ unsigned long __res, __mask; \ __mask = BIT_MASK(nr); \ __asm__ __volatile__ ( \ __AMO(op) #ord " %0, %2, %1" \ : "=r" (__res), "+A" (addr[BIT_WORD(nr)]) \ : "r" (mod(__mask)) \ : "memory"); \ ((__res & __mask) != 0); \ }) #define __op_bit_ord(op, mod, nr, addr, ord) \ __asm__ __volatile__ ( \ __AMO(op) #ord " zero, %1, %0" \ : "+A" (addr[BIT_WORD(nr)]) \ : "r" (mod(BIT_MASK(nr))) \ : "memory"); #define __test_and_op_bit(op, mod, nr, addr) \ __test_and_op_bit_ord(op, mod, nr, addr, .aqrl) #define __op_bit(op, mod, nr, addr) \ __op_bit_ord(op, mod, nr, addr, ) /* Bitmask modifiers */ #define __NOP(x) (x) #define __NOT(x) (~(x)) /** * test_and_set_bit - Set a bit and return its old value * @nr: Bit to set * @addr: Address to count from * * This operation may be reordered on other architectures than x86. */ static inline int test_and_set_bit(int nr, volatile unsigned long *addr) { return __test_and_op_bit(or, __NOP, nr, addr); } /** * test_and_clear_bit - Clear a bit and return its old value * @nr: Bit to clear * @addr: Address to count from * * This operation can be reordered on other architectures other than x86. */ static inline int test_and_clear_bit(int nr, volatile unsigned long *addr) { return __test_and_op_bit(and, __NOT, nr, addr); } /** * test_and_change_bit - Change a bit and return its old value * @nr: Bit to change * @addr: Address to count from * * This operation is atomic and cannot be reordered. * It also implies a memory barrier. */ static inline int test_and_change_bit(int nr, volatile unsigned long *addr) { return __test_and_op_bit(xor, __NOP, nr, addr); } /** * set_bit - Atomically set a bit in memory * @nr: the bit to set * @addr: the address to start counting from * * Note: there are no guarantees that this function will not be reordered * on non x86 architectures, so if you are writing portable code, * make sure not to rely on its reordering guarantees. * * Note that @nr may be almost arbitrarily large; this function is not * restricted to acting on a single-word quantity. */ static inline void set_bit(int nr, volatile unsigned long *addr) { __op_bit(or, __NOP, nr, addr); } /** * clear_bit - Clears a bit in memory * @nr: Bit to clear * @addr: Address to start counting from * * Note: there are no guarantees that this function will not be reordered * on non x86 architectures, so if you are writing portable code, * make sure not to rely on its reordering guarantees. */ static inline void clear_bit(int nr, volatile unsigned long *addr) { __op_bit(and, __NOT, nr, addr); } /** * change_bit - Toggle a bit in memory * @nr: Bit to change * @addr: Address to start counting from * * change_bit() may be reordered on other architectures than x86. * Note that @nr may be almost arbitrarily large; this function is not * restricted to acting on a single-word quantity. */ static inline void change_bit(int nr, volatile unsigned long *addr) { __op_bit(xor, __NOP, nr, addr); } /** * test_and_set_bit_lock - Set a bit and return its old value, for lock * @nr: Bit to set * @addr: Address to count from * * This operation is atomic and provides acquire barrier semantics. * It can be used to implement bit locks. */ static inline int test_and_set_bit_lock( unsigned long nr, volatile unsigned long *addr) { return __test_and_op_bit_ord(or, __NOP, nr, addr, .aq); } /** * clear_bit_unlock - Clear a bit in memory, for unlock * @nr: the bit to set * @addr: the address to start counting from * * This operation is atomic and provides release barrier semantics. */ static inline void clear_bit_unlock( unsigned long nr, volatile unsigned long *addr) { __op_bit_ord(and, __NOT, nr, addr, .rl); } /** * __clear_bit_unlock - Clear a bit in memory, for unlock * @nr: the bit to set * @addr: the address to start counting from * * This operation is like clear_bit_unlock, however it is not atomic. * It does provide release barrier semantics so it can be used to unlock * a bit lock, however it would only be used if no other CPU can modify * any bits in the memory until the lock is released (a good example is * if the bit lock itself protects access to the other bits in the word). * * On RISC-V systems there seems to be no benefit to taking advantage of the * non-atomic property here: it's a lot more instructions and we still have to * provide release semantics anyway. */ static inline void __clear_bit_unlock( unsigned long nr, volatile unsigned long *addr) { clear_bit_unlock(nr, addr); } #undef __test_and_op_bit #undef __op_bit #undef __NOP #undef __NOT #undef __AMO #include #include #include #endif /* _ASM_RISCV_BITOPS_H */