Il Tue, Aug 07, 2007 at 02:08:08PM +0200, Luca ha scritto: > On 8/7/07, Dor Laor <[EMAIL PROTECTED]> wrote: > > Luca claims the HPET intefer the RTC. Can it be disabled? ( I know some > > new chipsets implement rtc using HPET). > > Basically HPET can operate in legacy mode - where it uses the same IRQ > as the RTC (and RTC won't deliver any interrupt) - or in "standard" > mode where the IO-APIC can be configured to deliver the interrupt on > any line. ATM Linux can only use the legacy mode. > You can of course disable HPET, but then it won't be available for > in-kernel timekeeping (in case e.g. the TSC is not stable/synced). I'd > rather add support for HPET as timer in QEMU...
Something like this. Ulrich can you give it a try: --- Patch against current GIT, but also applies to kvm-33. Run kvm with -use-hpet. qemu/vl.c | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 60 insertions(+), 2 deletions(-) diff --git a/qemu/vl.c b/qemu/vl.c index 4ad39f1..36628af 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 peridic 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-rtc use /dev/hpet (HPET) for timer alarm (do use gettimeofday)\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; Luca -- I went to God just to see And I was looking at me Saw heaven and hell were lies When I'm God everyone dies ------------------------------------------------------------------------- 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/ _______________________________________________ kvm-devel mailing list kvm-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/kvm-devel