# HG changeset patch # User yamahata@xxxxxxxxxxxxx # Date 1160534926 -32400 # Node ID b5eb9c82cd1a9a6ade0f548498111cff16dbb13c # Parent 5176c3ea32938ab37f9b60d3716de33ee3192d9e remove VHPT_ADDR by mapping vhpt to xen identity mapping area. and some clean ups. PATCHNAME: remove_vhpt_addr Signed-off-by: Isaku Yamahata diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/arch/ia64/linux-xen/entry.S --- a/xen/arch/ia64/linux-xen/entry.S Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/arch/ia64/linux-xen/entry.S Wed Oct 11 11:48:46 2006 +0900 @@ -262,13 +262,15 @@ GLOBAL_ENTRY(ia64_switch_to) #endif rsm psr.ic // interrupts (psr.i) are already disabled here movl r25=PAGE_KERNEL + movl r26 = IA64_GRANULE_SHIFT << 2 ;; srlz.d or r23=r25,r20 // construct PA | page properties - mov r25=IA64_GRANULE_SHIFT<<2 - ;; - mov cr.itir=r25 + ptr.d in0, r26 // to purge dtr[IA64_TR_VHPT] + ;; + mov cr.itir=r26 mov cr.ifa=in0 // VA of next task... + srlz.d ;; mov r25=IA64_TR_CURRENT_STACK #ifdef XEN diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/arch/ia64/xen/domain.c Wed Oct 11 11:48:46 2006 +0900 @@ -117,13 +117,13 @@ void schedule_tail(struct vcpu *prev) extern char ia64_ivt; context_saved(prev); + ia64_disable_vhpt_walker(); if (VMX_DOMAIN(current)) { vmx_do_launch(current); migrate_timer(¤t->arch.arch_vmx.vtm.vtm_timer, current->processor); } else { ia64_set_iva(&ia64_ivt); - ia64_disable_vhpt_walker(); load_region_regs(current); ia64_set_pta(vcpu_pta(current)); vcpu_load_kernel_regs(current); @@ -156,6 +156,8 @@ void context_switch(struct vcpu *prev, s } if (VMX_DOMAIN(next)) vmx_load_state(next); + + ia64_disable_vhpt_walker(); /*ia64_psr(ia64_task_regs(next))->dfh = !ia64_is_local_fpu_owner(next);*/ prev = ia64_switch_to(next); @@ -175,7 +177,6 @@ void context_switch(struct vcpu *prev, s nd = current->domain; if (!is_idle_domain(nd)) { - ia64_disable_vhpt_walker(); load_region_regs(current); ia64_set_pta(vcpu_pta(current)); vcpu_load_kernel_regs(current); @@ -191,7 +192,6 @@ void context_switch(struct vcpu *prev, s * walker. Then all accesses happen within idle context will * be handled by TR mapping and identity mapping. */ - ia64_disable_vhpt_walker(); __ia64_per_cpu_var(current_psr_i_addr) = NULL; __ia64_per_cpu_var(current_psr_ic_addr) = NULL; } diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/arch/ia64/xen/regionreg.c --- a/xen/arch/ia64/xen/regionreg.c Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/arch/ia64/xen/regionreg.c Wed Oct 11 11:48:46 2006 +0900 @@ -17,7 +17,7 @@ #include /* 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 p_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); /* RID virtualization mechanism is really simple: domains have less rid bits than the host and the host rid space is shared among the domains. (Values @@ -260,7 +260,7 @@ int set_one_rr(unsigned long rr, unsigne } else if (rreg == 7) { ia64_new_rr7(vmMangleRID(newrrv.rrval),v->domain->shared_info, v->arch.privregs, v->domain->arch.shared_info_va, - vcpu_vhpt_maddr(v)); + __va_ul(vcpu_vhpt_maddr(v))); } else { set_rr(rr,newrrv.rrval); } diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/arch/ia64/xen/vhpt.c --- a/xen/arch/ia64/xen/vhpt.c Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/arch/ia64/xen/vhpt.c Wed Oct 11 11:48:46 2006 +0900 @@ -29,7 +29,7 @@ DEFINE_PER_CPU (unsigned long, vhpt_pend DEFINE_PER_CPU (unsigned long, vhpt_pend); static void - __vhpt_flush(unsigned long vhpt_maddr) +__vhpt_flush(unsigned long vhpt_maddr) { struct vhpt_lf_entry *v = (struct vhpt_lf_entry*)__va(vhpt_maddr); int i; @@ -155,8 +155,7 @@ pervcpu_vhpt_alloc(struct vcpu *v) v->arch.pta.ve = 1; // enable vhpt v->arch.pta.size = VHPT_SIZE_LOG2; v->arch.pta.vf = 1; // long format - //v->arch.pta.base = __va(v->arch.vhpt_maddr) >> 15; - v->arch.pta.base = VHPT_ADDR >> 15; + v->arch.pta.base = __va_ul(v->arch.vhpt_maddr) >> 15; vhpt_erase(v->arch.vhpt_maddr); smp_mb(); // per vcpu vhpt may be used by another physical cpu. @@ -248,7 +247,8 @@ __flush_vhpt_range(unsigned long vhpt_ma while ((long)addr_range > 0) { /* Get the VHPT entry. */ - unsigned int off = ia64_thash(vadr) - VHPT_ADDR; + unsigned int off = ia64_thash(vadr) - + __va_ul(vcpu_vhpt_maddr(current)); struct vhpt_lf_entry *v = vhpt_base + off; v->ti_tag = INVALID_TI_TAG; addr_range -= PAGE_SIZE; @@ -339,7 +339,7 @@ void domain_flush_tlb_vhpt(struct domain void domain_flush_tlb_vhpt(struct domain *d) { /* Very heavy... */ - if (HAS_PERVCPU_VHPT(d) /* || VMX_DOMAIN(v) */) + if (HAS_PERVCPU_VHPT(d) || d->arch.is_vti) on_each_cpu((void (*)(void *))local_flush_tlb_all, NULL, 1, 1); else on_each_cpu((void (*)(void *))flush_tlb_vhpt_all, d, 1, 1); diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/arch/ia64/xen/xenasm.S --- a/xen/arch/ia64/xen/xenasm.S Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/arch/ia64/xen/xenasm.S Wed Oct 11 11:48:46 2006 +0900 @@ -26,10 +26,11 @@ // void *shared_info, /* in1 */ // void *shared_arch_info, /* in2 */ // unsigned long shared_info_va, /* in3 */ -// unsigned long p_vhpt) /* in4 */ +// unsigned long va_vhpt) /* in4 */ //Local usage: // loc0=rp, loc1=ar.pfs, loc2=percpu_paddr, loc3=psr, loc4=ar.rse // loc5=pal_vaddr, loc6=xen_paddr, loc7=shared_archinfo_paddr, +// r16, r19, r20 are used by ia64_switch_mode_{phys, virt}() GLOBAL_ENTRY(ia64_new_rr7) // FIXME? not sure this unwind statement is correct... .prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(1) @@ -118,16 +119,31 @@ 1: // VHPT #if VHPT_ENABLED - mov r24=VHPT_SIZE_LOG2<<2 - movl r22=VHPT_ADDR +#if IA64_GRANULE_SHIFT < VHPT_SIZE_LOG2 +#error "it must be that VHPT_SIZE_LOG2 <= IA64_GRANULE_SHIFT" +#endif + // unless overlaps with KERNEL_TR and IA64_TR_CURRENT_STACK + dep r14=0,in4,0,KERNEL_TR_PAGE_SHIFT + dep r15=0,in4,0,IA64_GRANULE_SHIFT + dep r21=0,r13,0,IA64_GRANULE_SHIFT + ;; + cmp.eq p7,p0=r17,r14 + cmp.eq p8,p0=r15,r21 +(p7) br.cond.sptk .vhpt_overlaps +(p8) br.cond.sptk .vhpt_overlaps mov r21=IA64_TR_VHPT - ;; - ptr.d r22,r24 - or r23=in4,r26 // construct PA | page properties - mov cr.itir=r24 - mov cr.ifa=r22 + dep r22=0,r15,60,4 // physical address of + // va_vhpt & ~(IA64_GRANULE_SIZE - 1) + mov r24=IA64_GRANULE_SHIFT<<2 + ;; + ptr.d r15,r24 + or r23=r22,r26 // construct PA | page properties + mov cr.itir=r24 + mov cr.ifa=r15 + srlz.d ;; itr.d dtr[r21]=r23 // wire in new mapping... +.vhpt_overlaps: #endif // Shared info diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/include/asm-ia64/vhpt.h --- a/xen/include/asm-ia64/vhpt.h Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/include/asm-ia64/vhpt.h Wed Oct 11 11:48:46 2006 +0900 @@ -75,7 +75,8 @@ vcpu_pta(struct vcpu* v) if (HAS_PERVCPU_VHPT(v->domain)) return v->arch.pta.val; #endif - return VHPT_ADDR | (1 << 8) | (VHPT_SIZE_LOG2 << 2) | VHPT_ENABLED; + return __va_ul(__get_cpu_var(vhpt_paddr)) | (1 << 8) | + (VHPT_SIZE_LOG2 << 2) | VHPT_ENABLED; } #endif /* !__ASSEMBLY */ diff -r 5176c3ea3293 -r b5eb9c82cd1a xen/include/asm-ia64/xensystem.h --- a/xen/include/asm-ia64/xensystem.h Sun Oct 08 18:55:12 2006 -0600 +++ b/xen/include/asm-ia64/xensystem.h Wed Oct 11 11:48:46 2006 +0900 @@ -22,7 +22,6 @@ #define GATE_ADDR KERNEL_START #define DEFAULT_SHAREDINFO_ADDR 0xf100000000000000 #define PERCPU_ADDR (DEFAULT_SHAREDINFO_ADDR - PERCPU_PAGE_SIZE) -#define VHPT_ADDR 0xf200000000000000 #ifdef CONFIG_VIRTUAL_FRAME_TABLE #define VIRT_FRAME_TABLE_ADDR 0xf300000000000000 #define VIRT_FRAME_TABLE_END 0xf400000000000000