# HG changeset patch
# User Tom Wilkie <tom.wilkie@xxxxxxxxx>
# Date 1175000537 -3600
# Node ID 7eff43986c3abd4aaa9d8b9429fb8fd74c3bde90
# Parent c815f6553816731f6b797dc23dd3d000b4e8e8de
# Parent 79449efbdd80b77b0c89d2c499ec6d4fc383800f
Merge
---
linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c | 2 -
xen/acm/acm_policy.c | 24 ++++++++++-------
xen/arch/x86/hvm/svm/svm.c | 22 ++++++++-------
xen/arch/x86/time.c | 22 ++++++++-------
xen/common/domain.c | 4 ++
xen/common/schedule.c | 7 +---
6 files changed, 45 insertions(+), 36 deletions(-)
diff -r c815f6553816 -r 7eff43986c3a
linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c
--- a/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c Tue Mar 27
13:45:30 2007 +0100
+++ b/linux-2.6-xen-sparse/drivers/xen/core/machine_reboot.c Tue Mar 27
14:02:17 2007 +0100
@@ -123,7 +123,7 @@ static int take_machine_down(void *p_fas
static int take_machine_down(void *p_fast_suspend)
{
int fast_suspend = *(int *)p_fast_suspend;
- int suspend_cancelled, err, cpu;
+ int suspend_cancelled, err;
extern void time_resume(void);
if (fast_suspend) {
diff -r c815f6553816 -r 7eff43986c3a xen/acm/acm_policy.c
--- a/xen/acm/acm_policy.c Tue Mar 27 13:45:30 2007 +0100
+++ b/xen/acm/acm_policy.c Tue Mar 27 14:02:17 2007 +0100
@@ -62,6 +62,7 @@ do_acm_set_policy(void *buf, u32 buf_siz
do_acm_set_policy(void *buf, u32 buf_size)
{
struct acm_policy_buffer *pol = (struct acm_policy_buffer *)buf;
+ uint32_t offset, length;
/* some sanity checking */
if ((be32_to_cpu(pol->magic) != ACM_MAGIC) ||
(buf_size != be32_to_cpu(pol->len)) ||
@@ -92,22 +93,27 @@ do_acm_set_policy(void *buf, u32 buf_siz
/* get bin_policy lock and rewrite policy (release old one) */
write_lock(&acm_bin_pol_rwlock);
+ offset = be32_to_cpu(pol->policy_reference_offset);
+ length = be32_to_cpu(pol->primary_buffer_offset) - offset;
+
/* set label reference name */
- if (acm_set_policy_reference(buf +
be32_to_cpu(pol->policy_reference_offset),
- be32_to_cpu(pol->primary_buffer_offset) -
- be32_to_cpu(pol->policy_reference_offset)))
+ if ( (offset + length) > buf_size ||
+ acm_set_policy_reference(buf + offset, length))
goto error_lock_free;
/* set primary policy data */
- if (acm_primary_ops->set_binary_policy(buf +
be32_to_cpu(pol->primary_buffer_offset),
-
be32_to_cpu(pol->secondary_buffer_offset) -
-
be32_to_cpu(pol->primary_buffer_offset)))
+ offset = be32_to_cpu(pol->primary_buffer_offset);
+ length = be32_to_cpu(pol->secondary_buffer_offset) - offset;
+
+ if ( (offset + length) > buf_size ||
+ acm_primary_ops->set_binary_policy(buf + offset, length))
goto error_lock_free;
/* set secondary policy data */
- if (acm_secondary_ops->set_binary_policy(buf +
be32_to_cpu(pol->secondary_buffer_offset),
- be32_to_cpu(pol->len) -
-
be32_to_cpu(pol->secondary_buffer_offset)))
+ offset = be32_to_cpu(pol->secondary_buffer_offset);
+ length = be32_to_cpu(pol->len) - offset;
+ if ( (offset + length) > buf_size ||
+ acm_secondary_ops->set_binary_policy(buf + offset, length))
goto error_lock_free;
write_unlock(&acm_bin_pol_rwlock);
diff -r c815f6553816 -r 7eff43986c3a xen/arch/x86/hvm/svm/svm.c
--- a/xen/arch/x86/hvm/svm/svm.c Tue Mar 27 13:45:30 2007 +0100
+++ b/xen/arch/x86/hvm/svm/svm.c Tue Mar 27 14:02:17 2007 +0100
@@ -64,8 +64,8 @@ extern int svm_dbg_on;
extern int svm_dbg_on;
void svm_dump_regs(const char *from, struct cpu_user_regs *regs);
-static int svm_do_vmmcall_reset_to_realmode(struct vcpu *v,
- struct cpu_user_regs *regs);
+static int svm_reset_to_realmode(struct vcpu *v,
+ struct cpu_user_regs *regs);
/* va of hardware host save area */
static void *hsa[NR_CPUS] __read_mostly;
@@ -749,19 +749,21 @@ static void svm_init_ap_context(
struct vcpu_guest_context *ctxt, int vcpuid, int trampoline_vector)
{
struct vcpu *v;
+ struct vmcb_struct *vmcb;
cpu_user_regs_t *regs;
u16 cs_sel;
/* We know this is safe because hvm_bringup_ap() does it */
v = current->domain->vcpu[vcpuid];
+ vmcb = v->arch.hvm_svm.vmcb;
regs = &v->arch.guest_context.user_regs;
memset(ctxt, 0, sizeof(*ctxt));
/*
* We execute the trampoline code in real mode. The trampoline vector
- * passed to us is page alligned and is the physicall frame number for
- * the code. We will execute this code in real mode.
+ * passed to us is page alligned and is the physical frame number for
+ * the code. We will execute this code in real mode.
*/
cs_sel = trampoline_vector << 8;
ctxt->user_regs.eip = 0x0;
@@ -771,11 +773,11 @@ static void svm_init_ap_context(
* This is the launch of an AP; set state so that we begin executing
* the trampoline code in real-mode.
*/
- svm_do_vmmcall_reset_to_realmode(v, regs);
+ svm_reset_to_realmode(v, regs);
/* Adjust the vmcb's hidden register state. */
- v->arch.hvm_svm.vmcb->rip = 0;
- v->arch.hvm_svm.vmcb->cs.sel = cs_sel;
- v->arch.hvm_svm.vmcb->cs.base = (cs_sel << 4);
+ vmcb->rip = 0;
+ vmcb->cs.sel = cs_sel;
+ vmcb->cs.base = (cs_sel << 4);
}
static void svm_init_hypercall_page(struct domain *d, void *hypercall_page)
@@ -2494,8 +2496,8 @@ void svm_handle_invlpg(const short invlp
*
* returns 0 on success, non-zero otherwise
*/
-static int svm_do_vmmcall_reset_to_realmode(struct vcpu *v,
- struct cpu_user_regs *regs)
+static int svm_reset_to_realmode(struct vcpu *v,
+ struct cpu_user_regs *regs)
{
struct vmcb_struct *vmcb;
diff -r c815f6553816 -r 7eff43986c3a xen/arch/x86/time.c
--- a/xen/arch/x86/time.c Tue Mar 27 13:45:30 2007 +0100
+++ b/xen/arch/x86/time.c Tue Mar 27 14:02:17 2007 +0100
@@ -670,13 +670,19 @@ static inline void version_update_end(u3
(*version)++;
}
-static inline void __update_vcpu_system_time(struct vcpu *v)
+void update_vcpu_system_time(struct vcpu *v)
{
struct cpu_time *t;
struct vcpu_time_info *u;
+ if ( v->vcpu_info == NULL )
+ return;
+
t = &this_cpu(cpu_time);
u = &vcpu_info(v, time);
+
+ if ( u->tsc_timestamp == t->local_tsc_stamp )
+ return;
version_update_begin(&u->version);
@@ -686,13 +692,6 @@ static inline void __update_vcpu_system_
u->tsc_shift = (s8)t->tsc_scale.shift;
version_update_end(&u->version);
-}
-
-void update_vcpu_system_time(struct vcpu *v)
-{
- if ( vcpu_info(v, time.tsc_timestamp) !=
- this_cpu(cpu_time).local_tsc_stamp )
- __update_vcpu_system_time(v);
}
void update_domain_wallclock_time(struct domain *d)
@@ -771,9 +770,10 @@ static void local_time_calibration(void
local_irq_enable();
#if 0
- printk("PRE%d: tsc=%lld stime=%lld master=%lld\n",
+ printk("PRE%d: tsc=%"PRIu64" stime=%"PRIu64" master=%"PRIu64"\n",
smp_processor_id(), prev_tsc, prev_local_stime, prev_master_stime);
- printk("CUR%d: tsc=%lld stime=%lld master=%lld -> %lld\n",
+ printk("CUR%d: tsc=%"PRIu64" stime=%"PRIu64" master=%"PRIu64
+ " -> %"PRId64"\n",
smp_processor_id(), curr_tsc, curr_local_stime, curr_master_stime,
curr_master_stime - curr_local_stime);
#endif
@@ -854,6 +854,8 @@ static void local_time_calibration(void
t->local_tsc_stamp = curr_tsc;
t->stime_local_stamp = curr_local_stime;
t->stime_master_stamp = curr_master_stime;
+
+ update_vcpu_system_time(current);
out:
set_timer(&t->calibration_timer, NOW() + EPOCH);
diff -r c815f6553816 -r 7eff43986c3a xen/common/domain.c
--- a/xen/common/domain.c Tue Mar 27 13:45:30 2007 +0100
+++ b/xen/common/domain.c Tue Mar 27 14:02:17 2007 +0100
@@ -96,14 +96,16 @@ struct vcpu *alloc_vcpu(
v->domain = d;
v->vcpu_id = vcpu_id;
- v->vcpu_info = shared_info_addr(d, vcpu_info[vcpu_id]);
spin_lock_init(&v->pause_lock);
v->runstate.state = is_idle_vcpu(v) ? RUNSTATE_running : RUNSTATE_offline;
v->runstate.state_entry_time = NOW();
if ( !is_idle_domain(d) )
+ {
set_bit(_VCPUF_down, &v->vcpu_flags);
+ v->vcpu_info = shared_info_addr(d, vcpu_info[vcpu_id]);
+ }
if ( sched_init_vcpu(v, cpu_id) != 0 )
{
diff -r c815f6553816 -r 7eff43986c3a xen/common/schedule.c
--- a/xen/common/schedule.c Tue Mar 27 13:45:30 2007 +0100
+++ b/xen/common/schedule.c Tue Mar 27 14:02:17 2007 +0100
@@ -659,11 +659,8 @@ static void schedule(void)
stop_timer(&prev->periodic_timer);
/* Ensure that the domain has an up-to-date time base. */
- if ( !is_idle_vcpu(next) )
- {
- update_vcpu_system_time(next);
- vcpu_periodic_timer_work(next);
- }
+ update_vcpu_system_time(next);
+ vcpu_periodic_timer_work(next);
TRACE_4D(TRC_SCHED_SWITCH,
prev->domain->domain_id, prev->vcpu_id,
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|