Browse Source

[pk] fixed timer interrupt handler, etc.

cs250
Andrew Waterman 15 years ago
parent
commit
0be1f5eb1b
  1. 9
      pk/entry.S
  2. 11
      pk/handlers.c
  3. 2
      pk/pcr.h
  4. 5
      pk/riscv-pk.S

9
pk/entry.S

@ -128,8 +128,15 @@ pop_tf: # write the trap frame onto the stack
trap_entry:
mtpcr $ra,ASM_CR(PCR_K0)
mtpcr $x2,ASM_CR(PCR_K1)
# when coming from kernel, continue below its stack
mfpcr $ra,ASM_CR(PCR_SR)
and $ra,$ra,SR_PS
add $x2, $sp, -320
bnez $ra, 1f
la $x2,stack_top-320
jal save_tf
1:jal save_tf
move $sp,$x2
move $a0,$x2
jal handle_trap

11
pk/handlers.c

@ -101,10 +101,13 @@ static void handle_interrupt(trapframe_t* tf)
for(int i = 0; interrupts; interrupts >>= 1, i++)
{
if(i == TIMER_IRQ)
handle_timer_interrupt(tf);
else
handle_bad_interrupt(tf,i);
if(interrupts & 1)
{
if(i == TIMER_IRQ)
handle_timer_interrupt(tf);
else
handle_bad_interrupt(tf,i);
}
}
}

2
pk/pcr.h

@ -32,7 +32,7 @@
#define MEMSIZE_SHIFT 12
#define TIMER_PERIOD 0x1000000
#define TIMER_PERIOD 0x1000
#define TIMER_IRQ 7
#define CAUSE_EXCCODE 0x000000FF

5
pk/riscv-pk.S

@ -14,9 +14,10 @@ __start:
mtpcr $t0, ASM_CR(PCR_EVEC)
mtpcr $x0, ASM_CR(PCR_COUNT)
mtpcr $x0, ASM_CR(PCR_COMPARE)
li $t0, TIMER_PERIOD
mtpcr $t0, ASM_CR(PCR_COMPARE)
li $t0, SR_S | SR_PS | SR_ET | SR_IM | SR_EC | SR_SX
li $t0, SR_S | SR_PS | SR_ET | SR_EC | SR_SX
or $t1, $t0, SR_EF | SR_EV
mtpcr $t1, ASM_CR(PCR_SR)
mfpcr $t1, ASM_CR(PCR_SR)

Loading…
Cancel
Save