[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-changelog] [xen-unstable] [IA64] optimize entry and exit path
# HG changeset patch # User awilliam@xxxxxxxxxxx # Node ID e61bb865ec7407cd4a7a9b95485637009202a5ab # Parent c4af6e854010f2bd053236036e15f4067b99a418 [IA64] optimize entry and exit path VMM save/restore r4~r7 and unat to handle virtualization fault and mmio access, but it is not necessary for other faults to save/restore these registers. This patch is to save/restore these registers only when dtlb and virtualization fault happen. Signed-off-by: Anthony Xu <anthony.xu@xxxxxxxxx> --- xen/arch/ia64/vmx/vmx_entry.S | 31 ++++++++++++++++++++----------- xen/arch/ia64/vmx/vmx_ivt.S | 34 ++++++++++++++++++++++++++++------ xen/arch/ia64/vmx/vmx_minstate.h | 27 +++++++++++++++------------ 3 files changed, 63 insertions(+), 29 deletions(-) diff -r c4af6e854010 -r e61bb865ec74 xen/arch/ia64/vmx/vmx_entry.S --- a/xen/arch/ia64/vmx/vmx_entry.S Fri Jul 14 11:06:38 2006 -0600 +++ b/xen/arch/ia64/vmx/vmx_entry.S Fri Jul 14 11:18:36 2006 -0600 @@ -163,24 +163,39 @@ END(ia64_leave_nested) -GLOBAL_ENTRY(ia64_leave_hypervisor) +GLOBAL_ENTRY(ia64_leave_hypervisor_prepare) PT_REGS_UNWIND_INFO(0) /* * work.need_resched etc. mustn't get changed by this CPU before it returns to ;; * user- or fsys-mode, hence we disable interrupts early on: */ + adds r2 = PT(R4)+16,r12 + adds r3 = PT(R5)+16,r12 + adds r8 = PT(EML_UNAT)+16,r12 + ;; + ld8 r8 = [r8] + ;; + mov ar.unat=r8 + ;; + ld8.fill r4=[r2],16 //load r4 + ld8.fill r5=[r3],16 //load r5 + ;; + ld8.fill r6=[r2] //load r6 + ld8.fill r7=[r3] //load r7 + ;; +END(ia64_leave_hypervisor_prepare) +//fall through +GLOBAL_ENTRY(ia64_leave_hypervisor) + PT_REGS_UNWIND_INFO(0) rsm psr.i ;; alloc loc0=ar.pfs,0,1,1,0 + ;; adds out0=16,r12 - adds r7 = PT(EML_UNAT)+16,r12 - ;; - ld8 r7 = [r7] br.call.sptk.many b0=leave_hypervisor_tail ;; mov ar.pfs=loc0 - mov ar.unat=r7 adds r20=PT(PR)+16,r12 ;; lfetch [r20],PT(CR_IPSR)-PT(PR) @@ -244,12 +259,6 @@ GLOBAL_ENTRY(ia64_leave_hypervisor) ;; ldf.fill f10=[r2],32 ldf.fill f11=[r3],24 - ;; - ld8.fill r4=[r2],16 //load r4 - ld8.fill r5=[r3],16 //load r5 - ;; - ld8.fill r6=[r2] //load r6 - ld8.fill r7=[r3] //load r7 ;; srlz.i // ensure interruption collection is off ;; diff -r c4af6e854010 -r e61bb865ec74 xen/arch/ia64/vmx/vmx_ivt.S --- a/xen/arch/ia64/vmx/vmx_ivt.S Fri Jul 14 11:06:38 2006 -0600 +++ b/xen/arch/ia64/vmx/vmx_ivt.S Fri Jul 14 11:18:36 2006 -0600 @@ -201,7 +201,7 @@ vmx_itlb_loop: ;; vmx_itlb_out: mov r19 = 1 - br.sptk vmx_dispatch_tlb_miss + br.sptk vmx_dispatch_itlb_miss VMX_FAULT(1); END(vmx_itlb_miss) @@ -275,7 +275,7 @@ vmx_dtlb_loop: ;; vmx_dtlb_out: mov r19 = 2 - br.sptk vmx_dispatch_tlb_miss + br.sptk vmx_dispatch_dtlb_miss VMX_FAULT(2); END(vmx_dtlb_miss) @@ -1041,9 +1041,10 @@ ENTRY(vmx_dispatch_virtualization_fault) srlz.i // guarantee that interruption collection is on ;; (p15) ssm psr.i // restore psr.i - movl r14=ia64_leave_hypervisor + movl r14=ia64_leave_hypervisor_prepare ;; VMX_SAVE_REST + VMX_SAVE_EXTRA mov rp=r14 ;; adds out1=16,sp //regs @@ -1070,7 +1071,7 @@ ENTRY(vmx_dispatch_vexirq) br.call.sptk.many b6=vmx_vexirq END(vmx_dispatch_vexirq) -ENTRY(vmx_dispatch_tlb_miss) +ENTRY(vmx_dispatch_itlb_miss) VMX_SAVE_MIN_WITH_COVER_R19 alloc r14=ar.pfs,0,0,3,0 mov out0=cr.ifa @@ -1089,8 +1090,29 @@ ENTRY(vmx_dispatch_tlb_miss) ;; adds out2=16,r12 br.call.sptk.many b6=vmx_hpw_miss -END(vmx_dispatch_tlb_miss) - +END(vmx_dispatch_itlb_miss) + +ENTRY(vmx_dispatch_dtlb_miss) + VMX_SAVE_MIN_WITH_COVER_R19 + alloc r14=ar.pfs,0,0,3,0 + mov out0=cr.ifa + mov out1=r15 + adds r3=8,r2 // set up second base pointer + ;; + ssm psr.ic + ;; + srlz.i // guarantee that interruption collection is on + ;; + (p15) ssm psr.i // restore psr.i + movl r14=ia64_leave_hypervisor_prepare + ;; + VMX_SAVE_REST + VMX_SAVE_EXTRA + mov rp=r14 + ;; + adds out2=16,r12 + br.call.sptk.many b6=vmx_hpw_miss +END(vmx_dispatch_dtlb_miss) ENTRY(vmx_dispatch_break_fault) VMX_SAVE_MIN_WITH_COVER_R19 diff -r c4af6e854010 -r e61bb865ec74 xen/arch/ia64/vmx/vmx_minstate.h --- a/xen/arch/ia64/vmx/vmx_minstate.h Fri Jul 14 11:06:38 2006 -0600 +++ b/xen/arch/ia64/vmx/vmx_minstate.h Fri Jul 14 11:18:36 2006 -0600 @@ -260,24 +260,27 @@ stf.spill [r3]=f9,32; \ ;; \ stf.spill [r2]=f10,32; \ - stf.spill [r3]=f11,24; \ - ;; \ + stf.spill [r3]=f11; \ + adds r25=PT(B7)-PT(F11),r3; \ + ;; \ + st8 [r24]=r18,16; /* b6 */ \ + st8 [r25]=r19,16; /* b7 */ \ + adds r3=PT(R5)-PT(F11),r3; \ + ;; \ + st8 [r24]=r9; /* ar.csd */ \ + st8 [r25]=r10; /* ar.ssd */ \ + ;; + +#define VMX_SAVE_EXTRA \ .mem.offset 0,0; st8.spill [r2]=r4,16; \ .mem.offset 8,0; st8.spill [r3]=r5,16; \ ;; \ .mem.offset 0,0; st8.spill [r2]=r6,16; \ .mem.offset 8,0; st8.spill [r3]=r7; \ - adds r25=PT(B7)-PT(R7),r3; \ - ;; \ - st8 [r24]=r18,16; /* b6 */ \ - st8 [r25]=r19,16; /* b7 */ \ - ;; \ - st8 [r24]=r9; /* ar.csd */ \ - mov r26=ar.unat; \ - ;; \ - st8 [r25]=r10; /* ar.ssd */ \ + ;; \ + mov r26=ar.unat; \ + ;; \ st8 [r2]=r26; /* eml_unat */ \ - ;; #define VMX_SAVE_MIN_WITH_COVER VMX_DO_SAVE_MIN(cover, mov r30=cr.ifs,) #define VMX_SAVE_MIN_WITH_COVER_R19 VMX_DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19) _______________________________________________ Xen-changelog mailing list Xen-changelog@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-changelog
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |