Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 6 Jul 2018 23:49:17 +0000 (UTC)
From:      John Baldwin <jhb@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r336053 - in head: sys/arm/include sys/arm64/include tests/sys/kern
Message-ID:  <201807062349.w66NnHPe003591@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: jhb
Date: Fri Jul  6 23:49:17 2018
New Revision: 336053
URL: https://svnweb.freebsd.org/changeset/base/336053

Log:
  Export a breakpoint() function to userland for arm and arm64.
  
  Enable ptrace() tests using breakpoint() on these architectures.
  
  Reviewed by:	andrew
  Differential Revision:	https://reviews.freebsd.org/D15191

Modified:
  head/sys/arm/include/cpufunc.h
  head/sys/arm64/include/cpufunc.h
  head/tests/sys/kern/ptrace_test.c

Modified: head/sys/arm/include/cpufunc.h
==============================================================================
--- head/sys/arm/include/cpufunc.h	Fri Jul  6 22:07:26 2018	(r336052)
+++ head/sys/arm/include/cpufunc.h	Fri Jul  6 23:49:17 2018	(r336053)
@@ -54,7 +54,7 @@
 static __inline void
 breakpoint(void)
 {
-	__asm(".word      0xe7ffffff");
+	__asm("udf        0xffff");
 }
 
 struct cpu_functions {
@@ -494,6 +494,19 @@ extern int	arm_dcache_align_mask;
 extern u_int	arm_cache_level;
 extern u_int	arm_cache_loc;
 extern u_int	arm_cache_type[14];
+
+#else	/* !_KERNEL */
+
+static __inline void
+breakpoint(void)
+{
+
+	/*
+	 * This matches the instruction used by GDB for software
+	 * breakpoints.
+	 */
+	__asm("udf        0xfdee");
+}
 
 #endif	/* _KERNEL */
 #endif	/* _MACHINE_CPUFUNC_H_ */

Modified: head/sys/arm64/include/cpufunc.h
==============================================================================
--- head/sys/arm64/include/cpufunc.h	Fri Jul  6 22:07:26 2018	(r336052)
+++ head/sys/arm64/include/cpufunc.h	Fri Jul  6 23:49:17 2018	(r336053)
@@ -29,18 +29,18 @@
 #ifndef _MACHINE_CPUFUNC_H_
 #define	_MACHINE_CPUFUNC_H_
 
-#ifdef _KERNEL
-
-#include <machine/armreg.h>
-
-void pan_enable(void);
-
 static __inline void
 breakpoint(void)
 {
 
 	__asm("brk #0");
 }
+
+#ifdef _KERNEL
+
+#include <machine/armreg.h>
+
+void pan_enable(void);
 
 static __inline register_t
 dbg_disable(void)

Modified: head/tests/sys/kern/ptrace_test.c
==============================================================================
--- head/tests/sys/kern/ptrace_test.c	Fri Jul  6 22:07:26 2018	(r336052)
+++ head/tests/sys/kern/ptrace_test.c	Fri Jul  6 23:49:17 2018	(r336053)
@@ -54,8 +54,9 @@ __FBSDID("$FreeBSD$");
 /*
  * Architectures with a user-visible breakpoint().
  */
-#if defined(__amd64__) || defined(__i386__) || defined(__mips__) ||	\
-    defined(__riscv) || defined(__sparc64__)
+#if defined(__aarch64__) || defined(__amd64__) || defined(__arm__) ||	\
+    defined(__i386__) || defined(__mips__) || defined(__riscv) ||	\
+    defined(__sparc64__)
 #define	HAVE_BREAKPOINT
 #endif
 
@@ -63,8 +64,12 @@ __FBSDID("$FreeBSD$");
  * Adjust PC to skip over a breakpoint when stopped for a breakpoint trap.
  */
 #ifdef HAVE_BREAKPOINT
-#if defined(__amd64__) || defined(__i386__)
+#if defined(__aarch64__)
+#define	SKIP_BREAK(reg)	((reg)->elr += 4)
+#elif defined(__amd64__) || defined(__i386__)
 #define	SKIP_BREAK(reg)
+#elif defined(__arm__)
+#define	SKIP_BREAK(reg)	((reg)->r_pc += 4)
 #elif defined(__mips__)
 #define	SKIP_BREAK(reg)	((reg)->r_regs[PC] += 4)
 #elif defined(__riscv)



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201807062349.w66NnHPe003591>