diff options
Diffstat (limited to 'pintos-progos/threads/interrupt.h')
| -rw-r--r-- | pintos-progos/threads/interrupt.h | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/pintos-progos/threads/interrupt.h b/pintos-progos/threads/interrupt.h new file mode 100644 index 0000000..d43e06d --- /dev/null +++ b/pintos-progos/threads/interrupt.h | |||
| @@ -0,0 +1,70 @@ | |||
| 1 | #ifndef THREADS_INTERRUPT_H | ||
| 2 | #define THREADS_INTERRUPT_H | ||
| 3 | |||
| 4 | #include <stdbool.h> | ||
| 5 | #include <stdint.h> | ||
| 6 | |||
| 7 | /* Interrupts on or off? */ | ||
| 8 | enum intr_level | ||
| 9 | { | ||
| 10 | INTR_OFF, /* Interrupts disabled. */ | ||
| 11 | INTR_ON /* Interrupts enabled. */ | ||
| 12 | }; | ||
| 13 | |||
| 14 | enum intr_level intr_get_level (void); | ||
| 15 | enum intr_level intr_set_level (enum intr_level); | ||
| 16 | enum intr_level intr_enable (void); | ||
| 17 | enum intr_level intr_disable (void); | ||
| 18 | |||
| 19 | /* Interrupt stack frame. */ | ||
| 20 | struct intr_frame | ||
| 21 | { | ||
| 22 | /* Pushed by intr_entry in intr-stubs.S. | ||
| 23 | These are the interrupted task's saved registers. */ | ||
| 24 | uint32_t edi; /* Saved EDI. */ | ||
| 25 | uint32_t esi; /* Saved ESI. */ | ||
| 26 | uint32_t ebp; /* Saved EBP. */ | ||
| 27 | uint32_t esp_dummy; /* Not used. */ | ||
| 28 | uint32_t ebx; /* Saved EBX. */ | ||
| 29 | uint32_t edx; /* Saved EDX. */ | ||
| 30 | uint32_t ecx; /* Saved ECX. */ | ||
| 31 | uint32_t eax; /* Saved EAX. */ | ||
| 32 | uint16_t gs, :16; /* Saved GS segment register. */ | ||
| 33 | uint16_t fs, :16; /* Saved FS segment register. */ | ||
| 34 | uint16_t es, :16; /* Saved ES segment register. */ | ||
| 35 | uint16_t ds, :16; /* Saved DS segment register. */ | ||
| 36 | |||
| 37 | /* Pushed by intrNN_stub in intr-stubs.S. */ | ||
| 38 | uint32_t vec_no; /* Interrupt vector number. */ | ||
| 39 | |||
| 40 | /* Sometimes pushed by the CPU, | ||
| 41 | otherwise for consistency pushed as 0 by intrNN_stub. | ||
| 42 | The CPU puts it just under `eip', but we move it here. */ | ||
| 43 | uint32_t error_code; /* Error code. */ | ||
| 44 | |||
| 45 | /* Pushed by intrNN_stub in intr-stubs.S. | ||
| 46 | This frame pointer eases interpretation of backtraces. */ | ||
| 47 | void *frame_pointer; /* Saved EBP (frame pointer). */ | ||
| 48 | |||
| 49 | /* Pushed by the CPU. | ||
| 50 | These are the interrupted task's saved registers. */ | ||
| 51 | void (*eip) (void); /* Next instruction to execute. */ | ||
| 52 | uint16_t cs, :16; /* Code segment for eip. */ | ||
| 53 | uint32_t eflags; /* Saved CPU flags. */ | ||
| 54 | void *esp; /* Saved stack pointer. */ | ||
| 55 | uint16_t ss, :16; /* Data segment for esp. */ | ||
| 56 | }; | ||
| 57 | |||
| 58 | typedef void intr_handler_func (struct intr_frame *); | ||
| 59 | |||
| 60 | void intr_init (void); | ||
| 61 | void intr_register_ext (uint8_t vec, intr_handler_func *, const char *name); | ||
| 62 | void intr_register_int (uint8_t vec, int dpl, enum intr_level, | ||
| 63 | intr_handler_func *, const char *name); | ||
| 64 | bool intr_context (void); | ||
| 65 | void intr_yield_on_return (void); | ||
| 66 | |||
| 67 | void intr_dump_frame (const struct intr_frame *); | ||
| 68 | const char *intr_name (uint8_t vec); | ||
| 69 | |||
| 70 | #endif /* threads/interrupt.h */ | ||
