Module Name:    src
Committed By:   martin
Date:           Tue May  1 09:40:16 UTC 2012

Modified Files:
        src/sys/arch/sparc/include: cpu.h
        src/sys/arch/sparc/sparc: emul.c trap.c

Log Message:
On unaligned access, provide the data address to the signal handler, instead
of the faulting instructions address.


To generate a diff of this commit:
cvs rdiff -u -r1.93 -r1.94 src/sys/arch/sparc/include/cpu.h
cvs rdiff -u -r1.16 -r1.17 src/sys/arch/sparc/sparc/emul.c
cvs rdiff -u -r1.189 -r1.190 src/sys/arch/sparc/sparc/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/sparc/include/cpu.h
diff -u src/sys/arch/sparc/include/cpu.h:1.93 src/sys/arch/sparc/include/cpu.h:1.94
--- src/sys/arch/sparc/include/cpu.h:1.93	Sun Feb 19 21:06:28 2012
+++ src/sys/arch/sparc/include/cpu.h	Tue May  1 09:40:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: cpu.h,v 1.93 2012/02/19 21:06:28 rmind Exp $ */
+/*	$NetBSD: cpu.h,v 1.94 2012/05/01 09:40:15 martin Exp $ */
 
 /*
  * Copyright (c) 1992, 1993
@@ -236,7 +236,7 @@ void kgdb_panic(void);
 
 /* emul.c */
 struct trapframe;
-int fixalign(struct lwp *, struct trapframe *);
+int fixalign(struct lwp *, struct trapframe *, void **);
 int emulinstr(int, struct trapframe *);
 
 /* cpu.c */

Index: src/sys/arch/sparc/sparc/emul.c
diff -u src/sys/arch/sparc/sparc/emul.c:1.16 src/sys/arch/sparc/sparc/emul.c:1.17
--- src/sys/arch/sparc/sparc/emul.c:1.16	Mon Apr 28 20:23:36 2008
+++ src/sys/arch/sparc/sparc/emul.c	Tue May  1 09:40:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: emul.c,v 1.16 2008/04/28 20:23:36 martin Exp $	*/
+/*	$NetBSD: emul.c,v 1.17 2012/05/01 09:40:15 martin Exp $	*/
 
 /*-
  * Copyright (c) 1997 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.16 2008/04/28 20:23:36 martin Exp $");
+__KERNEL_RCSID(0, "$NetBSD: emul.c,v 1.17 2012/05/01 09:40:15 martin Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -212,10 +212,12 @@ muldiv(struct trapframe *tf,
  * Code to handle alignment faults on the sparc. This is enabled by sending
  * a fixalign trap. Such code is generated by compiling with cc -misalign
  * on SunOS, but we don't have such a feature yet on our gcc.
+ * If data_address is passed, do not emulate the instruction but just report
+ * back the VA (this is used for signal delivery).
  */
 
 int
-fixalign(struct lwp *l, struct trapframe *tf)
+fixalign(struct lwp *l, struct trapframe *tf, void **data_address)
 {
 	static u_char sizedef[] = { 0x4, 0xff, 0x2, 0x8 };
 
@@ -282,6 +284,12 @@ fixalign(struct lwp *l, struct trapframe
 
 	rs1 += rs2;
 
+	/* Only querying faulting data address? */
+	if (data_address) {
+		*data_address = (void*)rs1;
+		return 0;
+	}
+
 #ifdef DEBUG_EMUL
 	uprintf("memalign 0x%x: %s%c%c %c%d, %c%d, ", code.i_int,
 	    op.bits.st ? "st" : "ld", "us"[op.bits.sgn],

Index: src/sys/arch/sparc/sparc/trap.c
diff -u src/sys/arch/sparc/sparc/trap.c:1.189 src/sys/arch/sparc/sparc/trap.c:1.190
--- src/sys/arch/sparc/sparc/trap.c:1.189	Sun Feb 19 21:06:29 2012
+++ src/sys/arch/sparc/sparc/trap.c	Tue May  1 09:40:15 2012
@@ -1,4 +1,4 @@
-/*	$NetBSD: trap.c,v 1.189 2012/02/19 21:06:29 rmind Exp $ */
+/*	$NetBSD: trap.c,v 1.190 2012/05/01 09:40:15 martin Exp $ */
 
 /*
  * Copyright (c) 1996
@@ -49,7 +49,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.189 2012/02/19 21:06:29 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: trap.c,v 1.190 2012/05/01 09:40:15 martin Exp $");
 
 #include "opt_ddb.h"
 #include "opt_compat_svr4.h"
@@ -565,7 +565,7 @@ badtrap:
 
 	case T_ALIGN:
 		if ((p->p_md.md_flags & MDP_FIXALIGN) != 0) {
-			n = fixalign(l, tf);
+			n = fixalign(l, tf, NULL);
 			if (n == 0) {
 				ADVANCE;
 				break;
@@ -575,7 +575,7 @@ badtrap:
 		KSI_INIT_TRAP(&ksi);
 		ksi.ksi_trap = type;
 		ksi.ksi_code = BUS_ADRALN;
-		ksi.ksi_addr = (void *)pc;
+		fixalign(l, tf, &ksi.ksi_addr);
 		break;
 
 	case T_FPE:

Reply via email to