Module Name:    src
Committed By:   martin
Date:           Tue Feb  2 08:18:42 UTC 2021

Modified Files:
        src/sys/arch/sparc64/sparc64: trap.c

Log Message:
Worakround for traps on invalid VAs:
uvm_fault() can not (currently) deal properly with invalid VAs (inside the
VA hole), so do not pass faults for such addresses to it, but instead
either panic (if fault is in kernel) or send a SIGSEGV to userland.


To generate a diff of this commit:
cvs rdiff -u -r1.192 -r1.193 src/sys/arch/sparc64/sparc64/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/sparc64/sparc64/trap.c
diff -u src/sys/arch/sparc64/sparc64/trap.c:1.192 src/sys/arch/sparc64/sparc64/trap.c:1.193
--- src/sys/arch/sparc64/sparc64/trap.c:1.192	Thu Nov 21 19:24:01 2019
+++ src/sys/arch/sparc64/sparc64/trap.c	Tue Feb  2 08:18:42 2021
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.192 2019/11/21 19:24:01 ad Exp $ */
+/*	$NetBSD: trap.c,v 1.193 2021/02/02 08:18:42 martin Exp $ */
 
 /*
  * Copyright (c) 1996-2002 Eduardo Horvath.  All rights reserved.
@@ -50,7 +50,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.192 2019/11/21 19:24:01 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.193 2021/02/02 08:18:42 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_multiprocessor.h"
@@ -1092,6 +1092,25 @@ data_access_fault(struct trapframe64 *tf
 	sticks = p->p_sticks;
 	tstate = tf->tf_tstate;
 
+#ifdef _LP64
+	/* deal with invalid VAs early */
+	if (__predict_false(addr >= (1UL<<HOLESHIFT) && addr < (1UL<<63))) {
+
+		if (tstate & TSTATE_PRIV)
+			panic("fault type %u for invalid va %lx", type, addr);
+
+		KSI_INIT_TRAP(&ksi);
+		ksi.ksi_signo = SIGSEGV;
+		ksi.ksi_code = SEGV_ACCERR;
+		ksi.ksi_trap = type;
+		ksi.ksi_addr = (void *)pc;
+		trapsignal(l, &ksi);
+		userret(l, pc, sticks);
+		share_fpu(l, tf);
+		return;
+	}
+#endif
+
 	/* Find the faulting va to give to uvm_fault */
 	va = trunc_page(addr);
 

Reply via email to