__ __ __ __ _____ _ _ _____ _ _ _ | \/ | \ \ / / | __ \ (_) | | / ____| | | | | | \ / |_ __\ V / | |__) | __ ___ ____ _| |_ ___ | (___ | |__ ___| | | | |\/| | '__|> < | ___/ '__| \ \ / / _` | __/ _ \ \___ \| '_ \ / _ \ | | | | | | |_ / . \ | | | | | |\ V / (_| | || __/ ____) | | | | __/ | | |_| |_|_(_)_/ \_\ |_| |_| |_| \_/ \__,_|\__\___| |_____/|_| |_|\___V 2.1 if you need WebShell for Seo everyday contact me on Telegram Telegram Address : @jackleetFor_More_Tools:
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef __ASM_SPINLOCK_H
#define __ASM_SPINLOCK_H
#if __LINUX_ARM_ARCH__ < 6
#error SMP not supported on pre-ARMv6 CPUs
#endif
#include <linux/prefetch.h>
#include <asm/barrier.h>
#include <asm/processor.h>
/*
* sev and wfe are ARMv6K extensions. Uniprocessor ARMv6 may not have the K
* extensions, so when running on UP, we have to patch these instructions away.
*/
#ifdef CONFIG_THUMB2_KERNEL
/*
* For Thumb-2, special care is needed to ensure that the conditional WFE
* instruction really does assemble to exactly 4 bytes (as required by
* the SMP_ON_UP fixup code). By itself "wfene" might cause the
* assembler to insert a extra (16-bit) IT instruction, depending on the
* presence or absence of neighbouring conditional instructions.
*
* To avoid this unpredictability, an appropriate IT is inserted explicitly:
* the assembler won't change IT instructions which are explicitly present
* in the input.
*/
#define WFE(cond) __ALT_SMP_ASM( \
"it " cond "\n\t" \
"wfe" cond ".n", \
\
"nop.w" \
)
#else
#define WFE(cond) __ALT_SMP_ASM("wfe" cond, "nop")
#endif
#define SEV __ALT_SMP_ASM(WASM(sev), WASM(nop))
static inline void dsb_sev(void)
{
dsb(ishst);
__asm__(SEV);
}
/*
* ARMv6 ticket-based spin-locking.
*
* A memory barrier is required after we get a lock, and before we
* release it, because V6 CPUs are assumed to have weakly ordered
* memory.
*/
static inline void arch_spin_lock(arch_spinlock_t *lock)
{
unsigned long tmp;
u32 newval;
arch_spinlock_t lockval;
prefetchw(&lock->slock);
__asm__ __volatile__(
"1: ldrex %0, [%3]\n"
" add %1, %0, %4\n"
" strex %2, %1, [%3]\n"
" teq %2, #0\n"
" bne 1b"
: "=&r" (lockval), "=&r" (newval), "=&r" (tmp)
: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
: "cc");
while (lockval.tickets.next != lockval.tickets.owner) {
wfe();
lockval.tickets.owner = READ_ONCE(lock->tickets.owner);
}
smp_mb();
}
static inline int arch_spin_trylock(arch_spinlock_t *lock)
{
unsigned long contended, res;
u32 slock;
prefetchw(&lock->slock);
do {
__asm__ __volatile__(
" ldrex %0, [%3]\n"
" mov %2, #0\n"
" subs %1, %0, %0, ror #16\n"
" addeq %0, %0, %4\n"
" strexeq %2, %0, [%3]"
: "=&r" (slock), "=&r" (contended), "=&r" (res)
: "r" (&lock->slock), "I" (1 << TICKET_SHIFT)
: "cc");
} while (res);
if (!contended) {
smp_mb();
return 1;
} else {
return 0;
}
}
static inline void arch_spin_unlock(arch_spinlock_t *lock)
{
smp_mb();
lock->tickets.owner++;
dsb_sev();
}
static inline int arch_spin_value_unlocked(arch_spinlock_t lock)
{
return lock.tickets.owner == lock.tickets.next;
}
static inline int arch_spin_is_locked(arch_spinlock_t *lock)
{
return !arch_spin_value_unlocked(READ_ONCE(*lock));
}
static inline int arch_spin_is_contended(arch_spinlock_t *lock)
{
struct __raw_tickets tickets = READ_ONCE(lock->tickets);
return (tickets.next - tickets.owner) > 1;
}
#define arch_spin_is_contended arch_spin_is_contended
/*
* RWLOCKS
*
*
* Write locks are easy - we just set bit 31. When unlocking, we can
* just write zero since the lock is exclusively held.
*/
static inline void arch_write_lock(arch_rwlock_t *rw)
{
unsigned long tmp;
prefetchw(&rw->lock);
__asm__ __volatile__(
"1: ldrex %0, [%1]\n"
" teq %0, #0\n"
WFE("ne")
" strexeq %0, %2, [%1]\n"
" teq %0, #0\n"
" bne 1b"
: "=&r" (tmp)
: "r" (&rw->lock), "r" (0x80000000)
: "cc");
smp_mb();
}
static inline int arch_write_trylock(arch_rwlock_t *rw)
{
unsigned long contended, res;
prefetchw(&rw->lock);
do {
__asm__ __volatile__(
" ldrex %0, [%2]\n"
" mov %1, #0\n"
" teq %0, #0\n"
" strexeq %1, %3, [%2]"
: "=&r" (contended), "=&r" (res)
: "r" (&rw->lock), "r" (0x80000000)
: "cc");
} while (res);
if (!contended) {
smp_mb();
return 1;
} else {
return 0;
}
}
static inline void arch_write_unlock(arch_rwlock_t *rw)
{
smp_mb();
__asm__ __volatile__(
"str %1, [%0]\n"
:
: "r" (&rw->lock), "r" (0)
: "cc");
dsb_sev();
}
/*
* Read locks are a bit more hairy:
* - Exclusively load the lock value.
* - Increment it.
* - Store new lock value if positive, and we still own this location.
* If the value is negative, we've already failed.
* - If we failed to store the value, we want a negative result.
* - If we failed, try again.
* Unlocking is similarly hairy. We may have multiple read locks
* currently active. However, we know we won't have any write
* locks.
*/
static inline void arch_read_lock(arch_rwlock_t *rw)
{
unsigned long tmp, tmp2;
prefetchw(&rw->lock);
__asm__ __volatile__(
" .syntax unified\n"
"1: ldrex %0, [%2]\n"
" adds %0, %0, #1\n"
" strexpl %1, %0, [%2]\n"
WFE("mi")
" rsbspl %0, %1, #0\n"
" bmi 1b"
: "=&r" (tmp), "=&r" (tmp2)
: "r" (&rw->lock)
: "cc");
smp_mb();
}
static inline void arch_read_unlock(arch_rwlock_t *rw)
{
unsigned long tmp, tmp2;
smp_mb();
prefetchw(&rw->lock);
__asm__ __volatile__(
"1: ldrex %0, [%2]\n"
" sub %0, %0, #1\n"
" strex %1, %0, [%2]\n"
" teq %1, #0\n"
" bne 1b"
: "=&r" (tmp), "=&r" (tmp2)
: "r" (&rw->lock)
: "cc");
if (tmp == 0)
dsb_sev();
}
static inline int arch_read_trylock(arch_rwlock_t *rw)
{
unsigned long contended, res;
prefetchw(&rw->lock);
do {
__asm__ __volatile__(
" ldrex %0, [%2]\n"
" mov %1, #0\n"
" adds %0, %0, #1\n"
" strexpl %1, %0, [%2]"
: "=&r" (contended), "=&r" (res)
: "r" (&rw->lock)
: "cc");
} while (res);
/* If the lock is negative, then it is already held for write. */
if (contended < 0x80000000) {
smp_mb();
return 1;
} else {
return 0;
}
}
#endif /* __ASM_SPINLOCK_H */
| Name | Type | Size | Permission | Actions |
|---|---|---|---|---|
| hardware | Folder | 0755 |
|
|
| mach | Folder | 0755 |
|
|
| vdso | Folder | 0755 |
|
|
| xen | Folder | 0755 |
|
|
| Kbuild | File | 186 B | 0644 |
|
| arch_gicv3.h | File | 6.25 KB | 0644 |
|
| arch_timer.h | File | 3.05 KB | 0644 |
|
| archrandom.h | File | 229 B | 0644 |
|
| arm-cci.h | File | 535 B | 0644 |
|
| arm_pmuv3.h | File | 7.38 KB | 0644 |
|
| asm-offsets.h | File | 35 B | 0644 |
|
| assembler.h | File | 16.77 KB | 0644 |
|
| atomic.h | File | 12.59 KB | 0644 |
|
| auxvec.h | File | 29 B | 0644 |
|
| bL_switcher.h | File | 2.13 KB | 0644 |
|
| barrier.h | File | 2.84 KB | 0644 |
|
| bitops.h | File | 7.55 KB | 0644 |
|
| bitrev.h | File | 451 B | 0644 |
|
| bug.h | File | 2.56 KB | 0644 |
|
| bugs.h | File | 297 B | 0644 |
|
| cache.h | File | 896 B | 0644 |
|
| cacheflush.h | File | 15.14 KB | 0644 |
|
| cachetype.h | File | 3.02 KB | 0644 |
|
| checksum.h | File | 3.96 KB | 0644 |
|
| clocksource.h | File | 161 B | 0644 |
|
| cmpxchg.h | File | 6.31 KB | 0644 |
|
| compiler.h | File | 978 B | 0644 |
|
| cp15.h | File | 3.22 KB | 0644 |
|
| cpu.h | File | 370 B | 0644 |
|
| cpufeature.h | File | 1.26 KB | 0644 |
|
| cpuidle.h | File | 1.59 KB | 0644 |
|
| cputype.h | File | 8.68 KB | 0644 |
|
| cti.h | File | 3.62 KB | 0644 |
|
| current.h | File | 1.8 KB | 0644 |
|
| dcc.h | File | 623 B | 0644 |
|
| delay.h | File | 2.83 KB | 0644 |
|
| device.h | File | 533 B | 0644 |
|
| div64.h | File | 2.69 KB | 0644 |
|
| dma-iommu.h | File | 906 B | 0644 |
|
| dma.h | File | 4.17 KB | 0644 |
|
| dmi.h | File | 378 B | 0644 |
|
| domain.h | File | 3.35 KB | 0644 |
|
| ecard.h | File | 5.98 KB | 0644 |
|
| edac.h | File | 995 B | 0644 |
|
| efi.h | File | 2.62 KB | 0644 |
|
| elf.h | File | 4.58 KB | 0644 |
|
| exception.h | File | 416 B | 0644 |
|
| fiq.h | File | 1.36 KB | 0644 |
|
| firmware.h | File | 1.69 KB | 0644 |
|
| fixmap.h | File | 1.84 KB | 0644 |
|
| floppy.h | File | 2.26 KB | 0644 |
|
| fncpy.h | File | 2.49 KB | 0644 |
|
| fpstate.h | File | 1.34 KB | 0644 |
|
| fpu.h | File | 309 B | 0644 |
|
| ftrace.h | File | 1.96 KB | 0644 |
|
| futex.h | File | 4.25 KB | 0644 |
|
| glue-cache.h | File | 2.88 KB | 0644 |
|
| glue-df.h | File | 2.06 KB | 0644 |
|
| glue-pf.h | File | 1005 B | 0644 |
|
| glue-proc.h | File | 4.32 KB | 0644 |
|
| glue.h | File | 613 B | 0644 |
|
| hardirq.h | File | 246 B | 0644 |
|
| highmem.h | File | 2.32 KB | 0644 |
|
| hugetlb-3level.h | File | 740 B | 0644 |
|
| hugetlb.h | File | 541 B | 0644 |
|
| hw_breakpoint.h | File | 3.76 KB | 0644 |
|
| hw_irq.h | File | 349 B | 0644 |
|
| hwcap.h | File | 378 B | 0644 |
|
| hypervisor.h | File | 282 B | 0644 |
|
| idmap.h | File | 359 B | 0644 |
|
| insn.h | File | 1.29 KB | 0644 |
|
| io.h | File | 13.81 KB | 0644 |
|
| irq.h | File | 808 B | 0644 |
|
| irq_work.h | File | 234 B | 0644 |
|
| irqflags.h | File | 3.88 KB | 0644 |
|
| jump_label.h | File | 1.12 KB | 0644 |
|
| kasan.h | File | 708 B | 0644 |
|
| kasan_def.h | File | 2.66 KB | 0644 |
|
| kexec-internal.h | File | 272 B | 0644 |
|
| kexec.h | File | 2.16 KB | 0644 |
|
| kfence.h | File | 1.03 KB | 0644 |
|
| kgdb.h | File | 2.72 KB | 0644 |
|
| kprobes.h | File | 2.1 KB | 0644 |
|
| krait-l2-accessors.h | File | 231 B | 0644 |
|
| linkage.h | File | 216 B | 0644 |
|
| mc146818rtc.h | File | 720 B | 0644 |
|
| mcpm.h | File | 11.78 KB | 0644 |
|
| mcs_spinlock.h | File | 570 B | 0644 |
|
| memblock.h | File | 248 B | 0644 |
|
| memory.h | File | 10.24 KB | 0644 |
|
| mman.h | File | 369 B | 0644 |
|
| mmu.h | File | 949 B | 0644 |
|
| mmu_context.h | File | 3.76 KB | 0644 |
|
| module.h | File | 1.26 KB | 0644 |
|
| module.lds.h | File | 134 B | 0644 |
|
| mpu.h | File | 3.22 KB | 0644 |
|
| mtd-xip.h | File | 520 B | 0644 |
|
| neon.h | File | 1.02 KB | 0644 |
|
| nwflash.h | File | 195 B | 0644 |
|
| opcodes-sec.h | File | 350 B | 0644 |
|
| opcodes-virt.h | File | 684 B | 0644 |
|
| opcodes.h | File | 8.06 KB | 0644 |
|
| outercache.h | File | 3.19 KB | 0644 |
|
| page-nommu.h | File | 811 B | 0644 |
|
| page.h | File | 4.69 KB | 0644 |
|
| paravirt.h | File | 477 B | 0644 |
|
| paravirt_api_clock.h | File | 26 B | 0644 |
|
| pci.h | File | 687 B | 0644 |
|
| percpu.h | File | 1.7 KB | 0644 |
|
| perf_event.h | File | 477 B | 0644 |
|
| pgalloc.h | File | 3.29 KB | 0644 |
|
| pgtable-2level-hwdef.h | File | 3.31 KB | 0644 |
|
| pgtable-2level-types.h | File | 1.25 KB | 0644 |
|
| pgtable-2level.h | File | 8.54 KB | 0644 |
|
| pgtable-3level-hwdef.h | File | 4.34 KB | 0644 |
|
| pgtable-3level-types.h | File | 1.3 KB | 0644 |
|
| pgtable-3level.h | File | 8 KB | 0644 |
|
| pgtable-hwdef.h | File | 321 B | 0644 |
|
| pgtable-nommu.h | File | 1.89 KB | 0644 |
|
| pgtable.h | File | 10.16 KB | 0644 |
|
| probes.h | File | 1.3 KB | 0644 |
|
| proc-fns.h | File | 4.88 KB | 0644 |
|
| processor.h | File | 3 KB | 0644 |
|
| procinfo.h | File | 1.13 KB | 0644 |
|
| prom.h | File | 552 B | 0644 |
|
| psci.h | File | 379 B | 0644 |
|
| ptdump.h | File | 969 B | 0644 |
|
| ptrace.h | File | 4.93 KB | 0644 |
|
| seccomp.h | File | 281 B | 0644 |
|
| sections.h | File | 622 B | 0644 |
|
| secure_cntvoff.h | File | 152 B | 0644 |
|
| semihost.h | File | 643 B | 0644 |
|
| set_memory.h | File | 788 B | 0644 |
|
| setup.h | File | 1.13 KB | 0644 |
|
| shmparam.h | File | 419 B | 0644 |
|
| signal.h | File | 694 B | 0644 |
|
| simd.h | File | 185 B | 0644 |
|
| smp.h | File | 2.83 KB | 0644 |
|
| smp_plat.h | File | 2.48 KB | 0644 |
|
| smp_scu.h | File | 1.32 KB | 0644 |
|
| smp_twd.h | File | 590 B | 0644 |
|
| sparsemem.h | File | 714 B | 0644 |
|
| spectre.h | File | 991 B | 0644 |
|
| spinlock.h | File | 5.51 KB | 0644 |
|
| spinlock_types.h | File | 547 B | 0644 |
|
| stackprotector.h | File | 1.11 KB | 0644 |
|
| stacktrace.h | File | 1.47 KB | 0644 |
|
| string.h | File | 2.11 KB | 0644 |
|
| suspend.h | File | 445 B | 0644 |
|
| swab.h | File | 1005 B | 0644 |
|
| switch_to.h | File | 1.17 KB | 0644 |
|
| sync_bitops.h | File | 1.48 KB | 0644 |
|
| syscall.h | File | 2.07 KB | 0644 |
|
| syscalls.h | File | 1.96 KB | 0644 |
|
| system_info.h | File | 763 B | 0644 |
|
| system_misc.h | File | 1005 B | 0644 |
|
| tcm.h | File | 991 B | 0644 |
|
| text-patching.h | File | 438 B | 0644 |
|
| therm.h | File | 655 B | 0644 |
|
| thread_info.h | File | 5.07 KB | 0644 |
|
| thread_notify.h | File | 1.06 KB | 0644 |
|
| timex.h | File | 431 B | 0644 |
|
| tlb.h | File | 1.28 KB | 0644 |
|
| tlbflush.h | File | 17.66 KB | 0644 |
|
| tls.h | File | 3.31 KB | 0644 |
|
| topology.h | File | 1.14 KB | 0644 |
|
| traps.h | File | 1.38 KB | 0644 |
|
| uaccess-asm.h | File | 3.72 KB | 0644 |
|
| uaccess.h | File | 16.99 KB | 0644 |
|
| ucontext.h | File | 2.68 KB | 0644 |
|
| unified.h | File | 979 B | 0644 |
|
| unistd.h | File | 1.51 KB | 0644 |
|
| unwind.h | File | 1.28 KB | 0644 |
|
| uprobes.h | File | 948 B | 0644 |
|
| user.h | File | 4.06 KB | 0644 |
|
| v7m.h | File | 3.21 KB | 0644 |
|
| vdso.h | File | 507 B | 0644 |
|
| vermagic.h | File | 800 B | 0644 |
|
| vfp.h | File | 2.89 KB | 0644 |
|
| vfpmacros.h | File | 1.72 KB | 0644 |
|
| vga.h | File | 351 B | 0644 |
|
| virt.h | File | 1.81 KB | 0644 |
|
| vmalloc.h | File | 87 B | 0644 |
|
| vmlinux.lds.h | File | 4.52 KB | 0644 |
|
| word-at-a-time.h | File | 2.11 KB | 0644 |
|
| xor.h | File | 5.63 KB | 0644 |
|