diff options
author | Mole Shang <[email protected]> | 2024-02-11 14:41:35 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-11 14:41:35 +0800 |
commit | 48a5e34fcd07852b4a68825ce8e37feb6f6d04d7 (patch) | |
tree | b6ec41ca1889db0122d754b0083c7d1d87cb0818 /kernel/trap.c | |
parent | 3673a2cdfb30e1e3936e695a3fb8adee74488d6b (diff) | |
download | xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.tar.gz xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.tar.bz2 xv6-labs-48a5e34fcd07852b4a68825ce8e37feb6f6d04d7.zip |
lab traps: finishtraps
Diffstat (limited to 'kernel/trap.c')
-rw-r--r-- | kernel/trap.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/kernel/trap.c b/kernel/trap.c index 512c850..eb8009f 100644 --- a/kernel/trap.c +++ b/kernel/trap.c @@ -6,6 +6,12 @@ #include "proc.h" #include "defs.h" +/* + * Always remember that RISC-V disables interrupts when it starts to take a trap, + * so there's no need to call intr_off() at the beginning of trap handling. + * Reference: xv6-riscv-book 4.5 + */ + struct spinlock tickslock; uint ticks; @@ -76,9 +82,22 @@ usertrap(void) if(killed(p)) exit(-1); - // give up the CPU if this is a timer interrupt. - if(which_dev == 2) + if(which_dev == 2){ + // timer interrupt + if(p->alarm_interval > 0 && p->alarm_caninvoke){ + // record sigalarm + p->alarm_tickspassed++; + if(p->alarm_tickspassed == p->alarm_interval){ + // store original trapframe in p->atpfm + memmove(p->atpfm, p->trapframe, sizeof(struct trapframe)); + p->alarm_tickspassed = 0; + p->alarm_caninvoke = 0; + p->trapframe->epc = p->alarm_handler; + } + } + // give up the CPU. yield(); + } usertrapret(); } |