-
-
Save agentzh/aea6db6f7602896bfc4b90ddffddee33 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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