- Support guests with 1000 Hz
- cleanup the trailing garbage in vmx_virtpit.h
- Don't queue up pending timer interrupts before the first interrupt is injected
- This fixes the low bogomips problem
- Protect xen against guests programming a bad value for the counter
Signed-off-by: Edwin Zhai <edwin.zhai@xxxxxxxxx>
Signed-off-by: Arun Sharma <arun.sharma@xxxxxxxxx>
--- 1.2/xen/arch/x86/vmx_intercept.c 2005-02-17 13:11:51 -08:00
+++ edited/xen/arch/x86/vmx_intercept.c 2005-02-24 14:24:56 -08:00
@@ -203,7 +203,7 @@
/* Only some PIT operations such as load init counter need a hypervisor hook.
- * leave many other operations in user space DM
+ * leave all other operations in user space DM
*/
void vmx_hooks_assist(struct exec_domain *d)
{
@@ -213,11 +213,20 @@
struct vmx_virpit_t *vpit = &(d->arch.arch_vmx.vmx_platform.vmx_pit);
int rw_mode;
- if (p->state == STATE_IORESP_HOOK) { /*load init count*/
- vpit->init_val = (p->u.data & 0xFFFF) ; /* frequency(ms) of pit */
- vpit->period = (vpit->init_val) * 1000 / PIT_FREQ; /* frequency(ms) of
pit */
+ /* load init count*/
+ if (p->state == STATE_IORESP_HOOK) {
+ /* init count for this channel */
+ vpit->init_val = (p->u.data & 0xFFFF) ;
+ /* frequency(ms) of pit */
+ vpit->period = DIV_ROUND(((vpit->init_val) * 1000), PIT_FREQ);
+ if (vpit->period < 1) {
+ printk("VMX_PIT: guest programmed too small an init_val: %lx\n",
+ vpit->init_val);
+ vpit->period = 1;
+ }
vpit->vector = ((p->u.data >> 16) & 0xFF);
vpit->channel = ((p->u.data >> 24) & 0x3);
+ vpit->first_injected = 0;
vpit->count_LSB_latched = 0;
vpit->count_MSB_latched = 0;
===== xen/arch/x86/vmx_io.c 1.13 vs edited =====
--- 1.13/xen/arch/x86/vmx_io.c 2005-02-24 02:46:33 -08:00
+++ edited/xen/arch/x86/vmx_io.c 2005-02-24 12:11:35 -08:00
@@ -367,6 +367,12 @@
else
clear_highest_bit(d, highest_vector);
+ /* close the window between guest PIT initialization and sti */
+ if (highest_vector == vpit->vector && !vpit->first_injected){
+ vpit->first_injected = 1;
+ vpit->pending_intr_nr = 0;
+ }
+
intr_fields = (INTR_INFO_VALID_MASK | INTR_TYPE_EXT_INTR | highest_vector);
__vmwrite(VM_ENTRY_INTR_INFO_FIELD, intr_fields);
===== xen/include/asm-x86/vmx_virpit.h 1.1 vs edited =====
--- 1.1/xen/include/asm-x86/vmx_virpit.h 2005-02-08 15:57:16 -08:00
+++ edited/xen/include/asm-x86/vmx_virpit.h 2005-02-24 12:12:18 -08:00
@@ -1,4 +1,3 @@
-
#ifndef _VMX_VIRPIT_H
#define _VMX_VIRPIT_H
#include <xen/config.h>
@@ -25,6 +24,7 @@
unsigned int pending_intr_nr; /* the couner for pending timer
interrupts */
unsigned long long inject_point; /* the time inject virt intr */
struct ac_timer pit_timer; /* periodic timer for mode 2*/
+ int first_injected; /* flag to prevent shadow window */
/* virtual PIT state for handle related I/O */
int read_state;
@@ -38,44 +38,5 @@
/* to hook the ioreq packet to get the PIT initializaiton info */
extern void vmx_hooks_assist(struct exec_domain *d);
-
-#endif /* _VMX_VIRPIT_H_ */
-
-#ifndef _VMX_VIRPIT_H
-#define _VMX_VIRPIT_H
-#include <xen/config.h>
-#include <xen/init.h>
-#include <xen/lib.h>
-#include <xen/time.h>
-#include <xen/errno.h>
-#include <xen/ac_timer.h>
-#include <asm/vmx_vmcs.h>
-
-#define PIT_FREQ 1193181
-
-#define LSByte 0
-#define MSByte 1
-#define LSByte_multiple 2
-#define MSByte_multiple 3
-
-struct vmx_virpit_t {
- /* for simulation of counter 0 in mode 2*/
- int vector; /* the pit irq vector */
- unsigned int period; /* the frequency. e.g. 10ms*/
- unsigned int channel; /* the pit channel, counter 0~2 */
- unsigned long *intr_bitmap;
- unsigned int pending_intr_nr; /* the couner for pending timer
interrupts */
- unsigned long long inject_point; /* the time inject virt intr */
- struct ac_timer pit_timer; /* periodic timer for mode 2*/
-
- /* virtual PIT state for handle related I/O */
- int read_state;
- int count_LSB_latched;
- int count_MSB_latched;
-
- unsigned int count; /* the 16 bit channel count */
- unsigned int init_val; /* the init value for the counter */
-
-} ;
#endif /* _VMX_VIRPIT_H_ */
===== xen/include/xen/lib.h 1.21 vs edited =====
--- 1.21/xen/include/xen/lib.h 2005-02-19 19:28:20 -08:00
+++ edited/xen/include/xen/lib.h 2005-02-24 14:02:53 -08:00
@@ -23,6 +23,8 @@
#define SWAP(_a, _b) \
do { typeof(_a) _t = (_a); (_a) = (_b); (_b) = _t; } while ( 0 )
+#define DIV_ROUND(x, y) (((x) + (y) - 1) / (y))
+
#define reserve_bootmem(_p,_l) ((void)0)
struct domain;
-------------------------------------------------------
SF email is sponsored by - The IT Product Guide
Read honest & candid reviews on hundreds of IT Products from real users.
Discover which products truly live up to the hype. Start reading now.
http://ads.osdn.com/?ad_id=6595&alloc_id=14396&op=click
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxxxx
https://lists.sourceforge.net/lists/listinfo/xen-devel
|