projects
/
pintos-anon
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Make more useful.
[pintos-anon]
/
src
/
threads
/
interrupt.c
diff --git
a/src/threads/interrupt.c
b/src/threads/interrupt.c
index d248d7200b71173a3d43c941ff60f094bb773f34..8e7d575afe7928ac5f22c57c11719e2107dcae50 100644
(file)
--- a/
src/threads/interrupt.c
+++ b/
src/threads/interrupt.c
@@
-3,6
+3,7
@@
#include <inttypes.h>
#include <stdint.h>
#include <stdio.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/mmu.h"
#include "threads/intr-stubs.h"
#include "threads/io.h"
#include "threads/mmu.h"
@@
-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;
}
@@
-93,7
+95,7
@@
intr_init (void)
/* Initialize IDT. */
for (i = 0; i < INTR_CNT; i++)
/* Initialize IDT. */
for (i = 0; i < INTR_CNT; i++)
- idt[i] = make_
trap
_gate (intr_stubs[i], 0);
+ idt[i] = make_
intr
_gate (intr_stubs[i], 0);
/* Load IDT register. */
idtr_operand = make_idtr_operand (sizeof idt - 1, idt);
/* Load IDT register. */
idtr_operand = make_idtr_operand (sizeof idt - 1, idt);
@@
-303,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)
{