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);