use core::arch::asm;

#[inline(always)]
pub(crate) fn arch_set_my_processor_id(id: usize) {
    unsafe {
        asm!(
            "msr tpidr_el1, {0}",
            in(reg) id
        );
    }
}

#[inline(always)]
pub(crate) fn arch_my_processor_id() -> usize {
    let id;
    unsafe {
        asm!(
            "mrs {0}, tpidr_el1",
            out(reg) id
        );
    }
    id
}

#[inline(always)]
pub(crate) fn arch_cpu_relax() {
    unsafe {
        core::arch::aarch64::__yield();
    }
}

#[inline(always)]
pub(crate) fn arch_cpu_wfe() {
    unsafe {
        core::arch::aarch64::__wfe();
    }
}

#[inline(always)]
pub(crate) fn arch_smp_mb_acquire() {
    unsafe {
        core::arch::aarch64::__dmb(core::arch::aarch64::ISHLD);
    }
}

#[inline(always)]
pub(crate) fn arch_smp_mb_release() {
    unsafe {
        core::arch::aarch64::__dmb(core::arch::aarch64::ISHST);
    }
}

#[inline(always)]
pub(crate) fn arch_smp_mb() {
    unsafe {
        core::arch::aarch64::__dmb(core::arch::aarch64::ISH);
    }
}

#[inline(always)]
pub(crate) fn arch_isb() {
    unsafe {
        core::arch::aarch64::__isb(core::arch::aarch64::SY);
    }
}
