[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64] Support of 4k page size for individual guests
# HG changeset patch # User Alex Williamson <alex.williamson@xxxxxx> # Date 1187280206 21600 # Node ID b5dbf184df6c643ab524945c3de207c59eaf08c5 # Parent f317c27973f51f797677edecdbc1c99aed81f428 [IA64] Support of 4k page size for individual guests 4k pagesize support per vcpu Signed-off-by: Juergen Gross <juergen.gross@xxxxxxxxxxxxxxxxxxx> --- xen/arch/ia64/asm-offsets.c | 1 xen/arch/ia64/xen/domain.c | 1 xen/arch/ia64/xen/faults.c | 21 ++-- xen/arch/ia64/xen/hyperprivop.S | 195 +++++++++++++++++++--------------------- xen/arch/ia64/xen/mm.c | 20 ++-- xen/arch/ia64/xen/regionreg.c | 6 - xen/arch/ia64/xen/vcpu.c | 41 +++++--- xen/arch/ia64/xen/vhpt.c | 27 +++-- xen/include/asm-ia64/domain.h | 1 9 files changed, 168 insertions(+), 145 deletions(-) diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/asm-offsets.c --- a/xen/arch/ia64/asm-offsets.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/asm-offsets.c Thu Aug 16 10:03:26 2007 -0600 @@ -72,6 +72,7 @@ void foo(void) DEFINE(IA64_VCPU_DOMAIN_ITM_LAST_OFFSET, offsetof (struct vcpu, arch.domain_itm_last)); DEFINE(IA64_VCPU_ITLB_OFFSET, offsetof (struct vcpu, arch.itlb)); DEFINE(IA64_VCPU_DTLB_OFFSET, offsetof (struct vcpu, arch.dtlb)); + DEFINE(IA64_VCPU_VHPT_PG_SHIFT_OFFSET, offsetof (struct vcpu, arch.vhpt_pg_shift)); BLANK(); diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/domain.c --- a/xen/arch/ia64/xen/domain.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/domain.c Thu Aug 16 10:03:26 2007 -0600 @@ -446,6 +446,7 @@ int vcpu_initialise(struct vcpu *v) v->arch.ending_rid = d->arch.ending_rid; v->arch.breakimm = d->arch.breakimm; v->arch.last_processor = INVALID_PROCESSOR; + v->arch.vhpt_pg_shift = PAGE_SHIFT; } if (!VMX_DOMAIN(v)) diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/faults.c --- a/xen/arch/ia64/xen/faults.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/faults.c Thu Aug 16 10:03:26 2007 -0600 @@ -239,6 +239,8 @@ void ia64_do_page_fault(unsigned long ad (regs->cr_ipsr & ~DELIVER_PSR_CLR) | DELIVER_PSR_SET; regs->cr_ipsr = vcpu_pl_adjust(regs->cr_ipsr, IA64_PSR_CPL0_BIT); + if (PSCB(current, dcr) & IA64_DCR_BE) + regs->cr_ipsr |= IA64_PSR_BE; if (PSCB(current, hpsr_dfh)) regs->cr_ipsr |= IA64_PSR_DFH; @@ -741,7 +743,8 @@ ia64_shadow_fault(unsigned long ifa, uns pte = vlfe->page_flags; if (vlfe->ti_tag == ia64_ttag(ifa)) { /* The VHPT entry is valid. */ - gpfn = get_gpfn_from_mfn((pte & _PAGE_PPN_MASK) >> PAGE_SHIFT); + gpfn = get_gpfn_from_mfn((pte & _PAGE_PPN_MASK) >> + v->arch.vhpt_pg_shift); BUG_ON(gpfn == INVALID_M2P_ENTRY); } else { unsigned long itir, iha; @@ -757,10 +760,10 @@ ia64_shadow_fault(unsigned long ifa, uns /* Try again! */ if (fault != IA64_NO_FAULT) { /* This will trigger a dtlb miss. */ - ia64_ptcl(ifa, PAGE_SHIFT << 2); - return; - } - gpfn = ((pte & _PAGE_PPN_MASK) >> PAGE_SHIFT); + ia64_ptcl(ifa, v->arch.vhpt_pg_shift << 2); + return; + } + gpfn = ((pte & _PAGE_PPN_MASK) >> v->arch.vhpt_pg_shift); if (pte & _PAGE_D) pte |= _PAGE_VIRT_D; } @@ -788,7 +791,7 @@ ia64_shadow_fault(unsigned long ifa, uns /* Purge the TC locally. It will be reloaded from the VHPT iff the VHPT entry is still valid. */ - ia64_ptcl(ifa, PAGE_SHIFT << 2); + ia64_ptcl(ifa, v->arch.vhpt_pg_shift << 2); atomic64_inc(&d->arch.shadow_fault_count); } else { @@ -800,6 +803,6 @@ ia64_shadow_fault(unsigned long ifa, uns /* We don't know wether or not the fault must be reflected. The VHPT entry is not valid. */ /* FIXME: in metaphysical mode, we could do an ITC now. */ - ia64_ptcl(ifa, PAGE_SHIFT << 2); - } -} + ia64_ptcl(ifa, v->arch.vhpt_pg_shift << 2); + } +} diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/hyperprivop.S --- a/xen/arch/ia64/xen/hyperprivop.S Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/hyperprivop.S Thu Aug 16 10:03:26 2007 -0600 @@ -1604,26 +1604,27 @@ ENTRY(hyper_set_rr) extr.u r26=r9,IA64_RR_RID,IA64_RR_RID_LEN // r26 = r9.rid movl r20=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; ld8 r20=[r20];; - adds r21=IA64_VCPU_STARTING_RID_OFFSET,r20;; - ld4 r22=[r21];; - adds r21=IA64_VCPU_ENDING_RID_OFFSET,r20;; - ld4 r23=[r21];; - adds r24=IA64_VCPU_META_SAVED_RR0_OFFSET,r20;; + adds r22=IA64_VCPU_STARTING_RID_OFFSET,r20 + adds r23=IA64_VCPU_ENDING_RID_OFFSET,r20 + adds r24=IA64_VCPU_META_SAVED_RR0_OFFSET,r20 + adds r21=IA64_VCPU_VHPT_PG_SHIFT_OFFSET,r20;; + ld4 r22=[r22] + ld4 r23=[r23] + ld1 r21=[r21];; add r22=r26,r22;; cmp.geu p6,p0=r22,r23 // if r9.rid + starting_rid >= ending_rid (p6) br.cond.spnt.few 1f; // this is an error, but just ignore/return - // r21=starting_rid adds r20=XSI_RR0_OFS-XSI_PSR_IC_OFS,r18 shl r25=r25,3;; add r20=r20,r25;; st8 [r20]=r9;; // store away exactly what was passed // but adjust value actually placed in rr[r8] // r22 contains adjusted rid, "mangle" it (see regionreg.c) - // and set ps to PAGE_SHIFT and ve to 1 + // and set ps to v->arch.vhpt_pg_shift and ve to 1 extr.u r27=r22,0,8 extr.u r28=r22,8,8 - extr.u r29=r22,16,8;; - dep.z r23=PAGE_SHIFT,IA64_RR_PS,IA64_RR_PS_LEN;; + extr.u r29=r22,16,8 + dep.z r23=r21,IA64_RR_PS,IA64_RR_PS_LEN;; dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 dep r23=r27,r23,24,8;; dep r23=r28,r23,16,8;; @@ -1673,34 +1674,38 @@ ENTRY(hyper_set_rr0_to_rr4) ld8 r17=[r17];; adds r21=IA64_VCPU_STARTING_RID_OFFSET,r17 - adds r25=IA64_VCPU_ENDING_RID_OFFSET,r17 + adds r22=IA64_VCPU_ENDING_RID_OFFSET,r17 + adds r23=IA64_VCPU_VHPT_PG_SHIFT_OFFSET,r17 ;; - ld4 r22=[r21] // r22 = current->starting_rid + ld4 r21=[r21] // r21 = current->starting_rid extr.u r26=r8,IA64_RR_RID,IA64_RR_RID_LEN // r26 = r8.rid extr.u r27=r9,IA64_RR_RID,IA64_RR_RID_LEN // r27 = r9.rid - ld4 r23=[r25] // r23 = current->ending_rid + ld4 r22=[r22] // r22 = current->ending_rid extr.u r28=r10,IA64_RR_RID,IA64_RR_RID_LEN // r28 = r10.rid extr.u r29=r11,IA64_RR_RID,IA64_RR_RID_LEN // r29 = r11.rid adds r24=IA64_VCPU_META_SAVED_RR0_OFFSET,r17 extr.u r30=r14,IA64_RR_RID,IA64_RR_RID_LEN // r30 = r14.rid + ld1 r23=[r23] // r23 = current->vhpt_pg_shift ;; - add r16=r26,r22 - add r17=r27,r22 - add r19=r28,r22 - add r20=r29,r22 - add r21=r30,r22 + add r16=r26,r21 + add r17=r27,r21 + add r19=r28,r21 + add r20=r29,r21 + add r21=r30,r21 + dep.z r23=r23,IA64_RR_PS,IA64_RR_PS_LEN // r23 = rr.ps ;; - cmp.geu p6,p0=r16,r23 // if r8.rid + starting_rid >= ending_rid - cmp.geu p7,p0=r17,r23 // if r9.rid + starting_rid >= ending_rid - cmp.geu p8,p0=r19,r23 // if r10.rid + starting_rid >= ending_rid + cmp.geu p6,p0=r16,r22 // if r8.rid + starting_rid >= ending_rid + cmp.geu p7,p0=r17,r22 // if r9.rid + starting_rid >= ending_rid + cmp.geu p8,p0=r19,r22 // if r10.rid + starting_rid >= ending_rid (p6) br.cond.spnt.few 1f // this is an error, but just ignore/return (p7) br.cond.spnt.few 1f // this is an error, but just ignore/return - cmp.geu p9,p0=r20,r23 // if r11.rid + starting_rid >= ending_rid + cmp.geu p9,p0=r20,r22 // if r11.rid + starting_rid >= ending_rid (p8) br.cond.spnt.few 1f // this is an error, but just ignore/return (p9) br.cond.spnt.few 1f // this is an error, but just ignore/return - cmp.geu p10,p0=r21,r23 // if r14.rid + starting_rid >= ending_rid + cmp.geu p10,p0=r21,r22 // if r14.rid + starting_rid >= ending_rid (p10) br.cond.spnt.few 1f // this is an error, but just ignore/return - + dep r23=-1,r23,0,1 // add rr.ve + ;; mov r25=1 adds r22=XSI_RR0_OFS-XSI_PSR_IC_OFS,r18 ;; @@ -1715,13 +1720,11 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r27=r16,0,8 extr.u r28=r16,8,8 extr.u r29=r16,16,8;; - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - st8 [r24]=r23 // save for metaphysical - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + st8 [r24]=r25 // save for metaphysical + mov rr[r26]=r25 dv_serialize_data // rr1 @@ -1730,12 +1733,10 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r27=r17,0,8 extr.u r28=r17,8,8 extr.u r29=r17,16,8;; - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data // rr2 @@ -1744,12 +1745,10 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r27=r19,0,8 extr.u r28=r19,8,8 extr.u r29=r19,16,8;; - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data // rr3 @@ -1759,12 +1758,10 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r27=r20,0,8 extr.u r28=r20,8,8 extr.u r29=r20,16,8;; - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data // rr4 @@ -1774,49 +1771,43 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r27=r21,0,8 extr.u r28=r21,8,8 extr.u r29=r21,16,8;; - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data #else // shuffled version // rr0 // uses r27, r28, r29 for mangling - // r23 for mangled value + // r25 for mangled value st8 [r22]=r8, 8 // current->rrs[0] = r8 mov r26=0 // r26=0x0000000000000000 extr.u r27=r16,0,8 extr.u r28=r16,8,8 - extr.u r29=r16,16,8 - dep.z r23=PAGE_SHIFT,2,6;; - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - extr.u r25=r17,0,8 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - st8 [r24]=r23 // save for metaphysical - mov rr[r26]=r23 + extr.u r29=r16,16,8;; + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + st8 [r24]=r25 // save for metaphysical + mov rr[r26]=r25 dv_serialize_data // r16, r24, r25 is usable. // rr1 // uses r25, r28, r29 for mangling - // r23 for mangled value + // r25 for mangled value + extr.u r25=r17,0,8 extr.u r28=r17,8,8 st8 [r22]=r9, 8 // current->rrs[1] = r9 extr.u r29=r17,16,8 ;; - dep.z r23=PAGE_SHIFT,2,6;; add r26=r26,r30 // r26 = 0x2000000000000000 - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 extr.u r24=r19,8,8 extr.u r16=r19,0,8 - dep r23=r25,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r25,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data // r16, r17, r24, r25 is usable @@ -1826,10 +1817,8 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r29=r19,16,8 extr.u r27=r20,0,8 st8 [r22]=r10, 8 // current->rrs[2] = r10 - dep.z r17=PAGE_SHIFT,2,6;; add r26=r26,r30 // r26 = 0x4000000000000000 - dep r17=-1,r17,0,1;; // mangling is swapping bytes 1 & 3 - dep r17=r16,r17,24,8;; + dep r17=r16,r23,24,8;; // mangling is swapping bytes 1 & 3 dep r17=r24,r17,16,8;; dep r17=r29,r17,8,8;; mov rr[r26]=r17 @@ -1838,18 +1827,16 @@ ENTRY(hyper_set_rr0_to_rr4) // r16, r17, r19, r24, r25 is usable // rr3 // uses r27, r28, r29 for mangling - // r23 for mangled value + // r25 for mangled value extr.u r28=r20,8,8 extr.u r29=r20,16,8 st8 [r22]=r11, 8 // current->rrs[3] = r11 extr.u r16=r21,0,8 - dep.z r23=PAGE_SHIFT,2,6;; add r26=r26,r30 // r26 = 0x6000000000000000 - dep r23=-1,r23,0,1;; // mangling is swapping bytes 1 & 3 - dep r23=r27,r23,24,8;; - dep r23=r28,r23,16,8;; - dep r23=r29,r23,8,8;; - mov rr[r26]=r23 + dep r25=r27,r23,24,8;; // mangling is swapping bytes 1 & 3 + dep r25=r28,r25,16,8;; + dep r25=r29,r25,8,8;; + mov rr[r26]=r25 dv_serialize_data // r16, r17, r19, r20, r24, r25 @@ -1859,10 +1846,8 @@ ENTRY(hyper_set_rr0_to_rr4) extr.u r17=r21,8,8 extr.u r24=r21,16,8 st8 [r22]=r14 // current->rrs[4] = r14 - dep.z r25=PAGE_SHIFT,2,6;; add r26=r26,r30 // r26 = 0x8000000000000000 - dep r25=-1,r25,0,1;; // mangling is swapping bytes 1 & 3 - dep r25=r16,r25,24,8;; + dep r25=r16,r23,24,8;; // mangling is swapping bytes 1 & 3 dep r25=r17,r25,16,8;; dep r25=r24,r25,8,8;; mov rr[r26]=r25 @@ -2024,26 +2009,30 @@ ENTRY(hyper_ptc_ga) adds r21=1,r21;; st4 [r20]=r21;; #endif + movl r21=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; + ld8 r21=[r21];; + adds r22=IA64_VCPU_VHPT_PG_SHIFT_OFFSET,r21 mov r28=r8 extr.u r19=r9,2,6 // addr_range=1<<((r9&0xfc)>>2) mov r20=1 shr.u r24=r8,61 - addl r27=56,r0 // PAGE_SHIFT<<2 (for ptc.ga) movl r26=0x8000000000000000 // INVALID_TI_TAG mov r30=ar.lc ;; + ld1 r22=[r22] // current->arch.vhpt_pg_shift shl r19=r20,r19 cmp.eq p7,p0=7,r24 (p7) br.spnt.many dispatch_break_fault ;; // slow way for rr7 ;; + shl r27=r22,2 // vhpt_pg_shift<<2 (for ptc.ga) + shr.u r23=r19,r22 // repeat loop for n pages cmp.le p7,p0=r19,r0 // skip flush if size<=0 (p7) br.cond.dpnt 2f ;; - extr.u r24=r19,0,PAGE_SHIFT - shr.u r23=r19,PAGE_SHIFT ;; // repeat loop for n pages - cmp.ne p7,p0=r24,r0 ;; + shl r24=r23,r22;; + cmp.ne p7,p0=r24,r23 ;; (p7) adds r23=1,r23 ;; // n_pages<size<n_pages+1? extra iter mov ar.lc=r23 - movl r29=PAGE_SIZE;; + shl r29=r20,r22;; // page_size 1: thash r25=r28 ;; adds r25=16,r25 ;; @@ -2060,10 +2049,8 @@ 2: mov ar.lc=r30 ;; mov r29=cr.ipsr mov r30=cr.iip;; - movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; - ld8 r27=[r27];; - adds r25=IA64_VCPU_DTLB_OFFSET,r27 - adds r26=IA64_VCPU_ITLB_OFFSET,r27;; + adds r25=IA64_VCPU_DTLB_OFFSET,r21 + adds r26=IA64_VCPU_ITLB_OFFSET,r21;; ld8 r24=[r25] ld8 r27=[r26] ;; and r24=-2,r24 @@ -2110,10 +2097,14 @@ hyper_itc_d: br.sptk.many dispatch_break_fault ;; #else // ensure itir.ps >= xen's pagesize + movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; + ld8 r27=[r27];; + adds r22=IA64_VCPU_VHPT_PG_SHIFT_OFFSET,r27 adds r23=XSI_ITIR_OFS-XSI_PSR_IC_OFS,r18 ;; + ld1 r22=[r22] ld8 r23=[r23];; extr.u r24=r23,IA64_ITIR_PS,IA64_ITIR_PS_LEN;; // r24==logps - cmp.gt p7,p0=PAGE_SHIFT,r24 + cmp.gt p7,p0=r22,r24 (p7) br.spnt.many dispatch_break_fault ;; adds r21=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r21=[r21];; @@ -2121,8 +2112,6 @@ hyper_itc_d: extr.u r21=r21,61,3;; cmp.eq p7,p0=r21,r0 (p7) br.spnt.many dispatch_break_fault ;; - movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; - ld8 r27=[r27];; adds r27=IA64_VCPU_DOMAIN_OFFSET,r27;; ld8 r27=[r27] // FIXME: is the global var dom0 always pinned? assume so for now @@ -2160,18 +2149,24 @@ END(hyper_itc) // r31 == pr ENTRY(fast_insert) // translate_domain_pte(r16=pteval,PSCB(ifa)=address,r24=itir) - mov r19=1;; - shl r20=r19,r24;; + mov r19=1 + movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; + shl r20=r19,r24 + ld8 r27=[r27];; + adds r23=IA64_VCPU_VHPT_PG_SHIFT_OFFSET,r27 adds r20=-1,r20 // r20 == mask movl r19=_PAGE_PPN_MASK;; + ld1 r23=[r23] + mov r25=-1 and r22=r16,r19;; // r22 == pteval & _PAGE_PPN_MASK andcm r19=r22,r20 + shl r25=r25,r23 // -1 << current->arch.vhpt_pg_shift adds r21=XSI_IFA_OFS-XSI_PSR_IC_OFS,r18 ;; ld8 r21=[r21];; and r20=r21,r20;; or r19=r19,r20;; // r19 == mpaddr // FIXME: for now, just do domain0 and skip mpaddr range checks - dep r20=r0,r19,0,PAGE_SHIFT + and r20=r25,r19 movl r21=PAGE_PHYS ;; or r20=r20,r21 ;; // r20==return value from lookup_domain_mpa // r16=pteval,r20=pteval2 @@ -2208,8 +2203,6 @@ ENTRY(fast_insert) // vcpu_set_tr_entry(trp,r22=pte|1,r24=itir,r23=ifa) // TR_ENTRY = {page_flags,itir,addr,rid} tbit.z p6,p7=r17,0 - movl r27=THIS_CPU(cpu_kr)+IA64_KR_CURRENT_OFFSET;; - ld8 r27=[r27];; adds r28=IA64_VCPU_STARTING_RID_OFFSET,r27 (p6) adds r27=IA64_VCPU_DTLB_OFFSET,r27 (p7) adds r27=IA64_VCPU_ITLB_OFFSET,r27;; diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/mm.c --- a/xen/arch/ia64/xen/mm.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/mm.c Thu Aug 16 10:03:26 2007 -0600 @@ -447,7 +447,7 @@ gmfn_to_mfn_foreign(struct domain *d, un // given a domain virtual address, pte and pagesize, extract the metaphysical // address, convert the pte for a physical address for (possibly different) // Xen PAGE_SIZE and return modified pte. (NOTE: TLB insert should use -// PAGE_SIZE!) +// current->arch.vhpt_pg_shift!) u64 translate_domain_pte(u64 pteval, u64 address, u64 itir__, u64* itir, struct p2m_entry* entry) { @@ -457,20 +457,25 @@ u64 translate_domain_pte(u64 pteval, u64 u64 arflags; u64 arflags2; u64 maflags2; + u64 ps; pteval &= ((1UL << 53) - 1);// ignore [63:53] bits // FIXME address had better be pre-validated on insert mask = ~itir_mask(_itir.itir); mpaddr = ((pteval & _PAGE_PPN_MASK) & ~mask) | (address & mask); - - if (_itir.ps > PAGE_SHIFT) - _itir.ps = PAGE_SHIFT; + ps = current->arch.vhpt_pg_shift ? current->arch.vhpt_pg_shift : + PAGE_SHIFT; + + if (_itir.ps > ps) + _itir.ps = ps; ((ia64_itir_t*)itir)->itir = _itir.itir;/* Copy the whole register. */ ((ia64_itir_t*)itir)->ps = _itir.ps; /* Overwrite ps part! */ pteval2 = lookup_domain_mpa(d, mpaddr, entry); + if (ps < PAGE_SHIFT) + pteval2 |= address & (PAGE_SIZE - 1) & ~((1L << ps) - 1); /* Check access rights. */ arflags = pteval & _PAGE_AR_MASK; @@ -544,10 +549,11 @@ u64 translate_domain_pte(u64 pteval, u64 pteval &= ~_PAGE_D; } - /* Ignore non-addr bits of pteval2 and force PL0->2 + /* Ignore non-addr bits of pteval2 and force PL0->1 (PL3 is unaffected) */ - return (pteval & ~_PAGE_PPN_MASK) | - (pteval2 & _PAGE_PPN_MASK) | _PAGE_PL_PRIV; + return (pteval & ~(_PAGE_PPN_MASK | _PAGE_PL_MASK)) | + (pteval2 & _PAGE_PPN_MASK) | + (vcpu_pl_adjust(pteval, 7) & _PAGE_PL_MASK); } // given a current domain metaphysical address, return the physical address diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/regionreg.c --- a/xen/arch/ia64/xen/regionreg.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/regionreg.c Thu Aug 16 10:03:26 2007 -0600 @@ -72,7 +72,7 @@ static unsigned long allocate_metaphysic rrv.rrval = 0; // Or else may see reserved bit fault rrv.rid = d->arch.starting_mp_rid + n; - rrv.ps = PAGE_SHIFT; + rrv.ps = PAGE_SHIFT; // only used at domain creation rrv.ve = 0; /* Mangle metaphysical rid */ rrv.rrval = vmMangleRID(rrv.rrval); @@ -254,7 +254,7 @@ int set_one_rr(unsigned long rr, unsigne memrrv.rrval = rrv.rrval; newrrv.rid = newrid; newrrv.ve = 1; // VHPT now enabled for region 7!! - newrrv.ps = PAGE_SHIFT; + newrrv.ps = v->arch.vhpt_pg_shift; if (rreg == 0) { v->arch.metaphysical_saved_rr0 = vmMangleRID(newrrv.rrval); @@ -288,7 +288,7 @@ void init_all_rr(struct vcpu *v) rrv.rrval = 0; //rrv.rrval = v->domain->arch.metaphysical_rr0; - rrv.ps = PAGE_SHIFT; + rrv.ps = v->arch.vhpt_pg_shift; rrv.ve = 1; if (!v->vcpu_info) { panic("Stopping in init_all_rr\n"); } VCPU(v,rrs[0]) = -1; diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/vcpu.c --- a/xen/arch/ia64/xen/vcpu.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/vcpu.c Thu Aug 16 10:03:26 2007 -0600 @@ -1697,7 +1697,7 @@ IA64FAULT vcpu_translate(VCPU * vcpu, u6 } else { *pteval = (address & _PAGE_PPN_MASK) | __DIRTY_BITS | _PAGE_PL_PRIV | _PAGE_AR_RWX; - *itir = PAGE_SHIFT << 2; + *itir = vcpu->arch.vhpt_pg_shift << 2; perfc_incr(phys_translate); return IA64_NO_FAULT; } @@ -2292,13 +2292,29 @@ IA64FAULT vcpu_set_dtr(VCPU * vcpu, u64 VCPU translation cache access routines **************************************************************************/ +static void +vcpu_rebuild_vhpt(VCPU * vcpu, u64 ps) +{ +#ifdef CONFIG_XEN_IA64_PERVCPU_VHPT + printk("vhpt rebuild: using page_shift %d\n", (int)ps); + vcpu->arch.vhpt_pg_shift = ps; + vcpu_purge_tr_entry(&PSCBX(vcpu, dtlb)); + vcpu_purge_tr_entry(&PSCBX(vcpu, itlb)); + local_vhpt_flush(); + load_region_regs(vcpu); +#else + panic_domain(NULL, "domain trying to use smaller page size!\n"); +#endif +} + void vcpu_itc_no_srlz(VCPU * vcpu, u64 IorD, u64 vaddr, u64 pte, u64 mp_pte, u64 itir, struct p2m_entry *entry) { ia64_itir_t _itir = {.itir = itir}; unsigned long psr; - unsigned long ps = (vcpu->domain == dom0) ? _itir.ps : PAGE_SHIFT; + unsigned long ps = (vcpu->domain == dom0) ? _itir.ps : + vcpu->arch.vhpt_pg_shift; check_xen_space_overlap("itc", vaddr, 1UL << _itir.ps); @@ -2307,7 +2323,7 @@ vcpu_itc_no_srlz(VCPU * vcpu, u64 IorD, panic_domain(NULL, "vcpu_itc_no_srlz: domain trying to use " "smaller page size!\n"); - BUG_ON(_itir.ps > PAGE_SHIFT); + BUG_ON(_itir.ps > vcpu->arch.vhpt_pg_shift); vcpu_tlb_track_insert_or_dirty(vcpu, vaddr, entry); psr = ia64_clear_ic(); pte &= ~(_PAGE_RV2 | _PAGE_RV1); // Mask out the reserved bits. @@ -2320,7 +2336,7 @@ vcpu_itc_no_srlz(VCPU * vcpu, u64 IorD, // addresses never get flushed. More work needed if this // ever happens. //printk("vhpt_insert(%p,%p,%p)\n",vaddr,pte,1L<<logps); - if (_itir.ps > PAGE_SHIFT) + if (_itir.ps > vcpu->arch.vhpt_pg_shift) vhpt_multiple_insert(vaddr, pte, _itir.itir); else vhpt_insert(vaddr, pte, _itir.itir); @@ -2328,7 +2344,7 @@ vcpu_itc_no_srlz(VCPU * vcpu, u64 IorD, // even if domain pagesize is larger than PAGE_SIZE, just put // PAGE_SIZE mapping in the vhpt for now, else purging is complicated else { - _itir.ps = PAGE_SHIFT; + _itir.ps = vcpu->arch.vhpt_pg_shift; vhpt_insert(vaddr, pte, _itir.itir); } } @@ -2340,12 +2356,11 @@ IA64FAULT vcpu_itc_d(VCPU * vcpu, u64 pt struct p2m_entry entry; ia64_itir_t _itir = {.itir = itir}; - if (_itir.ps < PAGE_SHIFT) - panic_domain(NULL, "vcpu_itc_d: domain trying to use " - "smaller page size!\n"); + if (_itir.ps < vcpu->arch.vhpt_pg_shift) + vcpu_rebuild_vhpt(vcpu, _itir.ps); again: - //itir = (itir & ~0xfc) | (PAGE_SHIFT<<2); // ignore domain's pagesize + //itir = (itir & ~0xfc) | (vcpu->arch.vhpt_pg_shift<<2); // ign dom pgsz pteval = translate_domain_pte(pte, ifa, itir, &(_itir.itir), &entry); if (!pteval) return IA64_ILLOP_FAULT; @@ -2369,11 +2384,11 @@ IA64FAULT vcpu_itc_i(VCPU * vcpu, u64 pt struct p2m_entry entry; ia64_itir_t _itir = {.itir = itir}; - if (_itir.ps < PAGE_SHIFT) - panic_domain(NULL, "vcpu_itc_i: domain trying to use " - "smaller page size!\n"); + if (_itir.ps < vcpu->arch.vhpt_pg_shift) + vcpu_rebuild_vhpt(vcpu, _itir.ps); + again: - //itir = (itir & ~0xfc) | (PAGE_SHIFT<<2); // ignore domain's pagesize + //itir = (itir & ~0xfc) | (vcpu->arch.vhpt_pg_shift<<2); // ign dom pgsz pteval = translate_domain_pte(pte, ifa, itir, &(_itir.itir), &entry); if (!pteval) return IA64_ILLOP_FAULT; diff -r f317c27973f5 -r b5dbf184df6c xen/arch/ia64/xen/vhpt.c --- a/xen/arch/ia64/xen/vhpt.c Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/arch/ia64/xen/vhpt.c Thu Aug 16 10:03:26 2007 -0600 @@ -88,15 +88,16 @@ void vhpt_multiple_insert(unsigned long void vhpt_multiple_insert(unsigned long vaddr, unsigned long pte, unsigned long itir) { + unsigned char ps = current->arch.vhpt_pg_shift; ia64_itir_t _itir = {.itir = itir}; unsigned long mask = (1L << _itir.ps) - 1; int i; - if (_itir.ps-PAGE_SHIFT > 10 && !running_on_sim) { + if (_itir.ps - ps > 10 && !running_on_sim) { // if this happens, we may want to revisit this algorithm panic("vhpt_multiple_insert:logps-PAGE_SHIFT>10,spinning..\n"); } - if (_itir.ps-PAGE_SHIFT > 2) { + if (_itir.ps - ps > 2) { // FIXME: Should add counter here to see how often this // happens (e.g. for 16MB pages!) and determine if it // is a performance problem. On a quick look, it takes @@ -111,9 +112,9 @@ void vhpt_multiple_insert(unsigned long } vaddr &= ~mask; pte = ((pte & _PFN_MASK) & ~mask) | (pte & ~_PFN_MASK); - for (i = 1L << (_itir.ps-PAGE_SHIFT); i > 0; i--) { + for (i = 1L << (_itir.ps - ps); i > 0; i--) { vhpt_insert(vaddr, pte, _itir.itir); - vaddr += PAGE_SIZE; + vaddr += (1L << ps); } } @@ -291,6 +292,7 @@ __flush_vhpt_range(unsigned long vhpt_ma __flush_vhpt_range(unsigned long vhpt_maddr, u64 vadr, u64 addr_range) { void *vhpt_base = __va(vhpt_maddr); + u64 pgsz = 1L << current->arch.vhpt_pg_shift; while ((long)addr_range > 0) { /* Get the VHPT entry. */ @@ -298,8 +300,8 @@ __flush_vhpt_range(unsigned long vhpt_ma __va_ul(vcpu_vhpt_maddr(current)); struct vhpt_lf_entry *v = vhpt_base + off; v->ti_tag = INVALID_TI_TAG; - addr_range -= PAGE_SIZE; - vadr += PAGE_SIZE; + addr_range -= pgsz; + vadr += pgsz; } } @@ -362,7 +364,8 @@ void domain_flush_vtlb_range (struct dom // ptc.ga has release semantics. /* ptc.ga */ - platform_global_tlb_purge(vadr, vadr + addr_range, PAGE_SHIFT); + platform_global_tlb_purge(vadr, vadr + addr_range, + current->arch.vhpt_pg_shift); perfc_incr(domain_flush_vtlb_range); } @@ -381,6 +384,7 @@ __domain_flush_vtlb_track_entry(struct d int cpu; int vcpu; int local_purge = 1; + unsigned char ps = current->arch.vhpt_pg_shift; BUG_ON((vaddr >> VRN_SHIFT) != VRN7); /* @@ -413,7 +417,7 @@ __domain_flush_vtlb_track_entry(struct d continue; /* Invalidate VHPT entries. */ - vcpu_flush_vhpt_range(v, vaddr, PAGE_SIZE); + vcpu_flush_vhpt_range(v, vaddr, 1L << ps); /* * current->processor == v->processor @@ -427,7 +431,7 @@ __domain_flush_vtlb_track_entry(struct d } else { for_each_cpu_mask(cpu, entry->pcpu_dirty_mask) { /* Invalidate VHPT entries. */ - cpu_flush_vhpt_range(cpu, vaddr, PAGE_SIZE); + cpu_flush_vhpt_range(cpu, vaddr, 1L << ps); if (d->vcpu[cpu] != current) local_purge = 0; @@ -436,12 +440,11 @@ __domain_flush_vtlb_track_entry(struct d /* ptc.ga */ if (local_purge) { - ia64_ptcl(vaddr, PAGE_SHIFT << 2); + ia64_ptcl(vaddr, ps << 2); perfc_incr(domain_flush_vtlb_local); } else { /* ptc.ga has release semantics. */ - platform_global_tlb_purge(vaddr, vaddr + PAGE_SIZE, - PAGE_SHIFT); + platform_global_tlb_purge(vaddr, vaddr + (1L << ps), ps); perfc_incr(domain_flush_vtlb_global); } diff -r f317c27973f5 -r b5dbf184df6c xen/include/asm-ia64/domain.h --- a/xen/include/asm-ia64/domain.h Thu Aug 16 09:37:54 2007 -0600 +++ b/xen/include/asm-ia64/domain.h Thu Aug 16 10:03:26 2007 -0600 @@ -246,6 +246,7 @@ struct arch_vcpu { #define XEN_IA64_PKR_IN_USE 0x1 /* If psr.pk = 1 was set. */ unsigned char pkr_flags; + unsigned char vhpt_pg_shift; /* PAGE_SHIFT or less */ #ifdef CONFIG_XEN_IA64_PERVCPU_VHPT PTA pta; unsigned long vhpt_maddr; _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |