projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Move TODO.
[pintos-anon]
/
src
/
threads
/
interrupt.c
diff --git
a/src/threads/interrupt.c
b/src/threads/interrupt.c
index 8173ec11dcc44767c7cd5d02158651e48433eab4..8e7d575afe7928ac5f22c57c11719e2107dcae50 100644
(file)
--- a/
src/threads/interrupt.c
+++ b/
src/threads/interrupt.c
@@
-1,13
+1,14
@@
-#include "interrupt.h"
+#include "threads/interrupt.h"
+#include <debug.h>
#include <inttypes.h>
#include <stdint.h>
#include <inttypes.h>
#include <stdint.h>
-#include
"intr-stubs.h"
-#include "
debug
.h"
-#include "
io
.h"
-#include "
lib
.h"
-#include "mmu.h"
-#include "thread.h"
-#include "timer.h"
+#include
<stdio.h>
+#include "
threads/flags
.h"
+#include "
threads/intr-stubs
.h"
+#include "
threads/io
.h"
+#include "
threads/
mmu.h"
+#include "thread
s/thread
.h"
+#include "
devices/
timer.h"
/* Number of x86 interrupts. */
#define INTR_CNT 256
/* Number of x86 interrupts. */
#define INTR_CNT 256
@@
-68,6
+69,7
@@
enum intr_level
intr_enable (void)
{
enum intr_level old_level = intr_get_level ();
intr_enable (void)
{
enum intr_level old_level = intr_get_level ();
+ ASSERT (!intr_context ());
asm volatile ("sti");
return old_level;
}
asm volatile ("sti");
return old_level;
}
@@
-91,6
+93,10
@@
intr_init (void)
/* Initialize interrupt controller. */
pic_init ();
/* Initialize interrupt controller. */
pic_init ();
+ /* Initialize IDT. */
+ for (i = 0; i < INTR_CNT; i++)
+ idt[i] = make_intr_gate (intr_stubs[i], 0);
+
/* Load IDT register. */
idtr_operand = make_idtr_operand (sizeof idt - 1, idt);
asm volatile ("lidt %0" :: "m" (idtr_operand));
/* Load IDT register. */
idtr_operand = make_idtr_operand (sizeof idt - 1, idt);
asm volatile ("lidt %0" :: "m" (idtr_operand));
@@
-299,6
+305,10
@@
intr_handler (struct intr_frame *frame)
bool external;
intr_handler_func *handler;
bool external;
intr_handler_func *handler;
+ /* External interrupts are special.
+ We only handle one at a time (so interrupts must be off)
+ and they need to be acknowledged on the PIC (see below).
+ An external interrupt handler cannot sleep. */
external = frame->vec_no >= 0x20 && frame->vec_no < 0x30;
if (external)
{
external = frame->vec_no >= 0x20 && frame->vec_no < 0x30;
if (external)
{
@@
-342,14
+352,14
@@
intr_dump_frame (const struct intr_frame *f)
asm ("movl %%cr2, %0" : "=r" (cr2));
asm ("movl %%ss, %0" : "=r" (ss));
asm ("movl %%cr2, %0" : "=r" (cr2));
asm ("movl %%ss, %0" : "=r" (ss));
- print
k
("Interrupt %#04x (%s) at eip=%p\n",
+ print
f
("Interrupt %#04x (%s) at eip=%p\n",
f->vec_no, intr_names[f->vec_no], f->eip);
f->vec_no, intr_names[f->vec_no], f->eip);
- print
k
(" cr2=%08"PRIx32" error=%08"PRIx32"\n", cr2, f->error_code);
- print
k
(" eax=%08"PRIx32" ebx=%08"PRIx32" ecx=%08"PRIx32" edx=%08"PRIx32"\n",
+ print
f
(" cr2=%08"PRIx32" error=%08"PRIx32"\n", cr2, f->error_code);
+ print
f
(" eax=%08"PRIx32" ebx=%08"PRIx32" ecx=%08"PRIx32" edx=%08"PRIx32"\n",
f->eax, f->ebx, f->ecx, f->edx);
f->eax, f->ebx, f->ecx, f->edx);
- print
k
(" esi=%08"PRIx32" edi=%08"PRIx32" esp=%08"PRIx32" ebp=%08"PRIx32"\n",
+ print
f
(" esi=%08"PRIx32" edi=%08"PRIx32" esp=%08"PRIx32" ebp=%08"PRIx32"\n",
f->esi, f->edi, (uint32_t) f->esp, f->ebp);
f->esi, f->edi, (uint32_t) f->esp, f->ebp);
- print
k
(" cs=%04"PRIx16" ds=%04"PRIx16" es=%04"PRIx16" ss=%04"PRIx16"\n",
+ print
f
(" cs=%04"PRIx16" ds=%04"PRIx16" es=%04"PRIx16" ss=%04"PRIx16"\n",
f->cs, f->ds, f->es, f->cs != SEL_KCSEG ? f->ss : ss);
}
f->cs, f->ds, f->es, f->cs != SEL_KCSEG ? f->ss : ss);
}