summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormartin <martin@NetBSD.org>2019-12-09 15:19:30 +0000
committermartin <martin@NetBSD.org>2019-12-09 15:19:30 +0000
commit2adeb2bcb85b6ee2c548cc786e2abefab103a39a (patch)
tree7ff04288f926e336241a69d81c91ca36c5ed88b5
parent66608338e5eb086db0e94194a627a4e1e40db294 (diff)
Pull up following revision(s) (requested by jmcneill in ticket #525):
external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c: revision 1.1 distrib/sets/lists/modules/md.i386: revision 1.83 share/mk/bsd.own.mk: revision 1.1168 usr.bin/mkubootimage/mkubootimage.c: revision 1.25 sys/modules/dtrace/Makefile: revision 1.7 usr.bin/mkubootimage/mkubootimage.c: revision 1.26 sys/modules/dtrace/Makefile: revision 1.8 external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c: revision 1.2 distrib/sets/lists/modules/mi: revision 1.128 sys/arch/aarch64/include/frame.h: revision 1.3 sys/arch/evbarm/conf/mk.generic64: revision 1.4 external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c: revision 1.12 sys/modules/cyclic/Makefile: revision 1.4 sys/arch/aarch64/conf/Makefile.aarch64: revision 1.16 external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c: revision 1.1 sys/arch/aarch64/aarch64/start.S: revision 1.3 sys/arch/aarch64/aarch64/trap.c: revision 1.22 external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c: revision 1.1 external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S: revision 1.1 external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h: revision 1.1 external/cddl/osnet/dev/dtrace/aarch64/regset.h: revision 1.1 external/cddl/osnet/lib/libdtrace/Makefile: revision 1.26 distrib/sets/lists/modules/md.amd64: revision 1.82 usr.bin/mkubootimage/mkubootimage.1: revision 1.13 distrib/sets/lists/modules/ad.arm: revision 1.14 Add KDTRACE_HOOKS support. Define lwp_trapframe() macro dtrace: add support for aarch64 Add syscall_linux back for other arm architectures (accidently removed in previous) Add -u flag for updating headers in place. Fix alignment of .text section by changing load address to 0xffffffc000000000 and adding 64 bytes of padding before the entry point. Update arm64 image header in place Move dtrace_syscall_linux out of mi set list Enable DTrace on aarch64 Fix signed/unsigned comparison
-rw-r--r--distrib/sets/lists/modules/ad.arm4
-rw-r--r--distrib/sets/lists/modules/md.amd644
-rw-r--r--distrib/sets/lists/modules/md.i3864
-rw-r--r--distrib/sets/lists/modules/mi4
-rw-r--r--external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S171
-rw-r--r--external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c430
-rw-r--r--external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c332
-rw-r--r--external/cddl/osnet/dev/dtrace/aarch64/regset.h51
-rw-r--r--external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c234
-rw-r--r--external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h30
-rw-r--r--external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c2
-rw-r--r--external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c10
-rw-r--r--external/cddl/osnet/lib/libdtrace/Makefile5
-rw-r--r--share/mk/bsd.own.mk3
-rw-r--r--sys/arch/aarch64/aarch64/start.S9
-rw-r--r--sys/arch/aarch64/aarch64/trap.c29
-rw-r--r--sys/arch/aarch64/conf/Makefile.aarch644
-rw-r--r--sys/arch/aarch64/include/frame.h4
-rw-r--r--sys/arch/evbarm/conf/mk.generic6418
-rw-r--r--sys/modules/cyclic/Makefile2
-rw-r--r--sys/modules/dtrace/Makefile5
-rw-r--r--usr.bin/mkubootimage/mkubootimage.17
-rw-r--r--usr.bin/mkubootimage/mkubootimage.c19
23 files changed, 1346 insertions, 35 deletions
diff --git a/distrib/sets/lists/modules/ad.arm b/distrib/sets/lists/modules/ad.arm
index c7b9ed65a47..390cc52828b 100644
--- a/distrib/sets/lists/modules/ad.arm
+++ b/distrib/sets/lists/modules/ad.arm
@@ -1,4 +1,4 @@
-# $NetBSD: ad.arm,v 1.12 2019/02/03 08:02:58 pgoyette Exp $
+# $NetBSD: ad.arm,v 1.12.2.1 2019/12/09 15:19:30 martin Exp $
./@MODULEDIR@/compat_netbsd32 base-kernel-modules kmod
./@MODULEDIR@/compat_netbsd32/compat_netbsd32.kmod base-kernel-modules kmod
@@ -44,5 +44,7 @@
./@MODULEDIR@/compat_netbsd32_sysvipc_14/compat_netbsd32_sysvipc_14.kmod base-kernel-modules kmod
./@MODULEDIR@/compat_netbsd32_sysvipc_50 base-kernel-modules kmod
./@MODULEDIR@/compat_netbsd32_sysvipc_50/compat_netbsd32_sysvipc_50.kmod base-kernel-modules kmod
+./@MODULEDIR@/dtrace_syscall_linux base-kernel-modules kmod,dtrace
+./@MODULEDIR@/dtrace_syscall_linux/dtrace_syscall_linux.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/exec_elf32 base-kernel-modules kmod
./@MODULEDIR@/exec_elf32/exec_elf32.kmod base-kernel-modules kmod
diff --git a/distrib/sets/lists/modules/md.amd64 b/distrib/sets/lists/modules/md.amd64
index c61a11d3104..e72dde51d86 100644
--- a/distrib/sets/lists/modules/md.amd64
+++ b/distrib/sets/lists/modules/md.amd64
@@ -1,4 +1,4 @@
-# $NetBSD: md.amd64,v 1.80 2019/02/03 08:02:58 pgoyette Exp $
+# $NetBSD: md.amd64,v 1.80.2.1 2019/12/09 15:19:30 martin Exp $
#
# NOTE that there are two sets of files here:
# @MODULEDIR@ and amd64-xen
@@ -115,6 +115,8 @@
./@MODULEDIR@/drmkms_agp/drmkms_agp.kmod base-kernel-modules kmod
./@MODULEDIR@/drmkms_pci base-kernel-modules kmod
./@MODULEDIR@/drmkms_pci/drmkms_pci.kmod base-kernel-modules kmod
+./@MODULEDIR@/dtrace_syscall_linux base-kernel-modules kmod,dtrace
+./@MODULEDIR@/dtrace_syscall_linux/dtrace_syscall_linux.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtrace_syscall_linux32 base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtrace_syscall_linux32/dtrace_syscall_linux32.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtrace_syscall_netbsd32 base-kernel-modules kmod,dtrace
diff --git a/distrib/sets/lists/modules/md.i386 b/distrib/sets/lists/modules/md.i386
index b1269451d5b..3f0fa9bbae6 100644
--- a/distrib/sets/lists/modules/md.i386
+++ b/distrib/sets/lists/modules/md.i386
@@ -1,4 +1,4 @@
-# $NetBSD: md.i386,v 1.82 2018/09/19 16:11:53 maxv Exp $
+# $NetBSD: md.i386,v 1.82.2.1 2019/12/09 15:19:30 martin Exp $
#
# NOTE that there are two sets of files here: @MODULEDIR@ and i386pae-xen
#
@@ -79,6 +79,8 @@
./@MODULEDIR@/drmkms_agp/drmkms_agp.kmod base-kernel-modules kmod
./@MODULEDIR@/drmkms_pci base-kernel-modules kmod
./@MODULEDIR@/drmkms_pci/drmkms_pci.kmod base-kernel-modules kmod
+./@MODULEDIR@/dtrace_syscall_linux base-kernel-modules kmod,dtrace
+./@MODULEDIR@/dtrace_syscall_linux/dtrace_syscall_linux.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/emdtv base-kernel-modules kmod
./@MODULEDIR@/emdtv/emdtv.kmod base-kernel-modules kmod
./@MODULEDIR@/est base-kernel-modules kmod
diff --git a/distrib/sets/lists/modules/mi b/distrib/sets/lists/modules/mi
index 43ad3e6471f..c915fa3c487 100644
--- a/distrib/sets/lists/modules/mi
+++ b/distrib/sets/lists/modules/mi
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.122.2.2 2019/10/28 16:37:55 martin Exp $
+# $NetBSD: mi,v 1.122.2.3 2019/12/09 15:19:30 martin Exp $
#
# Note: don't delete entries from here - mark them as "obsolete" instead.
#
@@ -146,8 +146,6 @@
./@MODULEDIR@/dtrace_sdt/dtrace_sdt.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtrace_syscall base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtrace_syscall/dtrace_syscall.kmod base-kernel-modules kmod,dtrace
-./@MODULEDIR@/dtrace_syscall_linux base-kernel-modules kmod,dtrace
-./@MODULEDIR@/dtrace_syscall_linux/dtrace_syscall_linux.kmod base-kernel-modules kmod,dtrace
./@MODULEDIR@/dtv base-kernel-modules kmod
./@MODULEDIR@/dtv/dtv.kmod base-kernel-modules kmod
./@MODULEDIR@/dtv_math base-kernel-modules kmod
diff --git a/external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S
new file mode 100644
index 00000000000..a706576ad08
--- /dev/null
+++ b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_asm.S
@@ -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 --git a/external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c
new file mode 100644
index 00000000000..b237c4f1a8a
--- /dev/null
+++ b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_isa.c
@@ -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;
+
+ /*
+ * NB: Unlike some other architectures, we don't need to
+ * explicitly insert cpu_dtrace_caller as it appears in the
+ * normal kernel stack trace rather than a special trap frame.
+ */
+ if (aframes > 0) {
+ aframes--;
+ } else {
+ pcstack[depth++] = state.pc;
+ }
+
+ }
+
+ for (; depth < pcstack_limit; depth++) {
+ pcstack[depth] = 0;
+ }
+}
+
+static int
+dtrace_getustack_common(uint64_t *pcstack, int pcstack_limit, uintptr_t pc,
+ uintptr_t fp)
+{
+ volatile uint16_t *flags =
+ (volatile uint16_t *)&cpu_core[CURRENT_CPU].cpuc_dtrace_flags;
+ int ret = 0;
+ uintptr_t oldfp = fp;
+
+ ASSERT(pcstack == NULL || pcstack_limit > 0);
+
+ while (pc != 0) {
+ /*
+ * We limit the number of times we can go around this
+ * loop to account for a circular stack.
+ */
+ if (ret++ >= MAX_USTACK_DEPTH) {
+ *flags |= CPU_DTRACE_BADSTACK;
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = fp;
+ break;
+ }
+
+ if (pcstack != NULL) {
+ *pcstack++ = (uint64_t)pc;
+ pcstack_limit--;
+ if (pcstack_limit <= 0)
+ break;
+ }
+
+ if (fp == 0)
+ break;
+
+ pc = dtrace_fuword64((void *)(fp +
+ offsetof(struct arm64_frame, f_retaddr)));
+ fp = dtrace_fuword64((void *)fp);
+
+ if (fp == oldfp) {
+ *flags |= CPU_DTRACE_BADSTACK;
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = fp;
+ break;
+ }
+
+ /*
+ * ARM64TODO:
+ * This workaround might not be necessary. It needs to be
+ * revised and removed from all architectures if found
+ * unwanted. Leaving the original x86 comment for reference.
+ *
+ * This is totally bogus: if we faulted, we're going to clear
+ * the fault and break. This is to deal with the apparently
+ * broken Java stacks on x86.
+ */
+ if (*flags & CPU_DTRACE_FAULT) {
+ *flags &= ~CPU_DTRACE_FAULT;
+ break;
+ }
+
+ oldfp = fp;
+ }
+
+ return (ret);
+}
+
+void
+dtrace_getupcstack(uint64_t *pcstack, int pcstack_limit)
+{
+ proc_t *p = curproc;
+ struct trapframe *tf;
+ uintptr_t pc, sp, fp;
+ volatile uint16_t *flags =
+ (volatile uint16_t *)&cpu_core[CURRENT_CPU].cpuc_dtrace_flags;
+ int n;
+
+ if (*flags & CPU_DTRACE_FAULT)
+ return;
+
+ if (pcstack_limit <= 0)
+ return;
+
+ /*
+ * If there's no user context we still need to zero the stack.
+ */
+ if (p == NULL || (tf = curlwp->l_md.md_utf) == NULL)
+ goto zero;
+
+ *pcstack++ = (uint64_t)p->p_pid;
+ pcstack_limit--;
+
+ if (pcstack_limit <= 0)
+ return;
+
+ pc = tf->tf_pc;
+ sp = tf->tf_sp;
+ fp = tf->tf_regs.r_reg[29];
+
+ if (DTRACE_CPUFLAG_ISSET(CPU_DTRACE_ENTRY)) {
+ /*
+ * In an entry probe. The frame pointer has not yet been
+ * pushed (that happens in the function prologue). The
+ * best approach is to add the current pc as a missing top
+ * of stack and back the pc up to the caller, which is stored
+ * at the current stack pointer address since the call
+ * instruction puts it there right before the branch.
+ */
+
+ *pcstack++ = (uint64_t)pc;
+ pcstack_limit--;
+ if (pcstack_limit <= 0)
+ return;
+
+ pc = tf->tf_lr;
+ }
+
+ n = dtrace_getustack_common(pcstack, pcstack_limit, pc, fp);
+ ASSERT(n >= 0);
+ ASSERT(n <= pcstack_limit);
+
+ pcstack += n;
+ pcstack_limit -= n;
+
+zero:
+ while (pcstack_limit-- > 0)
+ *pcstack++ = 0;
+}
+
+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)
+{
+
+ printf("IMPLEMENT ME: %s\n", __func__);
+
+ return (0);
+}
+
+int
+dtrace_getstackdepth(int aframes)
+{
+ struct unwind_state state;
+ int scp_offset;
+ register_t sp;
+ int depth;
+ int done;
+
+ depth = 1;
+ done = 0;
+
+ __asm __volatile("mov %0, sp" : "=&r" (sp));
+
+ state.fp = (uint64_t)__builtin_frame_address(0);
+ state.sp = sp;
+ state.pc = (uint64_t)dtrace_getstackdepth;
+
+ do {
+ done = unwind_frame(&state);
+ if (!INKERNEL(state.pc) || !INKERNEL(state.fp))
+ break;
+ depth++;
+ } while (!done);
+
+ 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__);
+
+ return (0);
+}
+
+static int
+dtrace_copycheck(uintptr_t uaddr, uintptr_t kaddr, size_t size)
+{
+
+ if (uaddr + size > VM_MAXUSER_ADDRESS || uaddr + size < uaddr) {
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = uaddr;
+ return (0);
+ }
+
+ return (1);
+}
+
+void
+dtrace_copyin(uintptr_t uaddr, uintptr_t kaddr, size_t size,
+ volatile uint16_t *flags)
+{
+
+ if (dtrace_copycheck(uaddr, kaddr, size))
+ dtrace_copy(uaddr, kaddr, size);
+}
+
+void
+dtrace_copyout(uintptr_t kaddr, uintptr_t uaddr, size_t size,
+ volatile uint16_t *flags)
+{
+
+ if (dtrace_copycheck(uaddr, kaddr, size))
+ dtrace_copy(kaddr, uaddr, size);
+}
+
+void
+dtrace_copyinstr(uintptr_t uaddr, uintptr_t kaddr, size_t size,
+ volatile uint16_t *flags)
+{
+
+ if (dtrace_copycheck(uaddr, kaddr, size))
+ dtrace_copystr(uaddr, kaddr, size, flags);
+}
+
+void
+dtrace_copyoutstr(uintptr_t kaddr, uintptr_t uaddr, size_t size,
+ volatile uint16_t *flags)
+{
+
+ if (dtrace_copycheck(uaddr, kaddr, size))
+ dtrace_copystr(kaddr, uaddr, size, flags);
+}
+
+uint8_t
+dtrace_fuword8(void *uaddr)
+{
+
+ if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = (uintptr_t)uaddr;
+ return (0);
+ }
+
+ return (dtrace_fuword8_nocheck(uaddr));
+}
+
+uint16_t
+dtrace_fuword16(void *uaddr)
+{
+
+ if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = (uintptr_t)uaddr;
+ return (0);
+ }
+
+ return (dtrace_fuword16_nocheck(uaddr));
+}
+
+uint32_t
+dtrace_fuword32(void *uaddr)
+{
+
+ if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = (uintptr_t)uaddr;
+ return (0);
+ }
+
+ return (dtrace_fuword32_nocheck(uaddr));
+}
+
+uint64_t
+dtrace_fuword64(void *uaddr)
+{
+
+ if ((uintptr_t)uaddr > VM_MAXUSER_ADDRESS) {
+ DTRACE_CPUFLAG_SET(CPU_DTRACE_BADADDR);
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = (uintptr_t)uaddr;
+ return (0);
+ }
+
+ return (dtrace_fuword64_nocheck(uaddr));
+}
diff --git a/external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c
new file mode 100644
index 00000000000..c588c404e21
--- /dev/null
+++ b/external/cddl/osnet/dev/dtrace/aarch64/dtrace_subr.c
@@ -0,0 +1,332 @@
+/*
+ * 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>
+__KERNEL_RCSID(0, "$NetBSD: dtrace_subr.c,v 1.1.2.2 2019/12/09 15:19:30 martin Exp $");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/kmem.h>
+#include <sys/xcall.h>
+#include <sys/cpu.h>
+#include <sys/cpuvar.h>
+#include <sys/dtrace_impl.h>
+#include <sys/dtrace_bsd.h>
+#include <machine/cpu.h>
+#include <machine/frame.h>
+#include <machine/vmparam.h>
+#include <uvm/uvm_pglist.h>
+#include <uvm/uvm_prot.h>
+#include <uvm/uvm_pmap.h>
+
+#define CURRENT_CPU cpu_index(curcpu())
+#define OFFSET_MASK ((1 << OFFSET_SIZE) - 1)
+
+extern dtrace_id_t dtrace_probeid_error;
+extern int (*dtrace_invop_jump_addr)(struct trapframe *);
+extern void dtrace_getnanotime(struct timespec *tsp);
+
+int dtrace_invop(uintptr_t, struct trapframe *, uintptr_t);
+void dtrace_invop_init(void);
+void dtrace_invop_uninit(void);
+
+void dtrace_gethrtime_init(void);
+
+typedef struct dtrace_invop_hdlr {
+ int (*dtih_func)(uintptr_t, struct trapframe *, uintptr_t);
+ struct dtrace_invop_hdlr *dtih_next;
+} dtrace_invop_hdlr_t;
+
+dtrace_invop_hdlr_t *dtrace_invop_hdlr;
+
+int
+dtrace_invop(uintptr_t addr, struct trapframe *frame, uintptr_t eax)
+{
+ dtrace_invop_hdlr_t *hdlr;
+ int rval;
+
+ for (hdlr = dtrace_invop_hdlr; hdlr != NULL; hdlr = hdlr->dtih_next)
+ if ((rval = hdlr->dtih_func(addr, frame, eax)) != 0)
+ return (rval);
+
+ return (0);
+}
+
+
+void
+dtrace_invop_add(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
+{
+ dtrace_invop_hdlr_t *hdlr;
+
+ hdlr = kmem_alloc(sizeof (dtrace_invop_hdlr_t), KM_SLEEP);
+ hdlr->dtih_func = func;
+ hdlr->dtih_next = dtrace_invop_hdlr;
+ dtrace_invop_hdlr = hdlr;
+}
+
+void
+dtrace_invop_remove(int (*func)(uintptr_t, struct trapframe *, uintptr_t))
+{
+ dtrace_invop_hdlr_t *hdlr, *prev;
+
+ hdlr = dtrace_invop_hdlr;
+ prev = NULL;
+
+ for (;;) {
+ if (hdlr == NULL)
+ panic("attempt to remove non-existent invop handler");
+
+ if (hdlr->dtih_func == func)
+ break;
+
+ prev = hdlr;
+ hdlr = hdlr->dtih_next;
+ }
+
+ if (prev == NULL) {
+ ASSERT(dtrace_invop_hdlr == hdlr);
+ dtrace_invop_hdlr = hdlr->dtih_next;
+ } else {
+ ASSERT(dtrace_invop_hdlr != hdlr);
+ prev->dtih_next = hdlr->dtih_next;
+ }
+
+ kmem_free(hdlr, 0);
+}
+
+/*ARGSUSED*/
+void
+dtrace_toxic_ranges(void (*func)(uintptr_t base, uintptr_t limit))
+{
+
+ (*func)(0, (uintptr_t)VM_MIN_KERNEL_ADDRESS);
+}
+
+static void
+xcall_func(void *arg0, void *arg1)
+{
+ dtrace_xcall_t func = arg0;
+
+ (*func)(arg1);
+}
+
+void
+dtrace_xcall(processorid_t cpu, dtrace_xcall_t func, void *arg)
+{
+ uint64_t where;
+
+ if (cpu == DTRACE_CPUALL) {
+ where = xc_broadcast(0, xcall_func, func, arg);
+ } else {
+ struct cpu_info *ci = cpu_lookup(cpu);
+
+ KASSERT(ci != NULL);
+ where = xc_unicast(0, xcall_func, func, arg, ci);
+ }
+ xc_wait(where);
+}
+
+static void
+dtrace_sync_func(void)
+{
+
+}
+
+void
+dtrace_sync(void)
+{
+
+ dtrace_xcall(DTRACE_CPUALL, (dtrace_xcall_t)dtrace_sync_func, NULL);
+}
+
+/*
+ * DTrace needs a high resolution time function which can
+ * be called from a probe context and guaranteed not to have
+ * instrumented with probes itself.
+ *
+ * Returns nanoseconds since boot.
+ */
+uint64_t
+dtrace_gethrtime()
+{
+ struct timespec curtime;
+
+ nanouptime(&curtime);
+
+ return (curtime.tv_sec * 1000000000UL + curtime.tv_nsec);
+
+}
+
+void
+dtrace_gethrtime_init(void)
+{
+}
+
+uint64_t
+dtrace_gethrestime(void)
+{
+ struct timespec current_time;
+
+ dtrace_getnanotime(&current_time);
+
+ return (current_time.tv_sec * 1000000000UL + current_time.tv_nsec);
+}
+
+/* Function to handle DTrace traps during probes. See arm64/arm64/trap.c */
+int
+dtrace_trap(struct trapframe *frame, u_int type)
+{
+ /*
+ * A trap can occur while DTrace executes a probe. Before
+ * executing the probe, DTrace blocks re-scheduling and sets
+ * a flag in its per-cpu flags to indicate that it doesn't
+ * want to fault. On returning from the probe, the no-fault
+ * flag is cleared and finally re-scheduling is enabled.
+ *
+ * Check if DTrace has enabled 'no-fault' mode:
+ *
+ */
+
+ if ((cpu_core[CURRENT_CPU].cpuc_dtrace_flags & CPU_DTRACE_NOFAULT) != 0) {
+ /*
+ * There are only a couple of trap types that are expected.
+ * All the rest will be handled in the usual way.
+ */
+ switch (type) {
+ case ESR_EC_DATA_ABT_EL1:
+ /* Flag a bad address. */
+ cpu_core[CURRENT_CPU].cpuc_dtrace_flags |= CPU_DTRACE_BADADDR;
+ cpu_core[CURRENT_CPU].cpuc_dtrace_illval = 0;
+
+ /*
+ * Offset the instruction pointer to the instruction
+ * following the one causing the fault.
+ */
+ frame->tf_pc += 4;
+ return (1);
+ default:
+ /* Handle all other traps in the usual way. */
+ break;
+ }
+ }
+
+ /* Handle the trap in the usual way. */
+ return (0);
+}
+
+void
+dtrace_probe_error(dtrace_state_t *state, dtrace_epid_t epid, int which,
+ int fault, int fltoffs, uintptr_t illval)
+{
+
+ dtrace_probe(dtrace_probeid_error, (uint64_t)(uintptr_t)state,
+ (uintptr_t)epid,
+ (uintptr_t)which, (uintptr_t)fault, (uintptr_t)fltoffs);
+}
+
+static int
+dtrace_invop_start(struct trapframe *frame)
+{
+ int data, invop, reg, update_sp;
+ register_t arg1, arg2;
+ register_t *sp;
+ int offs;
+ int tmp;
+ int i;
+
+ invop = dtrace_invop(frame->tf_pc, frame, frame->tf_pc);
+
+ tmp = (invop & LDP_STP_MASK);
+ if (tmp == STP_64 || tmp == LDP_64) {
+ sp = (register_t *)frame->tf_sp;
+ data = invop;
+ arg1 = (data >> ARG1_SHIFT) & ARG1_MASK;
+ arg2 = (data >> ARG2_SHIFT) & ARG2_MASK;
+
+ offs = (data >> OFFSET_SHIFT) & OFFSET_MASK;
+
+ switch (tmp) {
+ case STP_64:
+ if (offs >> (OFFSET_SIZE - 1))
+ sp -= (~offs & OFFSET_MASK) + 1;
+ else
+ sp += (offs);
+ *(sp + 0) = frame->tf_regs.r_reg[arg1];
+ *(sp + 1) = frame->tf_regs.r_reg[arg2];
+ break;
+ case LDP_64:
+ frame->tf_regs.r_reg[arg1] = *(sp + 0);
+ frame->tf_regs.r_reg[arg2] = *(sp + 1);
+ if (offs >> (OFFSET_SIZE - 1))
+ sp -= (~offs & OFFSET_MASK) + 1;
+ else
+ sp += (offs);
+ break;
+ default:
+ break;
+ }
+
+ /* Update the stack pointer and program counter to continue */
+ frame->tf_sp = (register_t)sp;
+ frame->tf_pc += INSN_SIZE;
+ return (0);
+ }
+
+ if ((invop & B_MASK) == B_INSTR) {
+ data = (invop & B_DATA_MASK);
+ /* The data is the number of 4-byte words to change the pc */
+ data *= 4;
+ frame->tf_pc += data;
+ return (0);
+ }
+
+ if (invop == RET_INSTR) {
+ frame->tf_pc = frame->tf_lr;
+ return (0);
+ }
+
+ return (-1);
+}
+
+void
+dtrace_invop_init(void)
+{
+
+ dtrace_invop_jump_addr = dtrace_invop_start;
+}
+
+void
+dtrace_invop_uninit(void)
+{
+
+ dtrace_invop_jump_addr = 0;
+}
diff --git a/external/cddl/osnet/dev/dtrace/aarch64/regset.h b/external/cddl/osnet/dev/dtrace/aarch64/regset.h
new file mode 100644
index 00000000000..f99b48f8354
--- /dev/null
+++ b/external/cddl/osnet/dev/dtrace/aarch64/regset.h
@@ -0,0 +1,51 @@
+/*
+ * 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.
+ */
+
+/* Copyright (c) 1990, 1991 UNIX System Laboratories, Inc. */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+#ifndef _REGSET_H
+#define _REGSET_H
+
+/*
+ * #pragma ident "@(#)regset.h 1.11 05/06/08 SMI"
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* Place here */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _REGSET_H */
diff --git a/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c b/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c
new file mode 100644
index 00000000000..123290616ec
--- /dev/null
+++ b/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.c
@@ -0,0 +1,234 @@
+/*
+ * 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
+ *
+ * Portions Copyright 2006-2008 John Birrell jb@freebsd.org
+ * Portions Copyright 2013 Justin Hibbits jhibbits@freebsd.org
+ * Portions Copyright 2013 Howard Su howardsu@freebsd.org
+ * Portions Copyright 2015 Ruslan Bukin <br@bsdpad.com>
+ *
+ * $FreeBSD$
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#include <sys/cdefs.h>
+#include <sys/param.h>
+#include <sys/cpu.h>
+#include <sys/module.h>
+#include <sys/kmem.h>
+#include <machine/cpufunc.h>
+
+#include <sys/dtrace.h>
+
+#include "fbt.h"
+
+#define AARCH64_BRK 0xd4200000
+#define AARCH64_BRK_IMM16_SHIFT 5
+#define AARCH64_BRK_IMM16_VAL (0x40d << AARCH64_BRK_IMM16_SHIFT)
+#define FBT_PATCHVAL (AARCH64_BRK | AARCH64_BRK_IMM16_VAL)
+#define FBT_ENTRY "entry"
+#define FBT_RETURN "return"
+
+int
+fbt_invop(uintptr_t addr, struct trapframe *frame, uintptr_t rval)
+{
+ solaris_cpu_t *cpu;
+ fbt_probe_t *fbt;
+
+ cpu = &solaris_cpu[cpu_index(curcpu())];
+ fbt = fbt_probetab[FBT_ADDR2NDX(addr)];
+
+ for (; fbt != NULL; fbt = fbt->fbtp_hashnext) {
+ if ((uintptr_t)fbt->fbtp_patchpoint == addr) {
+ cpu->cpu_dtrace_caller = addr;
+
+ dtrace_probe(fbt->fbtp_id, frame->tf_regs.r_reg[0],
+ frame->tf_regs.r_reg[1], frame->tf_regs.r_reg[2],
+ frame->tf_regs.r_reg[3], frame->tf_regs.r_reg[4]);
+
+ cpu->cpu_dtrace_caller = 0;
+ return (fbt->fbtp_savedval);
+ }
+ }
+
+ return (0);
+}
+
+void
+fbt_patch_tracepoint(fbt_probe_t *fbt, fbt_patchval_t val)
+{
+
+ *fbt->fbtp_patchpoint = val;
+ cpu_icache_sync_range((vm_offset_t)fbt->fbtp_patchpoint, 4);
+}
+
+#if defined(__FreeBSD__)
+int
+fbt_provide_module_function(linker_file_t lf, int symindx,
+ linker_symval_t *symval, void *opaque)
+#elif defined(__NetBSD__)
+int
+fbt_provide_module_cb(const char *name, int symindx, void *value,
+ uint32_t symsize, int type, void *opaque)
+#else
+#error unsupported platform
+#endif
+{
+ fbt_probe_t *fbt, *retfbt;
+ uint32_t *target, *start;
+ uint32_t *instr, *limit;
+ int offs;
+
+#ifdef __FreeBSD__
+ char *modname = opaque;
+ const char *name = symval->name;
+
+ instr = (uint32_t *)(symval->value);
+ limit = (uint32_t *)(symval->value + symval->size);
+#endif
+#ifdef __NetBSD__
+ struct fbt_ksyms_arg *fka = opaque;
+ modctl_t *mod = fka->fka_mod;
+ const char *modname = module_name(mod);
+
+ /* got a function? */
+ if (ELF_ST_TYPE(type) != STT_FUNC)
+ return 0;
+
+ instr = (uint32_t *)(value);
+ limit = (uint32_t *)((uintptr_t)value + symsize);
+#endif
+
+ /* Check if function is excluded from instrumentation */
+ if (fbt_excluded(name))
+ return (0);
+
+ if (strncmp(name, "_spl", 4) == 0 ||
+ strcmp(name, "dosoftints") == 0 ||
+ strcmp(name, "nanouptime") == 0 ||
+ strncmp(name, "gtmr_", 5) == 0) {
+ return 0;
+ }
+
+ /* Look for stp (pre-indexed) operation */
+ for (; instr < limit; instr++) {
+ if ((*instr & LDP_STP_MASK) == STP_64)
+ break;
+ }
+
+ if (instr >= limit)
+ return (0);
+
+#ifdef __FreeBSD__
+ fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
+#else
+ fbt = kmem_zalloc(sizeof (fbt_probe_t), KM_SLEEP);
+#endif
+ fbt->fbtp_name = name;
+ fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
+ name, FBT_ENTRY, 3, fbt);
+ fbt->fbtp_patchpoint = instr;
+#ifdef __FreeBSD__
+ fbt->fbtp_ctl = lf;
+ fbt->fbtp_loadcnt = lf->loadcnt;
+#endif
+#ifdef __NetBSD__
+ fbt->fbtp_ctl = mod;
+#endif
+ fbt->fbtp_savedval = *instr;
+ fbt->fbtp_patchval = FBT_PATCHVAL;
+ fbt->fbtp_rval = DTRACE_INVOP_PUSHM;
+ fbt->fbtp_symindx = symindx;
+
+ fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
+ fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
+
+#ifdef __FreeBSD__
+ lf->fbt_nentries++;
+#endif
+
+ retfbt = NULL;
+again:
+ for (; instr < limit; instr++) {
+ if (*instr == RET_INSTR)
+ break;
+ else if ((*instr & B_MASK) == B_INSTR) {
+ offs = (*instr & B_DATA_MASK);
+ offs *= 4;
+ target = (instr + offs);
+#ifdef __FreeBSD__
+ start = (uint32_t *)symval->value;
+#else
+ start = (uint32_t *)value;
+#endif
+ if (target >= limit || target < start)
+ break;
+ }
+ }
+
+ if (instr >= limit)
+ return (0);
+
+ /*
+ * We have a winner!
+ */
+#ifdef __FreeBSD__
+ fbt = malloc(sizeof (fbt_probe_t), M_FBT, M_WAITOK | M_ZERO);
+#else
+ fbt = kmem_zalloc(sizeof (fbt_probe_t), KM_SLEEP);
+#endif
+ fbt->fbtp_name = name;
+ if (retfbt == NULL) {
+ fbt->fbtp_id = dtrace_probe_create(fbt_id, modname,
+ name, FBT_RETURN, 3, fbt);
+ } else {
+ retfbt->fbtp_next = fbt;
+ fbt->fbtp_id = retfbt->fbtp_id;
+ }
+ retfbt = fbt;
+
+ fbt->fbtp_patchpoint = instr;
+#ifdef __FreeBSD__
+ fbt->fbtp_ctl = lf;
+ fbt->fbtp_loadcnt = lf->loadcnt;
+#endif
+#ifdef __NetBSD__
+ fbt->fbtp_ctl = mod;
+#endif
+ fbt->fbtp_symindx = symindx;
+ if ((*instr & B_MASK) == B_INSTR)
+ fbt->fbtp_rval = DTRACE_INVOP_B;
+ else
+ fbt->fbtp_rval = DTRACE_INVOP_RET;
+ fbt->fbtp_savedval = *instr;
+ fbt->fbtp_patchval = FBT_PATCHVAL;
+ fbt->fbtp_hashnext = fbt_probetab[FBT_ADDR2NDX(instr)];
+ fbt_probetab[FBT_ADDR2NDX(instr)] = fbt;
+
+#ifdef __FreeBSD__
+ lf->fbt_nentries++;
+#endif
+
+ instr++;
+ goto again;
+}
diff --git a/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h b/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h
new file mode 100644
index 00000000000..5552f31a64a
--- /dev/null
+++ b/external/cddl/osnet/dev/fbt/aarch64/fbt_isa.h
@@ -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
+ *
+ * $FreeBSD$
+ *
+ */
+
+#ifndef _FBT_ISA_H_
+#define _FBT_ISA_H_
+
+typedef uint32_t fbt_patchval_t;
+
+#endif
diff --git a/external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c b/external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c
index 9f5af857049..3449e7b9426 100644
--- a/external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c
+++ b/external/cddl/osnet/dist/lib/libdtrace/aarch64/dt_isadep.c
@@ -29,6 +29,8 @@
#pragma ident "%Z%%M% %I% %E% SMI"
+#include <sys/ioctl.h>
+
#include <stdlib.h>
#include <assert.h>
#include <errno.h>
diff --git a/external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c b/external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c
index 9559caa0679..52e58bbad9a 100644
--- a/external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c
+++ b/external/cddl/osnet/dist/lib/libdtrace/common/dt_link.c
@@ -550,7 +550,9 @@ dump_elf32(dtrace_hdl_t *dtp, const dof_hdr_t *dof, int fd)
elf_file.ehdr.e_ident[EI_OSABI] = ELFOSABI_FREEBSD;
#endif
elf_file.ehdr.e_type = ET_REL;
-#if defined(__arm__)
+#if defined(__aarch64__)
+ elf_file.ehdr.e_machine = EM_AARCH64;
+#elif defined(__arm__)
elf_file.ehdr.e_machine = EM_ARM;
#elif defined(__mips__)
elf_file.ehdr.e_machine = EM_MIPS;
@@ -1262,7 +1264,9 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
if (dtp->dt_oflags & DTRACE_O_LP64) {
eclass = ELFCLASS64;
-#if defined(__mips__)
+#if defined(__aarch64__)
+ emachine1 = emachine2 = EM_AARCH64;
+#elif defined(__mips__)
emachine1 = emachine2 = EM_MIPS;
#elif defined(__powerpc__)
emachine1 = emachine2 = EM_PPC64;
@@ -1274,7 +1278,7 @@ process_obj(dtrace_hdl_t *dtp, const char *obj, int *eprobesp)
symsize = sizeof (Elf64_Sym);
} else {
eclass = ELFCLASS32;
-#if defined(__arm__)
+#if defined(__arm__) || defined(__aarch64__)
emachine1 = emachine2 = EM_ARM;
#elif defined(__mips__)
emachine1 = emachine2 = EM_MIPS;
diff --git a/external/cddl/osnet/lib/libdtrace/Makefile b/external/cddl/osnet/lib/libdtrace/Makefile
index 912b18ba371..c82a5df9c87 100644
--- a/external/cddl/osnet/lib/libdtrace/Makefile
+++ b/external/cddl/osnet/lib/libdtrace/Makefile
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.21 2019/02/11 17:49:37 tnn Exp $
+# $NetBSD: Makefile,v 1.21.2.1 2019/12/09 15:19:32 martin Exp $
# $FreeBSD: head/cddl/lib/libdtrace/Makefile 314654 2017-03-04 11:30:04Z ngie $
@@ -101,6 +101,9 @@ COPTS.dis_tables.c += -Wno-parentheses
COPTS.dis_tables.c += ${${ACTIVE_CC} == "gcc" :? -Wno-maybe-uninitialized :}
.elif ${MACHINE_ARCH} == "sparc64"
CPPFLAGS+= -I${OPENSOLARIS_SYS_DISTDIR}/uts/sparc
+.elif ${MACHINE_ARCH} == "aarch64"
+CPPFLAGS+= -I${OPENSOLARIS_SYS_DISTDIR}/uts/aarch64
+.PATH: ${.CURDIR}/../../dist/lib/libdtrace/aarch64
.elif ${MACHINE_CPU} == "arm"
CPPFLAGS+= -I${OPENSOLARIS_SYS_DISTDIR}/uts/arm
.PATH: ${.CURDIR}/../../dist/lib/libdtrace/arm
diff --git a/share/mk/bsd.own.mk b/share/mk/bsd.own.mk
index 94eae88196e..1cfa77c2469 100644
--- a/share/mk/bsd.own.mk
+++ b/share/mk/bsd.own.mk
@@ -1,4 +1,4 @@
-# $NetBSD: bsd.own.mk,v 1.1149.2.2 2019/12/08 15:54:34 martin Exp $
+# $NetBSD: bsd.own.mk,v 1.1149.2.3 2019/12/09 15:19:30 martin Exp $
# This needs to be before bsd.init.mk
.if defined(BSD_MK_COMPAT_FILE)
@@ -1009,6 +1009,7 @@ MKZFS?= yes
#
.if ${MACHINE_ARCH} == "i386" || \
${MACHINE_ARCH} == "x86_64" || \
+ ${MACHINE_ARCH} == "aarch64" || \
!empty(MACHINE_ARCH:Mearm*)
MKDTRACE?= yes
MKCTF?= yes
diff --git a/sys/arch/aarch64/aarch64/start.S b/sys/arch/aarch64/aarch64/start.S
index 1299bcf826d..fec275d9393 100644
--- a/sys/arch/aarch64/aarch64/start.S
+++ b/sys/arch/aarch64/aarch64/start.S
@@ -1,4 +1,4 @@
-/* $NetBSD: start.S,v 1.2 2018/10/18 09:01:51 skrll Exp $ */
+/* $NetBSD: start.S,v 1.2.6.1 2019/12/09 15:19:31 martin Exp $ */
/*
* Copyright (c) 2017 Ryo Shimizu <ryo@nerv.org>
@@ -32,7 +32,7 @@
#include <aarch64/asm.h>
-RCSID("$NetBSD: start.S,v 1.2 2018/10/18 09:01:51 skrll Exp $")
+RCSID("$NetBSD: start.S,v 1.2.6.1 2019/12/09 15:19:31 martin Exp $")
/* load far effective address (pc relative) */
.macro ADDR, reg, addr
@@ -41,6 +41,11 @@ RCSID("$NetBSD: start.S,v 1.2 2018/10/18 09:01:51 skrll Exp $")
.endm
/*
+ * Padding at start of kernel image to make room for 64-byte header (non-ELF booting)
+ */
+.space 64, 0x0
+
+/*
* Kernel start routine for aarch64 boards.
*/
.global start
diff --git a/sys/arch/aarch64/aarch64/trap.c b/sys/arch/aarch64/aarch64/trap.c
index 1bc0a13a700..cd49e5e4b07 100644
--- a/sys/arch/aarch64/aarch64/trap.c
+++ b/sys/arch/aarch64/aarch64/trap.c
@@ -1,4 +1,4 @@
-/* $NetBSD: trap.c,v 1.17.4.1 2019/08/07 10:19:54 martin Exp $ */
+/* $NetBSD: trap.c,v 1.17.4.2 2019/12/09 15:19:31 martin Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -31,10 +31,11 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.17.4.1 2019/08/07 10:19:54 martin Exp $");
+__KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.17.4.2 2019/12/09 15:19:31 martin Exp $");
#include "opt_arm_intr_impl.h"
#include "opt_compat_netbsd32.h"
+#include "opt_dtrace.h"
#include <sys/param.h>
#include <sys/kauth.h>
@@ -73,11 +74,20 @@ __KERNEL_RCSID(1, "$NetBSD: trap.c,v 1.17.4.1 2019/08/07 10:19:54 martin Exp $")
#include <ddb/db_output.h>
#include <machine/db_machdep.h>
#endif
+#ifdef KDTRACE_HOOKS
+#include <sys/dtrace_bsd.h>
+#endif
#ifdef DDB
int sigill_debug = 0;
#endif
+#ifdef KDTRACE_HOOKS
+dtrace_doubletrap_func_t dtrace_doubletrap_func = NULL;
+dtrace_trap_func_t dtrace_trap_func = NULL;
+int (*dtrace_invop_jump_addr)(struct trapframe *);
+#endif
+
const char * const trap_names[] = {
[ESR_EC_UNKNOWN] = "Unknown Reason (Illegal Instruction)",
[ESR_EC_SERROR] = "SError Interrupt",
@@ -186,16 +196,29 @@ trap_el1h_sync(struct trapframe *tf)
else
daif_enable(DAIF_D|DAIF_A);
+#ifdef KDTRACE_HOOKS
+ if (dtrace_trap_func != NULL && (*dtrace_trap_func)(tf, eclass))
+ return;
+#endif
+
switch (eclass) {
case ESR_EC_INSN_ABT_EL1:
case ESR_EC_DATA_ABT_EL1:
data_abort_handler(tf, eclass);
break;
+ case ESR_EC_BKPT_INSN_A64:
+#ifdef KDTRACE_HOOKS
+ if (__SHIFTOUT(esr, ESR_ISS) == 0x40d &&
+ dtrace_invop_jump_addr != 0) {
+ (*dtrace_invop_jump_addr)(tf);
+ break;
+ }
+ /* FALLTHROUGH */
+#endif
case ESR_EC_BRKPNT_EL1:
case ESR_EC_SW_STEP_EL1:
case ESR_EC_WTCHPNT_EL1:
- case ESR_EC_BKPT_INSN_A64:
#ifdef DDB
if (eclass == ESR_EC_BRKPNT_EL1)
kdb_trap(DB_TRAP_BREAKPOINT, tf);
diff --git a/sys/arch/aarch64/conf/Makefile.aarch64 b/sys/arch/aarch64/conf/Makefile.aarch64
index 282f863c7ba..d19aab72a05 100644
--- a/sys/arch/aarch64/conf/Makefile.aarch64
+++ b/sys/arch/aarch64/conf/Makefile.aarch64
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile.aarch64,v 1.15 2019/03/03 07:04:40 maxv Exp $
+# $NetBSD: Makefile.aarch64,v 1.15.4.1 2019/12/09 15:19:31 martin Exp $
# Makefile for NetBSD
#
@@ -74,7 +74,7 @@ locore.o: ${ARM}/aarch64/locore.S assym.h
## (5) link settings
##
KERNLDSCRIPT?= ${ARM}/conf/kern.ldscript
-LOADADDRESS?= 0xffffffc000000040
+LOADADDRESS?= 0xffffffc000000000
LINKFLAGS_NORMAL= -X
# Strip AArch64 mapping symbols from the kernel image, as they interfere
diff --git a/sys/arch/aarch64/include/frame.h b/sys/arch/aarch64/include/frame.h
index c01b82e148e..717479d36b1 100644
--- a/sys/arch/aarch64/include/frame.h
+++ b/sys/arch/aarch64/include/frame.h
@@ -1,4 +1,4 @@
-/* $NetBSD: frame.h,v 1.2 2018/04/01 04:35:03 ryo Exp $ */
+/* $NetBSD: frame.h,v 1.2.6.1 2019/12/09 15:19:31 martin Exp $ */
/*-
* Copyright (c) 2014 The NetBSD Foundation, Inc.
@@ -72,6 +72,8 @@ struct faultbuf {
register_t fb_reg[FB_MAX];
};
+#define lwp_trapframe(l) ((l)->l_md.md_utf)
+
#elif defined(__arm__)
#include <arm/frame.h>
diff --git a/sys/arch/evbarm/conf/mk.generic64 b/sys/arch/evbarm/conf/mk.generic64
index a6af068cc09..80fcfe16fc1 100644
--- a/sys/arch/evbarm/conf/mk.generic64
+++ b/sys/arch/evbarm/conf/mk.generic64
@@ -1,4 +1,4 @@
-# $NetBSD: mk.generic64,v 1.3 2018/09/29 17:05:55 jmcneill Exp $
+# $NetBSD: mk.generic64,v 1.3.4.1 2019/12/09 15:19:31 martin Exp $
SYSTEM_FIRST_OBJ= start.o
SYSTEM_FIRST_SFILE= ${ARM}/aarch64/start.S
@@ -7,15 +7,15 @@ _OSRELEASE!= ${HOST_SH} $S/conf/osrelease.sh
BOARDTYPE= evbarm64
-MKUBOOTIMAGEARGS= -f arm64 -a 0x200000
+MKUBOOTIMAGEARGS= -f arm64 -u -a 0x200000
MKKNLIMG= ${THISARM}/compile/rpi-mkknlimg.sh
-SYSTEM_LD_TAIL_EXTRA+=; \
- echo ${OBJCOPY} -S -O binary $@ $@.bin; \
- ${OBJCOPY} -S -O binary $@ $@.bin; \
- echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} $@.bin $@.ub; \
- ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} $@.bin $@.ub; \
- echo ${MKKNLIMG} $@.ub $@.img; \
- ${HOST_SH} ${MKKNLIMG} $@.ub $@.img;
+SYSTEM_LD_TAIL_EXTRA+= && \
+ echo ${OBJCOPY} -S -O binary $@ $@.bin && \
+ ${OBJCOPY} -S -O binary $@ $@.bin && \
+ echo ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} $@.bin $@.ub && \
+ ${TOOL_MKUBOOTIMAGE} ${MKUBOOTIMAGEARGS} $@.bin $@.ub && \
+ echo ${MKKNLIMG} $@.ub $@.img && \
+ ${HOST_SH} ${MKKNLIMG} $@.ub $@.img
EXTRA_KERNELS+= ${KERNELS:@.KERNEL.@${.KERNEL.}.img@}
diff --git a/sys/modules/cyclic/Makefile b/sys/modules/cyclic/Makefile
index cc1222c8add..58f8e0deead 100644
--- a/sys/modules/cyclic/Makefile
+++ b/sys/modules/cyclic/Makefile
@@ -8,6 +8,8 @@ OSNETDIR=${NETBSDSRCDIR}/external/cddl/osnet
.if exists(${OSNETDIR}/dev/cyclic/${MACHINE:S/amd64/i386/})
ARCH=${MACHINE:S/amd64/i386/}
+.elif exists(${OSNETDIR}/dev/cyclic/${MACHINE_CPU:S/aarch64/arm/})
+ARCH=${MACHINE_CPU:S/aarch64/arm/}
.elif exists(${OSNETDIR}/dev/cyclic/${MACHINE_CPU})
ARCH=${MACHINE_CPU}
.else
diff --git a/sys/modules/dtrace/Makefile b/sys/modules/dtrace/Makefile
index b26c6317937..a92117334cb 100644
--- a/sys/modules/dtrace/Makefile
+++ b/sys/modules/dtrace/Makefile
@@ -1,10 +1,13 @@
-# $NetBSD: Makefile,v 1.6 2015/03/08 17:11:57 christos Exp $
+# $NetBSD: Makefile,v 1.6.22.1 2019/12/09 15:19:31 martin Exp $
# $FreeBSD: src/sys/modules/dtrace/Makefile,v 1.6.2.1 2009/08/03 08:13:06 kensmith Exp $
.include <bsd.own.mk>
SUBDIR= dtrace sdt fbt lockstat profile syscall
+
+.if ${MACHINE_ARCH} != "aarch64"
SUBDIR+= linux_syscall
+.endif
.if ${MACHINE_ARCH} == "x86_64"
SUBDIR+= netbsd32_syscall
diff --git a/usr.bin/mkubootimage/mkubootimage.1 b/usr.bin/mkubootimage/mkubootimage.1
index 0329095c432..6771e734514 100644
--- a/usr.bin/mkubootimage/mkubootimage.1
+++ b/usr.bin/mkubootimage/mkubootimage.1
@@ -1,4 +1,4 @@
-.\" $NetBSD: mkubootimage.1,v 1.12 2018/02/04 15:44:51 jmcneill Exp $
+.\" $NetBSD: mkubootimage.1,v 1.12.6.1 2019/12/09 15:19:30 martin Exp $
.\"
.\" Copyright (c) 2012 The NetBSD Foundation, Inc.
.\" All rights reserved.
@@ -27,7 +27,7 @@
.\" ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
.\" POSSIBILITY OF SUCH DAMAGE.
.\"
-.Dd February 4, 2018
+.Dd December 4, 2019
.Dt MKUBOOTIMAGE 1
.Os
.Sh NAME
@@ -46,6 +46,7 @@
.Fl n Ar image
.Op Fl O Po freebsd Ns | Ns linux Ns | Ns netbsd Ns | Ns openbsd Pc
.Fl T No ( fs Ns | Ns kernel Ns | Ns kernel_noload Ns | Ns ramdisk Ns | Ns standalone )
+.Op Fl u
.Ar source destination
.\"
.Sh DESCRIPTION
@@ -124,6 +125,8 @@ Defines the image type.
This is required for
.Qq uimg
format images.
+.It Fl u
+Update the header in an existing file instead of creating a new one.
.El
.Pp
The required
diff --git a/usr.bin/mkubootimage/mkubootimage.c b/usr.bin/mkubootimage/mkubootimage.c
index 79a0dce79a2..f7419d2a6a3 100644
--- a/usr.bin/mkubootimage/mkubootimage.c
+++ b/usr.bin/mkubootimage/mkubootimage.c
@@ -1,4 +1,4 @@
-/* $NetBSD: mkubootimage.c,v 1.24 2018/02/04 17:33:34 jmcneill Exp $ */
+/* $NetBSD: mkubootimage.c,v 1.24.6.1 2019/12/09 15:19:30 martin Exp $ */
/*-
* Copyright (c) 2010 Jared D. McNeill <jmcneill@invisible.ca>
@@ -30,7 +30,7 @@
#endif
#include <sys/cdefs.h>
-__RCSID("$NetBSD: mkubootimage.c,v 1.24 2018/02/04 17:33:34 jmcneill Exp $");
+__RCSID("$NetBSD: mkubootimage.c,v 1.24.6.1 2019/12/09 15:19:30 martin Exp $");
#include <sys/mman.h>
#include <sys/stat.h>
@@ -74,6 +74,7 @@ static uint32_t image_entrypoint = 0;
static char *image_name;
static uint32_t image_magic = IH_MAGIC;
static enum image_format image_format = FMT_UIMG;
+static int update_image = 0;
static const struct uboot_image_format {
enum image_format format;
@@ -269,7 +270,7 @@ usage(void)
fprintf(stderr, " -O <openbsd|netbsd|freebsd|linux>");
fprintf(stderr, " -T <standalone|kernel|kernel_noload|ramdisk|fs|script>");
fprintf(stderr, " -a <addr> [-e <ep>] [-m <magic>] -n <name>");
- fprintf(stderr, " [-f <uimg|arm64>]");
+ fprintf(stderr, " [-f <uimg|arm64>] [-u]");
fprintf(stderr, " <srcfile> <dstfile>\n");
exit(EXIT_FAILURE);
@@ -431,6 +432,13 @@ write_image(void *hdr, size_t hdrlen, int kernel_fd, int image_fd)
}
}
+ if (update_image) {
+ if (lseek(kernel_fd, hdrlen, SEEK_SET) != (off_t)hdrlen) {
+ perror("seek failed");
+ return errno;
+ }
+ }
+
while ((rlen = read(kernel_fd, buf, sizeof(buf))) > 0) {
wlen = write(image_fd, buf, rlen);
if (wlen != rlen) {
@@ -453,7 +461,7 @@ main(int argc, char *argv[])
int ch;
unsigned long long num;
- while ((ch = getopt(argc, argv, "A:C:E:O:T:a:e:f:hm:n:")) != -1) {
+ while ((ch = getopt(argc, argv, "A:C:E:O:T:a:e:f:hm:n:u")) != -1) {
switch (ch) {
case 'A': /* arch */
image_arch = get_arch(optarg);
@@ -504,6 +512,9 @@ main(int argc, char *argv[])
case 'n': /* name */
image_name = strdup(optarg);
break;
+ case 'u': /* update image */
+ update_image = 1;
+ break;
case 'h':
default:
usage();