svn commit: r325831 - in stable/11: lib/libc/sys sys/arm/arm sys/arm/include sys/conf
John Baldwin
jhb at FreeBSD.org
Tue Nov 14 22:18:15 UTC 2017
Author: jhb
Date: Tue Nov 14 22:18:13 2017
New Revision: 325831
URL: https://svnweb.freebsd.org/changeset/base/325831
Log:
MFC 323581,323582,323583: Add ptrace operations for VFP registers.
323581:
Only mess with VFP state on the CPU for curthread for get/set_vfpcontext.
Future changes will use these functions to fetch and store VFP state for
threads other than curthread.
323582:
Add ptrace operations to fetch and store VFP registers.
323583:
Export get/set_vfpcontext from machdep.c.
Should have been part of the previous commit to add ptrace operations
for VFP registers.
Added:
stable/11/sys/arm/arm/ptrace_machdep.c
- copied unchanged from r323582, head/sys/arm/arm/ptrace_machdep.c
Modified:
stable/11/lib/libc/sys/ptrace.2
stable/11/sys/arm/arm/machdep.c
stable/11/sys/arm/include/ptrace.h
stable/11/sys/arm/include/vfp.h
stable/11/sys/conf/files.arm
Directory Properties:
stable/11/ (props changed)
Modified: stable/11/lib/libc/sys/ptrace.2
==============================================================================
--- stable/11/lib/libc/sys/ptrace.2 Tue Nov 14 22:17:02 2017 (r325830)
+++ stable/11/lib/libc/sys/ptrace.2 Tue Nov 14 22:18:13 2017 (r325831)
@@ -2,7 +2,7 @@
.\" $NetBSD: ptrace.2,v 1.2 1995/02/27 12:35:37 cgd Exp $
.\"
.\" This file is in the public domain.
-.Dd June 11, 2017
+.Dd September 14, 2017
.Dt PTRACE 2
.Os
.Sh NAME
@@ -762,6 +762,28 @@ The
.Fa data
argument is ignored.
.El
+.Sh ARM MACHINE-SPECIFIC REQUESTS
+.Bl -tag -width "Dv PT_SETVFPREGS"
+.It Dv PT_GETVFPREGS
+Return the thread's
+.Dv VFP
+machine state in the buffer pointed to by
+.Fa addr .
+.Pp
+The
+.Fa data
+argument is ignored.
+.It Dv PT_SETVFPREGS
+Set the thread's
+.Dv VFP
+machine state from the buffer pointed to by
+.Fa addr .
+.Pp
+The
+.Fa data
+argument is ignored.
+.El
+.Pp
.Sh x86 MACHINE-SPECIFIC REQUESTS
.Bl -tag -width "Dv PT_GETXSTATE_INFO"
.It Dv PT_GETXMMREGS
Modified: stable/11/sys/arm/arm/machdep.c
==============================================================================
--- stable/11/sys/arm/arm/machdep.c Tue Nov 14 22:17:02 2017 (r325830)
+++ stable/11/sys/arm/arm/machdep.c Tue Nov 14 22:18:13 2017 (r325831)
@@ -394,39 +394,41 @@ exec_setregs(struct thread *td, struct image_params *i
/*
* Get machine VFP context.
*/
-static void
+void
get_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
- struct pcb *curpcb;
+ struct pcb *pcb;
- curpcb = curthread->td_pcb;
- critical_enter();
-
- vfp_store(&curpcb->pcb_vfpstate, false);
- memcpy(vfp->mcv_reg, curpcb->pcb_vfpstate.reg,
+ pcb = td->td_pcb;
+ if (td == curthread) {
+ critical_enter();
+ vfp_store(&pcb->pcb_vfpstate, false);
+ critical_exit();
+ } else
+ MPASS(TD_IS_SUSPENDED(td));
+ memcpy(vfp->mcv_reg, pcb->pcb_vfpstate.reg,
sizeof(vfp->mcv_reg));
- vfp->mcv_fpscr = curpcb->pcb_vfpstate.fpscr;
-
- critical_exit();
+ vfp->mcv_fpscr = pcb->pcb_vfpstate.fpscr;
}
/*
* Set machine VFP context.
*/
-static void
+void
set_vfpcontext(struct thread *td, mcontext_vfp_t *vfp)
{
- struct pcb *curpcb;
+ struct pcb *pcb;
- curpcb = curthread->td_pcb;
- critical_enter();
-
- vfp_discard(td);
- memcpy(curpcb->pcb_vfpstate.reg, vfp->mcv_reg,
- sizeof(curpcb->pcb_vfpstate.reg));
- curpcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr;
-
- critical_exit();
+ pcb = td->td_pcb;
+ if (td == curthread) {
+ critical_enter();
+ vfp_discard(td);
+ critical_exit();
+ } else
+ MPASS(TD_IS_SUSPENDED(td));
+ memcpy(pcb->pcb_vfpstate.reg, vfp->mcv_reg,
+ sizeof(pcb->pcb_vfpstate.reg));
+ pcb->pcb_vfpstate.fpscr = vfp->mcv_fpscr;
}
#endif
Copied: stable/11/sys/arm/arm/ptrace_machdep.c (from r323582, head/sys/arm/arm/ptrace_machdep.c)
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ stable/11/sys/arm/arm/ptrace_machdep.c Tue Nov 14 22:18:13 2017 (r325831, copy of r323582, head/sys/arm/arm/ptrace_machdep.c)
@@ -0,0 +1,63 @@
+/*-
+ * Copyright (c) 2017 John Baldwin <jhb at FreeBSD.org>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/types.h>
+#include <sys/proc.h>
+#include <sys/ptrace.h>
+#ifdef VFP
+#include <machine/vfp.h>
+#endif
+
+int
+cpu_ptrace(struct thread *td, int req, void *addr, int data)
+{
+#ifdef VFP
+ mcontext_vfp_t vfp;
+#endif
+ int error;
+
+ switch (req) {
+#ifdef VFP
+ case PT_GETVFPREGS:
+ get_vfpcontext(td, &vfp);
+ error = copyout(&vfp, addr, sizeof(vfp));
+ break;
+ case PT_SETVFPREGS:
+ error = copyin(addr, &vfp, sizeof(vfp));
+ if (error == 0)
+ set_vfpcontext(td, &vfp);
+ break;
+#endif
+ default:
+ error = EINVAL;
+ }
+
+ return (error);
+}
Modified: stable/11/sys/arm/include/ptrace.h
==============================================================================
--- stable/11/sys/arm/include/ptrace.h Tue Nov 14 22:17:02 2017 (r325830)
+++ stable/11/sys/arm/include/ptrace.h Tue Nov 14 22:18:13 2017 (r325831)
@@ -4,5 +4,20 @@
#ifndef _MACHINE_PTRACE_H_
#define _MACHINE_PTRACE_H_
+#define __HAVE_PTRACE_MACHDEP
+
+/*
+ * Must match mcontext_vfp_t. Note that mcontext_vfp_t does not
+ * include explicit padding.
+ */
+struct vfpreg {
+ __uint64_t vfp_reg[32];
+ __uint32_t vfp_scr;
+ __uint32_t vfp_pad0;
+};
+
+#define PT_GETVFPREGS (PT_FIRSTMACH + 0)
+#define PT_SETVFPREGS (PT_FIRSTMACH + 1)
+
#endif /* !_MACHINE_PTRACE_H */
Modified: stable/11/sys/arm/include/vfp.h
==============================================================================
--- stable/11/sys/arm/include/vfp.h Tue Nov 14 22:17:02 2017 (r325830)
+++ stable/11/sys/arm/include/vfp.h Tue Nov 14 22:18:13 2017 (r325831)
@@ -148,6 +148,8 @@ struct vfp_state {
};
#ifdef _KERNEL
+void get_vfpcontext(struct thread *, mcontext_vfp_t *);
+void set_vfpcontext(struct thread *, mcontext_vfp_t *);
void vfp_init(void);
void vfp_store(struct vfp_state *, boolean_t);
void vfp_discard(struct thread *);
Modified: stable/11/sys/conf/files.arm
==============================================================================
--- stable/11/sys/conf/files.arm Tue Nov 14 22:17:02 2017 (r325830)
+++ stable/11/sys/conf/files.arm Tue Nov 14 22:18:13 2017 (r325831)
@@ -79,6 +79,7 @@ arm/arm/platform_if.m optional platform
arm/arm/pmap-v4.c optional !armv6
arm/arm/pmap-v6.c optional armv6
arm/arm/pmu.c optional pmu | fdt hwpmc
+arm/arm/ptrace_machdep.c standard
arm/arm/sc_machdep.c optional sc
arm/arm/setcpsr.S standard
arm/arm/setstack.s standard
More information about the svn-src-stable-11
mailing list