Module Name:    src
Committed By:   matt
Date:           Wed Aug 13 21:41:32 UTC 2014

Modified Files:
        src/sys/arch/arm/arm: ast.c process_machdep.c syscall.c
        src/sys/arch/arm/arm32: fault.c
        src/sys/arch/arm/include: locore.h

Log Message:
Add __NO_FIQ to prevent testing of the PSR FIQ bit
Use VALID_R15_PSR(pc, spsr) instead of testing explicitly


To generate a diff of this commit:
cvs rdiff -u -r1.23 -r1.24 src/sys/arch/arm/arm/ast.c
cvs rdiff -u -r1.29 -r1.30 src/sys/arch/arm/arm/process_machdep.c
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/arm/arm/syscall.c
cvs rdiff -u -r1.100 -r1.101 src/sys/arch/arm/arm32/fault.c
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/arm/include/locore.h

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/arm/arm/ast.c
diff -u src/sys/arch/arm/arm/ast.c:1.23 src/sys/arch/arm/arm/ast.c:1.24
--- src/sys/arch/arm/arm/ast.c:1.23	Fri Mar 28 21:43:49 2014
+++ src/sys/arch/arm/arm/ast.c	Wed Aug 13 21:41:32 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: ast.c,v 1.23 2014/03/28 21:43:49 matt Exp $	*/
+/*	$NetBSD: ast.c,v 1.24 2014/08/13 21:41:32 matt Exp $	*/
 
 /*
  * Copyright (c) 1994,1995 Mark Brinicombe
@@ -41,7 +41,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.23 2014/03/28 21:43:49 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ast.c,v 1.24 2014/08/13 21:41:32 matt Exp $");
 
 #include "opt_ddb.h"
 
@@ -86,7 +86,8 @@ userret(struct lwp *l)
 #endif
 
 #if defined(__PROG32) && defined(DIAGNOSTIC)
-	KASSERT((lwp_trapframe(l)->tf_spsr & IF32_bits) == 0);
+	KASSERT(VALID_R15_PSR(lwp_trapframe(l)->tf_pc,
+	    lwp_trapframe(l)->tf_spsr));
 #endif
 }
 
@@ -111,7 +112,7 @@ ast(struct trapframe *tf)
 #endif
 
 #ifdef __PROG32
-	KASSERT((tf->tf_spsr & IF32_bits) == 0);
+	KASSERT(VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
 #endif
 
 	curcpu()->ci_data.cpu_ntrap++;

Index: src/sys/arch/arm/arm/process_machdep.c
diff -u src/sys/arch/arm/arm/process_machdep.c:1.29 src/sys/arch/arm/arm/process_machdep.c:1.30
--- src/sys/arch/arm/arm/process_machdep.c:1.29	Sat Jan  4 00:10:02 2014
+++ src/sys/arch/arm/arm/process_machdep.c	Wed Aug 13 21:41:32 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.29 2014/01/04 00:10:02 dsl Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.30 2014/08/13 21:41:32 matt Exp $	*/
 
 /*
  * Copyright (c) 1993 The Regents of the University of California.
@@ -133,7 +133,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.29 2014/01/04 00:10:02 dsl Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.30 2014/08/13 21:41:32 matt Exp $");
 
 #include <sys/proc.h>
 #include <sys/ptrace.h>
@@ -158,15 +158,12 @@ process_read_regs(struct lwp *l, struct 
 	regs->r_pc = tf->tf_pc;
 	regs->r_cpsr = tf->tf_spsr;
 
+	KASSERT(VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
+
 #ifdef THUMB_CODE
 	if (tf->tf_spsr & PSR_T_bit)
 		regs->r_pc |= 1;
 #endif
-#ifdef DIAGNOSTIC
-	if ((tf->tf_spsr & PSR_MODE) == PSR_USR32_MODE
-	     && (tf->tf_spsr & IF32_bits))
-		panic("process_read_regs: IRQs/FIQs blocked in user process");
-#endif
 
 	return(0);
 }
@@ -204,11 +201,7 @@ process_write_regs(struct lwp *l, const 
 	if ((regs->r_pc & 1) || (regs->r_cpsr & PSR_T_bit))
 		tf->tf_spsr |= PSR_T_bit;
 #endif
-#ifdef DIAGNOSTIC
-	if ((tf->tf_spsr & PSR_MODE) == PSR_USR32_MODE
-	     && (tf->tf_spsr & IF32_bits))
-		panic("process_read_regs: IRQs/FIQs blocked in user process");
-#endif
+	KASSERT(VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
 #else /* __PROG26 */
 	if ((regs->r_pc & (R15_MODE | R15_IRQ_DISABLE | R15_FIQ_DISABLE)) != 0)
 		return EPERM;

Index: src/sys/arch/arm/arm/syscall.c
diff -u src/sys/arch/arm/arm/syscall.c:1.59 src/sys/arch/arm/arm/syscall.c:1.60
--- src/sys/arch/arm/arm/syscall.c:1.59	Wed Jan 29 18:45:21 2014
+++ src/sys/arch/arm/arm/syscall.c	Wed Aug 13 21:41:32 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: syscall.c,v 1.59 2014/01/29 18:45:21 matt Exp $	*/
+/*	$NetBSD: syscall.c,v 1.60 2014/08/13 21:41:32 matt Exp $	*/
 
 /*-
  * Copyright (c) 2000, 2003 The NetBSD Foundation, Inc.
@@ -71,7 +71,7 @@
 
 #include <sys/param.h>
 
-__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.59 2014/01/29 18:45:21 matt Exp $");
+__KERNEL_RCSID(0, "$NetBSD: syscall.c,v 1.60 2014/08/13 21:41:32 matt Exp $");
 
 #include <sys/cpu.h>
 #include <sys/device.h>
@@ -109,7 +109,7 @@ swi_handler(trapframe_t *tf)
 	if ((tf->tf_r15 & R15_IRQ_DISABLE) == 0)
 		int_on();
 #else
-	KASSERT((tf->tf_spsr & IF32_bits) == 0);
+	KASSERT(VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
 	restore_interrupts(tf->tf_spsr & IF32_bits);
 #endif
 

Index: src/sys/arch/arm/arm32/fault.c
diff -u src/sys/arch/arm/arm32/fault.c:1.100 src/sys/arch/arm/arm32/fault.c:1.101
--- src/sys/arch/arm/arm32/fault.c:1.100	Sat Apr 12 09:11:47 2014
+++ src/sys/arch/arm/arm32/fault.c	Wed Aug 13 21:41:32 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: fault.c,v 1.100 2014/04/12 09:11:47 skrll Exp $	*/
+/*	$NetBSD: fault.c,v 1.101 2014/08/13 21:41:32 matt Exp $	*/
 
 /*
  * Copyright 2003 Wasabi Systems, Inc.
@@ -81,7 +81,7 @@
 #include "opt_kgdb.h"
 
 #include <sys/types.h>
-__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.100 2014/04/12 09:11:47 skrll Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fault.c,v 1.101 2014/08/13 21:41:32 matt Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -253,9 +253,14 @@ data_abort_handler(trapframe_t *tf)
 	ci->ci_data.cpu_ntrap++;
 
 	/* Re-enable interrupts if they were enabled previously */
-	KASSERT(!TRAP_USERMODE(tf) || (tf->tf_spsr & IF32_bits) == 0);
+	KASSERT(!TRAP_USERMODE(tf) || VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
+#ifdef __NO_FIQ
+	if (__predict_true((tf->tf_spsr & I32_bit) != I32_bit))
+		restore_interrupts(tf->tf_spsr & IF32_bits);
+#else
 	if (__predict_true((tf->tf_spsr & IF32_bits) != IF32_bits))
 		restore_interrupts(tf->tf_spsr & IF32_bits);
+#endif
 
 	/* Get the current lwp structure */
 
@@ -800,14 +805,19 @@ prefetch_abort_handler(trapframe_t *tf)
 	 * from user mode so we know interrupts were not disabled.
 	 * But we check anyway.
 	 */
-	KASSERT(!TRAP_USERMODE(tf) || (tf->tf_spsr & IF32_bits) == 0);
-	if (__predict_true((tf->tf_spsr & I32_bit) != IF32_bits))
+	KASSERT(!TRAP_USERMODE(tf) || VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
+#ifdef __NO_FIQ
+	if (__predict_true((tf->tf_spsr & I32_bit) != I32_bit))
 		restore_interrupts(tf->tf_spsr & IF32_bits);
+#else
+	if (__predict_true((tf->tf_spsr & IF32_bits) != IF32_bits))
+		restore_interrupts(tf->tf_spsr & IF32_bits);
+#endif
 
 	/* See if the CPU state needs to be fixed up */
 	switch (prefetch_abort_fixup(tf)) {
 	case ABORT_FIXUP_RETURN:
-		KASSERT(!TRAP_USERMODE(tf) || (tf->tf_spsr & IF32_bits) == 0);
+		KASSERT(!TRAP_USERMODE(tf) || VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
 		return;
 	case ABORT_FIXUP_FAILED:
 		/* Deliver a SIGILL to the process */
@@ -890,7 +900,7 @@ do_trapsignal:
 	call_trapsignal(l, tf, &ksi);
 
 out:
-	KASSERT(!TRAP_USERMODE(tf) || (tf->tf_spsr & IF32_bits) == 0);
+	KASSERT(!TRAP_USERMODE(tf) || VALID_R15_PSR(tf->tf_pc, tf->tf_spsr));
 	userret(l);
 }
 

Index: src/sys/arch/arm/include/locore.h
diff -u src/sys/arch/arm/include/locore.h:1.16 src/sys/arch/arm/include/locore.h:1.17
--- src/sys/arch/arm/include/locore.h:1.16	Fri Mar 28 21:39:09 2014
+++ src/sys/arch/arm/include/locore.h	Wed Aug 13 21:41:32 2014
@@ -1,4 +1,4 @@
-/*	$NetBSD: locore.h,v 1.16 2014/03/28 21:39:09 matt Exp $	*/
+/*	$NetBSD: locore.h,v 1.17 2014/08/13 21:41:32 matt Exp $	*/
 
 /*
  * Copyright (c) 1994-1996 Mark Brinicombe.
@@ -112,9 +112,13 @@
  */
 
 #ifdef __PROG32
+#ifdef __NO_FIQ
 #define VALID_R15_PSR(r15,psr)						\
-	(((psr) & PSR_MODE) == PSR_USR32_MODE &&			\
-		((psr) & (I32_bit | F32_bit)) == 0)
+	(((psr) & PSR_MODE) == PSR_USR32_MODE && ((psr) & I32_bit) == 0)
+#else
+#define VALID_R15_PSR(r15,psr)						\
+	(((psr) & PSR_MODE) == PSR_USR32_MODE && ((psr) & IF32_bits) == 0)
+#endif
 #else
 #define VALID_R15_PSR(r15,psr)						\
 	(((r15) & R15_MODE) == R15_MODE_USR &&				\

Reply via email to