* [Qemu-devel] [PATCH] Add support for HPET periodic timer.
@ 2007-08-10 20:32 Luca Tettamanti
2007-08-13 8:04 ` [Qemu-devel] Re: [kvm-devel] " Avi Kivity
0 siblings, 1 reply; 4+ messages in thread
From: Luca Tettamanti @ 2007-08-10 20:32 UTC (permalink / raw)
To: qemu-devel; +Cc: kvm-devel, 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@gmail.com>
---
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
^ permalink raw reply related [flat|nested] 4+ messages in thread
* [Qemu-devel] Re: [kvm-devel] [PATCH] Add support for HPET periodic timer.
2007-08-10 20:32 [Qemu-devel] [PATCH] Add support for HPET periodic timer Luca Tettamanti
@ 2007-08-13 8:04 ` Avi Kivity
2007-08-13 11:50 ` Daniel P. Berrange
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, qemu-devel
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
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] Re: [kvm-devel] [PATCH] Add support for HPET periodic timer.
2007-08-13 8:04 ` [Qemu-devel] Re: [kvm-devel] " Avi Kivity
@ 2007-08-13 11:50 ` Daniel P. Berrange
2007-08-13 17:03 ` Luca
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, Luca Tettamanti, qemu-devel
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 -=|
^ permalink raw reply [flat|nested] 4+ messages in thread
* [Qemu-devel] Re: [kvm-devel] [PATCH] Add support for HPET periodic timer.
2007-08-13 11:50 ` Daniel P. Berrange
@ 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, qemu-devel
On 8/13/07, Daniel P. Berrange <berrange@redhat.com> 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
^ 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 [Qemu-devel] [PATCH] Add support for HPET periodic timer Luca Tettamanti
2007-08-13 8:04 ` [Qemu-devel] Re: [kvm-devel] " Avi Kivity
2007-08-13 11:50 ` Daniel P. Berrange
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;
as well as URLs for NNTP newsgroup(s).