Module Name:    src
Committed By:   chs
Date:           Wed Jul  7 01:17:49 UTC 2010

Modified Files:
        src/sys/arch/alpha/alpha: locore.s

Log Message:
implement ucas_* for alpha.


To generate a diff of this commit:
cvs rdiff -u -r1.119 -r1.120 src/sys/arch/alpha/alpha/locore.s

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/alpha/alpha/locore.s
diff -u src/sys/arch/alpha/alpha/locore.s:1.119 src/sys/arch/alpha/alpha/locore.s:1.120
--- src/sys/arch/alpha/alpha/locore.s:1.119	Thu Feb 25 07:14:48 2010
+++ src/sys/arch/alpha/alpha/locore.s	Wed Jul  7 01:17:49 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: locore.s,v 1.119 2010/02/25 07:14:48 skrll Exp $ */
+/* $NetBSD: locore.s,v 1.120 2010/07/07 01:17:49 chs Exp $ */
 
 /*-
  * Copyright (c) 1999, 2000 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
 
 #include <machine/asm.h>
 
-__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.119 2010/02/25 07:14:48 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: locore.s,v 1.120 2010/07/07 01:17:49 chs Exp $");
 
 #include "assym.h"
 
@@ -1276,6 +1276,104 @@
 	RET
 	END(fswberr)
 
+/*
+ * int ucas_32(volatile int32_t *uptr, int32_t old, int32_t new, int32_t *ret);
+ */
+
+NESTED(ucas_32, 4, 16, ra, IM_S0 | IM_RA, 0)
+	LDGP(pv)
+	lda	sp, -16(sp)			/* set up stack frame	     */
+	stq	ra, (16-8)(sp)			/* save ra		     */
+	stq	s0, (16-16)(sp)			/* save s0		     */
+	ldiq	t0, VM_MAX_ADDRESS		/* make sure that src addr   */
+	cmpult	a0, t0, t1			/* is in user space.	     */
+	beq	t1, copyerr_efault		/* if it's not, error out.   */
+	and	a0, 3, t1			/* check if addr is aligned. */
+	bne	t1, copyerr_efault		/* if it's not, error out.   */
+	/* Note: GET_CURLWP clobbers v0, t0, t8...t11. */
+	GET_CURLWP
+	ldq	s0, 0(v0)			/* s0 = curlwp		     */
+	lda	v0, copyerr			/* set up fault handler.     */
+	.set noat
+	ldq	at_reg, L_PCB(s0)
+	stq	v0, PCB_ONFAULT(at_reg)
+	.set at
+
+3:
+	ldl_l	t0, 0(a0)			/* t0 = *uptr */
+	cmpeq	t0, a1, t1			/* does t0 = old? */
+	beq	t1, 1f				/* if not, skip */
+	mov	a2, t1
+	stl_c	t1, 0(a0)			/* *uptr ~= new */
+	beq	t1, 2f				/* did it work? */
+1:
+	stl	t0, 0(a3)			/* *ret = t0 */
+	mov	zero, v0
+
+	.set noat
+	ldq	at_reg, L_PCB(s0)		/* kill the fault handler.   */
+	stq	zero, PCB_ONFAULT(at_reg)
+	.set at
+	ldq	ra, (16-8)(sp)			/* restore ra.		     */
+	ldq	s0, (16-16)(sp)			/* restore s0.		     */
+	lda	sp, 16(sp)			/* kill stack frame.	     */
+	RET					/* v0 left over from copystr */
+
+2:
+	br	3b
+END(ucas_32)
+
+STRONG_ALIAS(ucas_int,ucas_32)
+
+/*
+ * int ucas_64(volatile int64_t *uptr, int64_t old, int64_t new, int64_t *ret);
+ */
+
+NESTED(ucas_64, 4, 16, ra, IM_S0 | IM_RA, 0)
+	LDGP(pv)
+	lda	sp, -16(sp)			/* set up stack frame	     */
+	stq	ra, (16-8)(sp)			/* save ra		     */
+	stq	s0, (16-16)(sp)			/* save s0		     */
+	ldiq	t0, VM_MAX_ADDRESS		/* make sure that src addr   */
+	cmpult	a0, t0, t1			/* is in user space.	     */
+	beq	t1, copyerr_efault		/* if it's not, error out.   */
+	and	a0, 3, t1			/* check if addr is aligned. */
+	bne	t1, copyerr_efault		/* if it's not, error out.   */
+	/* Note: GET_CURLWP clobbers v0, t0, t8...t11. */
+	GET_CURLWP
+	ldq	s0, 0(v0)			/* s0 = curlwp		     */
+	lda	v0, copyerr			/* set up fault handler.     */
+	.set noat
+	ldq	at_reg, L_PCB(s0)
+	stq	v0, PCB_ONFAULT(at_reg)
+	.set at
+
+3:
+	ldq_l	t0, 0(a0)			/* t0 = *uptr */
+	cmpeq	t0, a1, t1			/* does t0 = old? */
+	beq	t1, 1f				/* if not, skip */
+	mov	a2, t1
+	stq_c	t1, 0(a0)			/* *uptr ~= new */
+	beq	t1, 2f				/* did it work? */
+1:
+	stq	t0, 0(a3)			/* *ret = t0 */
+	mov	zero, v0
+
+	.set noat
+	ldq	at_reg, L_PCB(s0)		/* kill the fault handler.   */
+	stq	zero, PCB_ONFAULT(at_reg)
+	.set at
+	ldq	ra, (16-8)(sp)			/* restore ra.		     */
+	ldq	s0, (16-16)(sp)			/* restore s0.		     */
+	lda	sp, 16(sp)			/* kill stack frame.	     */
+	RET					/* v0 left over from copystr */
+
+2:
+	br	3b
+END(ucas_64)
+
+STRONG_ALIAS(ucas_ptr,ucas_64)
+
 /**************************************************************************/
 
 /*

Reply via email to