diff options
Diffstat (limited to 'arch/ia64/kvm/optvfault.S')
| -rw-r--r-- | arch/ia64/kvm/optvfault.S | 30 | 
1 files changed, 30 insertions, 0 deletions
diff --git a/arch/ia64/kvm/optvfault.S b/arch/ia64/kvm/optvfault.S index 32254ce9a1b..f793be3efff 100644 --- a/arch/ia64/kvm/optvfault.S +++ b/arch/ia64/kvm/optvfault.S @@ -11,6 +11,7 @@  #include <asm/asmmacro.h>  #include <asm/processor.h> +#include <asm/kvm_host.h>  #include "vti.h"  #include "asm-offsets.h" @@ -140,6 +141,35 @@ GLOBAL_ENTRY(kvm_asm_mov_from_ar)  	;;  END(kvm_asm_mov_from_ar) +/* + * Special SGI SN2 optimized version of mov_from_ar using the SN2 RTC + * clock as it's source for emulating the ITC. This version will be + * copied on top of the original version if the host is determined to + * be an SN2. + */ +GLOBAL_ENTRY(kvm_asm_mov_from_ar_sn2) +	add r18=VMM_VCPU_ITC_OFS_OFFSET, r21 +	movl r19 = (KVM_VMM_BASE+(1<<KVM_VMM_SHIFT)) + +	add r16=VMM_VCPU_LAST_ITC_OFFSET,r21 +	extr.u r17=r25,6,7 +	mov r24=b0 +	;; +	ld8 r18=[r18] +	ld8 r19=[r19] +	addl r20=@gprel(asm_mov_to_reg),gp +	;; +	add r19=r19,r18 +	shladd r17=r17,4,r20 +	;; +	adds r30=kvm_resume_to_guest-asm_mov_to_reg,r20 +	st8 [r16] = r19 +	mov b0=r17 +	br.sptk.few b0 +	;; +END(kvm_asm_mov_from_ar_sn2) + +  // mov r1=rr[r3]  GLOBAL_ENTRY(kvm_asm_mov_from_rr)  |