/[qemu]/qemu/hw/slavio_timer.c
ViewVC logotype

Diff of /qemu/hw/slavio_timer.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1.2 by bellard, Wed Apr 6 20:47:48 2005 UTC revision 1.3 by bellard, Mon Dec 5 20:31:52 2005 UTC
# Line 42  do { printf("TIMER: " fmt , ##args); } w Line 42  do { printf("TIMER: " fmt , ##args); } w
42   * The 31-bit counter is incremented every 500ns by bit 9. Bits 8..0   * The 31-bit counter is incremented every 500ns by bit 9. Bits 8..0
43   * are zero. Bit 31 is 1 when count has been reached.   * are zero. Bit 31 is 1 when count has been reached.
44   *   *
45     * Per-CPU timers interrupt local CPU, system timer uses normal
46     * interrupt routing.
47     *
48   */   */
49    
50  typedef struct SLAVIO_TIMERState {  typedef struct SLAVIO_TIMERState {
# Line 53  typedef struct SLAVIO_TIMERState { Line 56  typedef struct SLAVIO_TIMERState {
56      int irq;      int irq;
57      int reached, stopped;      int reached, stopped;
58      int mode; // 0 = processor, 1 = user, 2 = system      int mode; // 0 = processor, 1 = user, 2 = system
59        unsigned int cpu;
60  } SLAVIO_TIMERState;  } SLAVIO_TIMERState;
61    
62  #define TIMER_MAXADDR 0x1f  #define TIMER_MAXADDR 0x1f
63  #define CNT_FREQ 2000000  #define CNT_FREQ 2000000
 #define MAX_CPUS 16  
64    
65  // Update count, set irq, update expire_time  // Update count, set irq, update expire_time
66  static void slavio_timer_get_out(SLAVIO_TIMERState *s)  static void slavio_timer_get_out(SLAVIO_TIMERState *s)
# Line 73  static void slavio_timer_get_out(SLAVIO_ Line 76  static void slavio_timer_get_out(SLAVIO_
76      else      else
77          ticks = qemu_get_clock(vm_clock) - s->tick_offset;          ticks = qemu_get_clock(vm_clock) - s->tick_offset;
78    
79      out = (ticks >= s->expire_time);      out = (ticks > s->expire_time);
80      if (out)      if (out)
81          s->reached = 0x80000000;          s->reached = 0x80000000;
82      if (!s->limit)      if (!s->limit)
# Line 100  static void slavio_timer_get_out(SLAVIO_ Line 103  static void slavio_timer_get_out(SLAVIO_
103      DPRINTF("irq %d limit %d reached %d d %lld count %d s->c %x diff %lld stopped %d mode %d\n", s->irq, limit, s->reached?1:0, (ticks-s->count_load_time), count, s->count, s->expire_time - ticks, s->stopped, s->mode);      DPRINTF("irq %d limit %d reached %d d %lld count %d s->c %x diff %lld stopped %d mode %d\n", s->irq, limit, s->reached?1:0, (ticks-s->count_load_time), count, s->count, s->expire_time - ticks, s->stopped, s->mode);
104    
105      if (s->mode != 1)      if (s->mode != 1)
106          pic_set_irq(s->irq, out);          pic_set_irq_cpu(s->irq, out, s->cpu);
107  }  }
108    
109  // timer callback  // timer callback
# Line 127  static uint32_t slavio_timer_mem_readl(v Line 130  static uint32_t slavio_timer_mem_readl(v
130          // part of counter (user mode)          // part of counter (user mode)
131          if (s->mode != 1) {          if (s->mode != 1) {
132              // clear irq              // clear irq
133              pic_set_irq(s->irq, 0);              pic_set_irq_cpu(s->irq, 0, s->cpu);
134              s->count_load_time = qemu_get_clock(vm_clock);              s->count_load_time = qemu_get_clock(vm_clock);
135              s->reached = 0;              s->reached = 0;
136              return s->limit;              return s->limit;
# Line 263  static void slavio_timer_reset(void *opa Line 266  static void slavio_timer_reset(void *opa
266      slavio_timer_get_out(s);      slavio_timer_get_out(s);
267  }  }
268    
269  static void slavio_timer_init_internal(uint32_t addr, int irq, int mode)  void slavio_timer_init(uint32_t addr, int irq, int mode, unsigned int cpu)
270  {  {
271      int slavio_timer_io_memory;      int slavio_timer_io_memory;
272      SLAVIO_TIMERState *s;      SLAVIO_TIMERState *s;
# Line 273  static void slavio_timer_init_internal(u Line 276  static void slavio_timer_init_internal(u
276          return;          return;
277      s->irq = irq;      s->irq = irq;
278      s->mode = mode;      s->mode = mode;
279        s->cpu = cpu;
280      s->irq_timer = qemu_new_timer(vm_clock, slavio_timer_irq, s);      s->irq_timer = qemu_new_timer(vm_clock, slavio_timer_irq, s);
281    
282      slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read,      slavio_timer_io_memory = cpu_register_io_memory(0, slavio_timer_mem_read,
# Line 282  static void slavio_timer_init_internal(u Line 286  static void slavio_timer_init_internal(u
286      qemu_register_reset(slavio_timer_reset, s);      qemu_register_reset(slavio_timer_reset, s);
287      slavio_timer_reset(s);      slavio_timer_reset(s);
288  }  }
   
 void slavio_timer_init(uint32_t addr1, int irq1, uint32_t addr2, int irq2)  
 {  
     int i;  
   
     for (i = 0; i < MAX_CPUS; i++) {  
         slavio_timer_init_internal(addr1 + i * TARGET_PAGE_SIZE, irq1, 0);  
     }  
   
     slavio_timer_init_internal(addr2, irq2, 2);  
 }  

Legend:
Removed from v.1.2  
changed lines
  Added in v.1.3

savannah-hackers-public@gnu.org
ViewVC Help
Powered by ViewVC 1.1.26