OpenCores
URL https://opencores.org/ocsvn/or1k/or1k/trunk

Subversion Repositories or1k

[/] [or1k/] [tags/] [nog_patch_52/] [or1ksim/] [tick/] [tick.c] - Diff between revs 1386 and 1390

Go to most recent revision | Show entire file | Details | Blame | View Log

Rev 1386 Rev 1390
Line 68... Line 68...
  switch (mode) {
  switch (mode) {
  case 1:
  case 1:
    if (!param) {
    if (!param) {
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles - ttcr;
      cycles_start = runtime.sim.cycles - ttcr;
      SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
    }
    }
  case 2:
  case 2:
    if (ttmr & SPR_TTMR_IE) {
    if (ttmr & SPR_TTMR_IE) {
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      setsprbits(SPR_TTMR, SPR_TTMR_IP, 1);
      /* be sure not to issue timer exception if an exception occured before it */
      /* be sure not to issue timer exception if an exception occured before it */
      if ((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE)
      if ((mfspr(SPR_SR) & SPR_SR_TEE) == SPR_SR_TEE)
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
        except_handle(EXCEPT_TICK, mfspr(SPR_EEAR_BASE));
      else
      else
        /* If TEE is currently not set we have to pend tick exception
        /* If TEE is currently not set we have to pend tick exception
           by rescheduling. */
           by rescheduling. */
        SCHED_ADD(tick_job, (void *)1, runtime.sim.cycles + 1);
        SCHED_ADD(tick_job, (void *)1, 1);
    }
    }
    break;
    break;
  }
  }
}
}
 
 
Line 95... Line 95...
  ttcr = value;
  ttcr = value;
  /* Remove previous if it exists */
  /* Remove previous if it exists */
  SCHED_FIND_REMOVE(tick_job, (void *)0);
  SCHED_FIND_REMOVE(tick_job, (void *)0);
  SCHED_FIND_REMOVE(tick_job, (void *)1);
  SCHED_FIND_REMOVE(tick_job, (void *)1);
  if (mode == 1 || mode == 2) {
  if (mode == 1 || mode == 2) {
    SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
    SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
    cycles_start = runtime.sim.cycles - ttcr;
    cycles_start = runtime.sim.cycles - ttcr;
  }
  }
}
}
 
 
void spr_write_ttmr (unsigned long value)
void spr_write_ttmr (unsigned long value)
Line 115... Line 115...
    case 1:    /* Timer should auto restart */
    case 1:    /* Timer should auto restart */
      sprs[SPR_TTCR] = ttcr = 0;
      sprs[SPR_TTCR] = ttcr = 0;
      cycles_start = runtime.sim.cycles;
      cycles_start = runtime.sim.cycles;
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_ADD(tick_job, (void *)0, runtime.sim.cycles + (ttmr & SPR_TTMR_PERIOD) - ttcr);
      SCHED_ADD(tick_job, (void *)0, (ttmr & SPR_TTMR_PERIOD) - ttcr);
      break;
      break;
    case 2:    /* Stop the timer when match */
    case 2:    /* Stop the timer when match */
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)0);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      SCHED_FIND_REMOVE(tick_job, (void *)1);
      break;
      break;

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.