Skip to contentSkip to conversation

Add support for HPET periodic timer.

PATCH In review Luca Tettamanti 3 participants 4 messages Aug 10, 2007 – Aug 13, 2007 3 messages not in the archive KVM

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add support for HPET periodic timer.

Linux operates the HPET timer in legacy replacement mode, which means that the periodic interrupt of the CMOS RTC is not delivered (qemu won't be able to use /dev/rtc). Add support for HPET (/dev/hpet) as a replacement for the RTC; the periodic interrupt is delivered via SIGIO and is handled in the same way as the RTC timer.
HPET must be explicitly enabled with -use-hpet.

---
 qemu/vl.c |   62 +++++++++++++++++++++++++++++++++++++++++++++++++-
 1 files changed, 60 insertions(+), 2 deletions(-)
qemu/vl.c +60 -2
index 4ad39f1..db7262b 100644
@@ -54,6 +54,7 @@
 #include <pty.h>
 #include <malloc.h>
 #include <linux/rtc.h>
+#include <linux/hpet.h>
 #include <linux/ppdev.h>
 #endif
 #endif
@@ -996,8 +997,9 @@ static void host_alarm_handler(int host_signum)
 
 static int use_rtc = 1;
 static int rtc_fd;
+static int use_hpet;
 
-static int start_rtc_timer(void)
+static int enable_rtc(void)
 {
     rtc_fd = open("/dev/rtc", O_RDONLY);
     if (rtc_fd < 0)
@@ -1017,6 +1019,56 @@ static int start_rtc_timer(void)
     return 0;
 }
 
+static char default_hpet[] = "/dev/hpet";
+
+static int enable_hpet(void)
+{
+    struct hpet_info info;
+    int r;
+
+    rtc_fd = open(default_hpet, O_RDONLY);
+    if (rtc_fd < 0)
+        return -1;
+
+    /* Set frequency */
+    r = ioctl(rtc_fd, HPET_IRQFREQ, RTC_FREQ);
+    if (r < 0) {
+        fprintf(stderr, "Could not configure '/dev/hpet' to have a 1024 Hz timer. This is not a fatal\n"
+                "error, but for better emulation accuracy type:\n"
+                "'echo 1024 > /proc/sys/dev/hpet/max-user-freq' as root.\n");
+        goto fail;
+    }
+
+    /* Check capabilities */
+    r = ioctl(rtc_fd, HPET_INFO, &info);
+    if (r < 0)
+        goto fail;
+    
+    /* Enable periodic mode */
+    r = ioctl(rtc_fd, HPET_EPI, 0);
+    if (info.hi_flags && (r < 0))
+        goto fail;
+
+    /* Enable interrupt */
+    r = ioctl(rtc_fd, HPET_IE_ON, 0);
+    if (r < 0)
+        goto fail;
+
+    pit_min_timer_count = PIT_FREQ / RTC_FREQ;
+
+    return 0;
+fail:
+    close(rtc_fd);
+    return -1;
+}
+
+static int start_rtc_timer(void)
+{
+    if (use_hpet)
+        return enable_hpet();
+    else
+        return enable_rtc();
+}
 #else
 
 static int start_rtc_timer(void)
@@ -1090,7 +1142,7 @@ static void init_timer_alarm(void)
            2.6 kernels */
         if (itv.it_interval.tv_usec > 1000 || 1) {
             /* try to use /dev/rtc to have a faster timer */
-            if (!use_rtc || (start_rtc_timer() < 0))
+            if ((!use_rtc && !use_hpet) || (start_rtc_timer() < 0))
                 goto use_itimer;
             /* disable itimer */
             itv.it_interval.tv_sec = 0;
@@ -6482,6 +6534,7 @@ void help(void)
            "-tdf            inject timer interrupts that got lost\n"
 #if defined(__linux__)
            "-no-rtc         don't use /dev/rtc for timer alarm (do use gettimeofday)\n"
+           "-use-hpet       use /dev/hpet (HPET) instead of RTC for timer alarm\n"
 #endif
 	   "-option-rom rom load a file, rom, into the option ROM space\n"
            "\n"
@@ -6574,6 +6627,7 @@ enum {
     QEMU_OPTION_tdf,
 #if defined(__linux__)
     QEMU_OPTION_no_rtc,
+    QEMU_OPTION_use_hpet,
 #endif
     QEMU_OPTION_cpu_vendor,
 };
@@ -6671,6 +6725,7 @@ const QEMUOption qemu_options[] = {
     { "tdf", 0, QEMU_OPTION_tdf }, /* enable time drift fix */
 #if defined(__linux__)
     { "no-rtc", 0, QEMU_OPTION_no_rtc },
+    { "use-hpet", 0, QEMU_OPTION_use_hpet },
 #endif
     { "cpu-vendor", HAS_ARG, QEMU_OPTION_cpu_vendor },
     { NULL },
@@ -7395,6 +7450,9 @@ int main(int argc, char **argv)
 	    case QEMU_OPTION_no_rtc:
 		use_rtc = 0;
 		break;
+	    case QEMU_OPTION_use_hpet:
+		use_hpet = 1;
+		break;
 #endif
 	    case QEMU_OPTION_cpu_vendor:
 		cpu_vendor_string = optarg;
Signature · 8 lines
1.5.2.3


-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

A message that is not in the archive (sent off-list or not yet received): 11867779422209-git-send-email-kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org

#2 lore raw
Quoted 8 lines · Luca Tettamanti

Linux operates the HPET timer in legacy replacement mode, which means that the periodic interrupt of the CMOS RTC is not delivered (qemu won't be able to use /dev/rtc). Add support for HPET (/dev/hpet) as a replacement for the RTC; the periodic interrupt is delivered via SIGIO and is handled in the same way as the RTC timer.
HPET must be explicitly enabled with -use-hpet.

Are there any downsides to using HPET? If not, I suggest making it the default, in order to reduce complexity for the user.

Something like:

- try to use HPET (unless -no-rtc selected)
- try to use RTC (unless -no-rtc selected)
- fallback to normal unix facilities

Signature · 1 line
error compiling committee.c: too many arguments to function

A message that is not in the archive (sent off-list or not yet received): 46C0109E.3090800-atKUWr5tajBWk0Htik3J/[email protected]

#4 lore raw
Quoted 10 lines · Avi Kivity
Quoted 8 lines · Luca Tettamanti

Linux operates the HPET timer in legacy replacement mode, which means that the periodic interrupt of the CMOS RTC is not delivered (qemu won't be able to use /dev/rtc). Add support for HPET (/dev/hpet) as a replacement for the RTC; the periodic interrupt is delivered via SIGIO and is handled in the same way as the RTC timer.
HPET must be explicitly enabled with -use-hpet.

Quoted 2 lines

Are there any downsides to using HPET? If not, I suggest making it the default, in order to reduce complexity for the user.

Only downside is that not all machines have HPET, and many which do have it disabled in BIOS for 'compatability' with Windows, but if you always fallback to trying RTC too, that's not an issue.

Quoted 5 lines

Something like:

- try to use HPET (unless -no-rtc selected)
- try to use RTC (unless -no-rtc selected)
- fallback to normal unix facilities

If we're going to add command line args it probably makes sense to be a little more generic than -no-rtc or -use-hpet. Have a list of preferred clock sources eg

-clock hpet,rtc,unix

If -clock is omitted, then default to trying all in the priority you describe.

Dan.

Signature · 10 lines
|=- Red Hat, Engineering, Emerging Technologies, Boston.  +1 978 392 2496 -=|
|=-           Perl modules: http://search.cpan.org/~danberr/              -=|
|=-               Projects: http://freshmeat.net/~danielpb/               -=|
|=-  GnuPG: 7D3B9505   F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505  -=| 

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems?  Stop.
Now Search log events and configuration files using AJAX and a browser.
Download your FREE copy of Splunk now >>  http://get.splunk.com/

A message that is not in the archive (sent off-list or not yet received): [email protected]

author
#6 lore raw
Quoted 8 lines · Daniel P. Berrange
Quoted 6 lines · Avi Kivity

Luca Tettamanti wrote:
Something like:

- try to use HPET (unless -no-rtc selected)
- try to use RTC (unless -no-rtc selected)
- fallback to normal unix facilities

Quoted 8 lines

If we're going to add command line args it probably makes sense to be a little more generic than -no-rtc or -use-hpet. Have a list of preferred clock sources eg

-clock hpet,rtc,unix

If -clock is omitted, then default to trying all in the priority you describe.

Makes sense, I'll prepare a patch (maybe after a couple of days of vacation :P).

Luca

-------------------------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc.
Still grepping through log files to find problems? Stop. Now Search log events and configuration files using AJAX and a browser. Download your FREE copy of Splunk now >> http://get.splunk.com/