Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch implement ucas_* for arm.
details: https://anonhg.NetBSD.org/src/rev/4779f82f196e
branches: trunk
changeset: 756124:4779f82f196e
user: chs <chs%NetBSD.org@localhost>
date: Wed Jul 07 01:17:26 2010 +0000
description:
implement ucas_* for arm.
diffstat:
sys/arch/acorn26/acorn26/except.c | 12 +++++--
sys/arch/arm/arm/arm_machdep.c | 16 +++++++++-
sys/arch/arm/arm/lock_cas.S | 55 ++++++++++++++++++++++++++++++++++++--
sys/arch/arm/arm32/atomic.S | 9 +++--
sys/arch/arm/arm32/fault.c | 6 ++-
sys/arch/arm/include/cpu.h | 5 ++-
6 files changed, 86 insertions(+), 17 deletions(-)
diffs (273 lines):
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/acorn26/acorn26/except.c
--- a/sys/arch/acorn26/acorn26/except.c Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/acorn26/acorn26/except.c Wed Jul 07 01:17:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: except.c,v 1.24 2010/03/20 23:31:27 chs Exp $ */
+/* $NetBSD: except.c,v 1.25 2010/07/07 01:17:26 chs Exp $ */
/*-
* Copyright (c) 1998, 1999, 2000 Ben Harris
* All rights reserved.
@@ -31,7 +31,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: except.c,v 1.24 2010/03/20 23:31:27 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: except.c,v 1.25 2010/07/07 01:17:26 chs Exp $");
#include "opt_ddb.h"
@@ -202,15 +202,17 @@
int error;
struct pcb *pcb;
void *onfault;
+ bool user;
if (pmap_fault(map->pmap, va, atype))
return;
pcb = lwp_getpcb(l);
onfault = pcb->pcb_onfault;
+ user = (tf->tf_r15 & R15_MODE) == R15_MODE_USR;
if (cpu_intr_p()) {
- KASSERT((tf->tf_r15 & R15_MODE) != R15_MODE_USR);
+ KASSERT(!user);
error = EFAULT;
} else {
pcb->pcb_onfault = NULL;
@@ -234,7 +236,7 @@
return;
}
#endif
- if ((tf->tf_r15 & R15_MODE) != R15_MODE_USR) {
+ if (!user) {
#ifdef DDB
db_printf("Unhandled data abort in kernel mode\n");
kdb_trap(T_FAULT, tf);
@@ -260,6 +262,8 @@
ksi.ksi_code = (error == EPERM) ? SEGV_ACCERR : SEGV_MAPERR;
ksi.ksi_addr = (void *) va;
trapsignal(l, &ksi);
+ } else if (!user) {
+ ucas_ras_check(tf);
}
}
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/arm/arm/arm_machdep.c
--- a/sys/arch/arm/arm/arm_machdep.c Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/arm/arm/arm_machdep.c Wed Jul 07 01:17:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: arm_machdep.c,v 1.28 2010/04/23 19:18:09 rmind Exp $ */
+/* $NetBSD: arm_machdep.c,v 1.29 2010/07/07 01:17:26 chs Exp $ */
/*
* Copyright (c) 2001 Wasabi Systems, Inc.
@@ -79,7 +79,7 @@
#include <sys/param.h>
-__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.28 2010/04/23 19:18:09 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: arm_machdep.c,v 1.29 2010/07/07 01:17:26 chs Exp $");
#include <sys/exec.h>
#include <sys/proc.h>
@@ -277,3 +277,15 @@
{
return curcpu()->ci_intr_depth != 0;
}
+
+void
+ucas_ras_check(trapframe_t *tf)
+{
+ extern char ucas_32_ras_start[];
+ extern char ucas_32_ras_end[];
+
+ if (tf->tf_pc > (vaddr_t)ucas_32_ras_start &&
+ tf->tf_pc < (vaddr_t)ucas_32_ras_end) {
+ tf->tf_pc = (vaddr_t)ucas_32_ras_start;
+ }
+}
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/arm/arm/lock_cas.S
--- a/sys/arch/arm/arm/lock_cas.S Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/arm/arm/lock_cas.S Wed Jul 07 01:17:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: lock_cas.S,v 1.6 2009/01/16 10:28:24 bjh21 Exp $ */
+/* $NetBSD: lock_cas.S,v 1.7 2010/07/07 01:17:26 chs Exp $ */
/*-
* Copyright (c) 2007 The NetBSD Foundation, Inc.
@@ -29,9 +29,16 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#include "opt_multiprocessor.h"
+#if defined(MULTIPROCESSOR)
+#error need to write MP support for ucas_* functions
+#endif
+
#include "opt_arm_debug.h"
+#include "assym.h"
#include <machine/asm.h>
+#include <machine/cpu.h>
.text
.align 0
@@ -67,8 +74,6 @@
strex r3, r2, [ip]
cmp r3, #0
bne 1b
- RET
- END(_lock_cas)
#else
ldr r3, [r0]
teq r3, r1
@@ -88,8 +93,9 @@
#endif /* __ARMEB__ */
stmia r3, {r1-r2} /* store ev_count */
#endif /* ARM_LOCK_CAS_DEBUG */
+#endif
RET
-#endif
+END(_lock_cas)
STRONG_ALIAS(_atomic_cas_ulong,_lock_cas)
STRONG_ALIAS(atomic_cas_ulong,_lock_cas)
@@ -108,3 +114,44 @@
STRONG_ALIAS(atomic_cas_uint_ni,_lock_cas)
STRONG_ALIAS(_atomic_cas_ptr_ni,_lock_cas)
STRONG_ALIAS(atomic_cas_ptr_ni,_lock_cas)
+
+#ifdef __PROG32
+#define SAVE_REGS stmfd sp!, {r4-r6}
+#define RESTORE_REGS ldmfd sp!, {r4-r6}
+#else
+/* Need to save R14_svc because it'll get trampled if we take a page fault. */
+#define SAVE_REGS stmfd sp!, {r4-r6, r14}
+#define RESTORE_REGS ldmfd sp!, {r4-r6, r14}
+#endif
+
+/*
+ * int ucas_32(volatile int32_t *uptr, int32_t old, int32_t new, int32_t *ret);
+ */
+ENTRY(ucas_32)
+ SAVE_REGS
+ GET_CURPCB(r4)
+ adr r5, .Lucasfault
+ str r5, [r4, #PCB_ONFAULT]
+
+ .globl _C_LABEL(ucas_32_ras_start)
+_C_LABEL(ucas_32_ras_start):
+ ldrt r5, [r0]
+ cmp r1, r5
+ streqt r2, [r0]
+ .globl _C_LABEL(ucas_32_ras_end)
+_C_LABEL(ucas_32_ras_end):
+
+ str r5, [r3]
+ mov r0, #0
+ str r0, [r4, #PCB_ONFAULT]
+ RESTORE_REGS
+ RET
+
+.Lucasfault:
+ mov r5, #0
+ str r5, [r4, #PCB_ONFAULT]
+ RESTORE_REGS
+ RET
+END(ucas_32)
+STRONG_ALIAS(ucas_int,ucas_32)
+STRONG_ALIAS(ucas_ptr,ucas_32)
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/arm/arm32/atomic.S
--- a/sys/arch/arm/arm32/atomic.S Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/arm/arm32/atomic.S Wed Jul 07 01:17:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: atomic.S,v 1.4 2008/11/19 06:32:10 matt Exp $ */
+/* $NetBSD: atomic.S,v 1.5 2010/07/07 01:17:27 chs Exp $ */
/*
* Copyright (C) 1994-1997 Mark Brinicombe
@@ -53,7 +53,7 @@
msr cpsr_c, r2
mov pc, lr
-
+END(atomic_set_bit)
#undef atomic_clear_bit
ENTRY(atomic_clear_bit)
@@ -67,6 +67,7 @@
msr cpsr_c, r2
mov pc, lr
+END(atomic_clear_bit)
#endif /* ATOMIC_SET_BIT_NONINLINE_REQUIRED */
@@ -81,7 +82,7 @@
cmp r3, #0 ;\
bne 1b ;\
RET ;\
- END(atomic_##NAME##_32)
+END(atomic_##NAME##_32)
ATOMIC_OP(and, and, r1)
ATOMIC_OP(nand, bic, r1)
@@ -101,7 +102,7 @@
cmp r3, #0 ;\
bne 1b ;\
RET ;\
- END(atomic_##NAME##_32_nv)
+END(atomic_##NAME##_32_nv)
ATOMIC_OP_NV(and, and, r1)
ATOMIC_OP_NV(nand, bic, r1)
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/arm/arm32/fault.c
--- a/sys/arch/arm/arm32/fault.c Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/arm/arm32/fault.c Wed Jul 07 01:17:26 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: fault.c,v 1.76 2010/03/21 00:10:14 chs Exp $ */
+/* $NetBSD: fault.c,v 1.77 2010/07/07 01:17:27 chs Exp $ */
/*
* Copyright 2003 Wasabi Systems, Inc.
@@ -82,7 +82,7 @@
#include "opt_sa.h"
#include <sys/types.h>
-__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.76 2010/03/21 00:10:14 chs Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.77 2010/07/07 01:17:27 chs Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -480,6 +480,8 @@
if (__predict_true(error == 0)) {
if (user)
uvm_grow(l->l_proc, va); /* Record any stack growth */
+ else
+ ucas_ras_check(tf);
UVMHIST_LOG(maphist, " <- uvm", 0, 0, 0, 0);
goto out;
}
diff -r 9262a8871f56 -r 4779f82f196e sys/arch/arm/include/cpu.h
--- a/sys/arch/arm/include/cpu.h Wed Jul 07 01:16:23 2010 +0000
+++ b/sys/arch/arm/include/cpu.h Wed Jul 07 01:17:26 2010 +0000
@@ -384,7 +384,7 @@
/* ast.c */
void userret(register struct lwp *);
-/* machdep.h */
+/* *_machdep.c */
void bootsync(void);
/* fault.c */
@@ -393,6 +393,9 @@
/* syscall.c */
void swi_handler(trapframe_t *);
+/* arm_machdep.c */
+void ucas_ras_check(trapframe_t *);
+
#endif /* !_LOCORE */
#endif /* _KERNEL */
Home |
Main Index |
Thread Index |
Old Index