#include "threads/interrupt.h"
#include <debug.h>
#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>
#include "threads/flags.h"
#include "threads/intr-stubs.h"
#include "threads/io.h"
#include "threads/thread.h"
#include "threads/vaddr.h"
#include "devices/timer.h"
Go to the source code of this file.
Defines | |
#define | PIC0_CTRL 0x20 |
#define | PIC0_DATA 0x21 |
#define | PIC1_CTRL 0xa0 |
#define | PIC1_DATA 0xa1 |
#define | IRQ_CASCADE0 2 |
#define | IRQ_CASCADE1 9 |
#define | PIC0_CTRL 0x20 |
#define | PIC0_DATA 0x21 |
#define | PIC1_CTRL 0xa0 |
#define | PIC1_DATA 0xa1 |
#define | INTR_CNT 256 |
Functions | |
static void | pic_init (void) |
static void | pic_end_of_interrupt (int irq) |
static uint64_t | make_intr_gate (void(*)(void), int dpl) |
static uint64_t | make_trap_gate (void(*)(void), int dpl) |
static uint64_t | make_idtr_operand (uint16_t limit, void *base) |
void | intr_handler (struct intr_frame *args) |
enum intr_level | intr_get_level (void) |
enum intr_level | intr_set_level (enum intr_level level) |
enum intr_level | intr_enable (void) |
enum intr_level | intr_disable (void) |
void | intr_init (void) |
static void | register_handler (uint8_t vec_no, int dpl, enum intr_level level, intr_handler_func *handler, const char *name) |
void | intr_register_ext (uint8_t vec_no, intr_handler_func *handler, const char *name) |
void | intr_register_int (uint8_t vec_no, int dpl, enum intr_level level, intr_handler_func *handler, const char *name) |
bool | intr_context (void) |
void | intr_yield_on_return (void) |
static uint64_t | make_gate (void(*function)(void), int dpl, int type) |
void | intr_dump_frame (const struct intr_frame *f) |
const char * | intr_name (uint8_t vec) |
void | intr_irq_mask (int irq) |
void | intr_irq_unmask (int irq) |
bool | intr_is_registered (uint8_t vec_no) |
Variables | |
static uint64_t | idt [INTR_CNT] |
static intr_handler_func * | intr_handlers [INTR_CNT] |
static const char * | intr_names [INTR_CNT] |
static uint8_t | pic_mask [2] |
static bool | in_external_intr |
static bool | yield_on_return |
#define INTR_CNT 256 |
#define IRQ_CASCADE0 2 |
#define IRQ_CASCADE1 9 |
#define PIC0_CTRL 0x20 |
Definition at line 27 of file interrupt.c.
#define PIC0_CTRL 0x20 |
#define PIC0_DATA 0x21 |
Definition at line 28 of file interrupt.c.
#define PIC0_DATA 0x21 |
Definition at line 28 of file interrupt.c.
Referenced by intr_irq_mask(), intr_irq_unmask(), and pic_init().
#define PIC1_CTRL 0xa0 |
Definition at line 29 of file interrupt.c.
#define PIC1_CTRL 0xa0 |
#define PIC1_DATA 0xa1 |
Definition at line 30 of file interrupt.c.
#define PIC1_DATA 0xa1 |
Definition at line 30 of file interrupt.c.
Referenced by intr_irq_mask(), intr_irq_unmask(), and pic_init().
bool intr_context | ( | void | ) |
Definition at line 221 of file interrupt.c.
References in_external_intr.
Referenced by acquire_console(), cond_signal(), cond_wait(), console_locked_by_current_thread(), intq_getc(), intq_putc(), intr_enable(), intr_handler(), intr_yield_on_return(), lock_acquire(), release_console(), sema_down(), thread_block(), thread_exit(), thread_yield(), and wait().
enum intr_level intr_disable | ( | void | ) |
Definition at line 113 of file interrupt.c.
References intr_get_level().
Referenced by debug_backtrace_all(), debug_panic(), idle(), input_getc(), intr_set_level(), pci_unregister_irq(), pit_configure_channel(), sema_down(), sema_try_down(), sema_up(), serial_flush(), serial_init_queue(), serial_putc(), speaker_off(), speaker_on(), thread_create(), thread_exit(), thread_unblock(), thread_yield(), timer_ticks(), uhci_remove_stalled(), uhci_tx_pkt_wait(), and vga_putc().
void intr_dump_frame | ( | const struct intr_frame * | f | ) |
Definition at line 409 of file interrupt.c.
References intr_frame::cs, intr_frame::ds, intr_frame::eax, intr_frame::ebp, intr_frame::ebx, intr_frame::ecx, intr_frame::edi, intr_frame::edx, intr_frame::eip, intr_frame::error_code, intr_frame::es, intr_frame::esi, intr_frame::esp, intr_names, printf(), PRIx16, PRIx32, intr_frame::ss, and intr_frame::vec_no.
Referenced by intr_handler(), and kill().
enum intr_level intr_enable | ( | void | ) |
Definition at line 97 of file interrupt.c.
References ASSERT, intr_context(), and intr_get_level().
Referenced by intr_set_level(), kernel_thread(), page_fault(), pci_unregister_irq(), thread_start(), and uhci_remove_stalled().
enum intr_level intr_get_level | ( | void | ) |
Definition at line 74 of file interrupt.c.
References FLAG_IF, INTR_OFF, and INTR_ON.
Referenced by input_full(), input_putc(), intq_empty(), intq_full(), intq_getc(), intq_putc(), intr_disable(), intr_enable(), intr_handler(), is_thread(), issue_pio_command(), putc_poll(), real_time_sleep(), schedule(), schedule_tail(), serial_notify(), signal(), speaker_beep(), thread_block(), thread_foreach(), timer_calibrate(), timer_sleep(), uhci_stop(), wait(), and write_ier().
void intr_handler | ( | struct intr_frame * | args | ) |
Definition at line 356 of file interrupt.c.
References ASSERT, in_external_intr, intr_context(), intr_dump_frame(), intr_get_level(), intr_handlers, INTR_OFF, NULL, PANIC, pic_end_of_interrupt(), thread_yield(), intr_frame::vec_no, and yield_on_return.
void intr_init | ( | void | ) |
Definition at line 127 of file interrupt.c.
References idt, INTR_CNT, intr_names, intr_stubs, make_idtr_operand(), make_intr_gate(), and pic_init().
Referenced by main().
void intr_irq_mask | ( | int | irq | ) |
masks a given IRQ
Definition at line 439 of file interrupt.c.
References outb(), PIC0_DATA, PIC1_DATA, and pic_mask.
Referenced by pci_mask_irq().
void intr_irq_unmask | ( | int | irq | ) |
unmasks a given IRQ
Definition at line 451 of file interrupt.c.
References IRQ_CASCADE0, IRQ_CASCADE1, outb(), PIC0_DATA, PIC1_DATA, and pic_mask.
Referenced by pci_unmask_irq().
bool intr_is_registered | ( | uint8_t | vec_no | ) |
Definition at line 474 of file interrupt.c.
References intr_handlers, and NULL.
Referenced by pci_register_irq().
const char* intr_name | ( | uint8_t | vec | ) |
void intr_register_ext | ( | uint8_t | vec_no, | |
intr_handler_func * | handler, | |||
const char * | name | |||
) |
Definition at line 190 of file interrupt.c.
References ASSERT, INTR_OFF, and register_handler().
Referenced by ide_init(), kbd_init(), pci_register_irq(), serial_init_queue(), and timer_init().
void intr_register_int | ( | uint8_t | vec_no, | |
int | dpl, | |||
enum intr_level | level, | |||
intr_handler_func * | handler, | |||
const char * | name | |||
) |
Definition at line 211 of file interrupt.c.
References ASSERT, and register_handler().
Referenced by exception_init(), and syscall_init().
enum intr_level intr_set_level | ( | enum intr_level | level | ) |
Definition at line 90 of file interrupt.c.
References intr_disable(), intr_enable(), and INTR_ON.
Referenced by debug_backtrace_all(), input_getc(), pit_configure_channel(), sema_down(), sema_try_down(), sema_up(), serial_flush(), serial_init_queue(), serial_putc(), speaker_off(), speaker_on(), thread_create(), thread_unblock(), thread_yield(), timer_ticks(), uhci_tx_pkt_wait(), and vga_putc().
void intr_yield_on_return | ( | void | ) |
Definition at line 231 of file interrupt.c.
References ASSERT, intr_context(), and yield_on_return.
Referenced by thread_tick().
static uint64_t make_gate | ( | void(*)(void) | function, | |
int | dpl, | |||
int | type | |||
) | [static] |
Definition at line 305 of file interrupt.c.
References ASSERT, NULL, and SEL_KCSEG.
Referenced by make_intr_gate(), and make_trap_gate().
static uint64_t make_intr_gate | ( | void(*)(void) | function, | |
int | dpl | |||
) | [static] |
Definition at line 328 of file interrupt.c.
References make_gate().
Referenced by intr_init(), and register_handler().
static uint64_t make_trap_gate | ( | void(*)(void) | function, | |
int | dpl | |||
) | [static] |
Definition at line 336 of file interrupt.c.
References make_gate().
Referenced by register_handler().
static void pic_end_of_interrupt | ( | int | irq | ) | [static] |
Definition at line 276 of file interrupt.c.
References ASSERT, and outb().
Referenced by intr_handler().
static void pic_init | ( | void | ) | [static] |
Definition at line 247 of file interrupt.c.
References outb(), PIC0_CTRL, PIC0_DATA, PIC1_CTRL, PIC1_DATA, and pic_mask.
Referenced by intr_init().
static void register_handler | ( | uint8_t | vec_no, | |
int | dpl, | |||
enum intr_level | level, | |||
intr_handler_func * | handler, | |||
const char * | name | |||
) | [static] |
Definition at line 174 of file interrupt.c.
References ASSERT, idt, intr_handlers, intr_names, INTR_ON, intr_stubs, make_intr_gate(), make_trap_gate(), and NULL.
Referenced by intr_register_ext(), and intr_register_int().
bool in_external_intr [static] |
intr_handler_func* intr_handlers[INTR_CNT] [static] |
Definition at line 42 of file interrupt.c.
Referenced by intr_handler(), intr_is_registered(), and register_handler().
const char* intr_names[INTR_CNT] [static] |
Definition at line 45 of file interrupt.c.
Referenced by intr_dump_frame(), intr_init(), intr_name(), and register_handler().
Definition at line 48 of file interrupt.c.
Referenced by intr_irq_mask(), intr_irq_unmask(), and pic_init().
bool yield_on_return [static] |
Definition at line 58 of file interrupt.c.
Referenced by intr_handler(), and intr_yield_on_return().