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-changelog

[Xen-changelog] [xen-unstable] merge with xen-unstable.hg (staging)

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] merge with xen-unstable.hg (staging)
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Wed, 19 Dec 2007 05:40:09 -0800
Delivery-date: Wed, 19 Dec 2007 05:40:28 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1197652360 25200
# Node ID a7ede5cb628a03c0afeaf8fbea4268995ea8eccf
# Parent  19c2b6d2930c22a11884d8a18abee7d5e1762d5e
# Parent  966a6d3b74087474df337e00b31cbecf495b442a
merge with xen-unstable.hg (staging)
---
 docs/misc/vtd.txt                        |   18 ++++++++++-
 docs/misc/xenstore.txt                   |   38 ++++++++++++++++++------
 tools/libfsimage/Rules.mk                |    2 -
 tools/libfsimage/common/Makefile         |    2 -
 tools/libxc/Makefile                     |    3 +
 tools/python/Makefile                    |    2 -
 tools/python/xen/util/xsm/acm/acm.py     |   49 ++++++++++++++++++++++---------
 tools/python/xen/util/xsm/dummy/dummy.py |   10 +++++-
 tools/xenstore/xenstored_core.c          |    5 ++-
 tools/xenstore/xenstored_watch.c         |    4 ++
 tools/xenstore/xs.c                      |    5 +++
 tools/xenstore/xsls.c                    |    2 -
 xen/arch/x86/hvm/hvm.c                   |   22 ++++++++++++-
 xen/arch/x86/hvm/svm/svm.c               |   20 +++++-------
 xen/arch/x86/hvm/vlapic.c                |   48 ++++++++++--------------------
 xen/arch/x86/hvm/vmx/vmx.c               |   13 --------
 xen/arch/x86/oprofile/op_model_ppro.c    |   26 ++++++++++++----
 xen/arch/x86/traps.c                     |   31 ++++++++++++-------
 xen/common/xenoprof.c                    |   17 ++++++++++
 xen/include/asm-x86/hvm/hvm.h            |   19 +-----------
 xen/include/asm-x86/hvm/vlapic.h         |    2 -
 xen/include/public/io/xs_wire.h          |    7 ++++
 22 files changed, 221 insertions(+), 124 deletions(-)

diff -r 19c2b6d2930c -r a7ede5cb628a docs/misc/vtd.txt
--- a/docs/misc/vtd.txt Thu Dec 13 09:34:49 2007 -0700
+++ b/docs/misc/vtd.txt Fri Dec 14 10:12:40 2007 -0700
@@ -2,7 +2,7 @@ Authors : Allen Kay    <allen.m.kay@inte
 Authors : Allen Kay    <allen.m.kay@xxxxxxxxx>
           Weidong Han  <weidong.han@xxxxxxxxx>
 Created : October-24-2007
-Updated : December-11-2007
+Updated : December-13-2007
 
 How to turn on VT-d in Xen
 --------------------------
@@ -41,6 +41,22 @@ PCIe devices do not have this restrictio
 PCIe devices do not have this restriction.
 
 
+VT-d Works on OS:
+-----------------
+
+1) Host OS: PAE, 64-bit
+2) Guest OS: 32-bit, PAE, 64-bit
+
+Because current Xen doesn't support MSI, for guest OS which uses MSI by 
default, need to add "pci=nomsi" option on its grub, e.g. RHEL5, FC6.
+
+
+Combinations Tested:
+--------------------
+
+1) 64-bit host: 32/PAE/64 Linux/XP/Win2003/Vista guests
+2) PAE host: 32/PAE Linux/XP/Win2003/Vista guests
+
+
 VT-d Enabled Systems
 --------------------
 
diff -r 19c2b6d2930c -r a7ede5cb628a docs/misc/xenstore.txt
--- a/docs/misc/xenstore.txt    Thu Dec 13 09:34:49 2007 -0700
+++ b/docs/misc/xenstore.txt    Fri Dec 14 10:12:40 2007 -0700
@@ -38,7 +38,9 @@ the four punctuation characters -/_@ (hy
 the four punctuation characters -/_@ (hyphen slash underscore atsign).
 @ should be avoided except to specify special watches (see below).
 Doubled slashes and trailing slashes (except to specify the root) are
-forbidden.  The empty path is also forbidden.
+forbidden.  The empty path is also forbidden.  Paths longer than 3072
+bytes are forbidden; clients specifying relative paths should keep
+them to within 2048 bytes.  (See XENSTORE_*_PATH_MAX in xs_wire.h.)
 
 
 Communication with xenstore is via either sockets, or event channel
@@ -55,6 +57,20 @@ order and must use req_id (and tx_id, if
 order and must use req_id (and tx_id, if applicable) to match up
 replies to requests.  (The current implementation always replies to
 requests in the order received but this should not be relied on.)
+
+The payload length (len field of the header) is limited to 4096
+(XENSTORE_PAYLOAD_MAX) in both directions.  If a client exceeds the
+limit, its xenstored connection will be immediately killed by
+xenstored, which is usually catastrophic from the client's point of
+view.  Clients (particularly domains, which cannot just reconnect)
+should avoid this.
+
+Existing clients do not always contain defences against overly long
+payloads.  Increasing xenstored's limit is therefore difficult; it
+would require negotiation with the client, and obviously would make
+parts of xenstore inaccessible to some clients.  In any case passing
+bulk data through xenstore is not recommended as the performance
+properties are poor.
 
 
 ---------- Xenstore protocol details - introduction ----------
@@ -174,6 +190,17 @@ WATCH                      <wpath>|<token>|?
        away, with <path> equal to <wpath>.  Watches may be triggered
        spuriously.  The tx_id in a WATCH request is ignored.
 
+       Watches are supposed to be restricted by the permissions
+       system but in practice the implementation is imperfect.
+       Applications should not rely on being sent a notification for
+       paths that they cannot read; however, an application may rely
+       on being sent a watch when a path which it _is_ able to read
+       is deleted even if that leaves only a nonexistent unreadable
+       parent.  A notification may omitted if a node's permissions
+       are changed so as to make it unreadable, in which case future
+       notifications may be suppressed (and if the node is later made
+       readable, some notifications may have been lost).
+
 WATCH_EVENT                                    <epath>|<token>|
        Unsolicited `reply' generated for matching modfication events
        as described above.  req_id and tx_id are both 0.
@@ -182,7 +209,7 @@ WATCH_EVENT                                 <epath>|<token>|
        modifed; however if the event was the recursive removal of an
        parent of <wpath>, <epath> is just
        <wpath> (rather than the actual path which was removed).  So
-       <epath> is a child of <epath>, regardless.
+       <epath> is a child of <wpath>, regardless.
 
        Iff <wpath> for the watch was specified as a relative pathname,
        the <epath> path will also be relative (with the same base,
@@ -192,7 +219,7 @@ UNWATCH                     <wpath>|<token>|?
 
 ---------- Transactions ----------
 
-TRANSACTION_START      ??                      <transid>|
+TRANSACTION_START      |                       <transid>|
        <transid> is an opaque uint32_t allocated by xenstored
        represented as unsigned decimal.  After this, transaction may
        be referenced by using <transid> (as 32-bit binary) in the
@@ -202,11 +229,6 @@ TRANSACTION_START  ??                      <transid>|
        Currently xenstored has the bug that after 2^32 transactions
        it will allocate the transid 0 for an actual transaction.
 
-       Clients using the provided xs.c bindings will send a single
-       nul byte for the argument payload.  We recommend that future
-       clients continue to do the same; any future extension will not
-       use that syntax.
-
 TRANSACTION_END                T|
 TRANSACTION_END                F|
        tx_id must refer to existing transaction.  After this
diff -r 19c2b6d2930c -r a7ede5cb628a tools/libfsimage/Rules.mk
--- a/tools/libfsimage/Rules.mk Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/libfsimage/Rules.mk Fri Dec 14 10:12:40 2007 -0700
@@ -27,6 +27,6 @@ fs-install: fs-all
        $(CC) $(CFLAGS) $(LDFLAGS) $(SHLIB_CFLAGS) -o $@ $^ -lfsimage 
$(FS_LIBDEPS)
 
 clean distclean:
-       rm -f $(PIC_OBJS) $(FSLIB)
+       rm -f $(PIC_OBJS) $(FSLIB) $(DEPS)
 
 -include $(DEPS)
diff -r 19c2b6d2930c -r a7ede5cb628a tools/libfsimage/common/Makefile
--- a/tools/libfsimage/common/Makefile  Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/libfsimage/common/Makefile  Fri Dec 14 10:12:40 2007 -0700
@@ -32,7 +32,7 @@ install: all
        $(INSTALL_DATA) fsimage_grub.h $(DESTDIR)/usr/include
 
 clean distclean:
-       rm -f $(PIC_OBJS) $(LIB)
+       rm -f $(PIC_OBJS) $(LIB) $(DEPS)
 
 libfsimage.so: libfsimage.so.$(MAJOR)
        ln -sf $< $@
diff -r 19c2b6d2930c -r a7ede5cb628a tools/libxc/Makefile
--- a/tools/libxc/Makefile      Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/libxc/Makefile      Fri Dec 14 10:12:40 2007 -0700
@@ -125,7 +125,8 @@ clean:
 clean:
        rm -rf *.rpm $(LIB) *~ $(DEPS) xen \
             $(CTRL_LIB_OBJS) $(CTRL_PIC_OBJS) \
-            $(GUEST_LIB_OBJS) $(GUEST_PIC_OBJS)
+            $(GUEST_LIB_OBJS) $(GUEST_PIC_OBJS) \
+            $(LIBELF_SRCS) libelf-private.h
 
 .PHONY: rpm
 rpm: build
diff -r 19c2b6d2930c -r a7ede5cb628a tools/python/Makefile
--- a/tools/python/Makefile     Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/python/Makefile     Fri Dec 14 10:12:40 2007 -0700
@@ -104,4 +104,4 @@ test:
 
 .PHONY: clean
 clean:
-       rm -rf build *.pyc *.pyo *.o *.a *~ $(CATALOGS) xen/util/xsm/xsm.py
+       rm -rf build *.pyc *.pyo *.o *.a *~ $(CATALOGS) xen/util/xsm/xsm.py 
xen/util/auxbin.pyc
diff -r 19c2b6d2930c -r a7ede5cb628a tools/python/xen/util/xsm/acm/acm.py
--- a/tools/python/xen/util/xsm/acm/acm.py      Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/python/xen/util/xsm/acm/acm.py      Fri Dec 14 10:12:40 2007 -0700
@@ -1545,21 +1545,44 @@ def get_security_label(self, xspol=None)
         label = self.info.get('security_label', label)
     return label
 
+
+__cond = threading.Condition()
+__script_runner = None
+__orders = []
+
 def run_resource_label_change_script(resource, label, command):
-    def __run_resource_label_change_script(label, command):
+    global __cond, __orders, __script_runner
+
+    def __run_resource_label_change_script():
+        global __cond, __orders
         script = XendOptions.instance().get_resource_label_change_script()
         if script:
-            parms = {
-                'resource' : resource,
-                'label'    : label,
-                'command'  : command,
-            }
-            log.info("Running resource label change script %s: %s" %
-                     (script, parms))
-            parms.update(os.environ)
-            os.spawnve(os.P_WAIT, script[0], script, parms)
+            parms = {}
+            while True:
+                __cond.acquire()
+                if len(__orders) == 0:
+                    __cond.wait()
+
+                parms['label'], \
+                   parms['command'], \
+                   parms['resource'] = __orders[0]
+
+                __orders = __orders[1:]
+                __cond.release()
+
+                log.info("Running resource label change script %s: %s" %
+                         (script, parms))
+                parms.update(os.environ)
+                os.spawnve(os.P_WAIT, script[0], script, parms)
         else:
             log.info("No script given for relabeling of resources.")
-    thread = threading.Thread(target=__run_resource_label_change_script,
-                              args=(label,command))
-    thread.start()
+    if not __script_runner:
+        __script_runner = \
+                 threading.Thread(target=__run_resource_label_change_script,
+                                  args=())
+        __script_runner.start()
+
+    __cond.acquire()
+    __orders.append((label,command,resource))
+    __cond.notify()
+    __cond.release()
diff -r 19c2b6d2930c -r a7ede5cb628a tools/python/xen/util/xsm/dummy/dummy.py
--- a/tools/python/xen/util/xsm/dummy/dummy.py  Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/python/xen/util/xsm/dummy/dummy.py  Fri Dec 14 10:12:40 2007 -0700
@@ -33,7 +33,6 @@ def err(msg):
 def err(msg):
     """Raise XSM-dummy exception.
     """
-    sys.stderr.write("XSM-dummyError: " + msg + "\n")
     raise XSMError(msg)
 
 def on():
@@ -123,3 +122,12 @@ def get_domain_label(domain):
 
 def set_domain_label():
     err("Command not supported under xsm 'dummy' module.")
+
+def dump_policy():
+    pass
+
+def dump_policy_file():
+    pass
+
+def get_ssid(domain):
+    err("No ssid has been assigned to any domain under xsm dummy module.")
diff -r 19c2b6d2930c -r a7ede5cb628a tools/xenstore/xenstored_core.c
--- a/tools/xenstore/xenstored_core.c   Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/xenstore/xenstored_core.c   Fri Dec 14 10:12:40 2007 -0700
@@ -672,6 +672,9 @@ bool is_valid_nodename(const char *node)
        if (strstr(node, "//"))
                return false;
 
+       if (strlen(node) > XENSTORE_ABS_PATH_MAX)
+               return false;
+
        return valid_chars(node);
 }
 
@@ -1281,7 +1284,7 @@ static void handle_input(struct connecti
                if (in->used != sizeof(in->hdr))
                        return;
 
-               if (in->hdr.msg.len > PATH_MAX) {
+               if (in->hdr.msg.len > XENSTORE_PAYLOAD_MAX) {
                        syslog(LOG_ERR, "Client tried to feed us %i",
                               in->hdr.msg.len);
                        goto bad_client;
diff -r 19c2b6d2930c -r a7ede5cb628a tools/xenstore/xenstored_watch.c
--- a/tools/xenstore/xenstored_watch.c  Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/xenstore/xenstored_watch.c  Fri Dec 14 10:12:40 2007 -0700
@@ -125,6 +125,10 @@ void do_watch(struct connection *conn, s
 
        if (strstarts(vec[0], "@")) {
                relative = false;
+               if (strlen(vec[0]) > XENSTORE_REL_PATH_MAX) {
+                       send_error(conn, EINVAL);
+                       return;
+               }
                /* check if valid event */
        } else {
                relative = !strstarts(vec[0], "/");
diff -r 19c2b6d2930c -r a7ede5cb628a tools/xenstore/xs.c
--- a/tools/xenstore/xs.c       Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/xenstore/xs.c       Fri Dec 14 10:12:40 2007 -0700
@@ -319,6 +319,11 @@ static void *xs_talkv(struct xs_handle *
        for (i = 0; i < num_vecs; i++)
                msg.len += iovec[i].iov_len;
 
+       if (msg.len > XENSTORE_PAYLOAD_MAX) {
+               errno = E2BIG;
+               return 0;
+       }
+
        ignorepipe.sa_handler = SIG_IGN;
        sigemptyset(&ignorepipe.sa_mask);
        ignorepipe.sa_flags = 0;
diff -r 19c2b6d2930c -r a7ede5cb628a tools/xenstore/xsls.c
--- a/tools/xenstore/xsls.c     Thu Dec 13 09:34:49 2007 -0700
+++ b/tools/xenstore/xsls.c     Fri Dec 14 10:12:40 2007 -0700
@@ -8,7 +8,7 @@
 #include <sys/ioctl.h>
 #include <termios.h>
 
-#define STRING_MAX PATH_MAX
+#define STRING_MAX XENSTORE_ABS_PATH_MAX+1024
 static int max_width = 80;
 static int desired_width = 60;
 static int show_whole_path = 0;
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/hvm/hvm.c
--- a/xen/arch/x86/hvm/hvm.c    Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/hvm/hvm.c    Fri Dec 14 10:12:40 2007 -0700
@@ -1405,6 +1405,25 @@ void hvm_cpuid(unsigned int input, unsig
     }
 }
 
+enum hvm_intblk hvm_interrupt_blocked(struct vcpu *v, struct hvm_intack intack)
+{
+    enum hvm_intblk r;
+    ASSERT(v == current);
+
+    r = hvm_funcs.interrupt_blocked(v, intack);
+    if ( r != hvm_intblk_none )
+        return r;
+
+    if ( intack.source == hvm_intsrc_lapic )
+    {
+        uint32_t tpr = vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xF0;
+        if ( (tpr >> 4) >= (intack.vector >> 4) )
+            return hvm_intblk_tpr;
+    }
+
+    return r;
+}
+
 static long hvm_grant_table_op(
     unsigned int cmd, XEN_GUEST_HANDLE(void) uop, unsigned int count)
 {
@@ -1425,7 +1444,6 @@ static hvm_hypercall_t *hvm_hypercall32_
     HYPERCALL(memory_op),
     [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
     HYPERCALL(xen_version),
-    HYPERCALL(grant_table_op),
     HYPERCALL(event_channel_op),
     HYPERCALL(sched_op),
     HYPERCALL(hvm_op)
@@ -1478,7 +1496,6 @@ static hvm_hypercall_t *hvm_hypercall64_
     HYPERCALL(memory_op),
     [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
     HYPERCALL(xen_version),
-    HYPERCALL(grant_table_op),
     HYPERCALL(event_channel_op),
     HYPERCALL(sched_op),
     HYPERCALL(hvm_op)
@@ -1488,7 +1505,6 @@ static hvm_hypercall_t *hvm_hypercall32_
     [ __HYPERVISOR_memory_op ] = (hvm_hypercall_t *)do_memory_op_compat32,
     [ __HYPERVISOR_grant_table_op ] = (hvm_hypercall_t *)hvm_grant_table_op,
     HYPERCALL(xen_version),
-    HYPERCALL(grant_table_op),
     HYPERCALL(event_channel_op),
     HYPERCALL(sched_op),
     HYPERCALL(hvm_op)
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c        Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/hvm/svm/svm.c        Fri Dec 14 10:12:40 2007 -0700
@@ -443,10 +443,6 @@ static enum hvm_intblk svm_interrupt_blo
     if ( !(guest_cpu_user_regs()->eflags & X86_EFLAGS_IF) )
         return hvm_intblk_rflags_ie;
 
-    if ( (intack.source == hvm_intsrc_lapic) &&
-         ((vmcb->vintr.fields.tpr & 0xf) >= (intack.vector >> 4)) )
-        return hvm_intblk_tpr;
-
     return hvm_intblk_none;
 }
 
@@ -520,13 +516,6 @@ static void svm_flush_guest_tlbs(void)
      * next VMRUN.  (If ASIDs are disabled, the whole TLB is flushed on
      * VMRUN anyway). */
     svm_asid_inc_generation();
-}
-
-static void svm_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    struct vmcb_struct *vmcb = v->arch.hvm_svm.vmcb;
-
-    vmcb->vintr.fields.tpr = value & 0x0f;
 }
 
 static void svm_sync_vmcb(struct vcpu *v)
@@ -787,6 +776,10 @@ static void svm_do_resume(struct vcpu *v
         /* Migrating to another ASID domain.  Request a new ASID. */
         svm_asid_init_vcpu(v);
     }
+
+    /* Reflect the vlapic's TPR in the hardware vtpr */
+    v->arch.hvm_svm.vmcb->vintr.fields.tpr = 
+        (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4;
 
     hvm_do_resume(v);
     reset_stack_and_jump(svm_asm_do_resume);
@@ -885,7 +878,6 @@ static struct hvm_function_table svm_fun
     .update_guest_cr      = svm_update_guest_cr,
     .update_guest_efer    = svm_update_guest_efer,
     .flush_guest_tlbs     = svm_flush_guest_tlbs,
-    .update_vtpr          = svm_update_vtpr,
     .stts                 = svm_stts,
     .set_tsc_offset       = svm_set_tsc_offset,
     .inject_exception     = svm_inject_exception,
@@ -2212,6 +2204,10 @@ asmlinkage void svm_vmexit_handler(struc
         domain_crash(v->domain);
         break;
     }
+
+    /* The exit may have updated the TPR: reflect this in the hardware vtpr */
+    vmcb->vintr.fields.tpr = 
+        (vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xFF) >> 4;
 }
 
 asmlinkage void svm_trace_vmentry(void)
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/hvm/vlapic.c
--- a/xen/arch/x86/hvm/vlapic.c Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/hvm/vlapic.c Fri Dec 14 10:12:40 2007 -0700
@@ -120,14 +120,9 @@ static void vlapic_clear_irr(int vector,
     vlapic_clear_vector(vector, &vlapic->regs->data[APIC_IRR]);
 }
 
-int vlapic_find_highest_irr(struct vlapic *vlapic)
-{
-    int result;
-
-    result = vlapic_find_highest_vector(&vlapic->regs->data[APIC_IRR]);
-    ASSERT((result == -1) || (result >= 16));
-
-    return result;
+static int vlapic_find_highest_irr(struct vlapic *vlapic)
+{
+    return vlapic_find_highest_vector(&vlapic->regs->data[APIC_IRR]);
 }
 
 int vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig)
@@ -142,14 +137,9 @@ int vlapic_set_irq(struct vlapic *vlapic
     return ret;
 }
 
-int vlapic_find_highest_isr(struct vlapic *vlapic)
-{
-    int result;
-
-    result = vlapic_find_highest_vector(&vlapic->regs->data[APIC_ISR]);
-    ASSERT((result == -1) || (result >= 16));
-
-    return result;
+static int vlapic_find_highest_isr(struct vlapic *vlapic)
+{
+    return vlapic_find_highest_vector(&vlapic->regs->data[APIC_ISR]);
 }
 
 uint32_t vlapic_get_ppr(struct vlapic *vlapic)
@@ -454,11 +444,9 @@ static void vlapic_set_tdcr(struct vlapi
                 "timer_divisor: %d", vlapic->hw.timer_divisor);
 }
 
-static void vlapic_read_aligned(struct vlapic *vlapic, unsigned int offset,
-                         unsigned int len, unsigned int *result)
-{
-    ASSERT((len == 4) && (offset >= 0) && (offset <= APIC_TDCR));
-
+static void vlapic_read_aligned(
+    struct vlapic *vlapic, unsigned int offset, unsigned int *result)
+{
     switch ( offset )
     {
     case APIC_PROCPRI:
@@ -487,15 +475,9 @@ static unsigned long vlapic_read(struct 
     if ( offset > APIC_TDCR )
         return 0;
 
-    /* some bugs on kernel cause read this with byte*/
-    if ( len != 4 )
-        HVM_DBG_LOG(DBG_LEVEL_VLAPIC,
-                    "read with len=0x%lx, should be 4 instead",
-                    len);
-
     alignment = offset & 0x3;
 
-    vlapic_read_aligned(vlapic, offset & ~0x3, 4, &tmp);
+    vlapic_read_aligned(vlapic, offset & ~0x3, &tmp);
     switch ( len )
     {
     case 1:
@@ -503,12 +485,14 @@ static unsigned long vlapic_read(struct 
         break;
 
     case 2:
-        ASSERT( alignment != 3 );
+        if ( alignment == 3 )
+            goto unaligned_exit_and_crash;
         result = *(unsigned short *)((unsigned char *)&tmp + alignment);
         break;
 
     case 4:
-        ASSERT( alignment == 0 );
+        if ( alignment != 0 )
+            goto unaligned_exit_and_crash;
         result = *(unsigned int *)((unsigned char *)&tmp + alignment);
         break;
 
@@ -523,6 +507,9 @@ static unsigned long vlapic_read(struct 
 
     return result;
 
+ unaligned_exit_and_crash:
+    gdprintk(XENLOG_ERR, "Unaligned LAPIC read len=0x%lx at offset=0x%x.\n",
+             len, offset);
  exit_and_crash:
     domain_crash(v->domain);
     return 0;
@@ -593,7 +580,6 @@ static void vlapic_write(struct vcpu *v,
     {
     case APIC_TASKPRI:
         vlapic_set_reg(vlapic, APIC_TASKPRI, val & 0xff);
-        hvm_update_vtpr(v, (val >> 4) & 0x0f);
         break;
 
     case APIC_EOI:
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/hvm/vmx/vmx.c
--- a/xen/arch/x86/hvm/vmx/vmx.c        Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/hvm/vmx/vmx.c        Fri Dec 14 10:12:40 2007 -0700
@@ -1011,13 +1011,6 @@ static enum hvm_intblk vmx_interrupt_blo
     if ( !(guest_cpu_user_regs()->eflags & X86_EFLAGS_IF) )
         return hvm_intblk_rflags_ie;
 
-    if ( intack.source == hvm_intsrc_lapic )
-    {
-        uint32_t tpr = vlapic_get_reg(vcpu_vlapic(v), APIC_TASKPRI) & 0xF0;
-        if ( (tpr >> 4) >= (intack.vector >> 4) )
-            return hvm_intblk_tpr;
-    }
-
     return hvm_intblk_none;
 }
 
@@ -1118,11 +1111,6 @@ static void vmx_inject_exception(
         __restore_debug_registers(curr);
         write_debugreg(6, read_debugreg(6) | 0x4000);
     }
-}
-
-static void vmx_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    /* VMX doesn't have a V_TPR field */
 }
 
 static int vmx_event_pending(struct vcpu *v)
@@ -1148,7 +1136,6 @@ static struct hvm_function_table vmx_fun
     .update_guest_cr      = vmx_update_guest_cr,
     .update_guest_efer    = vmx_update_guest_efer,
     .flush_guest_tlbs     = vmx_flush_guest_tlbs,
-    .update_vtpr          = vmx_update_vtpr,
     .stts                 = vmx_stts,
     .set_tsc_offset       = vmx_set_tsc_offset,
     .inject_exception     = vmx_inject_exception,
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/oprofile/op_model_ppro.c
--- a/xen/arch/x86/oprofile/op_model_ppro.c     Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/oprofile/op_model_ppro.c     Fri Dec 14 10:12:40 2007 -0700
@@ -104,6 +104,8 @@ static int ppro_check_ctrs(unsigned int 
        int mode = xenoprofile_get_mode(current, regs);
 
        for (i = 0 ; i < NUM_COUNTERS; ++i) {
+               if (!reset_value[i])
+                       continue;
                CTR_READ(low, high, msrs, i);
                if (CTR_OVERFLOWED(low)) {
                        xenoprof_log_event(current, regs, eip, mode, i);
@@ -123,18 +125,30 @@ static void ppro_start(struct op_msrs co
 static void ppro_start(struct op_msrs const * const msrs)
 {
        unsigned int low,high;
-       CTRL_READ(low, high, msrs, 0);
-       CTRL_SET_ACTIVE(low);
-       CTRL_WRITE(low, high, msrs, 0);
+       int i;
+
+       for (i = 0; i < NUM_COUNTERS; ++i) {
+               if (reset_value[i]) {
+                       CTRL_READ(low, high, msrs, i);
+                       CTRL_SET_ACTIVE(low);
+                       CTRL_WRITE(low, high, msrs, i);
+               }
+       }
 }
 
 
 static void ppro_stop(struct op_msrs const * const msrs)
 {
        unsigned int low,high;
-       CTRL_READ(low, high, msrs, 0);
-       CTRL_SET_INACTIVE(low);
-       CTRL_WRITE(low, high, msrs, 0);
+       int i;
+
+       for (i = 0; i < NUM_COUNTERS; ++i) {
+               if (!reset_value[i])
+                       continue;
+               CTRL_READ(low, high, msrs, i);
+               CTRL_SET_INACTIVE(low);
+               CTRL_WRITE(low, high, msrs, i);
+       }
 }
 
 
diff -r 19c2b6d2930c -r a7ede5cb628a xen/arch/x86/traps.c
--- a/xen/arch/x86/traps.c      Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/arch/x86/traps.c      Fri Dec 14 10:12:40 2007 -0700
@@ -1878,7 +1878,7 @@ static int emulate_privileged_op(struct 
         eax = regs->eax;
         edx = regs->edx;
         res = ((u64)edx << 32) | eax;
-        switch ( regs->ecx )
+        switch ( (u32)regs->ecx )
         {
 #ifdef CONFIG_X86_64
         case MSR_FS_BASE:
@@ -1916,15 +1916,19 @@ static int emulate_privileged_op(struct 
         case MSR_K8_PSTATE5:
         case MSR_K8_PSTATE6:
         case MSR_K8_PSTATE7:
-            if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
-                 (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) ||
-                 wrmsr_safe(regs->ecx, eax, edx) )
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD )
                 goto fail;
+            if ( cpufreq_controller != FREQCTL_dom0_kernel )
+                break;
+            if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
+                goto fail;
             break;
         case MSR_IA32_PERF_CTL:
-            if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
-                 (boot_cpu_data.x86_vendor != X86_VENDOR_INTEL) ||
-                 wrmsr_safe(regs->ecx, eax, edx) )
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_INTEL )
+                goto fail;
+            if ( cpufreq_controller != FREQCTL_dom0_kernel )
+                break;
+            if ( wrmsr_safe(regs->ecx, eax, edx) != 0 )
                 goto fail;
             break;
         default:
@@ -1944,7 +1948,7 @@ static int emulate_privileged_op(struct 
         break;
 
     case 0x32: /* RDMSR */
-        switch ( regs->ecx )
+        switch ( (u32)regs->ecx )
         {
 #ifdef CONFIG_X86_64
         case MSR_FS_BASE:
@@ -1979,9 +1983,14 @@ static int emulate_privileged_op(struct 
         case MSR_K8_PSTATE5:
         case MSR_K8_PSTATE6:
         case MSR_K8_PSTATE7:
-            if ( (cpufreq_controller != FREQCTL_dom0_kernel) ||
-                 (boot_cpu_data.x86_vendor != X86_VENDOR_AMD) ||
-                 rdmsr_safe(regs->ecx, regs->eax, regs->edx) )
+            if ( boot_cpu_data.x86_vendor != X86_VENDOR_AMD )
+                goto fail;
+            if ( cpufreq_controller != FREQCTL_dom0_kernel )
+            {
+                regs->eax = regs->edx = 0;
+                break;
+            }
+            if ( rdmsr_safe(regs->ecx, regs->eax, regs->edx) != 0 )
                 goto fail;
             break;
         case MSR_EFER:
diff -r 19c2b6d2930c -r a7ede5cb628a xen/common/xenoprof.c
--- a/xen/common/xenoprof.c     Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/common/xenoprof.c     Fri Dec 14 10:12:40 2007 -0700
@@ -12,6 +12,7 @@
 #ifndef COMPAT
 #include <xen/guest_access.h>
 #include <xen/sched.h>
+#include <xen/event.h>
 #include <public/xenoprof.h>
 #include <xen/paging.h>
 #include <xsm/xsm.h>
@@ -747,14 +748,30 @@ int do_xenoprof_op(int op, XEN_GUEST_HAN
         break;
 
     case XENOPROF_stop:
+    {
+        struct domain *d;
+        struct vcpu *v;
+        int i;
+
         if ( xenoprof_state != XENOPROF_PROFILING )
         {
             ret = -EPERM;
             break;
         }
         xenoprof_arch_stop();
+
+        /* Flush remaining samples. */
+        for ( i = 0; i < adomains; i++ )
+        {
+            if ( !active_ready[i] )
+                continue;
+            d = active_domains[i];
+            for_each_vcpu(d, v)
+                send_guest_vcpu_virq(v, VIRQ_XENOPROF);
+        }
         xenoprof_state = XENOPROF_READY;
         break;
+    }
 
     case XENOPROF_disable_virq:
     {
diff -r 19c2b6d2930c -r a7ede5cb628a xen/include/asm-x86/hvm/hvm.h
--- a/xen/include/asm-x86/hvm/hvm.h     Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/include/asm-x86/hvm/hvm.h     Fri Dec 14 10:12:40 2007 -0700
@@ -106,11 +106,6 @@ struct hvm_function_table {
     void (*flush_guest_tlbs)(void);
 
     /*
-     * Reflect the virtual APIC's value in the guest's V_TPR register
-     */
-    void (*update_vtpr)(struct vcpu *v, unsigned long value);
-
-    /*
      * Update specifics of the guest state:
      * 1) TS bit in guest cr0 
      * 2) TSC offset in guest
@@ -161,12 +156,8 @@ u64 hvm_get_guest_tsc(struct vcpu *v);
 #define hvm_long_mode_enabled(v) (v,0)
 #endif
 
-static inline enum hvm_intblk
-hvm_interrupt_blocked(struct vcpu *v, struct hvm_intack intack)
-{
-    ASSERT(v == current);
-    return hvm_funcs.interrupt_blocked(v, intack);
-}
+enum hvm_intblk
+hvm_interrupt_blocked(struct vcpu *v, struct hvm_intack intack);
 
 static inline int
 hvm_guest_x86_mode(struct vcpu *v)
@@ -182,12 +173,6 @@ hvm_update_host_cr3(struct vcpu *v)
 hvm_update_host_cr3(struct vcpu *v)
 {
     hvm_funcs.update_host_cr3(v);
-}
-
-static inline void
-hvm_update_vtpr(struct vcpu *v, unsigned long value)
-{
-    hvm_funcs.update_vtpr(v, value);
 }
 
 static inline void hvm_update_guest_cr(struct vcpu *v, unsigned int cr)
diff -r 19c2b6d2930c -r a7ede5cb628a xen/include/asm-x86/hvm/vlapic.h
--- a/xen/include/asm-x86/hvm/vlapic.h  Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/include/asm-x86/hvm/vlapic.h  Fri Dec 14 10:12:40 2007 -0700
@@ -73,8 +73,6 @@ static inline void vlapic_set_reg(
 
 int vlapic_set_irq(struct vlapic *vlapic, uint8_t vec, uint8_t trig);
 
-int vlapic_find_highest_irr(struct vlapic *vlapic);
-
 int vlapic_has_pending_irq(struct vcpu *v);
 int vlapic_ack_pending_irq(struct vcpu *v, int vector);
 
diff -r 19c2b6d2930c -r a7ede5cb628a xen/include/public/io/xs_wire.h
--- a/xen/include/public/io/xs_wire.h   Thu Dec 13 09:34:49 2007 -0700
+++ b/xen/include/public/io/xs_wire.h   Fri Dec 14 10:12:40 2007 -0700
@@ -108,6 +108,13 @@ struct xenstore_domain_interface {
     XENSTORE_RING_IDX rsp_cons, rsp_prod;
 };
 
+/* Violating this is very bad.  See docs/misc/xenstore.txt. */
+#define XENSTORE_PAYLOAD_MAX 4096
+
+/* Violating these just gets you an error back */
+#define XENSTORE_ABS_PATH_MAX 3072
+#define XENSTORE_REL_PATH_MAX 2048
+
 #endif /* _XS_WIRE_H */
 
 /*

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

<Prev in Thread] Current Thread [Next in Thread>