Module Name: src Committed By: chs Date: Wed Jul 7 01:18:39 UTC 2010
Modified Files: src/sys/arch/hp700/hp700: intr.c src/sys/arch/hppa/hppa: copy.S trap.c Log Message: fix hppa ucas_*(): - "ret" is a kernel-space pointer. - move the ucas RAS check from the device interrupt path to the page-fault path. To generate a diff of this commit: cvs rdiff -u -r1.25 -r1.26 src/sys/arch/hp700/hp700/intr.c cvs rdiff -u -r1.17 -r1.18 src/sys/arch/hppa/hppa/copy.S cvs rdiff -u -r1.92 -r1.93 src/sys/arch/hppa/hppa/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/hp700/hp700/intr.c diff -u src/sys/arch/hp700/hp700/intr.c:1.25 src/sys/arch/hp700/hp700/intr.c:1.26 --- src/sys/arch/hp700/hp700/intr.c:1.25 Wed Mar 31 17:46:21 2010 +++ src/sys/arch/hp700/hp700/intr.c Wed Jul 7 01:18:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: intr.c,v 1.25 2010/03/31 17:46:21 skrll Exp $ */ +/* $NetBSD: intr.c,v 1.26 2010/07/07 01:18:39 chs Exp $ */ /* $OpenBSD: intr.c,v 1.27 2009/12/31 12:52:35 jsing Exp $ */ /* @@ -35,7 +35,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.25 2010/03/31 17:46:21 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: intr.c,v 1.26 2010/07/07 01:18:39 chs Exp $"); #define __MUTEX_PRIVATE @@ -370,9 +370,6 @@ int hp700_intr_ipending_new(struct hp700_int_reg *, int); struct cpu_info *ci = curcpu(); - extern char ucas_ras_start[]; - extern char ucas_ras_end[]; - #ifndef LOCKDEBUG extern char mutex_enter_crit_start[]; extern char mutex_enter_crit_end[]; @@ -399,13 +396,6 @@ ((kmutex_t *)frame->tf_arg0)->mtx_owner = (uintptr_t)curlwp; #endif - if (frame->tf_iisq_head == HPPA_SID_KERNEL && - frame->tf_iioq_head >= (u_int)ucas_ras_start && - frame->tf_iioq_head <= (u_int)ucas_ras_end) { - frame->tf_iioq_head = (u_int)ucas_ras_start; - frame->tf_iioq_tail = (u_int)ucas_ras_start + 4; - } - /* * Read the CPU interrupt register and acknowledge all interrupts. * Starting with this value, get our set of new pending interrupts and Index: src/sys/arch/hppa/hppa/copy.S diff -u src/sys/arch/hppa/hppa/copy.S:1.17 src/sys/arch/hppa/hppa/copy.S:1.18 --- src/sys/arch/hppa/hppa/copy.S:1.17 Sun Jun 6 12:13:36 2010 +++ src/sys/arch/hppa/hppa/copy.S Wed Jul 7 01:18:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: copy.S,v 1.17 2010/06/06 12:13:36 skrll Exp $ */ +/* $NetBSD: copy.S,v 1.18 2010/07/07 01:18:39 chs Exp $ */ /*- * Copyright (c) 2002 The NetBSD Foundation, Inc. @@ -363,14 +363,11 @@ ucas_ras_start: ldw 0(%sr1, %arg0), %t1 - comb,<> %arg1, %t1, 2f - copy %t1, %ret1 -ucas_ras_end: + comb,<> %arg1, %t1, ucas_ras_end + copy %r0, %ret0 stw %arg2, 0(%sr1, %arg0) - copy %arg1, %ret1 -2: - stw %ret1, 0(%sr1, %arg3) - copy %r0, %ret0 +ucas_ras_end: + stw %t1, 0(%arg3) L$ucas_32_fault: bv 0(%rp) @@ -380,4 +377,3 @@ bv 0(%rp) ldi EFAULT, %ret0 EXIT(ucas_32) - Index: src/sys/arch/hppa/hppa/trap.c diff -u src/sys/arch/hppa/hppa/trap.c:1.92 src/sys/arch/hppa/hppa/trap.c:1.93 --- src/sys/arch/hppa/hppa/trap.c:1.92 Mon May 31 20:19:33 2010 +++ src/sys/arch/hppa/hppa/trap.c Wed Jul 7 01:18:39 2010 @@ -1,4 +1,4 @@ -/* $NetBSD: trap.c,v 1.92 2010/05/31 20:19:33 skrll Exp $ */ +/* $NetBSD: trap.c,v 1.93 2010/07/07 01:18:39 chs Exp $ */ /*- * Copyright (c) 2001, 2002 The NetBSD Foundation, Inc. @@ -58,7 +58,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.92 2010/05/31 20:19:33 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.93 2010/07/07 01:18:39 chs Exp $"); /* #define INTRDEBUG */ /* #define TRAPDEBUG */ @@ -917,6 +917,15 @@ panic("trap: uvm_fault(%p, %lx, %d): %d", map, va, vftype, ret); } + } else if ((type & T_USER) == 0) { + extern char ucas_ras_start[]; + extern char ucas_ras_end[]; + + if (frame->tf_iioq_head > (u_int)ucas_ras_start && + frame->tf_iioq_head < (u_int)ucas_ras_end) { + frame->tf_iioq_head = (u_int)ucas_ras_start; + frame->tf_iioq_tail = (u_int)ucas_ras_start + 4; + } } break;