aboutsummaryrefslogtreecommitdiff
path: root/sys/arm64
diff options
context:
space:
mode:
authorOlivier Houchard <cognet@FreeBSD.org>2022-10-27 21:25:59 +0000
committerOlivier Houchard <cognet@FreeBSD.org>2022-10-27 21:25:56 +0000
commitd78c2cd831d346b94c00c72b5a94a1a4f0dd3e53 (patch)
tree51961a777a231035142ce747014ae638b3a3f129 /sys/arm64
parent473e9fcab4ea9379f53e1f7d8e41f5a5754d0007 (diff)
downloadsrc-d78c2cd831d346b94c00c72b5a94a1a4f0dd3e53.tar.gz
src-d78c2cd831d346b94c00c72b5a94a1a4f0dd3e53.zip
arm64: Implement cpu_ptrace().
Add a minimal implementation of cpu_ptrace() for arm64. It is only used to get/set VFP registers for 32bits binaries, as it is apparently what we use there, instead of the MI PT_GETFPREGS/PT_SETFPREGS. PR: 267361 MFC After: 1 week
Diffstat (limited to 'sys/arm64')
-rw-r--r--sys/arm64/arm64/ptrace_machdep.c30
-rw-r--r--sys/arm64/include/ptrace.h10
2 files changed, 40 insertions, 0 deletions
diff --git a/sys/arm64/arm64/ptrace_machdep.c b/sys/arm64/arm64/ptrace_machdep.c
index 79aff19571c9..01135978b39a 100644
--- a/sys/arm64/arm64/ptrace_machdep.c
+++ b/sys/arm64/arm64/ptrace_machdep.c
@@ -49,6 +49,36 @@ __FBSDID("$FreeBSD$");
#include <machine/armreg.h>
+/* Only used to get/set 32bits VFP regs */
+int
+cpu_ptrace(struct thread *td, int req, void *arg, int data)
+{
+#if defined(VFP) && defined(COMPAT_FREEBSD32)
+ mcontext32_vfp_t vfp;
+ int error;
+
+ if (!SV_CURPROC_FLAG(SV_ILP32))
+ return (EINVAL);
+ switch (req) {
+ case PT_GETVFPREGS32:
+ get_fpcontext32(td, &vfp);
+ error = copyout(&vfp, arg, sizeof(vfp));
+ break;
+ case PT_SETVFPREGS32:
+ error = copyin(arg, &vfp, sizeof(vfp));
+ if (error == 0)
+ set_fpcontext32(td, &vfp);
+ break;
+ default:
+ error = EINVAL;
+ }
+
+ return (error);
+#else
+ return (EINVAL);
+#endif
+}
+
#if defined(VFP) && defined(COMPAT_FREEBSD32)
static bool
get_arm_vfp(struct regset *rs, struct thread *td, void *buf, size_t *sizep)
diff --git a/sys/arm64/include/ptrace.h b/sys/arm64/include/ptrace.h
index da23dbe43a4f..0705ee6daab0 100644
--- a/sys/arm64/include/ptrace.h
+++ b/sys/arm64/include/ptrace.h
@@ -1 +1,11 @@
/* $FreeBSD$ */
+
+#ifndef _MACHINE_PTRACE_H_
+#define _MACHINE_PTRACE_H_
+
+#define __HAVE_PTRACE_MACHDEP
+
+#define PT_GETVFPREGS32 (PT_FIRSTMACH + 0)
+#define PT_SETVFPREGS32 (PT_FIRSTMACH + 1)
+
+#endif /* _MACHINE_PTRACE_H_ */