Module Name: src
Committed By: chs
Date: Wed Jul 7 01:19:54 UTC 2010
Modified Files:
src/sys/arch/powerpc/powerpc: locore_subr.S trap.c
Log Message:
implement ucas_* for powerpc/oea.
To generate a diff of this commit:
cvs rdiff -u -r1.39 -r1.40 src/sys/arch/powerpc/powerpc/locore_subr.S
cvs rdiff -u -r1.135 -r1.136 src/sys/arch/powerpc/powerpc/trap.c
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/powerpc/powerpc/locore_subr.S
diff -u src/sys/arch/powerpc/powerpc/locore_subr.S:1.39 src/sys/arch/powerpc/powerpc/locore_subr.S:1.40
--- src/sys/arch/powerpc/powerpc/locore_subr.S:1.39 Thu Dec 10 05:10:03 2009
+++ src/sys/arch/powerpc/powerpc/locore_subr.S Wed Jul 7 01:19:54 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: locore_subr.S,v 1.39 2009/12/10 05:10:03 rmind Exp $ */
+/* $NetBSD: locore_subr.S,v 1.40 2010/07/07 01:19:54 chs Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -340,3 +340,19 @@
b _C_LABEL(idle_loop)
#endif /*MULTIPROCESSOR + OEA*/
+
+/*
+ * int do_ucas_32(int32_t *uptr, int32_t old, int32_t new, int32_t *ret);
+ */
+ENTRY(do_ucas_32)
+1:
+ lwarx %r10,0,%r3
+ cmpw %r10, %r4
+ bne 2f
+ stwcx. %r5,0,%r3
+ bne 1b
+ mr %r5,%r10
+2:
+ li %r3,0
+ stw %r10,0(%r6)
+ blr
Index: src/sys/arch/powerpc/powerpc/trap.c
diff -u src/sys/arch/powerpc/powerpc/trap.c:1.135 src/sys/arch/powerpc/powerpc/trap.c:1.136
--- src/sys/arch/powerpc/powerpc/trap.c:1.135 Fri Apr 23 19:18:10 2010
+++ src/sys/arch/powerpc/powerpc/trap.c Wed Jul 7 01:19:54 2010
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.135 2010/04/23 19:18:10 rmind Exp $ */
+/* $NetBSD: trap.c,v 1.136 2010/07/07 01:19:54 chs Exp $ */
/*
* Copyright (C) 1995, 1996 Wolfgang Solfrank.
@@ -32,7 +32,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.135 2010/04/23 19:18:10 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.136 2010/07/07 01:19:54 chs Exp $");
#include "opt_altivec.h"
#include "opt_ddb.h"
@@ -72,6 +72,9 @@
static inline vaddr_t setusr(vaddr_t, size_t *);
static inline void unsetusr(void);
+extern int do_ucas_32(volatile int32_t *, int32_t, int32_t, int32_t *);
+int ucas_32(volatile int32_t *, int32_t, int32_t, int32_t *);
+
void trap(struct trapframe *); /* Called from locore / trap_subr */
/* Why are these not defined in a header? */
int badaddr(void *, size_t);
@@ -623,6 +626,34 @@
}
int
+ucas_32(volatile int32_t *uptr, int32_t old, int32_t new, int32_t *ret)
+{
+ vaddr_t uva = (vaddr_t)uptr;
+ vaddr_t p;
+ struct faultbuf env;
+ size_t seglen;
+ int rv;
+
+ if (uva & 3) {
+ return EFAULT;
+ }
+ if ((rv = setfault(&env)) != 0) {
+ unsetusr();
+ goto out;
+ }
+ p = setusr(uva, &seglen);
+ KASSERT(seglen >= sizeof(*uptr));
+ do_ucas_32((void *)p, old, new, ret);
+ unsetusr();
+
+out:
+ curpcb->pcb_onfault = 0;
+ return rv;
+}
+__strong_alias(ucas_ptr,ucas_32);
+__strong_alias(ucas_int,ucas_32);
+
+int
badaddr(void *addr, size_t size)
{
return badaddr_read(addr, size, NULL);