# HG changeset patch
# User Alex Williamson <alex.williamson@xxxxxx>
# Date 1181682963 21600
# Node ID 171ec463e7ce7673edf1915a5c61420ade4bad1a
# Parent 601509daabfc0f33bae7cc5c07ef620b41c4a7a0
[IA64] Use virtualized psr in vcpu context instead of real psr.
Signed-off-by: Tristan Gingold <tgingold@xxxxxxx>
---
tools/libxc/ia64/xc_ia64_hvm_build.c | 6 ++
tools/libxc/ia64/xc_ia64_linux_restore.c | 12 -----
tools/libxc/xc_dom_ia64.c | 6 +-
xen/arch/ia64/vmx/vlsapic.c | 7 ---
xen/arch/ia64/xen/domain.c | 63 ++++++++++++++-----------------
xen/arch/ia64/xen/hypercall.c | 6 --
xen/arch/ia64/xen/vcpu.c | 2
7 files changed, 43 insertions(+), 59 deletions(-)
diff -r 601509daabfc -r 171ec463e7ce tools/libxc/ia64/xc_ia64_hvm_build.c
--- a/tools/libxc/ia64/xc_ia64_hvm_build.c Tue Jun 12 15:07:05 2007 -0600
+++ b/tools/libxc/ia64/xc_ia64_hvm_build.c Tue Jun 12 15:16:03 2007 -0600
@@ -1,3 +1,4 @@
+#include <asm/kregs.h>
#include "xg_private.h"
#include "xenguest.h"
#include "xc_private.h"
@@ -1083,6 +1084,11 @@ xc_hvm_build(int xc_handle, uint32_t dom
free(image);
ctxt->regs.ip = 0x80000000ffffffb0UL;
+ ctxt->regs.ar.fpsr = xc_ia64_fpsr_default();
+ ctxt->regs.cr.isr = 1UL << 63;
+ ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_BN;
+ ctxt->regs.cr.dcr = 0;
+ ctxt->regs.cr.pta = 15 << 2;
memset(&launch_domctl, 0, sizeof(launch_domctl));
diff -r 601509daabfc -r 171ec463e7ce tools/libxc/ia64/xc_ia64_linux_restore.c
--- a/tools/libxc/ia64/xc_ia64_linux_restore.c Tue Jun 12 15:07:05 2007 -0600
+++ b/tools/libxc/ia64/xc_ia64_linux_restore.c Tue Jun 12 15:16:03 2007 -0600
@@ -227,17 +227,7 @@ xc_domain_restore(int xc_handle, int io_
fprintf(stderr, "ip=%016lx, b0=%016lx\n", ctxt.regs.ip, ctxt.regs.b[0]);
- /* First to initialize. */
- domctl.cmd = XEN_DOMCTL_setvcpucontext;
- domctl.domain = (domid_t)dom;
- domctl.u.vcpucontext.vcpu = 0;
- set_xen_guest_handle(domctl.u.vcpucontext.ctxt, &ctxt);
- if (xc_domctl(xc_handle, &domctl) != 0) {
- ERROR("Couldn't set vcpu context");
- goto out;
- }
-
- /* Second to set registers... */
+ /* Initialize and set registers. */
ctxt.flags = VGCF_EXTRA_REGS;
domctl.cmd = XEN_DOMCTL_setvcpucontext;
domctl.domain = (domid_t)dom;
diff -r 601509daabfc -r 171ec463e7ce tools/libxc/xc_dom_ia64.c
--- a/tools/libxc/xc_dom_ia64.c Tue Jun 12 15:07:05 2007 -0600
+++ b/tools/libxc/xc_dom_ia64.c Tue Jun 12 15:16:03 2007 -0600
@@ -13,6 +13,7 @@
#include <string.h>
#include <inttypes.h>
#include <assert.h>
+#include <asm/kregs.h>
#include <xen/xen.h>
#include <xen/foreign/ia64.h>
@@ -106,9 +107,10 @@ static int vcpu_ia64(struct xc_dom_image
memset(ctxt, 0, sizeof(*ctxt));
ctxt->flags = 0;
- ctxt->regs.psr = 0; /* all necessary bits filled by hypervisor */
+ /* PSR is set according to SAL 3.2.4: AC, IC and BN are set. */
+ ctxt->regs.psr = IA64_PSR_AC | IA64_PSR_IC | IA64_PSR_BN;
ctxt->regs.ip = dom->parms.virt_entry;
- ctxt->regs.cfm = (uint64_t) 1 << 63;
+ ctxt->regs.cfm = 1UL << 63;
#ifdef __ia64__ /* FIXME */
ctxt->regs.ar.fpsr = xc_ia64_fpsr_default();
#endif
diff -r 601509daabfc -r 171ec463e7ce xen/arch/ia64/vmx/vlsapic.c
--- a/xen/arch/ia64/vmx/vlsapic.c Tue Jun 12 15:07:05 2007 -0600
+++ b/xen/arch/ia64/vmx/vlsapic.c Tue Jun 12 15:16:03 2007 -0600
@@ -696,11 +696,8 @@ static void vlsapic_write_ipi(VCPU *vcpu
test_bit(_VPF_down, &targ->pause_flags)) {
struct pt_regs *targ_regs = vcpu_regs(targ);
- struct vcpu_guest_context c;
-
- memset (&c, 0, sizeof(c));
-
- if (arch_set_info_guest(targ, &c) != 0) {
+
+ if (arch_set_info_guest(targ, NULL) != 0) {
printk("arch_boot_vcpu: failure\n");
return;
}
diff -r 601509daabfc -r 171ec463e7ce xen/arch/ia64/xen/domain.c
--- a/xen/arch/ia64/xen/domain.c Tue Jun 12 15:07:05 2007 -0600
+++ b/xen/arch/ia64/xen/domain.c Tue Jun 12 15:16:03 2007 -0600
@@ -622,12 +622,10 @@ void arch_get_info_guest(struct vcpu *v,
c.nat->regs.r[10] = uregs->r10;
c.nat->regs.r[11] = uregs->r11;
- if (is_hvm) {
- c.nat->regs.psr = vmx_vcpu_get_psr (v);
- } else {
- /* FIXME: get the vpsr. */
- c.nat->regs.psr = uregs->cr_ipsr;
- }
+ if (is_hvm)
+ c.nat->regs.psr = vmx_vcpu_get_psr(v);
+ else
+ c.nat->regs.psr = vcpu_get_psr(v);
c.nat->regs.ip = uregs->cr_iip;
c.nat->regs.cfm = uregs->cr_ifs;
@@ -717,6 +715,26 @@ int arch_set_info_guest(struct vcpu *v,
struct domain *d = v->domain;
int rc;
+ /* Finish vcpu initialization. */
+ if (!v->is_initialised) {
+ if (d->arch.is_vti)
+ rc = vmx_final_setup_guest(v);
+ else
+ rc = vcpu_late_initialise(v);
+ if (rc != 0)
+ return rc;
+
+ vcpu_init_regs(v);
+
+ v->is_initialised = 1;
+ /* Auto-online VCPU0 when it is initialised. */
+ if (v->vcpu_id == 0)
+ clear_bit(_VPF_down, &v->pause_flags);
+ }
+
+ if (c.nat == NULL)
+ return 0;
+
uregs->b6 = c.nat->regs.b[6];
uregs->b7 = c.nat->regs.b[7];
@@ -727,8 +745,11 @@ int arch_set_info_guest(struct vcpu *v,
uregs->r9 = c.nat->regs.r[9];
uregs->r10 = c.nat->regs.r[10];
uregs->r11 = c.nat->regs.r[11];
-
- uregs->cr_ipsr = c.nat->regs.psr;
+
+ if (!d->arch.is_vti)
+ vcpu_set_psr(v, c.nat->regs.psr);
+ else
+ vmx_vcpu_set_psr(v, c.nat->regs.psr);
uregs->cr_iip = c.nat->regs.ip;
uregs->cr_ifs = c.nat->regs.cfm;
@@ -813,32 +834,6 @@ int arch_set_info_guest(struct vcpu *v,
v->arch.iva = c.nat->regs.cr.iva;
}
- if (v->is_initialised)
- return 0;
-
- if (d->arch.is_vti) {
- rc = vmx_final_setup_guest(v);
- if (rc != 0)
- return rc;
- } else {
- rc = vcpu_late_initialise(v);
- if (rc != 0)
- return rc;
- VCPU(v, interrupt_mask_addr) =
- (unsigned char *) d->arch.shared_info_va +
- INT_ENABLE_OFFSET(v);
- }
-
- /* This overrides some registers. */
- vcpu_init_regs(v);
-
- if (!v->is_initialised) {
- v->is_initialised = 1;
- /* Auto-online VCPU0 when it is initialised. */
- if (v->vcpu_id == 0)
- clear_bit(_VPF_down, &v->pause_flags);
- }
-
return 0;
}
diff -r 601509daabfc -r 171ec463e7ce xen/arch/ia64/xen/hypercall.c
--- a/xen/arch/ia64/xen/hypercall.c Tue Jun 12 15:07:05 2007 -0600
+++ b/xen/arch/ia64/xen/hypercall.c Tue Jun 12 15:16:03 2007 -0600
@@ -86,11 +86,7 @@ fw_hypercall_ipi (struct pt_regs *regs)
/* First start: initialize vpcu. */
if (!targ->is_initialised) {
- struct vcpu_guest_context c;
-
- memset (&c, 0, sizeof (c));
-
- if (arch_set_info_guest (targ, &c) != 0) {
+ if (arch_set_info_guest (targ, NULL) != 0) {
printk ("arch_boot_vcpu: failure\n");
return;
}
diff -r 601509daabfc -r 171ec463e7ce xen/arch/ia64/xen/vcpu.c
--- a/xen/arch/ia64/xen/vcpu.c Tue Jun 12 15:07:05 2007 -0600
+++ b/xen/arch/ia64/xen/vcpu.c Tue Jun 12 15:16:03 2007 -0600
@@ -182,8 +182,6 @@ void vcpu_init_regs(struct vcpu *v)
INT_ENABLE_OFFSET(v);
VCPU(v, itv) = (1 << 16); /* timer vector masked */
- /* SAL specification 3.2.4 */
- VCPU(v, vpsr) = IA64_PSR_AC | IA64_PSR_IC | IA64_PSR_BN;
v->vcpu_info->evtchn_upcall_pending = 0;
v->vcpu_info->evtchn_upcall_mask = -1;
}
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|