Viewing: spinlock.h
📄 spinlock.h (Read Only) ⬅ To go back
#ifndef ARCH_ARM_SPINLOCK_H
#define ARCH_ARM_SPINLOCK_H

#include <stdint.h>

#if defined(__aarch64__)

static inline void cpu_relax(void) {
    __asm__ volatile("yield" ::: "memory");
}

static inline uintptr_t irq_save(void) {
    uintptr_t daif;
    __asm__ volatile("mrs %0, daif\n\tmsr daifset, #2" : "=r"(daif) :: "memory");
    return daif;
}

static inline void irq_restore(uintptr_t flags) {
    __asm__ volatile("msr daif, %0" :: "r"(flags) : "memory");
}

#else /* ARM32 */

static inline void cpu_relax(void) {
    __asm__ volatile("yield" ::: "memory");
}

static inline uintptr_t irq_save(void) {
    uintptr_t cpsr;
    __asm__ volatile("mrs %0, cpsr\n\tcpsid i" : "=r"(cpsr) :: "memory");
    return cpsr;
}

static inline void irq_restore(uintptr_t flags) {
    __asm__ volatile("msr cpsr_c, %0" :: "r"(flags) : "memory");
}

#endif

#endif /* ARCH_ARM_SPINLOCK_H */