Commit e856f2ad014e6cb1bd3eca126be23b8f919f3dd1
1 parent
c9a33054
Use a QEMUBH when an OMAP timer must expire immediately.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5265 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
14 additions
and
10 deletions
hw/omap1.c
| ... | ... | @@ -664,6 +664,7 @@ struct omap_mpu_timer_s { |
| 664 | 664 | uint32_t val; |
| 665 | 665 | int64_t time; |
| 666 | 666 | QEMUTimer *timer; |
| 667 | + QEMUBH *tick; | |
| 667 | 668 | int64_t rate; |
| 668 | 669 | int it_ena; |
| 669 | 670 | |
| ... | ... | @@ -708,21 +709,15 @@ static inline void omap_timer_update(struct omap_mpu_timer_s *timer) |
| 708 | 709 | * ticks. */ |
| 709 | 710 | if (expires > (ticks_per_sec >> 10) || timer->ar) |
| 710 | 711 | qemu_mod_timer(timer->timer, timer->time + expires); |
| 711 | - else { | |
| 712 | - timer->val = 0; | |
| 713 | - timer->st = 0; | |
| 714 | - if (timer->it_ena) | |
| 715 | - /* Edge-triggered irq */ | |
| 716 | - qemu_irq_pulse(timer->irq); | |
| 717 | - } | |
| 712 | + else | |
| 713 | + qemu_bh_schedule(timer->tick); | |
| 718 | 714 | } else |
| 719 | 715 | qemu_del_timer(timer->timer); |
| 720 | 716 | } |
| 721 | 717 | |
| 722 | -static void omap_timer_tick(void *opaque) | |
| 718 | +static void omap_timer_fire(void *opaque) | |
| 723 | 719 | { |
| 724 | - struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque; | |
| 725 | - omap_timer_sync(timer); | |
| 720 | + struct omap_mpu_timer_s *timer = opaque; | |
| 726 | 721 | |
| 727 | 722 | if (!timer->ar) { |
| 728 | 723 | timer->val = 0; |
| ... | ... | @@ -732,6 +727,14 @@ static void omap_timer_tick(void *opaque) |
| 732 | 727 | if (timer->it_ena) |
| 733 | 728 | /* Edge-triggered irq */ |
| 734 | 729 | qemu_irq_pulse(timer->irq); |
| 730 | +} | |
| 731 | + | |
| 732 | +static void omap_timer_tick(void *opaque) | |
| 733 | +{ | |
| 734 | + struct omap_mpu_timer_s *timer = (struct omap_mpu_timer_s *) opaque; | |
| 735 | + | |
| 736 | + omap_timer_sync(timer); | |
| 737 | + omap_timer_fire(timer); | |
| 735 | 738 | omap_timer_update(timer); |
| 736 | 739 | } |
| 737 | 740 | |
| ... | ... | @@ -835,6 +838,7 @@ struct omap_mpu_timer_s *omap_mpu_timer_init(target_phys_addr_t base, |
| 835 | 838 | s->clk = clk; |
| 836 | 839 | s->base = base; |
| 837 | 840 | s->timer = qemu_new_timer(vm_clock, omap_timer_tick, s); |
| 841 | + s->tick = qemu_bh_new(omap_timer_fire, s); | |
| 838 | 842 | omap_mpu_timer_reset(s); |
| 839 | 843 | omap_timer_clk_setup(s); |
| 840 | 844 | ... | ... |