diff options
Diffstat (limited to 'arch/sparc/lib')
| -rw-r--r-- | arch/sparc/lib/NG4memcpy.S | 5 | ||||
| -rw-r--r-- | arch/sparc/lib/VISsave.S | 67 | ||||
| -rw-r--r-- | arch/sparc/lib/atomic32.c | 22 | ||||
| -rw-r--r-- | arch/sparc/lib/atomic_64.S | 6 | ||||
| -rw-r--r-- | arch/sparc/lib/ksyms.c | 7 | 
5 files changed, 34 insertions, 73 deletions
diff --git a/arch/sparc/lib/NG4memcpy.S b/arch/sparc/lib/NG4memcpy.S index 140527a20e7d..83aeeb1dffdb 100644 --- a/arch/sparc/lib/NG4memcpy.S +++ b/arch/sparc/lib/NG4memcpy.S @@ -240,8 +240,11 @@ FUNC_NAME:	/* %o0=dst, %o1=src, %o2=len */  	add		%o0, 0x40, %o0  	bne,pt		%icc, 1b  	 LOAD(prefetch, %g1 + 0x200, #n_reads_strong) +#ifdef NON_USER_COPY +	VISExitHalfFast +#else  	VISExitHalf - +#endif  	brz,pn		%o2, .Lexit  	 cmp		%o2, 19  	ble,pn		%icc, .Lsmall_unaligned diff --git a/arch/sparc/lib/VISsave.S b/arch/sparc/lib/VISsave.S index b320ae9e2e2e..a063d84336d6 100644 --- a/arch/sparc/lib/VISsave.S +++ b/arch/sparc/lib/VISsave.S @@ -44,9 +44,8 @@ vis1:	ldub		[%g6 + TI_FPSAVED], %g3  	 stx		%g3, [%g6 + TI_GSR]  2:	add		%g6, %g1, %g3 -	cmp		%o5, FPRS_DU -	be,pn		%icc, 6f -	 sll		%g1, 3, %g1 +	mov		FPRS_DU | FPRS_DL | FPRS_FEF, %o5 +	sll		%g1, 3, %g1  	stb		%o5, [%g3 + TI_FPSAVED]  	rd		%gsr, %g2  	add		%g6, %g1, %g3 @@ -80,65 +79,3 @@ vis1:	ldub		[%g6 + TI_FPSAVED], %g3  	.align		32  80:	jmpl		%g7 + %g0, %g0  	 nop - -6:	ldub		[%g3 + TI_FPSAVED], %o5 -	or		%o5, FPRS_DU, %o5 -	add		%g6, TI_FPREGS+0x80, %g2 -	stb		%o5, [%g3 + TI_FPSAVED] - -	sll		%g1, 5, %g1 -	add		%g6, TI_FPREGS+0xc0, %g3 -	wr		%g0, FPRS_FEF, %fprs -	membar		#Sync -	stda		%f32, [%g2 + %g1] ASI_BLK_P -	stda		%f48, [%g3 + %g1] ASI_BLK_P -	membar		#Sync -	ba,pt		%xcc, 80f -	 nop - -	.align		32 -80:	jmpl		%g7 + %g0, %g0 -	 nop - -	.align		32 -VISenterhalf: -	ldub		[%g6 + TI_FPDEPTH], %g1 -	brnz,a,pn	%g1, 1f -	 cmp		%g1, 1 -	stb		%g0, [%g6 + TI_FPSAVED] -	stx		%fsr, [%g6 + TI_XFSR] -	clr		%o5 -	jmpl		%g7 + %g0, %g0 -	 wr		%g0, FPRS_FEF, %fprs - -1:	bne,pn		%icc, 2f -	 srl		%g1, 1, %g1 -	ba,pt		%xcc, vis1 -	 sub		%g7, 8, %g7 -2:	addcc		%g6, %g1, %g3 -	sll		%g1, 3, %g1 -	andn		%o5, FPRS_DU, %g2 -	stb		%g2, [%g3 + TI_FPSAVED] - -	rd		%gsr, %g2 -	add		%g6, %g1, %g3 -	stx		%g2, [%g3 + TI_GSR] -	add		%g6, %g1, %g2 -	stx		%fsr, [%g2 + TI_XFSR] -	sll		%g1, 5, %g1 -3:	andcc		%o5, FPRS_DL, %g0 -	be,pn		%icc, 4f -	 add		%g6, TI_FPREGS, %g2 - -	add		%g6, TI_FPREGS+0x40, %g3 -	membar		#Sync -	stda		%f0, [%g2 + %g1] ASI_BLK_P -	stda		%f16, [%g3 + %g1] ASI_BLK_P -	membar		#Sync -	ba,pt		%xcc, 4f -	 nop - -	.align		32 -4:	and		%o5, FPRS_DU, %o5 -	jmpl		%g7 + %g0, %g0 -	 wr		%o5, FPRS_FEF, %fprs diff --git a/arch/sparc/lib/atomic32.c b/arch/sparc/lib/atomic32.c index 71cd65ab200c..b9d63c0a7aab 100644 --- a/arch/sparc/lib/atomic32.c +++ b/arch/sparc/lib/atomic32.c @@ -27,22 +27,38 @@ static DEFINE_SPINLOCK(dummy);  #endif /* SMP */ -#define ATOMIC_OP(op, cop)						\ +#define ATOMIC_OP_RETURN(op, c_op)					\  int atomic_##op##_return(int i, atomic_t *v)				\  {									\  	int ret;							\  	unsigned long flags;						\  	spin_lock_irqsave(ATOMIC_HASH(v), flags);			\  									\ -	ret = (v->counter cop i);					\ +	ret = (v->counter c_op i);					\  									\  	spin_unlock_irqrestore(ATOMIC_HASH(v), flags);			\  	return ret;							\  }									\  EXPORT_SYMBOL(atomic_##op##_return); -ATOMIC_OP(add, +=) +#define ATOMIC_OP(op, c_op)						\ +void atomic_##op(int i, atomic_t *v)					\ +{									\ +	unsigned long flags;						\ +	spin_lock_irqsave(ATOMIC_HASH(v), flags);			\ +									\ +	v->counter c_op i;						\ +									\ +	spin_unlock_irqrestore(ATOMIC_HASH(v), flags);			\ +}									\ +EXPORT_SYMBOL(atomic_##op); + +ATOMIC_OP_RETURN(add, +=) +ATOMIC_OP(and, &=) +ATOMIC_OP(or, |=) +ATOMIC_OP(xor, ^=) +#undef ATOMIC_OP_RETURN  #undef ATOMIC_OP  int atomic_xchg(atomic_t *v, int new) diff --git a/arch/sparc/lib/atomic_64.S b/arch/sparc/lib/atomic_64.S index 05dac43907d1..d6b0363f345b 100644 --- a/arch/sparc/lib/atomic_64.S +++ b/arch/sparc/lib/atomic_64.S @@ -47,6 +47,9 @@ ENDPROC(atomic_##op##_return);  ATOMIC_OPS(add)  ATOMIC_OPS(sub) +ATOMIC_OP(and) +ATOMIC_OP(or) +ATOMIC_OP(xor)  #undef ATOMIC_OPS  #undef ATOMIC_OP_RETURN @@ -84,6 +87,9 @@ ENDPROC(atomic64_##op##_return);  ATOMIC64_OPS(add)  ATOMIC64_OPS(sub) +ATOMIC64_OP(and) +ATOMIC64_OP(or) +ATOMIC64_OP(xor)  #undef ATOMIC64_OPS  #undef ATOMIC64_OP_RETURN diff --git a/arch/sparc/lib/ksyms.c b/arch/sparc/lib/ksyms.c index 1d649a95660c..8eb454cfe05c 100644 --- a/arch/sparc/lib/ksyms.c +++ b/arch/sparc/lib/ksyms.c @@ -111,6 +111,9 @@ EXPORT_SYMBOL(atomic64_##op##_return);  ATOMIC_OPS(add)  ATOMIC_OPS(sub) +ATOMIC_OP(and) +ATOMIC_OP(or) +ATOMIC_OP(xor)  #undef ATOMIC_OPS  #undef ATOMIC_OP_RETURN @@ -135,10 +138,6 @@ EXPORT_SYMBOL(copy_user_page);  void VISenter(void);  EXPORT_SYMBOL(VISenter); -/* CRYPTO code needs this */ -void VISenterhalf(void); -EXPORT_SYMBOL(VISenterhalf); -  extern void xor_vis_2(unsigned long, unsigned long *, unsigned long *);  extern void xor_vis_3(unsigned long, unsigned long *, unsigned long *,  		unsigned long *);  |