summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJean-Christophe DUBOIS2012-12-03 13:55:57 +0100
committerPeter Maydell2012-12-11 13:54:47 +0100
commit97331270e50f5858c82a0c6d146da81f5b776535 (patch)
treee6dddc24f783cfe7652293c6469506d29a770b80
parenthw/arm_gic: fix target CPUs affected by set enable/pending ops (diff)
downloadqemu-97331270e50f5858c82a0c6d146da81f5b776535.tar.gz
qemu-97331270e50f5858c82a0c6d146da81f5b776535.tar.xz
qemu-97331270e50f5858c82a0c6d146da81f5b776535.zip
exynos4210/mct: Avoid infinite loop on non incremental timers
Check for a 0 "distance" value to avoid infinite loop when the expired FCR timer was not programed with auto-increment. With this change the behavior is coherent with the same type of code in the exynos4210_gfrc_restart() function in the same file. Linux seems to mostly use this timer with auto-increment which explain why it is not a problem most of the time. However other OS might have a problem with this if they don't use the auto-increment feature. Signed-off-by: Jean-Christophe DUBOIS <jcd@tribudubois.net> Reviewed-by: Evgeny Voevodin <e.voevodin@samsung.com> Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
-rw-r--r--hw/exynos4210_mct.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/hw/exynos4210_mct.c b/hw/exynos4210_mct.c
index e79cd6ac01..37dbda92df 100644
--- a/hw/exynos4210_mct.c
+++ b/hw/exynos4210_mct.c
@@ -568,7 +568,7 @@ static void exynos4210_gfrc_event(void *opaque)
/* Reload FRC to reach nearest comparator */
s->g_timer.curr_comp = exynos4210_gcomp_find(s);
distance = exynos4210_gcomp_get_distance(s, s->g_timer.curr_comp);
- if (distance > MCT_GT_COUNTER_STEP) {
+ if (distance > MCT_GT_COUNTER_STEP || !distance) {
distance = MCT_GT_COUNTER_STEP;
}
exynos4210_gfrc_set_count(&s->g_timer, distance);