001
002
003
004
005
006
007
008
009
010
011
012
013
014
015
016
017
018 #ifndef _SOS_HWINTR_H_
019 #define _SOS_HWINTR_H_
020
021
022
023
024
025
026
027
028
029 #include <sos/errno.h>
030 #include "cpu_context.h"
031
032
033 #define sos_save_flags(flags) \
034 asm volatile("pushfl ; popl %0":"=g"(flags)::"memory")
035 #define sos_restore_flags(flags) \
036 asm volatile("push %0; popfl"::"g"(flags):"memory")
037
038
039 #define sos_disable_IRQs(flags) \
040 ({ sos_save_flags(flags); asm("cli\n"); })
041 #define sos_restore_IRQs(flags) \
042 sos_restore_flags(flags)
043
044
045
046 #define SOS_IRQ_TIMER 0
047 #define SOS_IRQ_KEYBOARD 1
048 #define SOS_IRQ_SLAVE_PIC 2
049 #define SOS_IRQ_COM2 3
050 #define SOS_IRQ_COM1 4
051 #define SOS_IRQ_LPT2 5
052 #define SOS_IRQ_FLOPPY 6
053 #define SOS_IRQ_LPT1 7
054 #define SOS_IRQ_8_NOT_DEFINED 8
055 #define SOS_IRQ_RESERVED_1 9
056 #define SOS_IRQ_RESERVED_2 10
057 #define SOS_IRQ_RESERVED_3 11
058 #define SOS_IRQ_RESERVED_4 12
059 #define SOS_IRQ_COPROCESSOR 13
060 #define SOS_IRQ_HARDDISK 14
061 #define SOS_IRQ_RESERVED_5 15
062
063
064
065 typedef void (*sos_irq_handler_t)(int irq_level);
066
067
068
069 sos_ret_t sos_irq_subsystem_setup(void);
070
071
072
073
074
075
076
077
078 sos_ret_t sos_irq_set_routine(int irq_level,
079 sos_irq_handler_t routine);
080
081 sos_irq_handler_t sos_irq_get_routine(int irq_level);
082
083
084
085
086
087 sos_ui32_t sos_irq_get_nested_level(void);
088
089
090
091
092
093 #define sos_servicing_irq() \
094 (sos_irq_get_nested_level() > 0)
095
096
097 #endif