Module Name:    src
Committed By:   uwe
Date:           Fri Jan 28 21:06:09 UTC 2011

Modified Files:
        src/sys/arch/sh3/include: ptrace.h userret.h
        src/sys/arch/sh3/sh3: db_interface.c exception.c exception_vector.S
            process_machdep.c sh3_machdep.c

Log Message:
Implement PT_STEP.


To generate a diff of this commit:
cvs rdiff -u -r1.8 -r1.9 src/sys/arch/sh3/include/ptrace.h
cvs rdiff -u -r1.10 -r1.11 src/sys/arch/sh3/include/userret.h
cvs rdiff -u -r1.60 -r1.61 src/sys/arch/sh3/sh3/db_interface.c \
    src/sys/arch/sh3/sh3/exception.c
cvs rdiff -u -r1.46 -r1.47 src/sys/arch/sh3/sh3/exception_vector.S
cvs rdiff -u -r1.18 -r1.19 src/sys/arch/sh3/sh3/process_machdep.c
cvs rdiff -u -r1.89 -r1.90 src/sys/arch/sh3/sh3/sh3_machdep.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/sh3/include/ptrace.h
diff -u src/sys/arch/sh3/include/ptrace.h:1.8 src/sys/arch/sh3/include/ptrace.h:1.9
--- src/sys/arch/sh3/include/ptrace.h:1.8	Mon Oct 27 23:50:12 2008
+++ src/sys/arch/sh3/include/ptrace.h	Fri Jan 28 21:06:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: ptrace.h,v 1.8 2008/10/27 23:50:12 uwe Exp $	*/
+/*	$NetBSD: ptrace.h,v 1.9 2011/01/28 21:06:07 uwe Exp $	*/
 
 /*
  * Copyright (c) 1993 Christopher G. Demetriou
@@ -37,6 +37,8 @@
  * sh3-dependent ptrace definitions
  */
 
+#define PT_STEP		(PT_FIRSTMACH + 0)
+
 /* old struct reg (now struct __reg40) that was missing r_gbr */
 #define	PT___GETREGS40	(PT_FIRSTMACH + 1)
 #define	PT___SETREGS40	(PT_FIRSTMACH + 2)
@@ -45,7 +47,7 @@
 #define	PT_SETREGS	(PT_FIRSTMACH + 4)
 
 #define PT_MACHDEP_STRINGS \
-	"(unused)", \
+	"PT_STEP", \
 	"PT___GETREGS40", \
 	"PT___SETREGS40", \
 	"PT_GETREGS", \

Index: src/sys/arch/sh3/include/userret.h
diff -u src/sys/arch/sh3/include/userret.h:1.10 src/sys/arch/sh3/include/userret.h:1.11
--- src/sys/arch/sh3/include/userret.h:1.10	Mon Nov  5 20:37:48 2007
+++ src/sys/arch/sh3/include/userret.h	Fri Jan 28 21:06:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: userret.h,v 1.10 2007/11/05 20:37:48 ad Exp $	*/
+/*	$NetBSD: userret.h,v 1.11 2011/01/28 21:06:07 uwe Exp $	*/
 
 /*
  * Copyright (c) 1992, 1993
@@ -81,12 +81,39 @@
 
 #include <sys/userret.h>
 
+#include <sh3/ubcreg.h>
+#include "opt_ptrace.h"
+
+
 static __inline void
 userret(struct lwp *l)
 {
 
 	/* Invoke MI userret code */
 	mi_userret(l);
+
+#ifdef PTRACE
+	/* Check if lwp is being PT_STEP'ed */
+	if (l->l_md.md_flags & MDP_SSTEP) {
+		struct trapframe *tf = l->l_md.md_regs;
+
+		/*
+		 * Channel A is set up for single stepping in sh_cpu_init().
+		 * Before RTE we write tf_ubc to BBRA and tf_spc to BARA.
+		 */
+#ifdef SH3
+		if (CPU_IS_SH3) {
+			tf->tf_ubc = UBC_CYCLE_INSN | UBC_CYCLE_READ
+				| SH3_UBC_CYCLE_CPU;
+	}
+#endif
+#ifdef SH4
+		if (CPU_IS_SH4) {
+			tf->tf_ubc = UBC_CYCLE_INSN | UBC_CYCLE_READ;
+		}
+#endif
+	}
+#endif /* PTRACE */
 }
 
 #endif /* !_SH3_USERRET_H_ */

Index: src/sys/arch/sh3/sh3/db_interface.c
diff -u src/sys/arch/sh3/sh3/db_interface.c:1.60 src/sys/arch/sh3/sh3/db_interface.c:1.61
--- src/sys/arch/sh3/sh3/db_interface.c:1.60	Wed Jan 26 18:43:30 2011
+++ src/sys/arch/sh3/sh3/db_interface.c	Fri Jan 28 21:06:07 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: db_interface.c,v 1.60 2011/01/26 18:43:30 uwe Exp $	*/
+/*	$NetBSD: db_interface.c,v 1.61 2011/01/28 21:06:07 uwe Exp $	*/
 
 /*-
  * Copyright (C) 2002 UCHIYAMA Yasushi.  All rights reserved.
@@ -28,7 +28,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.60 2011/01/26 18:43:30 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: db_interface.c,v 1.61 2011/01/28 21:06:07 uwe Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -227,35 +227,21 @@
 db_set_single_step(db_regs_t *regs)
 {
 
-	_reg_write_2(SH_(BBRA), 0);		/* disable break */
-
+	/*
+	 * Channel A is set up for single stepping in sh_cpu_init().
+	 * Before RTE we write tf_ubc to BBRA and tf_spc to BARA.
+	 */
 #ifdef SH3
 	if (CPU_IS_SH3) {
-		/* A: compare all address bits */
-		_reg_write_4(SH3_BAMRA, 0x00000000);
-
-		/* A: break after execution, ignore ASID */
-		_reg_write_4(SH3_BRCR, (UBC_CTL_A_AFTER_INSN
-					 | SH3_UBC_CTL_A_MASK_ASID));
-
-		/* will be written to BBRA before RTE */
 		regs->tf_ubc = UBC_CYCLE_INSN | UBC_CYCLE_READ
 			| SH3_UBC_CYCLE_CPU;
 	}
-#endif	/* SH3 */
-
+#endif
 #ifdef SH4
 	if (CPU_IS_SH4) {
-		/* A: compare all address bits, ignore ASID */
-		_reg_write_1(SH4_BAMRA, SH4_UBC_MASK_NONE | SH4_UBC_MASK_ASID);
-
-		/* A: break after execution */
-		_reg_write_2(SH4_BRCR, UBC_CTL_A_AFTER_INSN);
-
-		/* will be written to BBRA before RTE */
 		regs->tf_ubc = UBC_CYCLE_INSN | UBC_CYCLE_READ;
 	}
-#endif	/* SH4 */
+#endif
 }
 
 void
Index: src/sys/arch/sh3/sh3/exception.c
diff -u src/sys/arch/sh3/sh3/exception.c:1.60 src/sys/arch/sh3/sh3/exception.c:1.61
--- src/sys/arch/sh3/sh3/exception.c:1.60	Thu Jan 27 01:01:55 2011
+++ src/sys/arch/sh3/sh3/exception.c	Fri Jan 28 21:06:08 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: exception.c,v 1.60 2011/01/27 01:01:55 uwe Exp $	*/
+/*	$NetBSD: exception.c,v 1.61 2011/01/28 21:06:08 uwe Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc. All rights reserved.
@@ -79,7 +79,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: exception.c,v 1.60 2011/01/27 01:01:55 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: exception.c,v 1.61 2011/01/28 21:06:08 uwe Exp $");
 
 #include "opt_ddb.h"
 #include "opt_kgdb.h"
@@ -185,6 +185,7 @@
 		break;
 
 	case EXPEVT_BREAK | EXP_USER:
+		l->l_md.md_flags &= ~MDP_SSTEP;
 		KSI_INIT_TRAP(&ksi);
 		ksi.ksi_signo = SIGTRAP;
 		ksi.ksi_code = TRAP_TRACE;

Index: src/sys/arch/sh3/sh3/exception_vector.S
diff -u src/sys/arch/sh3/sh3/exception_vector.S:1.46 src/sys/arch/sh3/sh3/exception_vector.S:1.47
--- src/sys/arch/sh3/sh3/exception_vector.S:1.46	Mon Dec 20 00:25:43 2010
+++ src/sys/arch/sh3/sh3/exception_vector.S	Fri Jan 28 21:06:08 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: exception_vector.S,v 1.46 2010/12/20 00:25:43 matt Exp $	*/
+/*	$NetBSD: exception_vector.S,v 1.47 2011/01/28 21:06:08 uwe Exp $	*/
 
 /*-
  * Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -28,6 +28,8 @@
 
 #include "opt_cputype.h"
 #include "opt_ddb.h"
+#include "opt_ptrace.h"
+
 #include "assym.h"
 
 #include <sh3/param.h>
@@ -46,7 +48,7 @@
 #define _ALIGN_TEXT	.align 5
 #include <sh3/asm.h>
 
-__KERNEL_RCSID(0, "$NetBSD: exception_vector.S,v 1.46 2010/12/20 00:25:43 matt Exp $")
+__KERNEL_RCSID(0, "$NetBSD: exception_vector.S,v 1.47 2011/01/28 21:06:08 uwe Exp $")
 
 
 /*
@@ -97,12 +99,12 @@
 
 	/* general_exception(curlwp, tf, TEA); */
 1:	mov	r4, r8
-#ifdef DDB
+#if defined(PTRACE) || defined(DDB)
 	mov	#0, r2
 	MOV	(BBRA, r1)
-	mov.w	r2, @r1			/* disable UBC */
 	mov.l	r2, @(TF_UBC, r14)	/* clear tf->tf_ubc */
-#endif /* DDB */
+	mov.w	r2, @r1			/* disable UBC channel A */
+#endif
 	__EXCEPTION_UNBLOCK(r0, r1)
 	mov.l	.Lg_general_exception, r0
 	jsr	@r0
@@ -114,9 +116,9 @@
 	jsr	@r0
 	 mov	r14, r5
 
-#ifdef DDB
+#if defined(PTRACE) || defined(DDB)
 	mov.l	@(TF_UBC, r14), r2
-	tst	r2, r2			! ddb single-step == 0?
+	tst	r2, r2			! single-step == 0?
 	bt	.Lg_return_from_exception
 
 	!! We are returning from DDB to do single step.  Channel A in
@@ -127,7 +129,7 @@
 	mov.l	@(TF_SPC, r14), r4
 	mov.l	r4, @r5			! BARA = tf->tf_spc
 	mov.w	r2, @r3			! BBRA = tf->tf_ubc
-#endif /* DDB */
+#endif /* PTRACE || DDB */
 .Lg_return_from_exception:
 	__EXCEPTION_RETURN
 

Index: src/sys/arch/sh3/sh3/process_machdep.c
diff -u src/sys/arch/sh3/sh3/process_machdep.c:1.18 src/sys/arch/sh3/sh3/process_machdep.c:1.19
--- src/sys/arch/sh3/sh3/process_machdep.c:1.18	Sat Nov 21 17:40:28 2009
+++ src/sys/arch/sh3/sh3/process_machdep.c	Fri Jan 28 21:06:08 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: process_machdep.c,v 1.18 2009/11/21 17:40:28 rmind Exp $	*/
+/*	$NetBSD: process_machdep.c,v 1.19 2011/01/28 21:06:08 uwe Exp $	*/
 
 /*
  * Copyright (c) 1993 The Regents of the University of California.
@@ -77,7 +77,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.18 2009/11/21 17:40:28 rmind Exp $");
+__KERNEL_RCSID(0, "$NetBSD: process_machdep.c,v 1.19 2011/01/28 21:06:08 uwe Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -343,9 +343,11 @@
 {
 
 	if (sstep)
-		return (EINVAL);
+		l->l_md.md_flags |= MDP_SSTEP;
+	else
+		l->l_md.md_flags &= ~MDP_SSTEP;
 
-	return (0);
+	return 0;
 }
 
 int

Index: src/sys/arch/sh3/sh3/sh3_machdep.c
diff -u src/sys/arch/sh3/sh3/sh3_machdep.c:1.89 src/sys/arch/sh3/sh3/sh3_machdep.c:1.90
--- src/sys/arch/sh3/sh3/sh3_machdep.c:1.89	Wed Jan 26 23:29:16 2011
+++ src/sys/arch/sh3/sh3/sh3_machdep.c	Fri Jan 28 21:06:08 2011
@@ -1,4 +1,4 @@
-/*	$NetBSD: sh3_machdep.c,v 1.89 2011/01/26 23:29:16 uwe Exp $	*/
+/*	$NetBSD: sh3_machdep.c,v 1.90 2011/01/28 21:06:08 uwe Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2002 The NetBSD Foundation, Inc.
@@ -65,11 +65,13 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sh3_machdep.c,v 1.89 2011/01/26 23:29:16 uwe Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sh3_machdep.c,v 1.90 2011/01/28 21:06:08 uwe Exp $");
 
+#include "opt_ddb.h"
 #include "opt_kgdb.h"
 #include "opt_memsize.h"
 #include "opt_kstack_debug.h"
+#include "opt_ptrace.h"
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -104,6 +106,7 @@
 #include <sh3/mmu.h>
 #include <sh3/pcb.h>
 #include <sh3/intr.h>
+#include <sh3/ubcreg.h>
 
 /* Our exported CPU info; we can have only one. */
 struct cpu_info cpu_info_store;
@@ -190,6 +193,33 @@
 
 	/* Set page size (4KB) */
 	uvm_setpagesize();
+
+	/* setup UBC channel A for single-stepping */
+#if defined(PTRACE) || defined(DDB)
+	_reg_write_2(SH_(BBRA), 0); /* disable channel A */
+	_reg_write_2(SH_(BBRB), 0); /* disable channel B */
+
+#ifdef SH3
+	if (CPU_IS_SH3) {
+		/* A: break after execution, ignore ASID */
+		_reg_write_4(SH3_BRCR, (UBC_CTL_A_AFTER_INSN
+					| SH3_UBC_CTL_A_MASK_ASID));
+
+		/* A: compare all address bits */
+		_reg_write_4(SH3_BAMRA, 0x00000000);
+	}
+#endif	/* SH3 */
+
+#ifdef SH4
+	if (CPU_IS_SH4) {
+		/* A: break after execution */
+		_reg_write_2(SH4_BRCR, UBC_CTL_A_AFTER_INSN);
+
+		/* A: compare all address bits, ignore ASID */
+		_reg_write_1(SH4_BAMRA, SH4_UBC_MASK_NONE | SH4_UBC_MASK_ASID);
+	}
+#endif	/* SH4 */
+#endif
 }
 
 

Reply via email to