@@ -14,6 +14,7 @@
#include <xen/init.h>
#include <xen/lib.h>
#include <xen/sched.h>
+#include <xen/sched-if.h>
#include <xen/softirq.h>
#include <xen/wait.h>
#include <xen/errno.h>
@@ -150,7 +151,7 @@ static void ctxt_switch_to(struct vcpu *n)
p2m_restore_state(n);
- WRITE_SYSREG32(n->domain->arch.vpidr, VPIDR_EL2);
+ WRITE_SYSREG32(n->arch.vpidr, VPIDR_EL2);
WRITE_SYSREG(n->arch.vmpidr, VMPIDR_EL2);
/* VGIC */
@@ -521,6 +522,9 @@ int vcpu_initialise(struct vcpu *v)
v->arch.actlr = READ_SYSREG32(ACTLR_EL1);
+ /* The virtual ID matches the physical id of the cpu in the cpupool */
+ v->arch.vpidr = v->domain->cpupool->info.midr;
+
processor_vcpu_initialise(v);
if ( (rc = vcpu_vgic_init(v)) != 0 )
@@ -562,9 +566,6 @@ int arch_domain_create(struct domain *d, unsigned int domcr_flags,
if ( (d->shared_info = alloc_xenheap_pages(0, 0)) == NULL )
goto fail;
- /* Default the virtual ID to match the physical */
- d->arch.vpidr = boot_cpu_data.midr.bits;
-
clear_page(d->shared_info);
share_xen_page_with_guest(
virt_to_page(d->shared_info), d, XENSHARE_writable);
@@ -1975,7 +1975,7 @@ static void do_cp14_32(struct cpu_user_regs *regs, const union hsr hsr)
* - Variant and Revision bits match MDIR
*/
val = (1 << 24) | (5 << 16);
- val |= ((d->arch.vpidr >> 20) & 0xf) | (d->arch.vpidr & 0xf);
+ val |= ((d->vcpu[0]->arch.vpidr >> 20) & 0xf) | (d->vcpu[0]->arch.vpidr & 0xf);
set_user_reg(regs, regidx, val);
break;
@@ -63,9 +63,6 @@ struct arch_domain
RELMEM_done,
} relmem;
- /* Virtual CPUID */
- uint32_t vpidr;
-
struct {
uint64_t offset;
} phys_timer_base;
@@ -173,6 +170,12 @@ struct arch_vcpu
uint32_t esr;
#endif
+ /*
+ * Holds the value of the Virtualization Processor ID.
+ * This is the value returned by Non-secure EL1 reads of MIDR_EL1.
+ */
+ uint32_t vpidr;
+
uint32_t ifsr; /* 32-bit guests only */
uint32_t afsr0, afsr1;