git: 21a16d55cc15 - main - dtrace: add register bindings for arm64

From: Christos Margiolis <christos_at_FreeBSD.org>
Date: Tue, 23 May 2023 14:19:51 UTC
The branch main has been updated by christos:

URL: https://cgit.FreeBSD.org/src/commit/?id=21a16d55cc15b12809b982c2026a26bcf97fe79b

commit 21a16d55cc15b12809b982c2026a26bcf97fe79b
Author:     Christos Margiolis <christos@FreeBSD.org>
AuthorDate: 2023-05-23 14:19:25 +0000
Commit:     Christos Margiolis <christos@FreeBSD.org>
CommitDate: 2023-05-23 14:19:25 +0000

    dtrace: add register bindings for arm64
    
    Reviewed by:    mhorne, markj
    Approved by:    markj (mentor)
    Sponsored by:   The FreeBSD Foundation
    Differential Revision:  https://reviews.freebsd.org/D39956
---
 cddl/lib/libdtrace/Makefile              |  1 +
 cddl/lib/libdtrace/regs_aarch64.d        | 74 ++++++++++++++++++++++++++++++++
 sys/cddl/dev/dtrace/aarch64/dtrace_isa.c | 18 ++++++--
 sys/cddl/dev/dtrace/aarch64/regset.h     | 35 ++++++++++++++-
 4 files changed, 123 insertions(+), 5 deletions(-)

diff --git a/cddl/lib/libdtrace/Makefile b/cddl/lib/libdtrace/Makefile
index 5232293e0be5..23cc8d2db574 100644
--- a/cddl/lib/libdtrace/Makefile
+++ b/cddl/lib/libdtrace/Makefile
@@ -133,6 +133,7 @@ DSRCS+=		regs_riscv.d
 
 .if ${MACHINE_CPUARCH} == "aarch64"
 SRCS+=		instr_size.c
+DSRCS+=		regs_aarch64.d
 .endif
 
 YFLAGS+=-d
diff --git a/cddl/lib/libdtrace/regs_aarch64.d b/cddl/lib/libdtrace/regs_aarch64.d
new file mode 100644
index 000000000000..7d20b5c546c5
--- /dev/null
+++ b/cddl/lib/libdtrace/regs_aarch64.d
@@ -0,0 +1,74 @@
+/*
+ * SPDX-License-Identifier: CDDL 1.0
+ *
+ * Copyright 2023 Christos Margiolis <christos@FreeBSD.org>
+ */
+
+inline int R_X0 = 0;
+#pragma D binding "1.13" R_X0
+inline int R_X1 = 1;
+#pragma D binding "1.13" R_X1
+inline int R_X2 = 2;
+#pragma D binding "1.13" R_X2
+inline int R_X3 = 3;
+#pragma D binding "1.13" R_X3
+inline int R_X4 = 4;
+#pragma D binding "1.13" R_X4
+inline int R_X5 = 5;
+#pragma D binding "1.13" R_X5
+inline int R_X6 = 6;
+#pragma D binding "1.13" R_X6
+inline int R_X7 = 7;
+#pragma D binding "1.13" R_X7
+inline int R_X8 = 8;
+#pragma D binding "1.13" R_X8
+inline int R_X9 = 9;
+#pragma D binding "1.13" R_X9
+inline int R_X10 = 10;
+#pragma D binding "1.13" R_X10
+inline int R_X11 = 11;
+#pragma D binding "1.13" R_X11
+inline int R_X12 = 12;
+#pragma D binding "1.13" R_X12
+inline int R_X13 = 13;
+#pragma D binding "1.13" R_X13
+inline int R_X14 = 14;
+#pragma D binding "1.13" R_X14
+inline int R_X15 = 15;
+#pragma D binding "1.13" R_X15
+inline int R_X16 = 16;
+#pragma D binding "1.13" R_X16
+inline int R_X17 = 17;
+#pragma D binding "1.13" R_X17
+inline int R_X18 = 18;
+#pragma D binding "1.13" R_X18
+inline int R_X19 = 19;
+#pragma D binding "1.13" R_X19
+inline int R_X20 = 20;
+#pragma D binding "1.13" R_X20
+inline int R_X21 = 21;
+#pragma D binding "1.13" R_X21
+inline int R_X22 = 22;
+#pragma D binding "1.13" R_X22
+inline int R_X23 = 23;
+#pragma D binding "1.13" R_X23
+inline int R_X24 = 24;
+#pragma D binding "1.13" R_X24
+inline int R_X25 = 25;
+#pragma D binding "1.13" R_X25
+inline int R_X26 = 26;
+#pragma D binding "1.13" R_X26
+inline int R_X27 = 27;
+#pragma D binding "1.13" R_X27
+inline int R_X28 = 28;
+#pragma D binding "1.13" R_X28
+inline int R_X29 = 29;
+#pragma D binding "1.13" R_X29
+inline int R_FP= 29;
+#pragma D binding "1.13" R_FP
+inline int R_LR = 30;
+#pragma D binding "1.13" R_LR
+inline int R_SP	= 31;
+#pragma D binding "1.13" R_SP
+inline int R_PC	= 32;
+#pragma D binding "1.13" R_PC
diff --git a/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c b/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
index 98a0e6e498ed..09dc0b729928 100644
--- a/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
+++ b/sys/cddl/dev/dtrace/aarch64/dtrace_isa.c
@@ -280,10 +280,20 @@ dtrace_getstackdepth(int aframes)
 ulong_t
 dtrace_getreg(struct trapframe *rp, uint_t reg)
 {
-
-	printf("IMPLEMENT ME: %s\n", __func__);
-
-	return (0);
+	switch (reg) {
+	case REG_X0 ... REG_X29:
+		return (rp->tf_x[reg]);
+	case REG_LR:
+		return (rp->tf_lr);
+	case REG_SP:
+		return (rp->tf_sp);
+	case REG_PC:
+		return (rp->tf_elr);
+	default:
+		DTRACE_CPUFLAG_SET(CPU_DTRACE_ILLOP);
+		return (0);
+	}
+	/* NOTREACHED */
 }
 
 static int
diff --git a/sys/cddl/dev/dtrace/aarch64/regset.h b/sys/cddl/dev/dtrace/aarch64/regset.h
index f99b48f8354f..492405d4a258 100644
--- a/sys/cddl/dev/dtrace/aarch64/regset.h
+++ b/sys/cddl/dev/dtrace/aarch64/regset.h
@@ -42,7 +42,40 @@
 extern "C" {
 #endif
 
-/* Place here */
+#define REG_X0		0
+#define REG_X1		1
+#define REG_X2		2
+#define REG_X3		3
+#define REG_X4		4
+#define REG_X5		5
+#define REG_X6		6
+#define REG_X7		7
+#define REG_X8		8
+#define REG_X9		9
+#define REG_X10		10
+#define REG_X11		11
+#define REG_X12		12
+#define REG_X13		13
+#define REG_X14		14
+#define REG_X15		15
+#define REG_X16		16
+#define REG_X17		17
+#define REG_X18		18
+#define REG_X19		19
+#define REG_X20		20
+#define REG_X21		21
+#define REG_X22		22
+#define REG_X23		23
+#define REG_X24		24
+#define REG_X25		25
+#define REG_X26		26
+#define REG_X27		27
+#define REG_X28		28
+#define REG_X29		29
+#define REG_FP		REG_X29
+#define REG_LR		30
+#define REG_SP		31
+#define REG_PC		32
 
 #ifdef	__cplusplus
 }