qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Paolo Bonzini <pbonzini@redhat.com>
To: qemu-devel@nongnu.org
Cc: Maria Klimushenkova <maria.klimushenkova@ispras.ru>,
	Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Subject: [Qemu-devel] [PULL 04/52] hpet: recover timer offset correctly
Date: Fri, 12 Jan 2018 12:30:28 +0100	[thread overview]
Message-ID: <1515756676-3860-5-git-send-email-pbonzini@redhat.com> (raw)
In-Reply-To: <1515756676-3860-1-git-send-email-pbonzini@redhat.com>

From: Maria Klimushenkova <maria.klimushenkova@ispras.ru>

HPET saves its state by calculating the current time and recovers timer
offset using this calculated value. But these calculations include
divisions and multiplications. Therefore the timer state cannot be recovered
precise enough.
This patch introduces saving of the original value of the offset to
preserve the determinism of the timer.

Signed-off-by: Maria Klimushenkova <maria.klimushenkova@ispras.ru>
Signed-off-by: Pavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Message-Id: <20171220100205.16625.84632.stgit@pasha-VirtualBox>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
---
 hw/timer/hpet.c | 32 ++++++++++++++++++++++++++++++--
 1 file changed, 30 insertions(+), 2 deletions(-)

diff --git a/hw/timer/hpet.c b/hw/timer/hpet.c
index 577371b..4904a60 100644
--- a/hw/timer/hpet.c
+++ b/hw/timer/hpet.c
@@ -70,6 +70,7 @@ typedef struct HPETState {
 
     MemoryRegion iomem;
     uint64_t hpet_offset;
+    bool hpet_offset_loaded;
     qemu_irq irqs[HPET_NUM_IRQ_ROUTES];
     uint32_t flags;
     uint8_t rtc_irq_level;
@@ -221,7 +222,9 @@ static int hpet_pre_save(void *opaque)
     HPETState *s = opaque;
 
     /* save current counter value */
-    s->hpet_counter = hpet_get_ticks(s);
+    if (hpet_enabled(s)) {
+        s->hpet_counter = hpet_get_ticks(s);
+    }
 
     return 0;
 }
@@ -232,6 +235,8 @@ static int hpet_pre_load(void *opaque)
 
     /* version 1 only supports 3, later versions will load the actual value */
     s->num_timers = HPET_MIN_TIMERS;
+    /* for checking whether the hpet_offset section is loaded */
+    s->hpet_offset_loaded = false;
     return 0;
 }
 
@@ -252,7 +257,10 @@ static int hpet_post_load(void *opaque, int version_id)
     HPETState *s = opaque;
 
     /* Recalculate the offset between the main counter and guest time */
-    s->hpet_offset = ticks_to_ns(s->hpet_counter) - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+    if (!s->hpet_offset_loaded) {
+        s->hpet_offset = ticks_to_ns(s->hpet_counter)
+                        - qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL);
+    }
 
     /* Push number of timers into capability returned via HPET_ID */
     s->capability &= ~HPET_ID_NUM_TIM_MASK;
@@ -267,6 +275,14 @@ static int hpet_post_load(void *opaque, int version_id)
     return 0;
 }
 
+static int hpet_offset_post_load(void *opaque, int version_id)
+{
+    HPETState *s = opaque;
+
+    s->hpet_offset_loaded = true;
+    return 0;
+}
+
 static bool hpet_rtc_irq_level_needed(void *opaque)
 {
     HPETState *s = opaque;
@@ -285,6 +301,17 @@ static const VMStateDescription vmstate_hpet_rtc_irq_level = {
     }
 };
 
+static const VMStateDescription vmstate_hpet_offset = {
+    .name = "hpet/offset",
+    .version_id = 1,
+    .minimum_version_id = 1,
+    .post_load = hpet_offset_post_load,
+    .fields = (VMStateField[]) {
+        VMSTATE_UINT64(hpet_offset, HPETState),
+        VMSTATE_END_OF_LIST()
+    }
+};
+
 static const VMStateDescription vmstate_hpet_timer = {
     .name = "hpet_timer",
     .version_id = 1,
@@ -320,6 +347,7 @@ static const VMStateDescription vmstate_hpet = {
     },
     .subsections = (const VMStateDescription*[]) {
         &vmstate_hpet_rtc_irq_level,
+        &vmstate_hpet_offset,
         NULL
     }
 };
-- 
1.8.3.1

  parent reply	other threads:[~2018-01-12 11:31 UTC|newest]

Thread overview: 60+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-01-12 11:30 [Qemu-devel] [PULL 00/52] Misc patches for 2017-01-12 Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 01/52] scsi-generic: Add share-rw option Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 02/52] scsi: fix scsi_convert_sense crash when in_buf == NULL && in_len == 0 Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 03/52] pc: fail memory hot-plug/unplug with -no-acpi and Q35 machine type Paolo Bonzini
2018-01-12 11:30 ` Paolo Bonzini [this message]
2018-01-12 11:47   ` [Qemu-devel] [PULL 04/52] hpet: recover timer offset correctly Pavel Dovgalyuk
2018-01-12 12:08     ` Paolo Bonzini
2018-01-12 12:18       ` Pavel Dovgalyuk
2018-01-12 12:21         ` Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 05/52] i386/cpu/kvm: look at PMU's CPUID before setting MSRs Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 06/52] chardev: use backend chr context when watch for fe Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 07/52] chardev: let g_idle_add() be with chardev gcontext Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 08/52] chardev: introduce qemu_chr_timeout_add_ms() Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 09/52] build-sys: fix qemu-ga -pthread linking Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 10/52] build-sys: silence make by default or V=0 Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 11/52] build-sys: add a rule to print a variable Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 12/52] build-sys: compile with -Og or -O1 when --enable-debug Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 13/52] tests/docker: add some sanitizers to fedora dockerfile Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 14/52] tests/docker: add test-debug Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 15/52] build-sys: add some sanitizers when --enable-debug if possible Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 16/52] tests: fix check-qobject leak Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 17/52] vl: fix direct firmware directories leak Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 18/52] readline: add a free function Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 19/52] tests: fix migration-test leak Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 20/52] crypto: fix stack-buffer-overflow error Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 21/52] qemu-config: fix leak in query-command-line-options Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 22/52] tests: fix qmp-test leak Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 23/52] ucontext: annotate coroutine stack for ASAN Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 24/52] tests: fix coroutine leak in /basic/entered Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 25/52] mips: fix potential fopen(NULL,...) Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 26/52] disas/s390: fix global-buffer-overflow Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 27/52] scsi-disk: release AioContext in unaligned WRITE SAME case Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 28/52] tests/boot-serial-test: Add tests for microblaze boards Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 29/52] tests/boot-serial-test: Add a test for the moxiesim machine Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 30/52] tests/boot-serial-test: Add support for the raspi2 machine Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 31/52] target/i386: move hflags update code to a function Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 32/52] target/i386: hax: change to use x86_update_hflags Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 33/52] target/i386: hax: Move x86_update_hflags Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 34/52] target-i386: update hflags on Hypervisor.framework Paolo Bonzini
2018-01-12 11:30 ` [Qemu-devel] [PULL 35/52] scripts/qemu-gdb: add simple tcg lock status helper Paolo Bonzini
2018-01-12 12:37   ` Alex Bennée
2018-01-12 11:31 ` [Qemu-devel] [PULL 36/52] scripts/qemu-gdb/timers.py: new helper to dump timer state Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 37/52] icount: fixed saving/restoring of icount warp timers Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 38/52] cpus: unify qemu_*_wait_io_event Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 39/52] irq: fix memory leak Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 40/52] net: Drop unusual use of do { } while (0); Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 41/52] mips: Tweak location of ';' in macros Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 42/52] chardev: Use goto/label instead of do/break/while(0) Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 43/52] chardev: Clean up previous patch indentation Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 44/52] tests: Avoid 'do/while(false); ' in vhost-user-bridge Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 45/52] maint: Fix macros with broken 'do/while(0); ' usage Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 46/52] checkpatch: Enforce proper do/while (0) style Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 47/52] find_ram_offset: Add comments and tracing Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 48/52] find_ram_offset: Align ram_addr_t allocation on long boundaries Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 49/52] block/iscsi: fix initialization of iTask in iscsi_co_get_block_status Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 50/52] cpu: flush TB cache when loading VMState Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 51/52] util/qemu-thread-*: add qemu_lock, locked and unlock trace events Paolo Bonzini
2018-01-12 11:31 ` [Qemu-devel] [PULL 52/52] scripts/analyse-locks-simpletrace.py: script to analyse lock times Paolo Bonzini
2018-01-12 18:38   ` Eric Blake
  -- strict thread matches above, loose matches on Subject: below --
2018-01-12 12:24 [Qemu-devel] [PULL v2 00/52] Misc patches for 2017-01-12 Paolo Bonzini
2018-01-12 12:24 ` [Qemu-devel] [PULL 04/52] hpet: recover timer offset correctly Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1515756676-3860-5-git-send-email-pbonzini@redhat.com \
    --to=pbonzini@redhat.com \
    --cc=maria.klimushenkova@ispras.ru \
    --cc=pavel.dovgaluk@ispras.ru \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).