1/* 2 * Copyright 2005-2009, Axel D��rfler, axeld@pinc-software.de. 3 * Copyright 2012, Alex Smith, alex@alex-smith.me.uk. 4 * Distributed under the terms of the MIT License. 5 */ 6#ifndef _KERNEL_ARCH_x86_INT_H 7#define _KERNEL_ARCH_x86_INT_H 8 9 10#define ARCH_INTERRUPT_BASE 0x20 11#define NUM_IO_VECTORS (256 - ARCH_INTERRUPT_BASE) 12 13 14static inline void 15arch_int_enable_interrupts_inline(void) 16{ 17 asm volatile("sti"); 18} 19 20 21static inline int 22arch_int_disable_interrupts_inline(void) 23{ 24 size_t flags; 25 26 asm volatile("pushf;\n" 27 "pop %0;\n" 28 "cli" : "=g" (flags)); 29 return (flags & 0x200) != 0; 30} 31 32 33static inline void 34arch_int_restore_interrupts_inline(int oldState) 35{ 36 if (oldState) 37 asm("sti"); 38} 39 40 41static inline bool 42arch_int_are_interrupts_enabled_inline(void) 43{ 44 size_t flags; 45 46 asm volatile("pushf;\n" 47 "pop %0;\n" : "=g" (flags)); 48 return (flags & 0x200) != 0; 49} 50 51 52// map the functions to the inline versions 53#define arch_int_enable_interrupts() arch_int_enable_interrupts_inline() 54#define arch_int_disable_interrupts() arch_int_disable_interrupts_inline() 55#define arch_int_restore_interrupts(status) \ 56 arch_int_restore_interrupts_inline(status) 57#define arch_int_are_interrupts_enabled() \ 58 arch_int_are_interrupts_enabled_inline() 59 60 61#ifdef __cplusplus 62 63typedef struct interrupt_controller_s { 64 const char *name; 65 void (*enable_io_interrupt)(int32 num); 66 void (*disable_io_interrupt)(int32 num); 67 void (*configure_io_interrupt)(int32 num, uint32 config); 68 bool (*is_spurious_interrupt)(int32 num); 69 bool (*is_level_triggered_interrupt)(int32 num); 70 bool (*end_of_interrupt)(int32 num); 71} interrupt_controller; 72 73 74void arch_int_set_interrupt_controller(const interrupt_controller &controller); 75 76#endif // __cplusplus 77 78#endif /* _KERNEL_ARCH_x86_INT_H */ 79