[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-changelog] [xen-unstable] merge with xen-unstable.hg



# HG changeset patch
# User awilliam@xxxxxxxxxxx
# Node ID 5ad72f9e639c8d24a59f7758ecdf46022eee1381
# Parent  e317ad162eba350fe32b780dd8293fc1ae883716
# Parent  8273f730371bfabbfa15f79a47a59ada06711aec
merge with xen-unstable.hg
---
 buildconfigs/Rules.mk            |    2 +-
 tools/ioemu/hw/pci.c             |   13 +++++++++++++
 tools/ioemu/hw/rtl8139.c         |    2 ++
 tools/ioemu/hw/usb-uhci.c        |    2 ++
 tools/ioemu/patches/qemu-pci     |   34 ++++++++++++++++++++++++++++++++++
 tools/ioemu/patches/series       |    1 +
 xen/arch/x86/mm/shadow/common.c  |   34 +++++++++++++++++-----------------
 xen/arch/x86/mm/shadow/multi.c   |   14 ++++++++++++--
 xen/arch/x86/mm/shadow/private.h |    2 +-
 xen/common/perfc.c               |   15 ++++++++-------
 xen/common/sysctl.c              |    6 +++---
 xen/include/asm-x86/mm.h         |    2 +-
 12 files changed, 95 insertions(+), 32 deletions(-)

diff -r e317ad162eba -r 5ad72f9e639c buildconfigs/Rules.mk
--- a/buildconfigs/Rules.mk     Tue Aug 29 08:09:28 2006 -0600
+++ b/buildconfigs/Rules.mk     Tue Aug 29 08:28:38 2006 -0600
@@ -19,7 +19,7 @@ endif
 
 # Expand Linux series to Linux version
 LINUX_SERIES   ?= 2.6
-LINUX_VER      ?= $(shell grep "^LINUX_VER" buildconfigs/mk.linux-2.6-xen | 
sed -e 's/.*=[ ]*//')
+LINUX_VER      ?= $(shell grep "^LINUX_VER " buildconfigs/mk.linux-2.6-xen | 
sed -e 's/.*=[ ]*//')
 
 # Setup Linux search path
 LINUX_SRC_PATH ?= .:..
diff -r e317ad162eba -r 5ad72f9e639c tools/ioemu/hw/pci.c
--- a/tools/ioemu/hw/pci.c      Tue Aug 29 08:09:28 2006 -0600
+++ b/tools/ioemu/hw/pci.c      Tue Aug 29 08:28:38 2006 -0600
@@ -286,6 +286,7 @@ void pci_default_write_config(PCIDevice 
             case 0x0b:
             case 0x0e:
             case 0x10 ... 0x27: /* base */
+            case 0x2c ... 0x2f: /* subsystem vendor id, subsystem id */
             case 0x30 ... 0x33: /* rom */
             case 0x3d:
                 can_write = 0;
@@ -318,6 +319,18 @@ void pci_default_write_config(PCIDevice 
             break;
         }
         if (can_write) {
+            if( addr == 0x05 ) {
+                /* In Command Register, bits 15:11 are reserved */
+                val &= 0x07; 
+            } else if ( addr == 0x06 ) {
+                /* In Status Register, bits 6, 2:0 are reserved, */
+                /* and bits 7,5,4,3 are read only */
+                val = d->config[addr];
+            } else if ( addr == 0x07 ) {
+                /* In Status Register, bits 10,9 are reserved, */
+                val = (val & ~0x06) | (d->config[addr] & 0x06);
+            }
+
             d->config[addr] = val;
         }
         addr++;
diff -r e317ad162eba -r 5ad72f9e639c tools/ioemu/hw/rtl8139.c
--- a/tools/ioemu/hw/rtl8139.c  Tue Aug 29 08:09:28 2006 -0600
+++ b/tools/ioemu/hw/rtl8139.c  Tue Aug 29 08:28:38 2006 -0600
@@ -3423,6 +3423,8 @@ void pci_rtl8139_init(PCIBus *bus, NICIn
     pci_conf[0x0e] = 0x00; /* header_type */
     pci_conf[0x3d] = 1;    /* interrupt pin 0 */
     pci_conf[0x34] = 0xdc;
+    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
+    pci_conf[0x2d] = pci_conf[0x01];
 
     s = &d->rtl8139;
 
diff -r e317ad162eba -r 5ad72f9e639c tools/ioemu/hw/usb-uhci.c
--- a/tools/ioemu/hw/usb-uhci.c Tue Aug 29 08:09:28 2006 -0600
+++ b/tools/ioemu/hw/usb-uhci.c Tue Aug 29 08:28:38 2006 -0600
@@ -659,6 +659,8 @@ void usb_uhci_init(PCIBus *bus, int devf
     pci_conf[0x0e] = 0x00; // header_type
     pci_conf[0x3d] = 4; // interrupt pin 3
     pci_conf[0x60] = 0x10; // release number
+    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
+    pci_conf[0x2d] = pci_conf[0x01];
     
     for(i = 0; i < NB_PORTS; i++) {
         qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);
diff -r e317ad162eba -r 5ad72f9e639c tools/ioemu/patches/series
--- a/tools/ioemu/patches/series        Tue Aug 29 08:09:28 2006 -0600
+++ b/tools/ioemu/patches/series        Tue Aug 29 08:28:38 2006 -0600
@@ -44,3 +44,4 @@ xen-platform-device
 xen-platform-device
 qemu-bootorder
 qemu-tunable-ide-write-cache
+qemu-pci -p3
diff -r e317ad162eba -r 5ad72f9e639c xen/arch/x86/mm/shadow/common.c
--- a/xen/arch/x86/mm/shadow/common.c   Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/arch/x86/mm/shadow/common.c   Tue Aug 29 08:28:38 2006 -0600
@@ -397,22 +397,14 @@ shadow_validate_guest_pt_write(struct vc
     ASSERT(shadow_lock_is_acquired(v->domain));
     rc = __shadow_validate_guest_entry(v, gmfn, entry, size);
     if ( rc & SHADOW_SET_FLUSH )
-    {
-        // Flush everyone except the local processor, which will flush when it
-        // re-enters the HVM guest.
-        //
-        cpumask_t mask = d->domain_dirty_cpumask;
-        cpu_clear(v->processor, mask);
-        flush_tlb_mask(mask);
-    }
+        /* Need to flush TLBs to pick up shadow PT changes */
+        flush_tlb_mask(d->domain_dirty_cpumask);
     if ( rc & SHADOW_SET_ERROR ) 
     {
         /* This page is probably not a pagetable any more: tear it out of the 
          * shadows, along with any tables that reference it */
         shadow_remove_all_shadows_and_parents(v, gmfn);
     }
-    /* We ignore the other bits: since we are about to change CR3 on
-     * VMENTER we don't need to do any extra TLB flushes. */ 
 }
 
 
@@ -1129,7 +1121,7 @@ sh_gfn_to_mfn_foreign(struct domain *d, 
 
 
 #if CONFIG_PAGING_LEVELS > 2
-    if ( gpfn > (RO_MPT_VIRT_END - RO_MPT_VIRT_START) / sizeof(l1_pgentry_t) ) 
+    if ( gpfn >= (RO_MPT_VIRT_END-RO_MPT_VIRT_START) / sizeof(l1_pgentry_t) ) 
         /* This pfn is higher than the p2m map can hold */
         return _mfn(INVALID_MFN);
 #endif
@@ -1898,16 +1890,16 @@ int shadow_remove_write_access(struct vc
         } while (0)
 
         
-        /* Linux lowmem: first 1GB is mapped 1-to-1 above 0xC0000000 */
-        if ( v == current 
-             && (gfn = sh_mfn_to_gfn(v->domain, gmfn)) < 0x40000000 )
-            GUESS(0xC0000000 + (gfn << PAGE_SHIFT), 4);
-
         if ( v->arch.shadow.mode->guest_levels == 2 )
         {
             if ( level == 1 )
                 /* 32bit non-PAE w2k3: linear map at 0xC0000000 */
                 GUESS(0xC0000000UL + (fault_addr >> 10), 1);
+
+            /* Linux lowmem: first 896MB is mapped 1-to-1 above 0xC0000000 */
+            if ((gfn = sh_mfn_to_gfn(v->domain, gmfn)) < 0x38000 ) 
+                GUESS(0xC0000000UL + (gfn << PAGE_SHIFT), 4);
+
         }
 #if CONFIG_PAGING_LEVELS >= 3
         else if ( v->arch.shadow.mode->guest_levels == 3 )
@@ -1918,6 +1910,10 @@ int shadow_remove_write_access(struct vc
             case 1: GUESS(0xC0000000UL + (fault_addr >> 9), 2); break;
             case 2: GUESS(0xC0600000UL + (fault_addr >> 18), 2); break;
             }
+
+            /* Linux lowmem: first 896MB is mapped 1-to-1 above 0xC0000000 */
+            if ((gfn = sh_mfn_to_gfn(v->domain, gmfn)) < 0x38000 ) 
+                GUESS(0xC0000000UL + (gfn << PAGE_SHIFT), 4);
         }
 #if CONFIG_PAGING_LEVELS >= 4
         else if ( v->arch.shadow.mode->guest_levels == 4 )
@@ -1929,6 +1925,10 @@ int shadow_remove_write_access(struct vc
             case 2: GUESS(0x70380000000UL + (fault_addr >> 18), 3); break;
             case 3: GUESS(0x70381C00000UL + (fault_addr >> 27), 3); break;
             }
+
+            /* Linux direct map at 0xffff810000000000 */
+            gfn = sh_mfn_to_gfn(v->domain, gmfn); 
+            GUESS(0xffff810000000000UL + (gfn << PAGE_SHIFT), 4); 
         }
 #endif /* CONFIG_PAGING_LEVELS >= 4 */
 #endif /* CONFIG_PAGING_LEVELS >= 3 */
@@ -2185,7 +2185,7 @@ void sh_remove_shadows(struct vcpu *v, m
 
     pg = mfn_to_page(gmfn);
 
-    /* Bale out now if the page is not shadowed */
+    /* Bail out now if the page is not shadowed */
     if ( (pg->count_info & PGC_page_table) == 0 )
         return;
 
diff -r e317ad162eba -r 5ad72f9e639c xen/arch/x86/mm/shadow/multi.c
--- a/xen/arch/x86/mm/shadow/multi.c    Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/arch/x86/mm/shadow/multi.c    Tue Aug 29 08:28:38 2006 -0600
@@ -2543,6 +2543,16 @@ static int validate_gl3e(struct vcpu *v,
 
     perfc_incrc(shadow_validate_gl3e_calls);
 
+#if (SHADOW_PAGING_LEVELS == 3) && (GUEST_PAGING_LEVELS == 3)
+    {
+        /* If we've updated a subshadow which is unreferenced then 
+           we don't care what value is being written - bail. */
+        struct pae_l3_bookkeeping *info = sl3p_to_info(se); 
+        if(!info->refcount)
+            return result; 
+    }
+#endif
+
     if ( guest_l3e_get_flags(*new_gl3e) & _PAGE_PRESENT )
     {
         gfn_t gl2gfn = guest_l3e_get_gfn(*new_gl3e);
@@ -2634,7 +2644,7 @@ static int validate_gl1e(struct vcpu *v,
 
 
 /**************************************************************************/
-/* Functions which translate and install a the shadows of arbitrary guest 
+/* Functions which translate and install the shadows of arbitrary guest 
  * entries that we have just seen the guest write. */
 
 
@@ -2934,7 +2944,7 @@ static int sh_page_fault(struct vcpu *v,
              && shadow_vcpu_mode_translate(v) 
              && mmio_space(gfn_to_paddr(gfn)) );
 
-    /* For MMIO, the shadow holds the *gfn*; for normal accesses, if holds 
+    /* For MMIO, the shadow holds the *gfn*; for normal accesses, it holds 
      * the equivalent mfn. */
     if ( mmio ) 
         gmfn = _mfn(gfn_x(gfn));
diff -r e317ad162eba -r 5ad72f9e639c xen/arch/x86/mm/shadow/private.h
--- a/xen/arch/x86/mm/shadow/private.h  Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/arch/x86/mm/shadow/private.h  Tue Aug 29 08:28:38 2006 -0600
@@ -555,7 +555,7 @@ vcpu_gfn_to_mfn_nofault(struct vcpu *v, 
         return _mfn(gfn);
 
 #if CONFIG_PAGING_LEVELS > 2
-    if ( gfn > (RO_MPT_VIRT_END - RO_MPT_VIRT_START) / sizeof(l1_pgentry_t) ) 
+    if ( gfn >= (RO_MPT_VIRT_END - RO_MPT_VIRT_START) / sizeof(l1_pgentry_t) ) 
         /* This pfn is higher than the p2m map can hold */
         return _mfn(INVALID_MFN);
 #endif
diff -r e317ad162eba -r 5ad72f9e639c xen/common/perfc.c
--- a/xen/common/perfc.c        Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/common/perfc.c        Tue Aug 29 08:28:38 2006 -0600
@@ -7,6 +7,7 @@
 #include <xen/spinlock.h>
 #include <xen/mm.h>
 #include <xen/guest_access.h>
+#include <public/sysctl.h>
 #include <asm/perfc.h>
 
 #undef  PERFCOUNTER
@@ -131,12 +132,12 @@ void perfc_reset(unsigned char key)
     arch_perfc_reset ();
 }
 
-static dom0_perfc_desc_t perfc_d[NR_PERFCTRS];
-static dom0_perfc_val_t *perfc_vals;
+static xen_sysctl_perfc_desc_t perfc_d[NR_PERFCTRS];
+static xen_sysctl_perfc_val_t *perfc_vals;
 static int               perfc_nbr_vals;
 static int               perfc_init = 0;
-static int perfc_copy_info(XEN_GUEST_HANDLE(dom0_perfc_desc_t) desc,
-                           XEN_GUEST_HANDLE(dom0_perfc_val_t) val)
+static int perfc_copy_info(XEN_GUEST_HANDLE_64(xen_sysctl_perfc_desc_t) desc,
+                           XEN_GUEST_HANDLE_64(xen_sysctl_perfc_val_t) val)
 {
     unsigned int i, j;
     unsigned int v = 0;
@@ -171,7 +172,7 @@ static int perfc_copy_info(XEN_GUEST_HAN
             }
             perfc_nbr_vals += perfc_d[i].nr_vals;
         }
-        perfc_vals = xmalloc_array(dom0_perfc_val_t, perfc_nbr_vals);
+        perfc_vals = xmalloc_array(xen_sysctl_perfc_val_t, perfc_nbr_vals);
         perfc_init = 1;
     }
     if (perfc_vals == NULL)
@@ -206,7 +207,7 @@ static int perfc_copy_info(XEN_GUEST_HAN
     }
     BUG_ON(v != perfc_nbr_vals);
 
-    if (copy_to_guest(desc, (dom0_perfc_desc_t *)perfc_d, NR_PERFCTRS))
+    if (copy_to_guest(desc, (xen_sysctl_perfc_desc_t *)perfc_d, NR_PERFCTRS))
         return -EFAULT;
     if (copy_to_guest(val, perfc_vals, perfc_nbr_vals))
         return -EFAULT;
@@ -214,7 +215,7 @@ static int perfc_copy_info(XEN_GUEST_HAN
 }
 
 /* Dom0 control of perf counters */
-int perfc_control(dom0_perfccontrol_t *pc)
+int perfc_control(xen_sysctl_perfc_op_t *pc)
 {
     static DEFINE_SPINLOCK(lock);
     int rc;
diff -r e317ad162eba -r 5ad72f9e639c xen/common/sysctl.c
--- a/xen/common/sysctl.c       Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/common/sysctl.c       Tue Aug 29 08:28:38 2006 -0600
@@ -121,10 +121,10 @@ long do_sysctl(XEN_GUEST_HANDLE(xen_sysc
     break;
 
 #ifdef PERF_COUNTERS
-    case XEN_SYSCTL_perfccontrol:
+    case XEN_SYSCTL_perfc_op:
     {
-        extern int perfc_control(xen_sysctl_perfccontrol_t *);
-        ret = perfc_control(&op->u.perfccontrol);
+        extern int perfc_control(xen_sysctl_perfc_op_t *);
+        ret = perfc_control(&op->u.perfc_op);
         if ( copy_to_guest(u_sysctl, op, 1) )
             ret = -EFAULT;
     }
diff -r e317ad162eba -r 5ad72f9e639c xen/include/asm-x86/mm.h
--- a/xen/include/asm-x86/mm.h  Tue Aug 29 08:09:28 2006 -0600
+++ b/xen/include/asm-x86/mm.h  Tue Aug 29 08:28:38 2006 -0600
@@ -368,7 +368,7 @@ static inline unsigned long get_mfn_from
     int ret;
 
 #if CONFIG_PAGING_LEVELS > 2
-    if ( pfn > (RO_MPT_VIRT_END - RO_MPT_VIRT_START) / sizeof (l1_pgentry_t) ) 
+    if ( pfn >= (RO_MPT_VIRT_END - RO_MPT_VIRT_START) / sizeof(l1_pgentry_t) ) 
         /* This pfn is higher than the p2m map can hold */
         return INVALID_MFN;
 #endif
diff -r e317ad162eba -r 5ad72f9e639c tools/ioemu/patches/qemu-pci
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/ioemu/patches/qemu-pci      Tue Aug 29 08:28:38 2006 -0600
@@ -0,0 +1,54 @@
+diff -r d5eb5205ff35 tools/ioemu/hw/pci.c
+--- a/tools/ioemu/hw/pci.c     Thu Aug 24 16:25:49 2006 +0100
++++ b/tools/ioemu/hw/pci.c     Fri Aug 25 11:00:03 2006 +0800
+@@ -286,6 +286,7 @@ void pci_default_write_config(PCIDevice 
+             case 0x0b:
+             case 0x0e:
+             case 0x10 ... 0x27: /* base */
++            case 0x2c ... 0x2f: /* subsystem vendor id, subsystem id */
+             case 0x30 ... 0x33: /* rom */
+             case 0x3d:
+                 can_write = 0;
+@@ -318,6 +319,18 @@ void pci_default_write_config(PCIDevice 
+             break;
+         }
+         if (can_write) {
++            if( addr == 0x05 ) {
++                /* In Command Register, bits 15:11 are reserved */
++                val &= 0x07; 
++            } else if ( addr == 0x06 ) {
++                /* In Status Register, bits 6, 2:0 are reserved, */
++                /* and bits 7,5,4,3 are read only */
++                val = d->config[addr];
++            } else if ( addr == 0x07 ) {
++                /* In Status Register, bits 10,9 are reserved, */
++                val = (val & ~0x06) | (d->config[addr] & 0x06);
++            }
++
+             d->config[addr] = val;
+         }
+         addr++;
+diff -r d5eb5205ff35 tools/ioemu/hw/rtl8139.c
+--- a/tools/ioemu/hw/rtl8139.c Thu Aug 24 16:25:49 2006 +0100
++++ b/tools/ioemu/hw/rtl8139.c Fri Aug 25 11:00:03 2006 +0800
+@@ -3423,6 +3423,8 @@ void pci_rtl8139_init(PCIBus *bus, NICIn
+     pci_conf[0x0e] = 0x00; /* header_type */
+     pci_conf[0x3d] = 1;    /* interrupt pin 0 */
+     pci_conf[0x34] = 0xdc;
++    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
++    pci_conf[0x2d] = pci_conf[0x01];
+ 
+     s = &d->rtl8139;
+ 
+diff -r d5eb5205ff35 tools/ioemu/hw/usb-uhci.c
+--- a/tools/ioemu/hw/usb-uhci.c        Thu Aug 24 16:25:49 2006 +0100
++++ b/tools/ioemu/hw/usb-uhci.c        Fri Aug 25 11:00:03 2006 +0800
+@@ -659,6 +659,8 @@ void usb_uhci_init(PCIBus *bus, int devf
+     pci_conf[0x0e] = 0x00; // header_type
+     pci_conf[0x3d] = 4; // interrupt pin 3
+     pci_conf[0x60] = 0x10; // release number
++    pci_conf[0x2c] = pci_conf[0x00]; // same as Vendor ID
++    pci_conf[0x2d] = pci_conf[0x01];
+     
+     for(i = 0; i < NB_PORTS; i++) {
+         qemu_register_usb_port(&s->ports[i].port, s, i, uhci_attach);

_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.