Author: gnn
Date: Tue Feb 10 19:41:30 2015
New Revision: 278529
URL: https://svnweb.freebsd.org/changeset/base/278529

Log:
  Initial version of DTrace on ARM32.
  
  Submitted by: Howard Su based on work by Oleksandr Tymoshenko
  Reviewed by:  ian, andrew, rpaulo, markj

Added:
  head/cddl/contrib/opensolaris/lib/libdtrace/arm/
  head/cddl/contrib/opensolaris/lib/libdtrace/arm/dt_isadep.c   (contents, 
props changed)
  head/sys/cddl/contrib/opensolaris/uts/arm/
  head/sys/cddl/contrib/opensolaris/uts/arm/dtrace/
  head/sys/cddl/contrib/opensolaris/uts/arm/dtrace/fasttrap_isa.c   (contents, 
props changed)
  head/sys/cddl/contrib/opensolaris/uts/arm/sys/
  head/sys/cddl/contrib/opensolaris/uts/arm/sys/fasttrap_isa.h   (contents, 
props changed)
  head/sys/cddl/dev/dtrace/arm/
  head/sys/cddl/dev/dtrace/arm/dtrace_asm.S   (contents, props changed)
  head/sys/cddl/dev/dtrace/arm/dtrace_isa.c   (contents, props changed)
  head/sys/cddl/dev/dtrace/arm/dtrace_subr.c   (contents, props changed)
  head/sys/cddl/dev/dtrace/arm/regset.h   (contents, props changed)
  head/sys/cddl/dev/fbt/arm/
  head/sys/cddl/dev/fbt/arm/fbt_isa.c   (contents, props changed)
  head/sys/cddl/dev/fbt/arm/fbt_isa.h   (contents, props changed)
Modified:
  head/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
  head/cddl/lib/Makefile
  head/cddl/lib/libdtrace/Makefile
  head/cddl/usr.sbin/Makefile
  head/lib/Makefile
  head/lib/libproc/proc_bkpt.c
  head/lib/libproc/proc_regs.c
  head/sys/arm/arm/exception.S
  head/sys/arm/arm/identcpu.c
  head/sys/arm/arm/trap.c
  head/sys/arm/conf/BEAGLEBONE
  head/sys/arm/include/cpufunc.h
  head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
  head/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
  head/sys/cddl/dev/lockstat/lockstat.c
  head/sys/cddl/dev/profile/profile.c
  head/sys/modules/dtrace/Makefile
  head/sys/modules/dtrace/dtrace/Makefile

Added: head/cddl/contrib/opensolaris/lib/libdtrace/arm/dt_isadep.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/cddl/contrib/opensolaris/lib/libdtrace/arm/dt_isadep.c Tue Feb 10 
19:41:30 2015        (r278529)
@@ -0,0 +1,190 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ * Copyright 2014 Howard Su
+ * Copyright 2015 George V. Neville-Neil
+ *
+ */
+
+#pragma ident  "%Z%%M% %I%     %E% SMI"
+
+#include <stdlib.h>
+#include <assert.h>
+#include <errno.h>
+#include <string.h>
+#include <libgen.h>
+
+#include <dt_impl.h>
+#include <dt_pid.h>
+
+#if !defined(sun)
+#define PR_MODEL_ILP32 1
+#define PR_MODEL_LP64  2
+#include <libproc_compat.h>
+#endif
+
+#define        OP(x)           ((x) >> 30)
+#define        OP2(x)          (((x) >> 22) & 0x07)
+#define        COND(x)         (((x) >> 25) & 0x0f)
+#define        A(x)            (((x) >> 29) & 0x01)
+
+#define        OP_BRANCH       0
+
+#define        OP2_BPcc        0x1
+#define        OP2_Bicc        0x2
+#define        OP2_BPr         0x3
+#define        OP2_FBPfcc      0x5
+#define        OP2_FBfcc       0x6
+
+/*ARGSUSED*/
+int
+dt_pid_create_entry_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp,
+    fasttrap_probe_spec_t *ftp, const GElf_Sym *symp)
+{
+       ftp->ftps_type = DTFTP_ENTRY;
+       ftp->ftps_pc = (uintptr_t)symp->st_value;
+       ftp->ftps_size = (size_t)symp->st_size;
+       ftp->ftps_noffs = 1;
+       ftp->ftps_offs[0] = 0;
+
+       if (ioctl(dtp->dt_ftfd, FASTTRAPIOC_MAKEPROBE, ftp) != 0) {
+               dt_dprintf("fasttrap probe creation ioctl failed: %s\n",
+                   strerror(errno));
+               return (dt_set_errno(dtp, errno));
+       }
+
+       return (1);
+}
+
+int
+dt_pid_create_return_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp,
+    fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, uint64_t *stret)
+{
+
+       uint32_t *text;
+       int i;
+       int srdepth = 0;
+
+       dt_dprintf("%s: unimplemented\n", __func__);
+       return (DT_PROC_ERR);
+
+       if ((text = malloc(symp->st_size + 4)) == NULL) {
+               dt_dprintf("mr sparkle: malloc() failed\n");
+               return (DT_PROC_ERR);
+       }
+
+       if (Pread(P, text, symp->st_size, symp->st_value) != symp->st_size) {
+               dt_dprintf("mr sparkle: Pread() failed\n");
+               free(text);
+               return (DT_PROC_ERR);
+       }
+
+       /*
+        * Leave a dummy instruction in the last slot to simplify edge
+        * conditions.
+        */
+       text[symp->st_size / 4] = 0;
+
+       ftp->ftps_type = DTFTP_RETURN;
+       ftp->ftps_pc = symp->st_value;
+       ftp->ftps_size = symp->st_size;
+       ftp->ftps_noffs = 0;
+
+
+       free(text);
+       if (ftp->ftps_noffs > 0) {
+               if (ioctl(dtp->dt_ftfd, FASTTRAPIOC_MAKEPROBE, ftp) != 0) {
+                       dt_dprintf("fasttrap probe creation ioctl failed: %s\n",
+                           strerror(errno));
+                       return (dt_set_errno(dtp, errno));
+               }
+       }
+
+
+       return (ftp->ftps_noffs);
+}
+
+/*ARGSUSED*/
+int
+dt_pid_create_offset_probe(struct ps_prochandle *P, dtrace_hdl_t *dtp,
+    fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, ulong_t off)
+{
+       if (off & 0x3)
+               return (DT_PROC_ALIGN);
+
+       ftp->ftps_type = DTFTP_OFFSETS;
+       ftp->ftps_pc = (uintptr_t)symp->st_value;
+       ftp->ftps_size = (size_t)symp->st_size;
+       ftp->ftps_noffs = 1;
+       ftp->ftps_offs[0] = off;
+
+       if (ioctl(dtp->dt_ftfd, FASTTRAPIOC_MAKEPROBE, ftp) != 0) {
+               dt_dprintf("fasttrap probe creation ioctl failed: %s\n",
+                   strerror(errno));
+               return (dt_set_errno(dtp, errno));
+       }
+
+       return (1);
+}
+
+/*ARGSUSED*/
+int
+dt_pid_create_glob_offset_probes(struct ps_prochandle *P, dtrace_hdl_t *dtp,
+    fasttrap_probe_spec_t *ftp, const GElf_Sym *symp, const char *pattern)
+{
+       ulong_t i;
+
+       ftp->ftps_type = DTFTP_OFFSETS;
+       ftp->ftps_pc = (uintptr_t)symp->st_value;
+       ftp->ftps_size = (size_t)symp->st_size;
+       ftp->ftps_noffs = 0;
+
+       /*
+        * If we're matching against everything, just iterate through each
+        * instruction in the function, otherwise look for matching offset
+        * names by constructing the string and comparing it against the
+        * pattern.
+        */
+       if (strcmp("*", pattern) == 0) {
+               for (i = 0; i < symp->st_size; i += 4) {
+                       ftp->ftps_offs[ftp->ftps_noffs++] = i;
+               }
+       } else {
+               char name[sizeof (i) * 2 + 1];
+
+               for (i = 0; i < symp->st_size; i += 4) {
+                       (void) sprintf(name, "%lx", i);
+                       if (gmatch(name, pattern))
+                               ftp->ftps_offs[ftp->ftps_noffs++] = i;
+               }
+       }
+
+       if (ioctl(dtp->dt_ftfd, FASTTRAPIOC_MAKEPROBE, ftp) != 0) {
+               dt_dprintf("fasttrap probe creation ioctl failed: %s\n",
+                   strerror(errno));
+               return (dt_set_errno(dtp, errno));
+       }
+
+       return (ftp->ftps_noffs);
+}

Modified: head/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c
==============================================================================
--- head/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c   Tue Feb 10 19:04:58 
2015        (r278528)
+++ head/cddl/contrib/opensolaris/tools/ctf/cvt/ctf.c   Tue Feb 10 19:41:30 
2015        (r278529)
@@ -169,12 +169,12 @@ write_objects(iidesc_t *idp, ctf_buf_t *
 {
        ushort_t id = (idp ? idp->ii_dtype->t_id : 0);
 
-       ctf_buf_write(b, &id, sizeof (id));
-
        if (target_requires_swap) {
                SWAP_16(id);
        }
 
+       ctf_buf_write(b, &id, sizeof (id));
+
        debug(3, "Wrote object %s (%d)\n", (idp ? idp->ii_name : "(null)"), id);
 }
 

Modified: head/cddl/lib/Makefile
==============================================================================
--- head/cddl/lib/Makefile      Tue Feb 10 19:04:58 2015        (r278528)
+++ head/cddl/lib/Makefile      Tue Feb 10 19:41:30 2015        (r278529)
@@ -27,7 +27,8 @@ _libzpool=    libzpool
 .endif
 
 .if ${MACHINE_ARCH} == "amd64" || ${MACHINE_ARCH} == "i386" || \
-       ${MACHINE_CPUARCH} == "mips" || ${MACHINE_CPUARCH} == "powerpc"
+       ${MACHINE_CPUARCH} == "mips" || ${MACHINE_CPUARCH} == "powerpc" || \
+       ${MACHINE_CPUARCH} == "arm"
 _drti=         drti
 _libdtrace=    libdtrace
 .endif

Modified: head/cddl/lib/libdtrace/Makefile
==============================================================================
--- head/cddl/lib/libdtrace/Makefile    Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/cddl/lib/libdtrace/Makefile    Tue Feb 10 19:41:30 2015        
(r278529)
@@ -81,6 +81,10 @@ CFLAGS+=     -I${OPENSOLARIS_SYS_DISTDIR}/ut
 CFLAGS+=       -I${OPENSOLARIS_SYS_DISTDIR}/uts/mips
 .PATH:         ${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libdtrace/mips
 .PATH:         ${.CURDIR}/../../../sys/cddl/dev/dtrace/mips
+.elif ${MACHINE_CPUARCH} == "arm"
+CFLAGS+=       -I${OPENSOLARIS_SYS_DISTDIR}/uts/arm
+.PATH:         ${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libdtrace/arm
+.PATH:         ${.CURDIR}/../../../sys/cddl/dev/dtrace/arm
 .elif ${MACHINE_CPUARCH} == "powerpc"
 CFLAGS+=       -I${OPENSOLARIS_SYS_DISTDIR}/uts/powerpc
 .PATH:         
${.CURDIR}/../../../cddl/contrib/opensolaris/lib/libdtrace/powerpc

Modified: head/cddl/usr.sbin/Makefile
==============================================================================
--- head/cddl/usr.sbin/Makefile Tue Feb 10 19:04:58 2015        (r278528)
+++ head/cddl/usr.sbin/Makefile Tue Feb 10 19:41:30 2015        (r278529)
@@ -30,6 +30,12 @@ _plockstat=  plockstat
 .endif
 .endif
 
+.if ${MACHINE_CPUARCH} == "arm"
+_dtrace=       dtrace
+_dtruss=       dtruss
+_lockstat=     lockstat
+.endif
+
 .if ${MACHINE_CPUARCH} == "mips"
 _dtrace=       dtrace
 .endif

Modified: head/lib/Makefile
==============================================================================
--- head/lib/Makefile   Tue Feb 10 19:04:58 2015        (r278528)
+++ head/lib/Makefile   Tue Feb 10 19:41:30 2015        (r278529)
@@ -284,6 +284,12 @@ _libsmb=   libsmb
 _libsmb=       libsmb
 .endif
 
+.if ${MACHINE_CPUARCH} == "arm"
+_libsmb=       libsmb
+_libproc=      libproc
+_librtld_db=   librtld_db
+.endif
+
 .if ${MK_OPENSSL} != "no"
 _libmp=                libmp
 .endif

Modified: head/lib/libproc/proc_bkpt.c
==============================================================================
--- head/lib/libproc/proc_bkpt.c        Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/lib/libproc/proc_bkpt.c        Tue Feb 10 19:41:30 2015        
(r278529)
@@ -51,6 +51,9 @@ __FBSDID("$FreeBSD$");
 #elif defined(__powerpc__)
 #define BREAKPOINT_INSTR       0x7fe00008      /* trap */
 #define BREAKPOINT_INSTR_SZ 4
+#elif defined(__arm__)
+#define BREAKPOINT_INSTR       0xe7ffffff      /* bkpt */
+#define BREAKPOINT_INSTR_SZ    4
 #else
 #error "Add support for your architecture"
 #endif

Modified: head/lib/libproc/proc_regs.c
==============================================================================
--- head/lib/libproc/proc_regs.c        Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/lib/libproc/proc_regs.c        Tue Feb 10 19:41:30 2015        
(r278529)
@@ -56,6 +56,8 @@ proc_regget(struct proc_handle *phdl, pr
        case REG_PC:
 #if defined(__amd64__)
                *regvalue = regs.r_rip;
+#elif defined(__arm__)
+               *regvalue = regs.r_pc;
 #elif defined(__i386__)
                *regvalue = regs.r_eip;
 #elif defined(__mips__)
@@ -67,6 +69,8 @@ proc_regget(struct proc_handle *phdl, pr
        case REG_SP:
 #if defined(__amd64__)
                *regvalue = regs.r_rsp;
+#elif defined(__arm__)
+               *regvalue = regs.r_sp;
 #elif defined(__i386__)
                *regvalue = regs.r_esp;
 #elif defined(__mips__)
@@ -99,6 +103,8 @@ proc_regset(struct proc_handle *phdl, pr
        case REG_PC:
 #if defined(__amd64__)
                regs.r_rip = regvalue;
+#elif defined(__arm__)
+               regs.r_pc = regvalue;
 #elif defined(__i386__)
                regs.r_eip = regvalue;
 #elif defined(__mips__)
@@ -110,6 +116,8 @@ proc_regset(struct proc_handle *phdl, pr
        case REG_SP:
 #if defined(__amd64__)
                regs.r_rsp = regvalue;
+#elif defined(__arm__)
+               regs.r_sp = regvalue;
 #elif defined(__i386__)
                regs.r_esp = regvalue;
 #elif defined(__mips__)

Modified: head/sys/arm/arm/exception.S
==============================================================================
--- head/sys/arm/arm/exception.S        Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/sys/arm/arm/exception.S        Tue Feb 10 19:41:30 2015        
(r278529)
@@ -48,11 +48,26 @@
 
 #include "assym.s"
 
+#include "opt_kdtrace.h"
 #include <machine/asm.h>
 #include <machine/armreg.h>
 #include <machine/asmacros.h>
 __FBSDID("$FreeBSD$");
 
+#ifdef KDTRACE_HOOKS
+       .bss
+       .align 4
+       .global _C_LABEL(dtrace_invop_jump_addr)
+_C_LABEL(dtrace_invop_jump_addr):
+       .word 0
+       .word 0
+
+       .global _C_LABEL(dtrace_invop_calltrap_addr)
+_C_LABEL(dtrace_invop_calltrap_addr):
+       .word 0
+       .word 0
+#endif
+
        .text   
        .align  2
 

Modified: head/sys/arm/arm/identcpu.c
==============================================================================
--- head/sys/arm/arm/identcpu.c Tue Feb 10 19:04:58 2015        (r278528)
+++ head/sys/arm/arm/identcpu.c Tue Feb 10 19:41:30 2015        (r278529)
@@ -387,7 +387,7 @@ identify_arm_cpu(void)
        u_int8_t type, linesize;
        int i;
 
-       cpuid = cpu_id();
+       cpuid = cpu_ident();
 
        if (cpuid == 0) {
                printf("Processor failed probe - no CPU ID\n");

Modified: head/sys/arm/arm/trap.c
==============================================================================
--- head/sys/arm/arm/trap.c     Tue Feb 10 19:04:58 2015        (r278528)
+++ head/sys/arm/arm/trap.c     Tue Feb 10 19:41:30 2015        (r278529)
@@ -78,6 +78,9 @@
  * Created      : 28/11/94
  */
 
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+#endif
 
 #include <sys/cdefs.h>
 __FBSDID("$FreeBSD$");
@@ -427,6 +430,13 @@ dab_fatal(struct trapframe *tf, u_int fs
 {
        const char *mode;
 
+#ifdef KDTRACE_HOOKS
+       if (!TRAP_USERMODE(tf)) {
+               if (dtrace_trap_func != NULL && (*dtrace_trap_func)(tf, far & 
FAULT_TYPE_MASK))
+                       return (0);
+       }
+#endif
+
        mode = TRAP_USERMODE(tf) ? "user" : "kernel";
 
        disable_interrupts(PSR_I|PSR_F);

Modified: head/sys/arm/conf/BEAGLEBONE
==============================================================================
--- head/sys/arm/conf/BEAGLEBONE        Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/sys/arm/conf/BEAGLEBONE        Tue Feb 10 19:41:30 2015        
(r278529)
@@ -27,6 +27,12 @@ include              "../ti/am335x/std.am335x"
 
 makeoptions    WITHOUT_MODULES="ahc"
 
+# DTrace support
+options         KDTRACE_HOOKS                # Kernel DTrace hooks
+options                DDB_CTF                      # all architectures - 
kernel ELF linker loads CTF data
+makeoptions         WITH_CTF=1
+makeoptions     MODULES_OVERRIDE="opensolaris dtrace dtrace/lockstat 
dtrace/profile dtrace/fbt"
+
 options        HZ=100
 options        SCHED_4BSD              # 4BSD scheduler
 options        PREEMPTION              # Enable kernel thread preemption

Modified: head/sys/arm/include/cpufunc.h
==============================================================================
--- head/sys/arm/include/cpufunc.h      Tue Feb 10 19:04:58 2015        
(r278528)
+++ head/sys/arm/include/cpufunc.h      Tue Feb 10 19:41:30 2015        
(r278529)
@@ -175,7 +175,7 @@ struct cpu_functions {
 extern struct cpu_functions cpufuncs;
 extern u_int cputype;
 
-#define cpu_id()               cpufuncs.cf_id()
+#define cpu_ident()            cpufuncs.cf_id()
 #define        cpu_cpwait()            cpufuncs.cf_cpwait()
 
 #define cpu_control(c, e)      cpufuncs.cf_control(c, e)

Added: head/sys/cddl/contrib/opensolaris/uts/arm/dtrace/fasttrap_isa.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/cddl/contrib/opensolaris/uts/arm/dtrace/fasttrap_isa.c     Tue Feb 
10 19:41:30 2015        (r278529)
@@ -0,0 +1,30 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+
+/*
+ *     XXX: Placeholder for ARM fasttrap code
+ */

Added: head/sys/cddl/contrib/opensolaris/uts/arm/sys/fasttrap_isa.h
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/cddl/contrib/opensolaris/uts/arm/sys/fasttrap_isa.h        Tue Feb 
10 19:41:30 2015        (r278529)
@@ -0,0 +1,94 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef        _FASTTRAP_ISA_H
+#define        _FASTTRAP_ISA_H
+
+#pragma ident  "%Z%%M% %I%     %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This is our reserved trap instruction: ta 0x38
+ */
+#define        FASTTRAP_INSTR                  0x91d02038
+
+#define        FASTTRAP_SUNWDTRACE_SIZE        128
+
+typedef uint32_t       fasttrap_instr_t;
+
+typedef struct fasttrap_machtp {
+       fasttrap_instr_t        ftmt_instr;     /* original instruction */
+       uintptr_t               ftmt_dest;      /* destination of DCTI */
+       uint8_t                 ftmt_type;      /* emulation type */
+       uint8_t                 ftmt_flags;     /* emulation flags */
+       uint8_t                 ftmt_cc;        /* which cc to look at */
+       uint8_t                 ftmt_code;      /* branch condition */
+} fasttrap_machtp_t;
+
+#define        ftt_instr       ftt_mtp.ftmt_instr
+#define        ftt_dest        ftt_mtp.ftmt_dest
+#define        ftt_type        ftt_mtp.ftmt_type
+#define        ftt_flags       ftt_mtp.ftmt_flags
+#define        ftt_cc          ftt_mtp.ftmt_cc
+#define        ftt_code        ftt_mtp.ftmt_code
+
+#define        FASTTRAP_T_COMMON       0x00    /* common case -- no emulation 
*/
+#define        FASTTRAP_T_CCR          0x01    /* integer condition code 
branch */
+#define        FASTTRAP_T_FCC          0x02    /* floating-point branch */
+#define        FASTTRAP_T_REG          0x03    /* register predicated branch */
+#define        FASTTRAP_T_ALWAYS       0x04    /* branch always */
+#define        FASTTRAP_T_CALL         0x05    /* call instruction */
+#define        FASTTRAP_T_JMPL         0x06    /* jmpl instruction */
+#define        FASTTRAP_T_RDPC         0x07    /* rdpc instruction */
+#define        FASTTRAP_T_RETURN       0x08    /* return instruction */
+
+/*
+ * For performance rather than correctness.
+ */
+#define        FASTTRAP_T_SAVE         0x10    /* save instruction (func entry 
only) */
+#define        FASTTRAP_T_RESTORE      0x11    /* restore instruction */
+#define        FASTTRAP_T_OR           0x12    /* mov instruction */
+#define        FASTTRAP_T_SETHI        0x13    /* sethi instruction (includes 
nop) */
+
+#define        FASTTRAP_F_ANNUL        0x01    /* branch is annulled */
+#define        FASTTRAP_F_RETMAYBE     0x02    /* not definitely a return site 
*/
+
+#define        FASTTRAP_AFRAMES                3
+#define        FASTTRAP_RETURN_AFRAMES         4
+#define        FASTTRAP_ENTRY_AFRAMES          3
+#define        FASTTRAP_OFFSET_AFRAMES         3
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _FASTTRAP_ISA_H */

Modified: head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c        Tue Feb 
10 19:04:58 2015        (r278528)
+++ head/sys/cddl/contrib/opensolaris/uts/common/dtrace/dtrace.c        Tue Feb 
10 19:41:30 2015        (r278529)
@@ -11880,7 +11880,7 @@ err:
        int i;
 
        *factor = 1;
-#if defined(__amd64__) || defined(__mips__) || defined(__powerpc__)
+#if defined(__amd64__) || defined(__arm__) || defined(__mips__) || 
defined(__powerpc__)
        /*
         * FreeBSD isn't good at limiting the amount of memory we
         * ask to malloc, so let's place a limit here before trying

Modified: head/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h
==============================================================================
--- head/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h   Tue Feb 10 
19:04:58 2015        (r278528)
+++ head/sys/cddl/contrib/opensolaris/uts/common/sys/dtrace.h   Tue Feb 10 
19:41:30 2015        (r278529)
@@ -2434,6 +2434,13 @@ extern void dtrace_helpers_destroy(proc_
 #define DTRACE_INVOP_MFLR_R0   5
 #define DTRACE_INVOP_NOP       6
 
+#elif defined(__arm__)
+
+#define DTRACE_INVOP_PUSHM     1
+#define DTRACE_INVOP_POPM      2
+#define DTRACE_INVOP_B         3
+
+
 #endif
 
 #ifdef __cplusplus

Added: head/sys/cddl/dev/dtrace/arm/dtrace_asm.S
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/cddl/dev/dtrace/arm/dtrace_asm.S   Tue Feb 10 19:41:30 2015        
(r278529)
@@ -0,0 +1,197 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ * $FreeBSD$
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#define _ASM
+#define _LOCORE
+#define LOCORE
+
+#include <sys/cpuvar_defs.h>
+#include <sys/dtrace.h>
+
+#include <machine/armreg.h>
+#include <machine/asm.h>
+
+#include "assym.s"
+
+/*
+void dtrace_membar_producer(void)
+*/
+ENTRY(dtrace_membar_producer)
+       RET
+END(dtrace_membar_producer)
+
+/*
+void dtrace_membar_consumer(void)
+*/
+ENTRY(dtrace_membar_consumer)
+       RET
+END(dtrace_membar_consumer)
+
+/*
+dtrace_icookie_t dtrace_interrupt_disable(void)
+*/
+ENTRY(dtrace_interrupt_disable)
+       mrs     r0, cpsr
+       mov     r1, r0
+       orr     r1, r1, #(PSR_I | PSR_F)
+       msr     cpsr_c, r1
+       RET
+END(dtrace_interrupt_disable)
+
+/*
+void dtrace_interrupt_enable(dtrace_icookie_t cookie)
+*/
+ENTRY(dtrace_interrupt_enable)
+       and     r0, r0, #(PSR_I | PSR_F) 
+       mrs     r1, cpsr
+       bic     r1, r1, #(PSR_I | PSR_F)
+       orr     r1, r1, r0
+       msr     cpsr_c, r1
+       RET
+END(dtrace_interrupt_enable)
+/*
+uint8_t
+dtrace_fuword8_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword8_nocheck)
+       ldrb    r3, [r0]
+       mov     r0, r3
+       RET
+END(dtrace_fuword8_nocheck)
+
+/*
+uint16_t
+dtrace_fuword16_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword16_nocheck)
+       ldrh    r3, [r0]
+       mov     r0, r3
+       RET
+END(dtrace_fuword16_nocheck)
+
+/*
+uint32_t
+dtrace_fuword32_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword32_nocheck)
+       ldr     r3, [r0]
+       mov     r0, r3
+       RET
+END(dtrace_fuword32_nocheck)
+
+/*
+uint64_t
+dtrace_fuword64_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword64_nocheck)
+       ldm     r0, {r2, r3}
+
+       mov     r0, r2
+       mov     r1, r3
+#if defined(__BIG_ENDIAN__)
+/* big endian */
+       mov     r0, r3
+       mov     r1, r2
+#else
+/* little endian */
+       mov     r0, r2
+       mov     r1, r3
+
+#endif
+       RET
+END(dtrace_fuword64_nocheck)
+
+/*
+void
+dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
+*/
+ENTRY(dtrace_copy)
+       stmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
+       teq     r2, #0x00000000
+       mov     r5, #0x00000000
+       beq     2f
+
+1:     ldrb    r4, [r0], #0x0001
+       add     r5, r5, #0x00000001
+       strb    r4, [r1], #0x0001
+       teqne   r5, r2
+       bne     1b
+
+2:     ldmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
+       RET
+END(dtrace_copy)
+
+/*
+void
+dtrace_copystr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
+    volatile uint16_t *flags)
+XXX: Check for flags?
+*/
+ENTRY(dtrace_copystr)
+       stmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
+       teq     r2, #0x00000000
+       mov     r5, #0x00000000
+       beq     2f
+
+1:     ldrb    r4, [r0], #0x0001
+       add     r5, r5, #0x00000001
+       teq     r4, #0x00000000
+       strb    r4, [r1], #0x0001
+       teqne   r5, r2
+       bne     1b
+
+2:     ldmfd   sp!, {r4-r5}                    /* stack is 8 byte aligned */
+       RET
+END(dtrace_copystr)
+
+/*
+void
+vpanic(const char *format, va_list alist)
+*/
+ENTRY(vpanic)                          /* Initial stack layout: */
+vpanic_common:
+       RET
+END(vpanic)
+       
+/*
+void
+dtrace_vpanic(const char *format, va_list alist)
+*/
+ENTRY(dtrace_vpanic)                   /* Initial stack layout: */
+       b       vpanic  
+       RET
+END(dtrace_vpanic)                     /* Initial stack layout: */
+
+/*
+uintptr_t
+dtrace_caller(int aframes)
+*/
+ENTRY(dtrace_caller)
+       mov     r0, #-1
+       RET
+END(dtrace_caller)

Added: head/sys/cddl/dev/dtrace/arm/dtrace_isa.c
==============================================================================
--- /dev/null   00:00:00 1970   (empty, because file is newly added)
+++ head/sys/cddl/dev/dtrace/arm/dtrace_isa.c   Tue Feb 10 19:41:30 2015        
(r278529)
@@ -0,0 +1,356 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License").  You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ * $FreeBSD$
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
+ * Use is subject to license terms.
+ */
+#include <sys/cdefs.h>
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/stack.h>
+#include <sys/pcpu.h>
+
+#include <machine/frame.h>
+#include <machine/md_var.h>
+#include <machine/reg.h>
+
+#include <vm/vm.h>
+#include <vm/vm_param.h>
+#include <vm/pmap.h>
+
+#include <machine/atomic.h>
+#include <machine/db_machdep.h>
+#include <machine/md_var.h>
+#include <machine/vmparam.h>
+#include <machine/stack.h>
+#include <ddb/db_sym.h>
+#include <ddb/ddb.h>
+#include <sys/kdb.h>
+
+#include "regset.h"
+
+/*
+ * Wee need some reasonable default to prevent backtrace code
+ * from wandering too far
+ */
+#define        MAX_FUNCTION_SIZE 0x10000
+#define        MAX_PROLOGUE_SIZE 0x100
+
+
+uint8_t dtrace_fuword8_nocheck(void *);
+uint16_t dtrace_fuword16_nocheck(void *);
+uint32_t dtrace_fuword32_nocheck(void *);
+uint64_t dtrace_fuword64_nocheck(void *);
+
+void
+dtrace_getpcstack(pc_t *pcstack, int pcstack_limit, int aframes,
+    uint32_t *intrpc)
+{
+       u_int32_t       *frame, *lastframe;
+       int     scp_offset;
+       int     depth = 0;
+       pc_t caller = (pc_t) solaris_cpu[curcpu].cpu_dtrace_caller;
+
+       if (intrpc != 0)
+               pcstack[depth++] = (pc_t) intrpc;
+
+       aframes++;
+
+       frame = (u_int32_t *)__builtin_frame_address(0);;
+       lastframe = NULL;
+       scp_offset = -(get_pc_str_offset() >> 2);
+
+       while ((frame != NULL) && (depth < pcstack_limit)) {
+               db_addr_t       scp;
+#if 0 
+               u_int32_t       savecode;
+               int             r;
+               u_int32_t       *rp;
+#endif
+
+               /*
+                * In theory, the SCP isn't guaranteed to be in the function
+                * that generated the stack frame.  We hope for the best.
+                */
+               scp = frame[FR_SCP];
+
+               if (aframes > 0) {
+                       aframes--;
+                       if ((aframes == 0) && (caller != 0)) {
+                               pcstack[depth++] = caller;
+                       }
+               }
+               else {
+                       pcstack[depth++] = scp;
+               }
+
+#if 0
+               savecode = ((u_int32_t *)scp)[scp_offset];
+               if ((savecode & 0x0e100000) == 0x08000000) {
+                       /* Looks like an STM */
+                       rp = frame - 4;
+                       for (r = 10; r >= 0; r--) {
+                               if (savecode & (1 << r)) {
+                                       /* register r == *rp-- */
+                               }
+                       }
+               }
+#endif
+
+               /*
+                * Switch to next frame up
+                */
+               if (frame[FR_RFP] == 0)
+                       break; /* Top of stack */
+
+               lastframe = frame;
+               frame = (u_int32_t *)(frame[FR_RFP]);
+
+               if (INKERNEL((int)frame)) {
+                       /* staying in kernel */
+                       if (frame <= lastframe) {
+                               /* bad frame pointer */
+                               break;
+                       }
+               }
+               else
+                       break;
+       }
+
+       for (; depth < pcstack_limit; depth++) {
+               pcstack[depth] = 0;
+       }
+}
+
+void
+dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit)
+{
+       printf("IMPLEMENT ME: %s\n", __func__);
+}
+
+int
+dtrace_getustackdepth(void)
+{
+       printf("IMPLEMENT ME: %s\n", __func__);
+       return (0);
+}
+
+void
+dtrace_getufpstack(uint64_t *pcstack, uint64_t *fpstack, int pcstack_limit)
+{
+       printf("IMPLEMENT ME: %s\n", __func__);
+}
+
+/*ARGSUSED*/
+uint64_t
+dtrace_getarg(int arg, int aframes)
+{
+/*     struct arm_frame *fp = (struct arm_frame *)dtrace_getfp();*/
+
+       return (0);
+}
+
+int
+dtrace_getstackdepth(int aframes)
+{
+       u_int32_t       *frame, *lastframe;
+       int     scp_offset;
+       int     depth = 1;
+
+       frame = (u_int32_t *)__builtin_frame_address(0);;
+       lastframe = NULL;
+       scp_offset = -(get_pc_str_offset() >> 2);
+
+       while (frame != NULL) {
+               db_addr_t       scp;
+#if 0 
+               u_int32_t       savecode;
+               int             r;
+               u_int32_t       *rp;
+#endif
+
+               /*
+                * In theory, the SCP isn't guaranteed to be in the function
+                * that generated the stack frame.  We hope for the best.
+                */
+               scp = frame[FR_SCP];
+
+               depth++;
+
+               /*
+                * Switch to next frame up
+                */
+               if (frame[FR_RFP] == 0)
+                       break; /* Top of stack */
+
+               lastframe = frame;
+               frame = (u_int32_t *)(frame[FR_RFP]);
+
+               if (INKERNEL((int)frame)) {
+                       /* staying in kernel */
+                       if (frame <= lastframe) {
+                               /* bad frame pointer */
+                               break;
+                       }
+               }
+               else
+                       break;
+       }
+
+       if (depth < aframes)
+               return 0;
+       else
+               return depth - aframes;
+
+}
+
+ulong_t
+dtrace_getreg(struct trapframe *rp, uint_t reg)
+{
+       printf("IMPLEMENT ME: %s\n", __func__);

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
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