.. as long as Xen doesn't itself make use of PIT channel 2.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxxxx>
Index: 2007-08-08/xen/arch/x86/domain_build.c
===================================================================
--- 2007-08-08.orig/xen/arch/x86/domain_build.c 2007-08-07 15:00:27.000000000
+0200
+++ 2007-08-08/xen/arch/x86/domain_build.c 2007-08-23 11:42:20.000000000
+0200
@@ -967,6 +967,8 @@ int __init construct_dom0(
rc |= ioports_deny_access(dom0, 0xA0, 0xA1);
/* Interval Timer (PIT). */
rc |= ioports_deny_access(dom0, 0x40, 0x43);
+ if ( !using_pit )
+ rc |= ioports_permit_access(dom0, 0x42, 0x42);
/* PIT Channel 2 / PC Speaker Control. */
rc |= ioports_deny_access(dom0, 0x61, 0x61);
/* Command-line I/O ranges. */
Index: 2007-08-08/xen/arch/x86/hvm/i8254.c
===================================================================
--- 2007-08-08.orig/xen/arch/x86/hvm/i8254.c 2007-06-18 08:34:29.000000000
+0200
+++ 2007-08-08/xen/arch/x86/hvm/i8254.c 2007-08-23 11:47:42.000000000 +0200
@@ -592,20 +592,49 @@ static int handle_speaker_io(ioreq_t *p)
return 1;
}
+#include <io_ports.h>
+
int pv_pit_handler(int port, int data, int write)
{
ioreq_t ioreq = {
.size = 1,
.type = IOREQ_TYPE_PIO,
.addr = port,
- .dir = write ? 0 : 1,
- .data = write ? data : 0,
+ .dir = write ? IOREQ_WRITE : IOREQ_READ,
+ .data = data
};
if ( port == 0x61 )
+ {
+ if ( !using_pit && current->domain->domain_id == 0 )
+ {
+ if ( !write )
+ return inb(0x61);
+ outb((inb(0x61) & ~3) | (data & 3), 0x61);
+ return 0;
+ }
handle_speaker_io(&ioreq);
+ }
else
+ {
+ if ( !using_pit && current->domain->domain_id == 0 &&
+ port == PIT_MODE && write )
+ {
+ switch ( data & 0xc0 )
+ {
+ case 0xc0: /* read back */
+ outb(data & 0xf8, PIT_MODE);
+ if ( !(data & 0x07) )
+ return 0;
+ data &= ~0x08;
+ break;
+ case 0x80: /* counter 2 latch */
+ outb(data, PIT_MODE);
+ return 0;
+ }
+ }
handle_pit_io(&ioreq);
+ }
return !write ? ioreq.data : 0;
}
Index: 2007-08-08/xen/arch/x86/time.c
===================================================================
--- 2007-08-08.orig/xen/arch/x86/time.c 2007-06-15 14:05:46.000000000 +0200
+++ 2007-08-08/xen/arch/x86/time.c 2007-08-23 11:33:37.000000000 +0200
@@ -38,6 +38,7 @@ string_param("clocksource", opt_clocksou
#define EPOCH MILLISECS(1000)
unsigned long cpu_khz; /* CPU clock frequency in kHz. */
+int using_pit;
unsigned long hpet_address;
DEFINE_SPINLOCK(rtc_lock);
volatile unsigned long jiffies;
@@ -177,7 +178,6 @@ static u64 init_pit_and_calibrate_tsc(vo
unsigned long count;
/* Set PIT channel 0 to HZ Hz. */
-#define CLOCK_TICK_RATE 1193180 /* crystal freq (Hz) */
#define LATCH (((CLOCK_TICK_RATE)+(HZ/2))/HZ)
outb_p(0x34, PIT_MODE); /* binary, mode 2, LSB/MSB, ch 0 */
outb_p(LATCH & 0xff, PIT_CH0); /* LSB */
@@ -308,6 +308,7 @@ static void init_pit(struct platform_tim
pts->frequency = CLOCK_TICK_RATE;
pts->read_counter = read_pit_count;
pts->counter_bits = 16;
+ using_pit = 1;
}
/************************************************************
Index: 2007-08-08/xen/include/asm-x86/time.h
===================================================================
--- 2007-08-08.orig/xen/include/asm-x86/time.h 2007-06-15 14:05:46.000000000
+0200
+++ 2007-08-08/xen/include/asm-x86/time.h 2007-08-23 11:37:34.000000000
+0200
@@ -4,6 +4,8 @@
#include <asm/msr.h>
+extern int using_pit;
+
extern void calibrate_tsc_bp(void);
extern void calibrate_tsc_ap(void);
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|