Skip to content

Instantly share code, notes, and snippets.

@agentzh

agentzh/a.patch Secret

Created February 1, 2021 22:52
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save agentzh/aea6db6f7602896bfc4b90ddffddee33 to your computer and use it in GitHub Desktop.
Save agentzh/aea6db6f7602896bfc4b90ddffddee33 to your computer and use it in GitHub Desktop.
commit 12dcbfcc279e7ecc3599e31efc152b68a9db22bd
Author: Yichun Zhang (agentzh) <yichun@openresty.com>
Date: Mon Feb 1 14:51:22 2021 -0800
Tapset: aarc64: register()/u_register(): support w* registers
diff --git a/tapset/arm64/registers.stp b/tapset/arm64/registers.stp
index b9203ec9b..b6d69200c 100644
--- a/tapset/arm64/registers.stp
+++ b/tapset/arm64/registers.stp
@@ -1,7 +1,7 @@
/* Dwarfless register access for arm64 */
/* TODO: handle 32-bit access of registers */
-@__private30 global _reg_offsets[37]
+@__private30 global _reg_offsets[37], _r32_offsets[31]
probe init {
/* Same order as pt_regs */
@@ -40,6 +40,38 @@ probe init {
_reg_offsets["pc"] = 256
_reg_offsets["pstate"] = 264
_reg_offsets["orig_x0"] = 272
+
+ _r32_offsets["w0"] = 0
+ _r32_offsets["w1"] = 8
+ _r32_offsets["w2"] = 16
+ _r32_offsets["w3"] = 24
+ _r32_offsets["w4"] = 32
+ _r32_offsets["w5"] = 40
+ _r32_offsets["w6"] = 48
+ _r32_offsets["w7"] = 56
+ _r32_offsets["w8"] = 64
+ _r32_offsets["w9"] = 72
+ _r32_offsets["w10"] = 80
+ _r32_offsets["w11"] = 88
+ _r32_offsets["w12"] = 96
+ _r32_offsets["w13"] = 104
+ _r32_offsets["w14"] = 112
+ _r32_offsets["w15"] = 120
+ _r32_offsets["w16"] = 128
+ _r32_offsets["w17"] = 136
+ _r32_offsets["w18"] = 144
+ _r32_offsets["w19"] = 152
+ _r32_offsets["w20"] = 160
+ _r32_offsets["w21"] = 168
+ _r32_offsets["w22"] = 176
+ _r32_offsets["w23"] = 184
+ _r32_offsets["w24"] = 192
+ _r32_offsets["w25"] = 200
+ _r32_offsets["w26"] = 208
+ _r32_offsets["w27"] = 216
+ _r32_offsets["w28"] = 224
+ _r32_offsets["w29"] = 232
+ _r32_offsets["w30"] = 240
}
function probing_32bit_app:long() %{ /* pure */
@@ -84,11 +116,18 @@ function _stp_sign_extend32:long (value:long) {
}
function _stp_register:long (name:string, sign_extend:long) {
+ reg32 = 0
assert(registers_valid(), "cannot access CPU registers in this context")
offset = _reg_offsets[name]
- assert(offset != 0 || (name in _reg_offsets), "Unknown register: " . name)
+ if (offset == 0 && !(name in _reg_offsets)) {
+ offset = _r32_offsets[name]
+ if (offset == 0 && !(name in _r32_offsets)) {
+ assert(0, "Unknown register: " . name)
+ }
+ reg32 = 1;
+ }
value = _stp_get_register_by_offset(offset)
- if (probing_32bit_app()) {
+ if (reg32 || probing_32bit_app()) {
if (sign_extend)
value = _stp_sign_extend32(value)
else
diff --git a/testsuite/systemtap.base/register_aarch64.exp b/testsuite/systemtap.base/register_aarch64.exp
new file mode 100644
index 000000000..2558baeb9
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64.exp
@@ -0,0 +1,162 @@
+set test "register_aarch64"
+set testpath "$srcdir/$subdir"
+
+if {! [installtest_p]} { untested $test; return }
+if {! [uretprobes_p]} { untested $test; return }
+set arch [exec uname -i]
+if {$arch ne "aarch64"} { untested $test; return }
+
+# --- TEST 1 ---
+
+set subtest1 "TEST 1: 64-bit x0"
+
+set res [target_compile ${testpath}/${test}_1.c ./a.out executable \
+ "additional_flags=-O additional_flags=-g additional_flags=-O0"]
+if {$res ne ""} {
+ verbose "target_compile failed: $res" 2
+ fail "$test: $subtest1: unable to compile ${test}_1.c"
+} else {
+ foreach runtime [get_runtime_list] {
+ if {$runtime eq ""} {
+ set runtime "kernel"
+ }
+ set test_name "$test: $subtest1 ($runtime)"
+ set cmd "stap --runtime=$runtime -c ./a.out '$srcdir/$subdir/${test}_1.stp'"
+ set exit_code [run_cmd_2way $cmd out stderr]
+ set exp_out "x0 = 0x56781234beefdead
+u x0 = 0x56781234beefdead
+
+w0 = 0xffffffffbeefdead
+u w0 = 0xbeefdead
+"
+ is "${test_name}: stdout" $out $exp_out
+ is "${test_name}: exit code" $exit_code 0
+ if {$stderr ne ""} {
+ send_log "stderr:\n$stderr"
+ }
+ }
+}
+
+# --- TEST 2 ---
+
+set subtest2 "TEST 2: 64-bit x1"
+
+set res [target_compile ${testpath}/${test}_2.c ./a.out executable \
+ "additional_flags=-O additional_flags=-g additional_flags=-O0"]
+if {$res ne ""} {
+ verbose "target_compile failed: $res" 2
+ fail "$test: $subtest2: unable to compile ${test}_2.c"
+} else {
+ foreach runtime [get_runtime_list] {
+ if {$runtime eq ""} {
+ set runtime "kernel"
+ }
+ set test_name "$test: $subtest2 ($runtime)"
+ set cmd "stap --runtime=$runtime -c ./a.out '$srcdir/$subdir/${test}_2.stp'"
+ set exit_code [run_cmd_2way $cmd out stderr]
+ set exp_out "x1 = 0x56781234beefdead
+u x1 = 0x56781234beefdead
+
+w1 = 0xffffffffbeefdead
+u w1 = 0xbeefdead
+"
+ is "${test_name}: stdout" $out $exp_out
+ is "${test_name}: exit code" $exit_code 0
+ if {$stderr ne ""} {
+ send_log "stderr:\n$stderr"
+ }
+ }
+}
+
+# --- TEST 3 ---
+
+set subtest3 "TEST 3: 64-bit x2"
+
+set res [target_compile ${testpath}/${test}_3.c ./a.out executable \
+ "additional_flags=-O additional_flags=-g additional_flags=-O0"]
+if {$res ne ""} {
+ verbose "target_compile failed: $res" 2
+ fail "$test: $subtest3: unable to compile ${test}_3.c"
+} else {
+ foreach runtime [get_runtime_list] {
+ if {$runtime eq ""} {
+ set runtime "kernel"
+ }
+ set test_name "$test: $subtest3 ($runtime)"
+ set cmd "stap --runtime=$runtime -c ./a.out '$srcdir/$subdir/${test}_3.stp'"
+ set exit_code [run_cmd_2way $cmd out stderr]
+ set exp_out "x2 = 0x56781234beefdead
+u x2 = 0x56781234beefdead
+
+w2 = 0xffffffffbeefdead
+u w2 = 0xbeefdead
+"
+ is "${test_name}: stdout" $out $exp_out
+ is "${test_name}: exit code" $exit_code 0
+ if {$stderr ne ""} {
+ send_log "stderr:\n$stderr"
+ }
+ }
+}
+
+# --- TEST 4 ---
+
+set subtest4 "TEST 4: 64-bit x3"
+
+set res [target_compile ${testpath}/${test}_4.c ./a.out executable \
+ "additional_flags=-O additional_flags=-g additional_flags=-O0"]
+if {$res ne ""} {
+ verbose "target_compile failed: $res" 2
+ fail "$test: $subtest4: unable to compile ${test}_4.c"
+} else {
+ foreach runtime [get_runtime_list] {
+ if {$runtime eq ""} {
+ set runtime "kernel"
+ }
+ set test_name "$test: $subtest4 ($runtime)"
+ set cmd "stap --runtime=$runtime -c ./a.out '$srcdir/$subdir/${test}_4.stp'"
+ set exit_code [run_cmd_2way $cmd out stderr]
+ set exp_out "x3 = 0x56781234beefdead
+u x3 = 0x56781234beefdead
+
+w3 = 0xffffffffbeefdead
+u w3 = 0xbeefdead
+"
+ is "${test_name}: stdout" $out $exp_out
+ is "${test_name}: exit code" $exit_code 0
+ if {$stderr ne ""} {
+ send_log "stderr:\n$stderr"
+ }
+ }
+}
+
+# --- TEST 5 ---
+
+set subtest5 "TEST 5: 64-bit x29"
+
+set res [target_compile ${testpath}/${test}_5.c ./a.out executable \
+ "additional_flags=-O additional_flags=-g additional_flags=-O0"]
+if {$res ne ""} {
+ verbose "target_compile failed: $res" 2
+ fail "$test: $subtest5: unable to compile ${test}_5.c"
+} else {
+ foreach runtime [get_runtime_list] {
+ if {$runtime eq ""} {
+ set runtime "kernel"
+ }
+ set test_name "$test: $subtest5 ($runtime)"
+ set cmd "stap --runtime=$runtime -c ./a.out '$srcdir/$subdir/${test}_5.stp'"
+ set exit_code [run_cmd_2way $cmd out stderr]
+ set exp_out "x29 = 0x56781234beefdead
+u x29 = 0x56781234beefdead
+
+w29 = 0xffffffffbeefdead
+u w29 = 0xbeefdead
+"
+ is "${test_name}: stdout" $out $exp_out
+ is "${test_name}: exit code" $exit_code 0
+ if {$stderr ne ""} {
+ send_log "stderr:\n$stderr"
+ }
+ }
+}
diff --git a/testsuite/systemtap.base/register_aarch64_1.c b/testsuite/systemtap.base/register_aarch64_1.c
new file mode 100644
index 000000000..c3460b898
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_1.c
@@ -0,0 +1,12 @@
+void foo(void) {
+ asm volatile("movz x0, 0xdead;"
+ "movk x0, 0xbeef, lsl 16;"
+ "movk x0, 0x1234, lsl 32;"
+ "movk x0, 0x5678, lsl 48;");
+ return;
+}
+
+int main(void) {
+ foo();
+ return 0;
+}
diff --git a/testsuite/systemtap.base/register_aarch64_1.stp b/testsuite/systemtap.base/register_aarch64_1.stp
new file mode 100644
index 000000000..7b812e4c8
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_1.stp
@@ -0,0 +1,8 @@
+probe process.function("foo").return {
+ printf("x0 = %#x\n", register("x0"));
+ printf("u x0 = %#x\n\n", u_register("x0"));
+
+ printf("w0 = %#x\n", register("w0"));
+ printf("u w0 = %#x\n", u_register("w0"));
+ exit()
+}
diff --git a/testsuite/systemtap.base/register_aarch64_2.c b/testsuite/systemtap.base/register_aarch64_2.c
new file mode 100644
index 000000000..ea025393c
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_2.c
@@ -0,0 +1,12 @@
+void foo(void) {
+ asm volatile("movz x1, 0xdead;"
+ "movk x1, 0xbeef, lsl 16;"
+ "movk x1, 0x1234, lsl 32;"
+ "movk x1, 0x5678, lsl 48;");
+ return;
+}
+
+int main(void) {
+ foo();
+ return 0;
+}
diff --git a/testsuite/systemtap.base/register_aarch64_2.stp b/testsuite/systemtap.base/register_aarch64_2.stp
new file mode 100644
index 000000000..3c61b758f
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_2.stp
@@ -0,0 +1,8 @@
+probe process.function("foo").return {
+ printf("x1 = %#x\n", register("x1"));
+ printf("u x1 = %#x\n\n", u_register("x1"));
+
+ printf("w1 = %#x\n", register("w1"));
+ printf("u w1 = %#x\n", u_register("w1"));
+ exit()
+}
diff --git a/testsuite/systemtap.base/register_aarch64_3.c b/testsuite/systemtap.base/register_aarch64_3.c
new file mode 100644
index 000000000..f4d9ba2a2
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_3.c
@@ -0,0 +1,12 @@
+void foo(void) {
+ asm volatile("movz x2, 0xdead;"
+ "movk x2, 0xbeef, lsl 16;"
+ "movk x2, 0x1234, lsl 32;"
+ "movk x2, 0x5678, lsl 48;");
+ return;
+}
+
+int main(void) {
+ foo();
+ return 0;
+}
diff --git a/testsuite/systemtap.base/register_aarch64_3.stp b/testsuite/systemtap.base/register_aarch64_3.stp
new file mode 100644
index 000000000..ba8c16b48
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_3.stp
@@ -0,0 +1,8 @@
+probe process.function("foo").return {
+ printf("x2 = %#x\n", register("x2"));
+ printf("u x2 = %#x\n\n", u_register("x2"));
+
+ printf("w2 = %#x\n", register("w2"));
+ printf("u w2 = %#x\n", u_register("w2"));
+ exit()
+}
diff --git a/testsuite/systemtap.base/register_aarch64_4.c b/testsuite/systemtap.base/register_aarch64_4.c
new file mode 100644
index 000000000..83e9f41a2
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_4.c
@@ -0,0 +1,12 @@
+void foo(void) {
+ asm volatile("movz x3, 0xdead;"
+ "movk x3, 0xbeef, lsl 16;"
+ "movk x3, 0x1234, lsl 32;"
+ "movk x3, 0x5678, lsl 48;");
+ return;
+}
+
+int main(void) {
+ foo();
+ return 0;
+}
diff --git a/testsuite/systemtap.base/register_aarch64_4.stp b/testsuite/systemtap.base/register_aarch64_4.stp
new file mode 100644
index 000000000..3ba258ad8
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_4.stp
@@ -0,0 +1,8 @@
+probe process.function("foo").return {
+ printf("x3 = %#x\n", register("x3"));
+ printf("u x3 = %#x\n\n", u_register("x3"));
+
+ printf("w3 = %#x\n", register("w3"));
+ printf("u w3 = %#x\n", u_register("w3"));
+ exit()
+}
diff --git a/testsuite/systemtap.base/register_aarch64_5.c b/testsuite/systemtap.base/register_aarch64_5.c
new file mode 100644
index 000000000..d2cd6e413
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_5.c
@@ -0,0 +1,12 @@
+void foo(void) {
+ asm volatile("movz x29, 0xdead;"
+ "movk x29, 0xbeef, lsl 16;"
+ "movk x29, 0x1234, lsl 32;"
+ "movk x29, 0x5678, lsl 48;");
+ return;
+}
+
+int main(void) {
+ foo();
+ return 0;
+}
diff --git a/testsuite/systemtap.base/register_aarch64_5.stp b/testsuite/systemtap.base/register_aarch64_5.stp
new file mode 100644
index 000000000..26b052993
--- /dev/null
+++ b/testsuite/systemtap.base/register_aarch64_5.stp
@@ -0,0 +1,8 @@
+probe process.function("foo").return {
+ printf("x29 = %#x\n", register("x29"));
+ printf("u x29 = %#x\n\n", u_register("x29"));
+
+ printf("w29 = %#x\n", register("w29"));
+ printf("u w29 = %#x\n", u_register("w29"));
+ exit()
+}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment