git: d78c2cd831d3 - main - arm64: Implement cpu_ptrace().
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_ */