diff options
author | Olivier Houchard <cognet@FreeBSD.org> | 2022-10-27 21:25:59 +0000 |
---|---|---|
committer | Olivier Houchard <cognet@FreeBSD.org> | 2022-10-27 21:25:56 +0000 |
commit | d78c2cd831d346b94c00c72b5a94a1a4f0dd3e53 (patch) | |
tree | 51961a777a231035142ce747014ae638b3a3f129 /sys/arm64 | |
parent | 473e9fcab4ea9379f53e1f7d8e41f5a5754d0007 (diff) | |
download | src-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.c | 30 | ||||
-rw-r--r-- | sys/arm64/include/ptrace.h | 10 |
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_ */ |