Add support for HPET periodic timer.
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
@@ -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
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]
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]
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/