aboutsummaryrefslogtreecommitdiff
path: root/system/qemu-kvm/patches/deprecate-time-drift-fix.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/qemu-kvm/patches/deprecate-time-drift-fix.patch')
-rw-r--r--system/qemu-kvm/patches/deprecate-time-drift-fix.patch150
1 files changed, 150 insertions, 0 deletions
diff --git a/system/qemu-kvm/patches/deprecate-time-drift-fix.patch b/system/qemu-kvm/patches/deprecate-time-drift-fix.patch
new file mode 100644
index 0000000000000..56def2d391a1f
--- /dev/null
+++ b/system/qemu-kvm/patches/deprecate-time-drift-fix.patch
@@ -0,0 +1,150 @@
+From d527b774878defc27f317cdde19b5c54fd0d5666 Mon Sep 17 00:00:00 2001
+From: Jan Kiszka <jan.kiszka@siemens.com>
+Date: Sun, 15 Jan 2012 12:06:12 +0100
+Subject: [PATCH] qemu-kvm: Deprecate time drift fix
+
+Remove this divergence from upstream. It is practically unused today as
+the default mode is in-kernel irqchip. We keep the command line switch
+for now, adding a warning that there is no effect anymore.
+
+The feature can be reintroduced to upstream once we have IRQ paths with
+feedback support.
+
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Signed-off-by: Marcelo Tosatti <mtosatti@redhat.com>
+---
+ hw/i8254.c | 28 ++--------------------------
+ hw/i8259.c | 17 -----------------
+ qemu-options.hx | 4 ++--
+ vl.c | 4 ++--
+ 4 files changed, 6 insertions(+), 47 deletions(-)
+
+diff --git a/hw/i8254.c b/hw/i8254.c
+index d73a5f2..50ecceb 100644
+--- a/hw/i8254.c
++++ b/hw/i8254.c
+@@ -347,11 +347,6 @@ static uint32_t pit_ioport_read(void *opaque, uint32_t addr)
+ return ret;
+ }
+
+-/* global counters for time-drift fix */
+-int64_t timer_acks=0, timer_interrupts=0, timer_ints_to_push=0;
+-
+-extern int time_drift_fix;
+-
+ static void pit_irq_timer_update(PITChannelState *s, int64_t current_time)
+ {
+ int64_t expire_time;
+@@ -362,35 +357,16 @@ static void pit_irq_timer_update(PITChannelState *s, int64_t current_time)
+ expire_time = pit_get_next_transition_time(s, current_time);
+ irq_level = pit_get_out1(s, current_time);
+ qemu_set_irq(s->irq, irq_level);
+- if (time_drift_fix && irq_level==1) {
+- /* FIXME: fine tune timer_max_fix (max fix per tick).
+- * Should it be 1 (double time), 2 , 4, 10 ?
+- * Currently setting it to 5% of PIT-ticks-per-second (per PIT-tick)
+- */
+- const long pit_ticks_per_sec = (s->count>0) ? (PIT_FREQ/s->count) : 0;
+- const long timer_max_fix = pit_ticks_per_sec/20;
+- const long delta = timer_interrupts - timer_acks;
+- const long max_delta = pit_ticks_per_sec * 60; /* one minute */
+- if ((delta > max_delta) && (pit_ticks_per_sec > 0)) {
+- printf("time drift is too long, %ld seconds were lost\n", delta/pit_ticks_per_sec);
+- timer_acks = timer_interrupts;
+- timer_ints_to_push = 0;
+- } else if (delta > 0) {
+- timer_ints_to_push = MIN(delta, timer_max_fix);
+- }
+- timer_interrupts++;
+- }
+ #ifdef DEBUG_PIT
+ printf("irq_level=%d next_delay=%f\n",
+ irq_level,
+ (double)(expire_time - current_time) / get_ticks_per_sec());
+ #endif
+ s->next_transition_time = expire_time;
+- if (expire_time != -1) {
++ if (expire_time != -1)
+ qemu_mod_timer(s->irq_timer, expire_time);
+- } else {
++ else
+ qemu_del_timer(s->irq_timer);
+- }
+ }
+
+ static void pit_irq_timer(void *opaque)
+diff --git a/hw/i8259.c b/hw/i8259.c
+index 7e17071..0632ea2 100644
+--- a/hw/i8259.c
++++ b/hw/i8259.c
+@@ -210,9 +210,6 @@ static void pic_intack(PicState *s, int irq)
+ pic_update_irq(s);
+ }
+
+-extern int time_drift_fix;
+-extern int64_t timer_acks, timer_ints_to_push;
+-
+ int pic_read_irq(PicState *s)
+ {
+ int irq, irq2, intno;
+@@ -232,20 +229,6 @@ int pic_read_irq(PicState *s)
+ intno = s->irq_base + irq;
+ }
+ pic_intack(s, irq);
+-
+- /* FIXME: limit to x86, or better, to platforms where irq0 is the
+- * timer interrupts. */
+-
+- if (time_drift_fix && s->master && irq == 0) {
+- timer_acks++;
+- if (timer_ints_to_push > 0) {
+- timer_ints_to_push--;
+- /* simulate an edge irq0, like the one generated by i8254 */
+- pic_set_irq(s, 0, 0);
+- pic_set_irq(s, 0, 1);
+- }
+- }
+-
+ } else {
+ /* spurious IRQ on host controller */
+ irq = 7;
+diff --git a/qemu-options.hx b/qemu-options.hx
+index c645f87..d567ba3 100644
+--- a/qemu-options.hx
++++ b/qemu-options.hx
+@@ -2633,8 +2633,8 @@ DEF("no-kvm-pit-reinjection", 0, QEMU_OPTION_no_kvm_pit_reinjection,
+ "-no-kvm-pit-reinjection\n"
+ " disable KVM kernel mode PIT interrupt reinjection\n",
+ QEMU_ARCH_I386)
+-DEF("tdf", 0, QEMU_OPTION_tdf,
+- "-tdf enable guest time drift compensation\n", QEMU_ARCH_ALL)
++HXCOMM -tdf is deprecated and ignored today
++DEF("tdf", 0, QEMU_OPTION_tdf, "", QEMU_ARCH_ALL)
+ DEF("kvm-shadow-memory", HAS_ARG, QEMU_OPTION_kvm_shadow_memory,
+ "-kvm-shadow-memory MEGABYTES\n"
+ " allocate MEGABYTES for kvm mmu shadowing\n",
+diff --git a/vl.c b/vl.c
+index c009eb8..1a77de1 100644
+--- a/vl.c
++++ b/vl.c
+@@ -222,7 +222,6 @@ const char *watchdog;
+ QEMUOptionRom option_rom[MAX_OPTION_ROMS];
+ int nb_option_roms;
+ int semihosting_enabled = 0;
+-int time_drift_fix = 0;
+ unsigned int kvm_shadow_memory = 0;
+ int old_param = 0;
+ const char *qemu_name;
+@@ -2955,7 +2954,8 @@ int main(int argc, char **argv, char **envp)
+ semihosting_enabled = 1;
+ break;
+ case QEMU_OPTION_tdf:
+- time_drift_fix = 1;
++ fprintf(stderr, "Warning: user space PIT time drift fix "
++ "is no longer supported.\n");
+ break;
+ case QEMU_OPTION_kvm_shadow_memory:
+ kvm_shadow_memory = (int64_t)atoi(optarg) * 1024 * 1024 / 4096;
+--
+1.7.6.5
+