a40276a5852340ef5dd54f969c9346ba5dcca281
[pintos-anon] / src / threads / interrupt.h
1 #ifndef HEADER_INTERRUPT_H
2 #define HEADER_INTERRUPT_H 1
3
4 #include <stdbool.h>
5 #include <stdint.h>
6
7 enum if_level 
8   {
9     IF_OFF,             /* Interrupts disabled. */
10     IF_ON               /* Interrupts enabled. */
11   };
12
13 enum if_level intr_get_level (void);
14 enum if_level intr_set_level (enum if_level);
15 enum if_level intr_enable (void);
16 enum if_level intr_disable (void);
17 \f
18 struct intr_frame
19   {
20     /* Pushed by the stubs. */
21     uint32_t edi;
22     uint32_t esi;
23     uint32_t ebp;
24     uint32_t esp_dummy;
25     uint32_t ebx;
26     uint32_t edx;
27     uint32_t ecx;
28     uint32_t eax;
29     uint16_t es, :16;
30     uint16_t ds, :16;
31     uint32_t vec_no;
32
33     /* Sometimes pushed by the CPU, otherwise by the stubs. */
34     uint32_t error_code;
35
36     /* Pushed by the CPU. */
37     void (*eip) (void);
38     uint16_t cs, :16;
39     uint32_t eflags;
40     void *esp;
41     uint16_t ss, :16;
42   };
43
44 typedef void intr_handler_func (struct intr_frame *);
45
46 void intr_init (void);
47 void intr_register (uint8_t vec, int dpl, enum if_level, intr_handler_func *);
48 bool intr_context (void);
49 void intr_yield_on_return (void);
50
51 #endif /* interrupt.h */