summaryrefslogtreecommitdiff
path: root/sys/arch/mips64
diff options
context:
space:
mode:
authorMiod Vallat <miod@cvs.openbsd.org>2008-02-20 21:34:20 +0000
committerMiod Vallat <miod@cvs.openbsd.org>2008-02-20 21:34:20 +0000
commit9949c7c0e74a6c0db87ab4dfb76eb31bbb1f9d71 (patch)
tree4af95144a895c18e228cd5aa3b119907ea45370f /sys/arch/mips64
parenta70750f826f74eebcef979bf18c6c39a9df3d5ec (diff)
Oops, correctly recover from kcopy() faults, since the stack frame is
different now.
Diffstat (limited to 'sys/arch/mips64')
-rw-r--r--sys/arch/mips64/mips64/lcore_access.S13
1 files changed, 11 insertions, 2 deletions
diff --git a/sys/arch/mips64/mips64/lcore_access.S b/sys/arch/mips64/mips64/lcore_access.S
index 0d9d17f8d91..9da36ec7b38 100644
--- a/sys/arch/mips64/mips64/lcore_access.S
+++ b/sys/arch/mips64/mips64/lcore_access.S
@@ -1,4 +1,4 @@
-/* $OpenBSD: lcore_access.S,v 1.12 2008/02/20 19:13:38 miod Exp $ */
+/* $OpenBSD: lcore_access.S,v 1.13 2008/02/20 21:34:19 miod Exp $ */
/*
* Copyright (c) 2001-2003 Opsycon AB (www.opsycon.se / www.opsycon.com)
@@ -58,7 +58,7 @@
onfault_table:
PTR_VAL 0 # invalid index number
PTR_VAL _copyerr
- PTR_VAL _copyerr
+ PTR_VAL _kcopyerr
#if defined(DDB) || defined(DEBUG)
PTR_VAL kt_ddberr
#else
@@ -321,3 +321,12 @@ NON_LEAF(kcopy, FRAMESZ(CF_SZ + REGSZ), ra)
j ra
move v0, zero
END(kcopy)
+
+_kcopyerr:
+ PTR_L v0, CF_ARGSZ(sp)
+ PTR_L t3, curprocpaddr
+ PTR_L ra, CF_RA_OFFS + REGSZ(sp)
+ sw v0, PCB_ONFAULT(t3)
+ PTR_ADDU sp, sp, FRAMESZ(CF_SZ + REGSZ)
+ j ra
+ li v0, EFAULT # return error