summaryrefslogtreecommitdiff
path: root/trap.c
diff options
context:
space:
mode:
Diffstat (limited to 'trap.c')
-rw-r--r--trap.c19
1 files changed, 6 insertions, 13 deletions
diff --git a/trap.c b/trap.c
index 929f761..050a94d 100644
--- a/trap.c
+++ b/trap.c
@@ -129,7 +129,6 @@ kerneltrap()
{
uint64 sstatus = r_sstatus();
uint64 scause = r_scause();
- uint64 sepc = r_sepc(); // XXX needed only for check at end?
if((sstatus & SSTATUS_SPP) == 0)
panic("kerneltrap: not from supervisor mode");
@@ -141,12 +140,6 @@ kerneltrap()
printf("sepc=%p stval=%p\n", r_sepc(), r_stval());
panic("kerneltrap");
}
-
- // XXX assert that we don't have to save/restore sstatus or sepc.
- if(r_sstatus() != sstatus)
- panic("kerneltrap sstatus");
- if(r_sepc() != sepc)
- panic("kerneltrap sepc");
}
// check if it's an external interrupt or software interrupt,
@@ -166,8 +159,6 @@ devintr()
if(irq == UART0_IRQ){
uartintr();
- } else {
- printf("stray interrupt irq=%d\n", irq);
}
plic_complete(irq);
@@ -175,10 +166,12 @@ devintr()
} else if(scause == 0x8000000000000001){
// software interrupt from a machine-mode timer interrupt.
- acquire(&tickslock);
- ticks++;
- wakeup(&ticks);
- release(&tickslock);
+ if(cpuid() == 0){
+ acquire(&tickslock);
+ ticks++;
+ wakeup(&ticks);
+ release(&tickslock);
+ }
// acknowledge.
w_sip(r_sip() & ~2);