WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-devel

[Xen-devel] [PATCH] Support 1000 HZ guests

To: Ian Pratt <Ian.Pratt@xxxxxxxxxxxx>, Keir Fraser <Keir.Fraser@xxxxxxxxxxxx>
Subject: [Xen-devel] [PATCH] Support 1000 HZ guests
From: Arun Sharma <arun.sharma@xxxxxxxxx>
Date: Thu, 24 Feb 2005 16:05:02 -0800
Cc: xen-devel@xxxxxxxxxxxxxxxxxxxxx
Delivery-date: Fri, 25 Feb 2005 15:43:29 +0000
Envelope-to: xen+James.Bulpin@xxxxxxxxxxxx
List-archive: <http://sourceforge.net/mailarchive/forum.php?forum=xen-devel>
List-help: <mailto:xen-devel-request@lists.sourceforge.net?subject=help>
List-id: List for Xen developers <xen-devel.lists.sourceforge.net>
List-post: <mailto:xen-devel@lists.sourceforge.net>
List-subscribe: <https://lists.sourceforge.net/lists/listinfo/xen-devel>, <mailto:xen-devel-request@lists.sourceforge.net?subject=subscribe>
List-unsubscribe: <https://lists.sourceforge.net/lists/listinfo/xen-devel>, <mailto:xen-devel-request@lists.sourceforge.net?subject=unsubscribe>
Sender: xen-devel-admin@xxxxxxxxxxxxxxxxxxxxx
User-agent: Mutt/1.4.1i
- 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-devel] [PATCH] Support 1000 HZ guests, Arun Sharma <=