* [PATCH] Add support for HPET periodic timer.
@ 2007-08-10 20:32 Luca Tettamanti
[not found] ` <11867779422209-git-send-email-kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
0 siblings, 1 reply; 4+ messages in thread
From: Luca Tettamanti @ 2007-08-10 20:32 UTC (permalink / raw)
To: qemu-devel-qX2TKyscuCcdnm+yROfE0A
Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, 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.
Signed-off-by: Luca Tettamanti <kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
---
qemu/vl.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/qemu/vl.c b/qemu/vl.c
index 4ad39f1..db7262b 100644
--- a/qemu/vl.c
+++ b/qemu/vl.c
@@ -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;
--
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/
^ permalink raw reply related [flat|nested] 4+ messages in thread[parent not found: <11867779422209-git-send-email-kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>]
* Re: [PATCH] Add support for HPET periodic timer. [not found] ` <11867779422209-git-send-email-kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> @ 2007-08-13 8:04 ` Avi Kivity [not found] ` <46C0109E.3090800-atKUWr5tajBWk0Htik3J/w@public.gmane.org> 0 siblings, 1 reply; 4+ messages in thread From: Avi Kivity @ 2007-08-13 8:04 UTC (permalink / raw) To: Luca Tettamanti Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, qemu-devel-qX2TKyscuCcdnm+yROfE0A Luca Tettamanti wrote: > 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 -- error compiling committee.c: too many arguments to function ------------------------------------------------------------------------- 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/ ^ permalink raw reply [flat|nested] 4+ messages in thread
[parent not found: <46C0109E.3090800-atKUWr5tajBWk0Htik3J/w@public.gmane.org>]
* Re: [PATCH] Add support for HPET periodic timer. [not found] ` <46C0109E.3090800-atKUWr5tajBWk0Htik3J/w@public.gmane.org> @ 2007-08-13 11:50 ` Daniel P. Berrange [not found] ` <20070813115030.GB14348-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> 0 siblings, 1 reply; 4+ messages in thread From: Daniel P. Berrange @ 2007-08-13 11:50 UTC (permalink / raw) To: Avi Kivity Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, qemu-devel-qX2TKyscuCcdnm+yROfE0A On Mon, Aug 13, 2007 at 11:04:46AM +0300, Avi Kivity wrote: > Luca Tettamanti wrote: > > 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. 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. > 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. -- |=- 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/ ^ permalink raw reply [flat|nested] 4+ messages in thread
[parent not found: <20070813115030.GB14348-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>]
* Re: [PATCH] Add support for HPET periodic timer. [not found] ` <20070813115030.GB14348-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> @ 2007-08-13 17:03 ` Luca 0 siblings, 0 replies; 4+ messages in thread From: Luca @ 2007-08-13 17:03 UTC (permalink / raw) To: Daniel P. Berrange Cc: kvm-devel-5NWGOfrQmneRv+LV9MX5uipxlwaOVQ5f, qemu-devel-qX2TKyscuCcdnm+yROfE0A On 8/13/07, Daniel P. Berrange <berrange-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org> wrote: > On Mon, Aug 13, 2007 at 11:04:46AM +0300, Avi Kivity wrote: > > 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 > > 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/ ^ permalink raw reply [flat|nested] 4+ messages in thread
end of thread, other threads:[~2007-08-13 17:03 UTC | newest]
Thread overview: 4+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2007-08-10 20:32 [PATCH] Add support for HPET periodic timer Luca Tettamanti
[not found] ` <11867779422209-git-send-email-kronos.it-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
2007-08-13 8:04 ` Avi Kivity
[not found] ` <46C0109E.3090800-atKUWr5tajBWk0Htik3J/w@public.gmane.org>
2007-08-13 11:50 ` Daniel P. Berrange
[not found] ` <20070813115030.GB14348-H+wXaHxf7aLQT0dZR+AlfA@public.gmane.org>
2007-08-13 17:03 ` Luca
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox