提交 cb83c716 创建 作者: rtm's avatar rtm

fix some trap bugs

上级 84eb544b
...@@ -73,3 +73,9 @@ setupsegs() may modify current segment table, is that legal? ...@@ -73,3 +73,9 @@ setupsegs() may modify current segment table, is that legal?
trap() ought to lgdt on return, since currently only done in swtch() trap() ought to lgdt on return, since currently only done in swtch()
protect hardware interrupt vectors from user INT instructions? protect hardware interrupt vectors from user INT instructions?
i'm getting a curious interrupt when jumping into user space. maybe
it's IRQ 0, but it comes at a weird and changing vector (e.g. 119) if
you don't initialize the PIC. why doesn't jos see this? if i
initialize the PIC with IRQ_OFFSET 32, the interrupt arrives at vector
32.
...@@ -5,12 +5,20 @@ ...@@ -5,12 +5,20 @@
#include "defs.h" #include "defs.h"
#include "x86.h" #include "x86.h"
char junk1[20000]; extern char edata[], end[];
char junk2[20000] = { 1 };
main() main()
{ {
struct proc *p; struct proc *p;
// clear BSS
memset(edata, 0, end - edata);
// partially initizialize PIC
outb(0x20+1, 0xFF); // IO_PIC1
outb(0xA0+1, 0xFF); // IO_PIC2
outb(0x20, 0x11);
outb(0x20+1, 32);
cprintf("\nxV6\n\n"); cprintf("\nxV6\n\n");
......
...@@ -12,11 +12,15 @@ extern unsigned vectors[]; /* vectors.S, array of 256 entry point addresses */ ...@@ -12,11 +12,15 @@ extern unsigned vectors[]; /* vectors.S, array of 256 entry point addresses */
extern void trapenter(); extern void trapenter();
extern void trapenter1(); extern void trapenter1();
int xx;
void void
tinit() tinit()
{ {
int i; int i;
xx = 0;
for(i = 0; i < 256; i++){ for(i = 0; i < 256; i++){
SETGATE(idt[i], 1, SEG_KCODE << 3, vectors[i], 3); SETGATE(idt[i], 1, SEG_KCODE << 3, vectors[i], 3);
} }
...@@ -27,8 +31,10 @@ void ...@@ -27,8 +31,10 @@ void
trap(struct Trapframe *tf) trap(struct Trapframe *tf)
{ {
/* which process are we running? */ /* which process are we running? */
cprintf("trap %d tf %x\n", tf->tf_trapno, tf); if(xx < 10)
while(1) cprintf("%d\n", tf->tf_trapno);
; xx++;
//while(1)
//;
// XXX probably ought to lgdt on trap return // XXX probably ought to lgdt on trap return
} }
...@@ -14,7 +14,7 @@ for(my $i = 0; $i < 256; $i++){ ...@@ -14,7 +14,7 @@ for(my $i = 0; $i < 256; $i++){
if(($i < 8 || $i > 14) && $i != 17){ if(($i < 8 || $i > 14) && $i != 17){
print "\tpushl \$0\n"; print "\tpushl \$0\n";
} }
print "\tpushl $i\n"; print "\tpushl \$$i\n";
print "\tjmp alltraps\n"; print "\tjmp alltraps\n";
} }
print ".data\n"; print ".data\n";
......
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论