Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/modules/dtrace dtrace: add support for aarch64



details:   https://anonhg.NetBSD.org/src/rev/f4ff303468b1
branches:  trunk
changeset: 967268:f4ff303468b1
user:      jmcneill <jmcneill%NetBSD.org@localhost>
date:      Tue Dec 03 22:10:56 2019 +0000

description:
dtrace: add support for aarch64

diffstat:

 external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S        |  171 +++++
 external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c        |  430 +++++++++++++
 external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c       |  332 ++++++++++
 external/cddl/osnet/dev/dtrace/aarch64/regset.h            |   51 +
 external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c              |  234 +++++++
 external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h              |   30 +
 external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c |    2 +
 external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c    |   10 +-
 external/cddl/osnet/lib/libdtrace/Makefile                 |    5 +-
 sys/modules/cyclic/Makefile                                |    2 +
 sys/modules/dtrace/Makefile                                |    5 +-
 11 files changed, 1267 insertions(+), 5 deletions(-)

diffs (truncated from 1367 to 300 lines):

diff -r a0709d8c015b -r f4ff303468b1 external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S       Tue Dec 03 22:10:56 2019 +0000
@@ -0,0 +1,171 @@
+/*
+ * 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
+
+#include <sys/cpuvar_defs.h>
+#include <sys/dtrace.h>
+
+#include <machine/asm.h>
+
+/*
+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     x0, daif
+       msr     daifset, #2
+       RET
+END(dtrace_interrupt_disable)
+
+/*
+void dtrace_interrupt_enable(dtrace_icookie_t cookie)
+*/
+ENTRY(dtrace_interrupt_enable)
+       msr     daif, x0
+       RET
+END(dtrace_interrupt_enable)
+/*
+uint8_t
+dtrace_fuword8_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword8_nocheck)
+       ldrb    w0, [x0]
+       RET
+END(dtrace_fuword8_nocheck)
+
+/*
+uint16_t
+dtrace_fuword16_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword16_nocheck)
+       ldrh    w0, [x0]
+       RET
+END(dtrace_fuword16_nocheck)
+
+/*
+uint32_t
+dtrace_fuword32_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword32_nocheck)
+       ldr     w0, [x0]
+       RET
+END(dtrace_fuword32_nocheck)
+
+/*
+uint64_t
+dtrace_fuword64_nocheck(void *addr)
+*/
+ENTRY(dtrace_fuword64_nocheck)
+       ldr     x0, [x0]
+       RET
+END(dtrace_fuword64_nocheck)
+
+/*
+void
+dtrace_copy(uintptr_t uaddr, uintptr_t kaddr, size_t size)
+*/
+ENTRY(dtrace_copy)
+       cbz     x2, 2f          /* If len == 0 then skip loop */
+1:
+       ldrb    w4, [x0], #1    /* Load from uaddr */
+       strb    w4, [x1], #1    /* Store in kaddr */
+       sub     x2, x2, #1      /* len-- */
+       cbnz    x2, 1b
+2:
+       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)
+       cbz     x2, 2f          /* If len == 0 then skip loop */
+ 
+1:     ldrb    w4, [x0], #1    /* Load from uaddr */
+       strb    w4, [x1], #1    /* Store in kaddr */
+       cbz     w4, 2f          /* If == 0 then break */
+       sub     x2, x2, #1      /* len-- */
+       cbnz    x2, 1b
+2:
+       RET
+END(dtrace_copystr)
+
+/*
+uintptr_t
+dtrace_caller(int aframes)
+*/
+ENTRY(dtrace_caller)
+       mov     x0, #-1
+       RET
+END(dtrace_caller)
+
+/*
+uint32_t
+dtrace_cas32(uint32_t *target, uint32_t cmp, uint32_t new)
+*/
+ENTRY(dtrace_cas32)
+1:     ldxr    w3, [x0]        /* Load target */
+       cmp     w3, w1          /* Check if *target == cmp */
+       bne     2f              /* No, return */
+       stxr    w12, w2, [x0]   /* Store new to target */
+       cbnz    w12, 1b         /* Try again if store not succeed */
+2:     mov     w0, w3          /* Return the value loaded from target */
+       RET
+END(dtrace_cas32)
+
+/*
+void *
+dtrace_casptr(volatile void *target, volatile void *cmp, volatile void *new)
+*/
+ENTRY(dtrace_casptr)
+1:     ldxr    x3, [x0]        /* Load target */
+       cmp     x3, x1          /* Check if *target == cmp */
+       bne     2f              /* No, return */
+       stxr    w12, x2, [x0]   /* Store new to target */
+       cbnz    w12, 1b         /* Try again if store not succeed */
+2:     mov     x0, x3          /* Return the value loaded from target */
+       RET
+END(dtrace_casptr)
diff -r a0709d8c015b -r f4ff303468b1 external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c       Tue Dec 03 22:10:56 2019 +0000
@@ -0,0 +1,430 @@
+/*
+ * 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 <machine/frame.h>
+#include <machine/reg.h>
+
+#include <machine/db_machdep.h>
+#include <machine/vmparam.h>
+#include <ddb/db_sym.h>
+#include <ddb/ddb.h>
+
+#include "regset.h"
+
+#define        INKERNEL(va)    ((VM_MIN_KERNEL_ADDRESS <= (va)) && ((va) < VM_MAX_KERNEL_ADDRESS))
+#define        CURRENT_CPU     cpu_index(curcpu())
+
+struct unwind_state {
+       register_t fp;
+       register_t sp;
+       register_t pc;
+};
+
+struct arm64_frame {
+       struct arm64_frame      *f_frame;
+       uintptr_t               f_retaddr;
+};
+
+static int
+unwind_frame(struct unwind_state *frame)
+{
+       uint64_t fp = frame->fp;
+
+       if (!INKERNEL(fp))
+               return (-1);
+
+       frame->sp = fp + 0x10;
+       /* FP to previous frame (X29) */
+       frame->fp = *(uint64_t *)(fp);
+       /* LR (X30) */
+       frame->pc = *(uint64_t *)(fp + 8) - 4;
+
+       return (0);
+}
+
+/*
+ * Wee need some reasonable default to prevent backtrace code
+ * from wandering too far
+ */
+#define        MAX_FUNCTION_SIZE 0x10000
+#define        MAX_PROLOGUE_SIZE 0x100
+#define        MAX_USTACK_DEPTH  2048
+
+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)
+{
+       struct unwind_state state;
+       int scp_offset;
+       register_t sp, fp;
+       int depth;
+
+       depth = 0;
+
+       if (intrpc != 0) {
+               pcstack[depth++] = (pc_t) intrpc;
+       }
+
+       aframes++;
+
+       __asm __volatile("mov %0, sp" : "=&r" (sp));
+
+       state.fp = (uint64_t)__builtin_frame_address(0);
+       state.sp = sp;
+       state.pc = (uint64_t)dtrace_getpcstack;
+
+       while (depth < pcstack_limit) {
+               if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
+                       break;
+
+               fp = state.fp;
+               state.sp = fp + 0x10;
+               /* FP to previous frame (X29) */
+               state.fp = *(register_t *)(fp);
+               /* LR (X30) */
+               state.pc = *(register_t *)(fp + 8) - 4;
+



Home | Main Index | Thread Index | Old Index