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