1 /* 2 * Copyright 2005-2021, Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Axel Dörfler <axeld@pinc-software.de> 7 * Ingo Weinhold <bonefish@cs.tu-berlin.de> 8 * Adrien Destugues <pulkomandy@pulkomandy.tk> 9 */ 10 #ifndef _KERNEL_ARCH_SPARC_INT_H 11 #define _KERNEL_ARCH_SPARC_INT_H 12 13 #include <SupportDefs.h> 14 15 #define NUM_IO_VECTORS 256 16 17 static inline void 18 arch_int_enable_interrupts_inline(void) 19 { 20 int tmp; 21 asm volatile( 22 "rdpr %%pstate, %0\n" 23 "or %0, 2, %0\n" 24 "wrpr %0, %%pstate\n" 25 : "=r" (tmp) 26 ); 27 } 28 29 30 static inline int 31 arch_int_disable_interrupts_inline(void) 32 { 33 int flags; 34 int tmp; 35 asm volatile( 36 "rdpr %%pstate, %0\n" 37 "andn %0, 2, %1\n" 38 "wrpr %1, %%pstate\n" 39 : "=r" (flags), "=r" (tmp) 40 ); 41 return flags & 2; 42 } 43 44 45 static inline void 46 arch_int_restore_interrupts_inline(int oldState) 47 { 48 if (oldState) 49 arch_int_enable_interrupts_inline(); 50 } 51 52 53 static inline bool 54 arch_int_are_interrupts_enabled_inline(void) 55 { 56 int flags; 57 asm volatile( 58 "rdpr %%pstate, %0\n" 59 : "=r" (flags) 60 ); 61 62 return flags & 2; 63 } 64 65 66 // map the functions to the inline versions 67 #define arch_int_enable_interrupts() arch_int_enable_interrupts_inline() 68 #define arch_int_disable_interrupts() arch_int_disable_interrupts_inline() 69 #define arch_int_restore_interrupts(status) \ 70 arch_int_restore_interrupts_inline(status) 71 #define arch_int_are_interrupts_enabled() \ 72 arch_int_are_interrupts_enabled_inline() 73 74 75 #endif /* _KERNEL_ARCH_SPARC_INT_H */ 76