yield if timer interrupt
all user tests passed
This commit is contained in:
parent
a82772594e
commit
ec3d3a1fce
14
trap.c
14
trap.c
|
@ -36,6 +36,8 @@ trapinit(void)
|
|||
void
|
||||
usertrap(void)
|
||||
{
|
||||
int which_dev = 0;
|
||||
|
||||
if((r_sstatus() & SSTATUS_SPP) != 0)
|
||||
panic("usertrap: not from user mode");
|
||||
|
||||
|
@ -62,7 +64,7 @@ usertrap(void)
|
|||
p->tf->epc += 4;
|
||||
|
||||
syscall();
|
||||
} else if(devintr()){
|
||||
} else if((which_dev = devintr()) != 0){
|
||||
// ok
|
||||
} else {
|
||||
printf("usertrap(): unexpected scause 0x%p pid=%d\n", r_scause(), p->pid);
|
||||
|
@ -73,6 +75,10 @@ usertrap(void)
|
|||
if(p->killed)
|
||||
exit();
|
||||
|
||||
// give up the CPU if this is a timer interrupt.
|
||||
if(which_dev == 2)
|
||||
yield();
|
||||
|
||||
usertrapret();
|
||||
}
|
||||
|
||||
|
@ -146,7 +152,9 @@ kerneltrap()
|
|||
|
||||
// check if it's an external interrupt or software interrupt,
|
||||
// and handle it.
|
||||
// returns 1 if handled, 0 if not recognized.
|
||||
// returns 2 if timer interrupt,
|
||||
// 1 if other device,
|
||||
// 0 if not recognized.
|
||||
int
|
||||
devintr()
|
||||
{
|
||||
|
@ -176,7 +184,7 @@ devintr()
|
|||
// acknowledge.
|
||||
w_sip(r_sip() & ~2);
|
||||
|
||||
return 1;
|
||||
return 2;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue