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