git: 21a16d55cc15 - main - dtrace: add register bindings for arm64
- Go to: [ bottom of page ] [ top of archives ] [ this month ]
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
}