[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64] EFI mapping: restoring mapping correctly.
# HG changeset patch # User Isaku Yamahata <yamahata@xxxxxxxxxxxxx> # Date 1219658677 -32400 # Node ID 6607624285b213f9bcb66636593facbc143e2c7c # Parent 9112c53b70cdcacfc0630365dc768f6d5dd2188a [IA64] EFI mapping: restoring mapping correctly. When swiching back from efi mapping, correctly switch back depending on the current vcpu type. Signed-off-by: Isaku Yamahata <yamahata@xxxxxxxxxxxxx> --- xen/arch/ia64/vmx/vmx_phy_mode.c | 4 -- xen/arch/ia64/vmx/vmx_vcpu.c | 21 ++++++++------ xen/arch/ia64/xen/regionreg.c | 42 ++++++++++++++++++++++++++--- xen/include/asm-ia64/linux-xen/linux/efi.h | 4 +- xen/include/asm-ia64/regionreg.h | 1 xen/include/asm-ia64/vmx_vcpu.h | 4 +- 6 files changed, 56 insertions(+), 20 deletions(-) diff -r 9112c53b70cd -r 6607624285b2 xen/arch/ia64/vmx/vmx_phy_mode.c --- a/xen/arch/ia64/vmx/vmx_phy_mode.c Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/arch/ia64/vmx/vmx_phy_mode.c Mon Aug 25 19:04:37 2008 +0900 @@ -169,9 +169,7 @@ vmx_load_all_rr(VCPU *vcpu) ia64_dv_serialize_data(); ia64_set_rr((VRN6 << VRN_SHIFT), vrrtomrr(vcpu, VMX(vcpu, vrr[VRN6]))); ia64_dv_serialize_data(); - vmx_switch_rr7(vrrtomrr(vcpu,VMX(vcpu, vrr[VRN7])), - (void *)vcpu->arch.vhpt.hash, - vcpu->arch.privregs); + vmx_switch_rr7_vcpu(vcpu, vrrtomrr(vcpu, VMX(vcpu, vrr[VRN7]))); ia64_set_pta(VMX(vcpu, mpta)); vmx_ia64_set_dcr(vcpu); diff -r 9112c53b70cd -r 6607624285b2 xen/arch/ia64/vmx/vmx_vcpu.c --- a/xen/arch/ia64/vmx/vmx_vcpu.c Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/arch/ia64/vmx/vmx_vcpu.c Mon Aug 25 19:04:37 2008 +0900 @@ -196,13 +196,17 @@ void vmx_vcpu_set_rr_fast(VCPU *vcpu, u6 } } -void vmx_switch_rr7(unsigned long rid, void *guest_vhpt, - void *shared_arch_info) -{ - __get_cpu_var(inserted_vhpt) = (unsigned long)guest_vhpt; - __get_cpu_var(inserted_vpd) = (unsigned long)shared_arch_info; - __get_cpu_var(inserted_mapped_regs) = (unsigned long)shared_arch_info; - __vmx_switch_rr7(rid, guest_vhpt, shared_arch_info); +void __vmx_switch_rr7_vcpu(struct vcpu *v, unsigned long rid) +{ + __vmx_switch_rr7(rid, (void *)v->arch.vhpt.hash, v->arch.privregs); +} + +void vmx_switch_rr7_vcpu(struct vcpu *v, unsigned long rid) +{ + __get_cpu_var(inserted_vhpt) = (unsigned long)v->arch.vhpt.hash; + __get_cpu_var(inserted_vpd) = (unsigned long)v->arch.privregs; + __get_cpu_var(inserted_mapped_regs) = (unsigned long)v->arch.privregs; + __vmx_switch_rr7_vcpu(v, rid); } IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, u64 reg, u64 val) @@ -218,8 +222,7 @@ IA64FAULT vmx_vcpu_set_rr(VCPU *vcpu, u6 switch((u64)(reg>>VRN_SHIFT)) { case VRN7: if (likely(vcpu == current)) - vmx_switch_rr7(vrrtomrr(vcpu,val), (void *)vcpu->arch.vhpt.hash, - vcpu->arch.privregs); + vmx_switch_rr7_vcpu(vcpu, vrrtomrr(vcpu, val)); break; case VRN4: rrval = vrrtomrr(vcpu,val); diff -r 9112c53b70cd -r 6607624285b2 xen/arch/ia64/xen/regionreg.c --- a/xen/arch/ia64/xen/regionreg.c Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/arch/ia64/xen/regionreg.c Mon Aug 25 19:04:37 2008 +0900 @@ -18,9 +18,12 @@ #include <asm/vcpu.h> #include <asm/percpu.h> #include <asm/pal.h> +#include <asm/vmx_vcpu.h> /* Defined in xemasm.S */ -extern void ia64_new_rr7(unsigned long rid, void *shared_info, void *shared_arch_info, unsigned long shared_info_va, unsigned long va_vhpt); +extern void ia64_new_rr7(unsigned long rid, void *shared_info, + void *shared_arch_info, unsigned long shared_info_va, + unsigned long va_vhpt); extern void ia64_new_rr7_efi(unsigned long rid, unsigned long repin_percpu, unsigned long vpd); @@ -237,6 +240,14 @@ set_rr(unsigned long rr, unsigned long r { ia64_set_rr(rr, vmMangleRID(rrval)); ia64_srlz_d(); +} + +static inline void +ia64_new_rr7_vcpu(struct vcpu *v, unsigned long rid) +{ + ia64_new_rr7(rid, v->domain->shared_info, + v->arch.privregs, v->domain->arch.shared_info_va, + __va_ul(vcpu_vhpt_maddr(v))); } // validates and changes a single region register @@ -282,9 +293,7 @@ int set_one_rr(unsigned long rr, unsigne __get_cpu_var(inserted_mapped_regs) = v->domain->arch.shared_info_va + XMAPPEDREGS_OFS; - ia64_new_rr7(vmMangleRID(newrrv.rrval),v->domain->shared_info, - v->arch.privregs, v->domain->arch.shared_info_va, - __va_ul(vcpu_vhpt_maddr(v))); + ia64_new_rr7_vcpu(v, vmMangleRID(newrrv.rrval)); } else { set_rr(rr,newrrv.rrval); } @@ -310,6 +319,31 @@ int set_one_rr_efi(unsigned long rr, uns } return 1; +} + +void +set_one_rr_efi_restore(unsigned long rr, unsigned long val) +{ + unsigned long rreg = REGION_NUMBER(rr); + + BUG_ON(rreg != 6 && rreg != 7); + + if (rreg == 6) { + ia64_set_rr(rr, val); + ia64_srlz_d(); + } else { + /* firmware call is done very early before struct vcpu + and strcut domain are initialized. */ + if (unlikely(current == NULL || current->domain == NULL || + is_idle_vcpu(current))) + ia64_new_rr7_efi(val, cpu_isset(smp_processor_id(), + percpu_set), + 0UL); + else if (VMX_DOMAIN(current)) + __vmx_switch_rr7_vcpu(current, val); + else + ia64_new_rr7_vcpu(current, val); + } } void set_virtual_rr0(void) diff -r 9112c53b70cd -r 6607624285b2 xen/include/asm-ia64/linux-xen/linux/efi.h --- a/xen/include/asm-ia64/linux-xen/linux/efi.h Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/include/asm-ia64/linux-xen/linux/efi.h Mon Aug 25 19:04:37 2008 +0900 @@ -487,8 +487,8 @@ struct efi_generic_dev_path { #define XEN_EFI_RR_LEAVE(rr6, rr7) do { \ if (rr7 != XEN_EFI_RR) { \ efi_unmap_pal_code(); \ - set_one_rr_efi(6UL << 61, rr6); \ - set_one_rr_efi(7UL << 61, rr7); \ + set_one_rr_efi_restore(6UL << 61, rr6); \ + set_one_rr_efi_restore(7UL << 61, rr7); \ } \ } while (0) diff -r 9112c53b70cd -r 6607624285b2 xen/include/asm-ia64/regionreg.h --- a/xen/include/asm-ia64/regionreg.h Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/include/asm-ia64/regionreg.h Mon Aug 25 19:04:37 2008 +0900 @@ -46,6 +46,7 @@ extern cpumask_t percpu_set; int set_one_rr(unsigned long rr, unsigned long val); int set_one_rr_efi(unsigned long rr, unsigned long val); +void set_one_rr_efi_restore(unsigned long rr, unsigned long val); // This function is purely for performance... apparently scrambling // bits in the region id makes for better hashing, which means better diff -r 9112c53b70cd -r 6607624285b2 xen/include/asm-ia64/vmx_vcpu.h --- a/xen/include/asm-ia64/vmx_vcpu.h Mon Aug 25 19:04:37 2008 +0900 +++ b/xen/include/asm-ia64/vmx_vcpu.h Mon Aug 25 19:04:37 2008 +0900 @@ -105,8 +105,8 @@ extern void vcpu_load_kernel_regs(VCPU * extern void vcpu_load_kernel_regs(VCPU * vcpu); extern void __vmx_switch_rr7(unsigned long rid, void *guest_vhpt, void *shared_arch_info); -extern void vmx_switch_rr7(unsigned long rid, void *guest_vhpt, - void *shared_arch_info); +extern void __vmx_switch_rr7_vcpu(struct vcpu *v, unsigned long rid); +extern void vmx_switch_rr7_vcpu(struct vcpu *v, unsigned long rid); extern void vmx_ia64_set_dcr(VCPU * v); extern void inject_guest_interruption(struct vcpu *vcpu, u64 vec); extern void vmx_asm_bsw0(void); _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |