git: d78c2cd831d3 - main - arm64: Implement cpu_ptrace().

From: Olivier Houchard <cognet_at_FreeBSD.org>
Date: Thu, 27 Oct 2022 21:30:06 UTC
The branch main has been updated by cognet:

URL: https://cgit.FreeBSD.org/src/commit/?id=d78c2cd831d346b94c00c72b5a94a1a4f0dd3e53

commit d78c2cd831d346b94c00c72b5a94a1a4f0dd3e53
Author:     Olivier Houchard <cognet@FreeBSD.org>
AuthorDate: 2022-10-27 21:25:59 +0000
Commit:     Olivier Houchard <cognet@FreeBSD.org>
CommitDate: 2022-10-27 21:25:56 +0000

    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
---
 sys/arm64/arm64/ptrace_machdep.c | 30 ++++++++++++++++++++++++++++++
 sys/arm64/include/ptrace.h       | 10 ++++++++++
 2 files changed, 40 insertions(+)

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_ */