00001 #ifndef THREADS_INTERRUPT_H
00002
00003 #define THREADS_INTERRUPT_H
00004
00005 #include <stdbool.h>
00006 #include <stdint.h>
00007
00008
00009 enum intr_level
00010 {
00011 INTR_OFF,
00012 INTR_ON
00013 };
00014
00015 enum intr_level intr_get_level (void);
00016 enum intr_level intr_set_level (enum intr_level);
00017 enum intr_level intr_enable (void);
00018 enum intr_level intr_disable (void);
00019
00020
00021 struct intr_frame
00022 {
00023
00024
00025 uint32_t edi;
00026 uint32_t esi;
00027 uint32_t ebp;
00028 uint32_t esp_dummy;
00029 uint32_t ebx;
00030 uint32_t edx;
00031 uint32_t ecx;
00032 uint32_t eax;
00033 uint16_t gs, :16;
00034 uint16_t fs, :16;
00035 uint16_t es, :16;
00036 uint16_t ds, :16;
00037
00038
00039 uint32_t vec_no;
00040
00041
00042
00043
00044 uint32_t error_code;
00045
00046
00047
00048 void *frame_pointer;
00049
00050
00051
00052 void (*eip) (void);
00053 uint16_t cs, :16;
00054 uint32_t eflags;
00055 void *esp;
00056 uint16_t ss, :16;
00057 };
00058
00059 typedef void intr_handler_func (struct intr_frame *);
00060
00061 void intr_init (void);
00062 void intr_register_ext (uint8_t vec, intr_handler_func *, const char *name);
00063 void intr_register_int (uint8_t vec, int dpl, enum intr_level,
00064 intr_handler_func *, const char *name);
00065 bool intr_context (void);
00066 void intr_yield_on_return (void);
00067
00068 void intr_dump_frame (const struct intr_frame *);
00069 const char *intr_name (uint8_t vec);
00070
00071 void intr_irq_mask(int irq);
00072 void intr_irq_unmask(int irq);
00073
00074 bool intr_is_registered ( uint8_t vec );
00075
00076 #endif