13a72e3ebSJaroslaw Pelczar /* 23a72e3ebSJaroslaw Pelczar * Copyright 2018, Jaroslaw Pelczar <jarek@jpelczar.com> 33a72e3ebSJaroslaw Pelczar * Distributed under the terms of the MIT License. 43a72e3ebSJaroslaw Pelczar */ 53a72e3ebSJaroslaw Pelczar #ifndef _KERNEL_ARCH_ARM64_ARCH_INT_H_ 63a72e3ebSJaroslaw Pelczar #define _KERNEL_ARCH_ARM64_ARCH_INT_H_ 73a72e3ebSJaroslaw Pelczar 83a72e3ebSJaroslaw Pelczar 93a72e3ebSJaroslaw Pelczar #include <SupportDefs.h> 10b3a12553SJaroslaw Pelczar #include <kernel/arch/arm64/arm_registers.h> 113a72e3ebSJaroslaw Pelczar 123a72e3ebSJaroslaw Pelczar 133a72e3ebSJaroslaw Pelczar #define NUM_IO_VECTORS 1024 143a72e3ebSJaroslaw Pelczar 15b3a12553SJaroslaw Pelczar static inline void arch_int_enable_interrupts_inline(void)16b3a12553SJaroslaw Pelczararch_int_enable_interrupts_inline(void) 17b3a12553SJaroslaw Pelczar { 18*d1c3213aSmilek7 asm volatile("msr daifclr, #0xf" : : : "memory"); 19b3a12553SJaroslaw Pelczar } 20b3a12553SJaroslaw Pelczar 21b3a12553SJaroslaw Pelczar 22b3a12553SJaroslaw Pelczar static inline int arch_int_disable_interrupts_inline(void)23b3a12553SJaroslaw Pelczararch_int_disable_interrupts_inline(void) 24b3a12553SJaroslaw Pelczar { 25b3a12553SJaroslaw Pelczar uint32 flags; 26b3a12553SJaroslaw Pelczar 27*d1c3213aSmilek7 asm volatile("mrs %0, daif\n" "msr daifset, #0xf" : "=r"(flags) : : "memory"); 28b3a12553SJaroslaw Pelczar 29b3a12553SJaroslaw Pelczar return flags; 30b3a12553SJaroslaw Pelczar } 31b3a12553SJaroslaw Pelczar 32b3a12553SJaroslaw Pelczar 33b3a12553SJaroslaw Pelczar static inline void arch_int_restore_interrupts_inline(int oldState)34b3a12553SJaroslaw Pelczararch_int_restore_interrupts_inline(int oldState) 35b3a12553SJaroslaw Pelczar { 36*d1c3213aSmilek7 asm volatile("msr daif, %0" : : "r"(oldState) : "memory"); 37b3a12553SJaroslaw Pelczar } 38b3a12553SJaroslaw Pelczar 39b3a12553SJaroslaw Pelczar 40b3a12553SJaroslaw Pelczar static inline bool arch_int_are_interrupts_enabled_inline(void)41b3a12553SJaroslaw Pelczararch_int_are_interrupts_enabled_inline(void) 42b3a12553SJaroslaw Pelczar { 43*d1c3213aSmilek7 return (READ_SPECIALREG(DAIF) & PSR_I) == 0; 44b3a12553SJaroslaw Pelczar } 45b3a12553SJaroslaw Pelczar 46*d1c3213aSmilek7 47b3a12553SJaroslaw Pelczar // map the functions to the inline versions 48b3a12553SJaroslaw Pelczar #define arch_int_enable_interrupts() arch_int_enable_interrupts_inline() 49b3a12553SJaroslaw Pelczar #define arch_int_disable_interrupts() arch_int_disable_interrupts_inline() 50b3a12553SJaroslaw Pelczar #define arch_int_restore_interrupts(status) \ 51b3a12553SJaroslaw Pelczar arch_int_restore_interrupts_inline(status) 52b3a12553SJaroslaw Pelczar #define arch_int_are_interrupts_enabled() \ 53b3a12553SJaroslaw Pelczar arch_int_are_interrupts_enabled_inline() 543a72e3ebSJaroslaw Pelczar 55*d1c3213aSmilek7 563a72e3ebSJaroslaw Pelczar #endif /* _KERNEL_ARCH_ARM64_ARCH_INT_H_ */ 57