正式确认罪魁祸首是这个内核 BUG。
做 trace 时的 stack layout 如下:
+-------+ FP of firewall
| ... |
| var | <- tcc read here
| tcc |
| reg |
| reg |
| reg |
| reg |
| rip | IP of firewall
| rbp | FP of firewall
+-------+ FP of firewall_policy
| ... |
| tcc |
| reg |
| reg |
| rip | IP of firewall_policy
| rip | IP of my_tailcall_inspect
| rbp | FP of firewall_policy
+-------+ FP of trampoline
| ... |
| arg |
| arg |
| arg | <- ctx of tailcall_inspect
| rip | IP of trampoline
| rbp | FP of trampoline
+-------+ FP of tailcall_inspect
| ... |
+-------+ RSP of tailcall_inspect
在 trace 时 dump 出来的一些 stack 信息:
tailcall_inspect: ctx=ffffae1140003d10 prog_array=0000000000000001 map_id=0
tailcall_inspect: ctx=ffffae1140003d10 tcc=b0405c8f tcc_fp=b0405c8f00000000
tailcall_inspect: ctx=ffffae1140003d10 prog=0000000000000000 prog_id=0
tailcall_inspect: ctx=ffffae1140003d10 ip_tc_inspect=ffffffffc1403c25 ip_firewall_policy=ffffffffc14014a4
tailcall_inspect: ctx=ffffae1140003d10 REG1=ffffce013e410480 REG2=0000000000000003
tailcall_inspect: ip_firewall=ffffffffc13ffbf8 stack=ffff9fa9e5d44b10 0000000000000003
tailcall_inspect: stack=ffffce013e410480 ffffae1140003d10 tcc_init=0000000000000000
tailcall_inspect: stack var=00000000b0405c8f
tailcall_inspect: ctx=ffffae1140003d10 prog_array=ffffae114b569000 index=1
其中,在 firewall_policy 里 tail_call_cnt 的值是 0xb0405cf8,而不是预期的 0x1。而这个值是 firewall 函数栈的一部分。
等周末的时候,我写篇 blog 来介绍这个 BUG 以及 debug 过程。
做 trace 时的 stack layout 如下:
+-------+ FP of firewall
| ... |
| var | <- tcc read here
| tcc |
| reg |
| reg |
| reg |
| reg |
| rip | IP of firewall
| rbp | FP of firewall
+-------+ FP of firewall_policy
| ... |
| tcc |
| reg |
| reg |
| rip | IP of firewall_policy
| rip | IP of my_tailcall_inspect
| rbp | FP of firewall_policy
+-------+ FP of trampoline
| ... |
| arg |
| arg |
| arg | <- ctx of tailcall_inspect
| rip | IP of trampoline
| rbp | FP of trampoline
+-------+ FP of tailcall_inspect
| ... |
+-------+ RSP of tailcall_inspect
在 trace 时 dump 出来的一些 stack 信息:
tailcall_inspect: ctx=ffffae1140003d10 prog_array=0000000000000001 map_id=0
tailcall_inspect: ctx=ffffae1140003d10 tcc=b0405c8f tcc_fp=b0405c8f00000000
tailcall_inspect: ctx=ffffae1140003d10 prog=0000000000000000 prog_id=0
tailcall_inspect: ctx=ffffae1140003d10 ip_tc_inspect=ffffffffc1403c25 ip_firewall_policy=ffffffffc14014a4
tailcall_inspect: ctx=ffffae1140003d10 REG1=ffffce013e410480 REG2=0000000000000003
tailcall_inspect: ip_firewall=ffffffffc13ffbf8 stack=ffff9fa9e5d44b10 0000000000000003
tailcall_inspect: stack=ffffce013e410480 ffffae1140003d10 tcc_init=0000000000000000
tailcall_inspect: stack var=00000000b0405c8f
tailcall_inspect: ctx=ffffae1140003d10 prog_array=ffffae114b569000 index=1
其中,在 firewall_policy 里 tail_call_cnt 的值是 0xb0405cf8,而不是预期的 0x1。而这个值是 firewall 函数栈的一部分。
等周末的时候,我写篇 blog 来介绍这个 BUG 以及 debug 过程。