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 && \