Author: jhibbits
Date: Wed Jan 14 07:01:21 2015
New Revision: 277166
URL: https://svnweb.freebsd.org/changeset/base/277166

Log:
  Add Altivec/VMX register support to ptrace.
  
  MFC after:    2 weeks
  Relnotes:     yes

Added:
  head/sys/powerpc/powerpc/ptrace_machdep.c   (contents, props changed)
Modified:
  head/sys/conf/files.powerpc
  head/sys/powerpc/include/ptrace.h
  head/sys/powerpc/include/reg.h

Modified: head/sys/conf/files.powerpc
==============================================================================
--- head/sys/conf/files.powerpc Wed Jan 14 06:46:25 2015        (r277165)
+++ head/sys/conf/files.powerpc Wed Jan 14 07:01:21 2015        (r277166)
@@ -202,6 +202,7 @@ powerpc/powerpc/pic_if.m    standard
 powerpc/powerpc/pmap_dispatch.c        standard
 powerpc/powerpc/platform.c     standard
 powerpc/powerpc/platform_if.m  standard
+powerpc/powerpc/ptrace_machdep.c       standard
 powerpc/powerpc/sc_machdep.c   optional        sc
 powerpc/powerpc/setjmp.S       standard
 powerpc/powerpc/sigcode32.S    optional        powerpc | compat_freebsd32

Modified: head/sys/powerpc/include/ptrace.h
==============================================================================
--- head/sys/powerpc/include/ptrace.h   Wed Jan 14 06:46:25 2015        
(r277165)
+++ head/sys/powerpc/include/ptrace.h   Wed Jan 14 07:01:21 2015        
(r277166)
@@ -1,6 +1,6 @@
 /*-
- * Copyright (c) 1992, 1993
- *     The Regents of the University of California.  All rights reserved.
+ * Copyright (c) 2014 Justin Hibbits
+ * All rights reserved.
  *
  * Redistribution and use in source and binary forms, with or without
  * modification, are permitted provided that the following conditions
@@ -33,4 +33,9 @@
 #ifndef _MACHINE_PTRACE_H_
 #define _MACHINE_PTRACE_H_
 
+#define        __HAVE_PTRACE_MACHDEP
+
+#define PT_GETVRREGS   (PT_FIRSTMACH + 0)
+#define PT_SETVRREGS   (PT_FIRSTMACH + 1)
+
 #endif

Modified: head/sys/powerpc/include/reg.h
==============================================================================
--- head/sys/powerpc/include/reg.h      Wed Jan 14 06:46:25 2015        
(r277165)
+++ head/sys/powerpc/include/reg.h      Wed Jan 14 07:01:21 2015        
(r277166)
@@ -24,6 +24,14 @@ struct fpreg {
        double fpscr;
 };
 
+/* Must match pcb.pcb_vec */
+struct vmxreg {
+       uint32_t vr[32][4];
+       uint32_t pad[2];
+       uint32_t vrsave;
+       uint32_t vscr;
+};
+
 struct dbreg {
        unsigned int    junk;
 };
@@ -43,6 +51,10 @@ struct fpreg32 {
        struct fpreg data;
 };
 
+struct vmxreg32 {
+       struct vmxreg data;
+};
+
 struct dbreg32 {
        struct dbreg data;
 };

Added: head/sys/powerpc/powerpc/ptrace_machdep.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/powerpc/powerpc/ptrace_machdep.c   Wed Jan 14 07:01:21 2015        
(r277166)
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2014 Justin Hibbits
+ * 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 "opt_compat.h"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/malloc.h>
+#include <sys/proc.h>
+#include <sys/ptrace.h>
+#include <sys/sysent.h>
+#include <machine/altivec.h>
+#include <machine/cpu.h>
+#include <machine/md_var.h>
+#include <machine/pcb.h>
+
+int
+cpu_ptrace(struct thread *td, int req, void *addr, int data)
+{
+       int error;
+       struct pcb *pcb;
+       struct vec vec;
+
+       pcb = td->td_pcb;
+
+       bzero(&vec, sizeof(vec));
+
+       error = EINVAL;
+       switch (req) {
+       case PT_GETVRREGS:
+               if (!(cpu_features & PPC_FEATURE_HAS_ALTIVEC))
+                       break;
+
+               if (pcb->pcb_flags & PCB_VEC) {
+                       save_vec_nodrop(td);
+                       memcpy(&vec, &pcb->pcb_vec, sizeof(vec));
+               }
+               error = copyout(&vec, addr, sizeof(vec));
+               break;
+       case PT_SETVRREGS:
+               if (!(cpu_features & PPC_FEATURE_HAS_ALTIVEC))
+                       break;
+               error = copyin(addr, &vec, sizeof(vec));
+               if (error == 0) {
+                       pcb->pcb_flags |= PCB_VEC;
+                       memcpy(&pcb->pcb_vec, &vec, sizeof(vec));
+               }
+               break;
+
+       default:
+               break;
+       }
+
+       return (error);
+}
_______________________________________________
svn-src-head@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-head
To unsubscribe, send any mail to "svn-src-head-unsubscr...@freebsd.org"

Reply via email to