diff --git a/src/xenxs/xen_sxpr.c b/src/xenxs/xen_sxpr.c
index 86902865d6..72fb81aeed 100644
--- a/src/xenxs/xen_sxpr.c
+++ b/src/xenxs/xen_sxpr.c
@@ -1175,6 +1175,23 @@ xenParseSxpr(const struct sexpr *root,
/* Old XenD only allows localtime here for HVM */
if (sexpr_int(root, "domain/image/hvm/localtime"))
def->clock.offset = VIR_DOMAIN_CLOCK_OFFSET_LOCALTIME;
+
+ if (sexpr_lookup(root, "domain/image/hvm/hpet")) {
+ virDomainTimerDefPtr timer;
+
+ if (VIR_ALLOC_N(def->clock.timers, 1) < 0 ||
+ VIR_ALLOC(timer) < 0) {
+ virReportOOMError();
+ goto error;
+ }
+
+ timer->name = VIR_DOMAIN_TIMER_NAME_HPET;
+ timer->present = sexpr_int(root, "domain/image/hvm/hpet");
+ timer->tickpolicy = -1;
+
+ def->clock.ntimers = 1;
+ def->clock.timers[0] = timer;
+ }
}
/* Current XenD allows localtime here, for PV and HVM */
@@ -2220,6 +2237,15 @@ xenFormatSxpr(virConnectPtr conn,
if (def->emulator && (hvm || xendConfigVersion >= 3))
virBufferEscapeSexpr(&buf, "(device_model '%s')", def->emulator);
+ /* look for HPET in order to override the hypervisor/xend default */
+ for (i = 0; i < def->clock.ntimers; i++) {
+ if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
+ def->clock.timers[i]->present != -1) {
+ virBufferAsprintf(&buf, "(hpet %d)",
+ def->clock.timers[i]->present);
+ break;
+ }
+ }
/* PV graphics for xen <= 3.0.4, or HVM graphics for xen <= 3.1.0 */
if ((!hvm && xendConfigVersion < XEND_CONFIG_MIN_VERS_PVFB_NEWCONF) ||
diff --git a/src/xenxs/xen_xm.c b/src/xenxs/xen_xm.c
index 7f67ae289e..accf5f4c44 100644
--- a/src/xenxs/xen_xm.c
+++ b/src/xenxs/xen_xm.c
@@ -369,6 +369,25 @@ xenParseXM(virConfPtr conf, int xendConfigVersion,
goto cleanup;
else if (val)
def->features |= (1 << VIR_DOMAIN_FEATURE_HAP);
+
+ if (xenXMConfigGetBool(conf, "hpet", &val, -1) < 0)
+ goto cleanup;
+ else if (val != -1) {
+ virDomainTimerDefPtr timer;
+
+ if (VIR_ALLOC_N(def->clock.timers, 1) < 0 ||
+ VIR_ALLOC(timer) < 0) {
+ virReportOOMError();
+ goto cleanup;
+ }
+
+ timer->name = VIR_DOMAIN_TIMER_NAME_HPET;
+ timer->present = val;
+ timer->tickpolicy = -1;
+
+ def->clock.ntimers = 1;
+ def->clock.timers[0] = timer;
+ }
}
if (xenXMConfigGetBool(conf, "localtime", &vmlocaltime, 0) < 0)
goto cleanup;
@@ -1514,6 +1533,13 @@ virConfPtr xenFormatXM(virConnectPtr conn,
goto cleanup;
}
+ for (i = 0; i < def->clock.ntimers; i++) {
+ if (def->clock.timers[i]->name == VIR_DOMAIN_TIMER_NAME_HPET &&
+ def->clock.timers[i]->present != -1 &&
+ xenXMConfigSetInt(conf, "hpet", def->clock.timers[i]->present) < 0)
+ break;
+ }
+
if (xendConfigVersion == 1) {
for (i = 0 ; i < def->ndisks ; i++) {
if (def->disks[i]->device == VIR_DOMAIN_DISK_DEVICE_CDROM &&
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr
new file mode 100644
index 0000000000..d52214f3ab
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.sexpr
@@ -0,0 +1,9 @@
+(domain (domid 1)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\
+(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')\
+(on_reboot 'restart')(on_crash 'restart')\
+(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\
+(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\
+(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 1)(vnc 1)))\
+(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\
+(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\
+(model 'e1000')(type ioemu))))\
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml
new file mode 100644
index 0000000000..d0ead27cc2
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-hpet.xml
@@ -0,0 +1,44 @@
+
+ fvtest
+ b5d70dd2-75cd-aca5-1776-9660b059d8bc
+ 409600
+ 409600
+ 1
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+
+
+
+
+
+
+ destroy
+ restart
+ restart
+
+ /usr/lib64/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr
new file mode 100644
index 0000000000..75bc8b115a
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.sexpr
@@ -0,0 +1,9 @@
+(domain (domid 1)(name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\
+(uuid 'b5d70dd275cdaca517769660b059d8bc')(on_poweroff 'destroy')\
+(on_reboot 'restart')(on_crash 'restart')\
+(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\
+(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\
+(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 0)(vnc 1)))\
+(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\
+(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\
+(model 'e1000')(type ioemu))))\
diff --git a/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml
new file mode 100644
index 0000000000..9e6deae97d
--- /dev/null
+++ b/tests/sexpr2xmldata/sexpr2xml-fv-force-nohpet.xml
@@ -0,0 +1,44 @@
+
+ fvtest
+ b5d70dd2-75cd-aca5-1776-9660b059d8bc
+ 409600
+ 409600
+ 1
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+
+
+
+
+
+
+ destroy
+ restart
+ restart
+
+ /usr/lib64/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/sexpr2xmltest.c b/tests/sexpr2xmltest.c
index f465105660..f393935a73 100644
--- a/tests/sexpr2xmltest.c
+++ b/tests/sexpr2xmltest.c
@@ -157,6 +157,8 @@ mymain(void)
DO_TEST("fv-usbmouse", "fv-usbmouse", 1);
DO_TEST("fv-usbtablet", "fv-usbtablet", 1);
DO_TEST("fv-kernel", "fv-kernel", 1);
+ DO_TEST("fv-force-hpet", "fv-force-hpet", 1);
+ DO_TEST("fv-force-nohpet", "fv-force-nohpet", 1);
DO_TEST("fv-serial-null", "fv-serial-null", 1);
DO_TEST("fv-serial-file", "fv-serial-file", 1);
diff --git a/tests/xmconfigdata/test-fullvirt-force-hpet.cfg b/tests/xmconfigdata/test-fullvirt-force-hpet.cfg
new file mode 100644
index 0000000000..4dd75853df
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-force-hpet.cfg
@@ -0,0 +1,26 @@
+name = "XenGuest2"
+uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809"
+maxmem = 579
+memory = 394
+vcpus = 1
+builder = "hvm"
+kernel = "/usr/lib/xen/boot/hvmloader"
+boot = "d"
+pae = 1
+acpi = 1
+apic = 1
+localtime = 0
+hpet = 1
+on_poweroff = "destroy"
+on_reboot = "restart"
+on_crash = "restart"
+device_model = "/usr/lib/xen/bin/qemu-dm"
+sdl = 0
+vnc = 1
+vncunused = 1
+vnclisten = "127.0.0.1"
+vncpasswd = "123poi"
+disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
+vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=ioemu" ]
+parallel = "none"
+serial = "none"
diff --git a/tests/xmconfigdata/test-fullvirt-force-hpet.xml b/tests/xmconfigdata/test-fullvirt-force-hpet.xml
new file mode 100644
index 0000000000..a662b97a5a
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-force-hpet.xml
@@ -0,0 +1,45 @@
+
+ XenGuest2
+ c7a5fdb2-cdaf-9455-926a-d65c16db1809
+ 592896
+ 403456
+ 1
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+
+
+
+
+
+
+
+
+ destroy
+ restart
+ restart
+
+ /usr/lib/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg b/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg
new file mode 100644
index 0000000000..d4fb429932
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-force-nohpet.cfg
@@ -0,0 +1,26 @@
+name = "XenGuest2"
+uuid = "c7a5fdb2-cdaf-9455-926a-d65c16db1809"
+maxmem = 579
+memory = 394
+vcpus = 1
+builder = "hvm"
+kernel = "/usr/lib/xen/boot/hvmloader"
+boot = "d"
+pae = 1
+acpi = 1
+apic = 1
+localtime = 0
+hpet = 0
+on_poweroff = "destroy"
+on_reboot = "restart"
+on_crash = "restart"
+device_model = "/usr/lib/xen/bin/qemu-dm"
+sdl = 0
+vnc = 1
+vncunused = 1
+vnclisten = "127.0.0.1"
+vncpasswd = "123poi"
+disk = [ "phy:/dev/HostVG/XenGuest2,hda,w", "file:/root/boot.iso,hdc:cdrom,r" ]
+vif = [ "mac=00:16:3e:66:92:9c,bridge=xenbr1,script=vif-bridge,model=e1000,type=ioemu" ]
+parallel = "none"
+serial = "none"
diff --git a/tests/xmconfigdata/test-fullvirt-force-nohpet.xml b/tests/xmconfigdata/test-fullvirt-force-nohpet.xml
new file mode 100644
index 0000000000..bcd9af6605
--- /dev/null
+++ b/tests/xmconfigdata/test-fullvirt-force-nohpet.xml
@@ -0,0 +1,45 @@
+
+ XenGuest2
+ c7a5fdb2-cdaf-9455-926a-d65c16db1809
+ 592896
+ 403456
+ 1
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+
+
+
+
+
+
+
+
+ destroy
+ restart
+ restart
+
+ /usr/lib/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/xmconfigtest.c b/tests/xmconfigtest.c
index 6022621a1f..a15a7ff193 100644
--- a/tests/xmconfigtest.c
+++ b/tests/xmconfigtest.c
@@ -231,6 +231,9 @@ mymain(void)
DO_TEST("fullvirt-serial-udp", 2);
DO_TEST("fullvirt-serial-unix", 2);
+ DO_TEST("fullvirt-force-hpet", 2);
+ DO_TEST("fullvirt-force-nohpet", 2);
+
DO_TEST("fullvirt-parallel-tcp", 2);
DO_TEST("fullvirt-sound", 2);
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr
new file mode 100644
index 0000000000..400872d386
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.sexpr
@@ -0,0 +1,9 @@
+(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\
+(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')\
+(on_reboot 'restart')(on_crash 'restart')\
+(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\
+(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\
+(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 1)(vnc 1)))\
+(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\
+(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\
+(model 'e1000')(type ioemu))))\
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml
new file mode 100644
index 0000000000..1065f0eb63
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-force-hpet.xml
@@ -0,0 +1,39 @@
+
+ fvtest
+ b5d70dd275cdaca517769660b059d8bc
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+ 409600
+ 1
+ destroy
+ restart
+ restart
+
+
+
+
+
+
+
+ /usr/lib64/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr
new file mode 100644
index 0000000000..95778928c3
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.sexpr
@@ -0,0 +1,9 @@
+(vm (name 'fvtest')(memory 400)(maxmem 400)(vcpus 1)\
+(uuid 'b5d70dd2-75cd-aca5-1776-9660b059d8bc')(on_poweroff 'destroy')\
+(on_reboot 'restart')(on_crash 'restart')\
+(image (hvm (kernel '/usr/lib/xen/boot/hvmloader')(vcpus 1)(boot c)\
+(cdrom '/root/boot.iso')(acpi 1)(usb 1)(parallel none)(serial none)\
+(device_model '/usr/lib64/xen/bin/qemu-dm')(hpet 0)(vnc 1)))\
+(device (vbd (dev 'ioemu:hda')(uname 'file:/root/foo.img')(mode 'w')))\
+(device (vif (mac '00:16:3e:1b:b1:47')(bridge 'xenbr0')(script 'vif-bridge')\
+(model 'e1000')(type ioemu))))\
diff --git a/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml
new file mode 100644
index 0000000000..decfd67db2
--- /dev/null
+++ b/tests/xml2sexprdata/xml2sexpr-fv-force-nohpet.xml
@@ -0,0 +1,39 @@
+
+ fvtest
+ b5d70dd275cdaca517769660b059d8bc
+
+ hvm
+ /usr/lib/xen/boot/hvmloader
+
+
+ 409600
+ 1
+ destroy
+ restart
+ restart
+
+
+
+
+
+
+
+ /usr/lib64/xen/bin/qemu-dm
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/tests/xml2sexprtest.c b/tests/xml2sexprtest.c
index dab8c84680..d8cdcbbe5b 100644
--- a/tests/xml2sexprtest.c
+++ b/tests/xml2sexprtest.c
@@ -143,6 +143,8 @@ mymain(void)
DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1);
DO_TEST("fv-usbmouse", "fv-usbmouse", "fvtest", 1);
DO_TEST("fv-kernel", "fv-kernel", "fvtest", 1);
+ DO_TEST("fv-force-hpet", "fv-force-hpet", "fvtest", 1);
+ DO_TEST("fv-force-nohpet", "fv-force-nohpet", "fvtest", 1);
DO_TEST("fv-serial-null", "fv-serial-null", "fvtest", 1);
DO_TEST("fv-serial-file", "fv-serial-file", "fvtest", 1);