diff options
author | Ilya Leoshkevich <iii@linux.ibm.com> | 2019-08-30 07:07:32 -0400 |
---|---|---|
committer | Daniel Borkmann <daniel@iogearbox.net> | 2019-09-03 15:01:52 -0400 |
commit | 3ec2a0ed3fec4ec8b27d9b71fdcbc1c30d1542d3 (patch) | |
tree | c3b394a6a1d22385770e2db21bd0e5f07f5b0570 /tools | |
parent | 416c572821841bef2cbb6346fb559901efff4ff3 (diff) |
selftests/bpf: fix endianness issues in test_sysctl
A lot of test_sysctl sub-tests fail due to handling strings as a bunch
of immediate values in a little-endian-specific manner.
Fix by wrapping all immediates in bpf_ntohl and the new bpf_be64_to_cpu.
fixup_sysctl_value() dynamically writes an immediate, and thus should be
endianness-aware. Implement this by simply memcpy()ing the raw
user-provided value, since testcase endianness and bpf program
endianness match.
Fixes: 1f5fa9ab6e2e ("selftests/bpf: Test BPF_CGROUP_SYSCTL")
Fixes: 9a1027e52535 ("selftests/bpf: Test file_pos field in bpf_sysctl ctx")
Fixes: 6041c67f28d8 ("selftests/bpf: Test bpf_sysctl_get_name helper")
Fixes: 11ff34f74e32 ("selftests/bpf: Test sysctl_get_current_value helper")
Fixes: 786047dd08de ("selftests/bpf: Test bpf_sysctl_{get,set}_new_value helpers")
Fixes: 8549ddc832d6 ("selftests/bpf: Test bpf_strtol and bpf_strtoul helpers")
Signed-off-by: Ilya Leoshkevich <iii@linux.ibm.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Diffstat (limited to 'tools')
-rw-r--r-- | tools/testing/selftests/bpf/test_sysctl.c | 125 |
1 files changed, 82 insertions, 43 deletions
diff --git a/tools/testing/selftests/bpf/test_sysctl.c b/tools/testing/selftests/bpf/test_sysctl.c index 106644f7e73e..fc33ae36b760 100644 --- a/tools/testing/selftests/bpf/test_sysctl.c +++ b/tools/testing/selftests/bpf/test_sysctl.c | |||
@@ -13,6 +13,7 @@ | |||
13 | #include <bpf/bpf.h> | 13 | #include <bpf/bpf.h> |
14 | #include <bpf/libbpf.h> | 14 | #include <bpf/libbpf.h> |
15 | 15 | ||
16 | #include "bpf_endian.h" | ||
16 | #include "bpf_rlimit.h" | 17 | #include "bpf_rlimit.h" |
17 | #include "bpf_util.h" | 18 | #include "bpf_util.h" |
18 | #include "cgroup_helpers.h" | 19 | #include "cgroup_helpers.h" |
@@ -214,7 +215,8 @@ static struct sysctl_test tests[] = { | |||
214 | /* if (ret == expected && */ | 215 | /* if (ret == expected && */ |
215 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, sizeof("tcp_mem") - 1, 6), | 216 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, sizeof("tcp_mem") - 1, 6), |
216 | /* buf == "tcp_mem\0") */ | 217 | /* buf == "tcp_mem\0") */ |
217 | BPF_LD_IMM64(BPF_REG_8, 0x006d656d5f706374ULL), | 218 | BPF_LD_IMM64(BPF_REG_8, |
219 | bpf_be64_to_cpu(0x7463705f6d656d00ULL)), | ||
218 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 220 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
219 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 221 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
220 | 222 | ||
@@ -255,7 +257,8 @@ static struct sysctl_test tests[] = { | |||
255 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), | 257 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), |
256 | 258 | ||
257 | /* buf[0:7] == "tcp_me\0") */ | 259 | /* buf[0:7] == "tcp_me\0") */ |
258 | BPF_LD_IMM64(BPF_REG_8, 0x00656d5f706374ULL), | 260 | BPF_LD_IMM64(BPF_REG_8, |
261 | bpf_be64_to_cpu(0x7463705f6d650000ULL)), | ||
259 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 262 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
260 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 263 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
261 | 264 | ||
@@ -298,12 +301,14 @@ static struct sysctl_test tests[] = { | |||
298 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 16, 14), | 301 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 16, 14), |
299 | 302 | ||
300 | /* buf[0:8] == "net/ipv4" && */ | 303 | /* buf[0:8] == "net/ipv4" && */ |
301 | BPF_LD_IMM64(BPF_REG_8, 0x347670692f74656eULL), | 304 | BPF_LD_IMM64(BPF_REG_8, |
305 | bpf_be64_to_cpu(0x6e65742f69707634ULL)), | ||
302 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 306 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
303 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), | 307 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), |
304 | 308 | ||
305 | /* buf[8:16] == "/tcp_mem" && */ | 309 | /* buf[8:16] == "/tcp_mem" && */ |
306 | BPF_LD_IMM64(BPF_REG_8, 0x6d656d5f7063742fULL), | 310 | BPF_LD_IMM64(BPF_REG_8, |
311 | bpf_be64_to_cpu(0x2f7463705f6d656dULL)), | ||
307 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), | 312 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), |
308 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), | 313 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), |
309 | 314 | ||
@@ -350,12 +355,14 @@ static struct sysctl_test tests[] = { | |||
350 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 10), | 355 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 10), |
351 | 356 | ||
352 | /* buf[0:8] == "net/ipv4" && */ | 357 | /* buf[0:8] == "net/ipv4" && */ |
353 | BPF_LD_IMM64(BPF_REG_8, 0x347670692f74656eULL), | 358 | BPF_LD_IMM64(BPF_REG_8, |
359 | bpf_be64_to_cpu(0x6e65742f69707634ULL)), | ||
354 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 360 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
355 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), | 361 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), |
356 | 362 | ||
357 | /* buf[8:16] == "/tcp_me\0") */ | 363 | /* buf[8:16] == "/tcp_me\0") */ |
358 | BPF_LD_IMM64(BPF_REG_8, 0x00656d5f7063742fULL), | 364 | BPF_LD_IMM64(BPF_REG_8, |
365 | bpf_be64_to_cpu(0x2f7463705f6d6500ULL)), | ||
359 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), | 366 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), |
360 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 367 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
361 | 368 | ||
@@ -396,7 +403,8 @@ static struct sysctl_test tests[] = { | |||
396 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), | 403 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), |
397 | 404 | ||
398 | /* buf[0:8] == "net/ip\0") */ | 405 | /* buf[0:8] == "net/ip\0") */ |
399 | BPF_LD_IMM64(BPF_REG_8, 0x000070692f74656eULL), | 406 | BPF_LD_IMM64(BPF_REG_8, |
407 | bpf_be64_to_cpu(0x6e65742f69700000ULL)), | ||
400 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 408 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
401 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 409 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
402 | 410 | ||
@@ -431,7 +439,8 @@ static struct sysctl_test tests[] = { | |||
431 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), | 439 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), |
432 | 440 | ||
433 | /* buf[0:6] == "Linux\n\0") */ | 441 | /* buf[0:6] == "Linux\n\0") */ |
434 | BPF_LD_IMM64(BPF_REG_8, 0x000a78756e694cULL), | 442 | BPF_LD_IMM64(BPF_REG_8, |
443 | bpf_be64_to_cpu(0x4c696e75780a0000ULL)), | ||
435 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 444 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
436 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 445 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
437 | 446 | ||
@@ -469,7 +478,8 @@ static struct sysctl_test tests[] = { | |||
469 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), | 478 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 6, 6), |
470 | 479 | ||
471 | /* buf[0:6] == "Linux\n\0") */ | 480 | /* buf[0:6] == "Linux\n\0") */ |
472 | BPF_LD_IMM64(BPF_REG_8, 0x000a78756e694cULL), | 481 | BPF_LD_IMM64(BPF_REG_8, |
482 | bpf_be64_to_cpu(0x4c696e75780a0000ULL)), | ||
473 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 483 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
474 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 484 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
475 | 485 | ||
@@ -507,7 +517,8 @@ static struct sysctl_test tests[] = { | |||
507 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), | 517 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, -E2BIG, 6), |
508 | 518 | ||
509 | /* buf[0:6] == "Linux\0") */ | 519 | /* buf[0:6] == "Linux\0") */ |
510 | BPF_LD_IMM64(BPF_REG_8, 0x000078756e694cULL), | 520 | BPF_LD_IMM64(BPF_REG_8, |
521 | bpf_be64_to_cpu(0x4c696e7578000000ULL)), | ||
511 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 522 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
512 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 523 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
513 | 524 | ||
@@ -650,7 +661,8 @@ static struct sysctl_test tests[] = { | |||
650 | 661 | ||
651 | /* buf[0:4] == "606\0") */ | 662 | /* buf[0:4] == "606\0") */ |
652 | BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), | 663 | BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), |
653 | BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0x00363036, 2), | 664 | BPF_JMP_IMM(BPF_JNE, BPF_REG_9, |
665 | bpf_ntohl(0x36303600), 2), | ||
654 | 666 | ||
655 | /* return DENY; */ | 667 | /* return DENY; */ |
656 | BPF_MOV64_IMM(BPF_REG_0, 0), | 668 | BPF_MOV64_IMM(BPF_REG_0, 0), |
@@ -685,17 +697,20 @@ static struct sysctl_test tests[] = { | |||
685 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 23, 14), | 697 | BPF_JMP_IMM(BPF_JNE, BPF_REG_0, 23, 14), |
686 | 698 | ||
687 | /* buf[0:8] == "3000000 " && */ | 699 | /* buf[0:8] == "3000000 " && */ |
688 | BPF_LD_IMM64(BPF_REG_8, 0x2030303030303033ULL), | 700 | BPF_LD_IMM64(BPF_REG_8, |
701 | bpf_be64_to_cpu(0x3330303030303020ULL)), | ||
689 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), | 702 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 0), |
690 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), | 703 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 10), |
691 | 704 | ||
692 | /* buf[8:16] == "4000000 " && */ | 705 | /* buf[8:16] == "4000000 " && */ |
693 | BPF_LD_IMM64(BPF_REG_8, 0x2030303030303034ULL), | 706 | BPF_LD_IMM64(BPF_REG_8, |
707 | bpf_be64_to_cpu(0x3430303030303020ULL)), | ||
694 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), | 708 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 8), |
695 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), | 709 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 6), |
696 | 710 | ||
697 | /* buf[16:24] == "6000000\0") */ | 711 | /* buf[16:24] == "6000000\0") */ |
698 | BPF_LD_IMM64(BPF_REG_8, 0x0030303030303036ULL), | 712 | BPF_LD_IMM64(BPF_REG_8, |
713 | bpf_be64_to_cpu(0x3630303030303000ULL)), | ||
699 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16), | 714 | BPF_LDX_MEM(BPF_DW, BPF_REG_9, BPF_REG_7, 16), |
700 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), | 715 | BPF_JMP_REG(BPF_JNE, BPF_REG_8, BPF_REG_9, 2), |
701 | 716 | ||
@@ -735,7 +750,8 @@ static struct sysctl_test tests[] = { | |||
735 | 750 | ||
736 | /* buf[0:3] == "60\0") */ | 751 | /* buf[0:3] == "60\0") */ |
737 | BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), | 752 | BPF_LDX_MEM(BPF_W, BPF_REG_9, BPF_REG_7, 0), |
738 | BPF_JMP_IMM(BPF_JNE, BPF_REG_9, 0x003036, 2), | 753 | BPF_JMP_IMM(BPF_JNE, BPF_REG_9, |
754 | bpf_ntohl(0x36300000), 2), | ||
739 | 755 | ||
740 | /* return DENY; */ | 756 | /* return DENY; */ |
741 | BPF_MOV64_IMM(BPF_REG_0, 0), | 757 | BPF_MOV64_IMM(BPF_REG_0, 0), |
@@ -757,7 +773,8 @@ static struct sysctl_test tests[] = { | |||
757 | /* sysctl_set_new_value arg2 (buf) */ | 773 | /* sysctl_set_new_value arg2 (buf) */ |
758 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 774 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
759 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 775 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
760 | BPF_MOV64_IMM(BPF_REG_0, 0x00303036), | 776 | BPF_MOV64_IMM(BPF_REG_0, |
777 | bpf_ntohl(0x36303000)), | ||
761 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 778 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
762 | 779 | ||
763 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), | 780 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), |
@@ -791,7 +808,7 @@ static struct sysctl_test tests[] = { | |||
791 | /* sysctl_set_new_value arg2 (buf) */ | 808 | /* sysctl_set_new_value arg2 (buf) */ |
792 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 809 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
793 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 810 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
794 | BPF_MOV64_IMM(BPF_REG_0, FIXUP_SYSCTL_VALUE), | 811 | BPF_LD_IMM64(BPF_REG_0, FIXUP_SYSCTL_VALUE), |
795 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 812 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
796 | 813 | ||
797 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), | 814 | BPF_MOV64_REG(BPF_REG_2, BPF_REG_7), |
@@ -825,8 +842,9 @@ static struct sysctl_test tests[] = { | |||
825 | /* arg1 (buf) */ | 842 | /* arg1 (buf) */ |
826 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 843 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
827 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 844 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
828 | BPF_MOV64_IMM(BPF_REG_0, 0x00303036), | 845 | BPF_MOV64_IMM(BPF_REG_0, |
829 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 846 | bpf_ntohl(0x36303000)), |
847 | BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), | ||
830 | 848 | ||
831 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 849 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
832 | 850 | ||
@@ -869,7 +887,8 @@ static struct sysctl_test tests[] = { | |||
869 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 887 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
870 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 888 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
871 | /* "600 602\0" */ | 889 | /* "600 602\0" */ |
872 | BPF_LD_IMM64(BPF_REG_0, 0x0032303620303036ULL), | 890 | BPF_LD_IMM64(BPF_REG_0, |
891 | bpf_be64_to_cpu(0x3630302036303200ULL)), | ||
873 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 892 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
874 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 893 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
875 | 894 | ||
@@ -937,7 +956,8 @@ static struct sysctl_test tests[] = { | |||
937 | /* arg1 (buf) */ | 956 | /* arg1 (buf) */ |
938 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 957 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
939 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 958 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
940 | BPF_MOV64_IMM(BPF_REG_0, 0x00303036), | 959 | BPF_MOV64_IMM(BPF_REG_0, |
960 | bpf_ntohl(0x36303000)), | ||
941 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 961 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
942 | 962 | ||
943 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 963 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -969,8 +989,9 @@ static struct sysctl_test tests[] = { | |||
969 | /* arg1 (buf) */ | 989 | /* arg1 (buf) */ |
970 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 990 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
971 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 991 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
972 | BPF_MOV64_IMM(BPF_REG_0, 0x00373730), | 992 | BPF_MOV64_IMM(BPF_REG_0, |
973 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 993 | bpf_ntohl(0x30373700)), |
994 | BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), | ||
974 | 995 | ||
975 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 996 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
976 | 997 | ||
@@ -1012,7 +1033,8 @@ static struct sysctl_test tests[] = { | |||
1012 | /* arg1 (buf) */ | 1033 | /* arg1 (buf) */ |
1013 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1034 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1014 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 1035 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
1015 | BPF_MOV64_IMM(BPF_REG_0, 0x00303036), | 1036 | BPF_MOV64_IMM(BPF_REG_0, |
1037 | bpf_ntohl(0x36303000)), | ||
1016 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1038 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
1017 | 1039 | ||
1018 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1040 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -1052,7 +1074,8 @@ static struct sysctl_test tests[] = { | |||
1052 | /* arg1 (buf) */ | 1074 | /* arg1 (buf) */ |
1053 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1075 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1054 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 1076 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
1055 | BPF_MOV64_IMM(BPF_REG_0, 0x090a0c0d), | 1077 | BPF_MOV64_IMM(BPF_REG_0, |
1078 | bpf_ntohl(0x0d0c0a09)), | ||
1056 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1079 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
1057 | 1080 | ||
1058 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1081 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -1092,7 +1115,9 @@ static struct sysctl_test tests[] = { | |||
1092 | /* arg1 (buf) */ | 1115 | /* arg1 (buf) */ |
1093 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1116 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1094 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 1117 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
1095 | BPF_MOV64_IMM(BPF_REG_0, 0x00362d0a), /* " -6\0" */ | 1118 | /* " -6\0" */ |
1119 | BPF_MOV64_IMM(BPF_REG_0, | ||
1120 | bpf_ntohl(0x0a2d3600)), | ||
1096 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1121 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
1097 | 1122 | ||
1098 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1123 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -1132,8 +1157,10 @@ static struct sysctl_test tests[] = { | |||
1132 | /* arg1 (buf) */ | 1157 | /* arg1 (buf) */ |
1133 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1158 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1134 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 1159 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
1135 | BPF_MOV64_IMM(BPF_REG_0, 0x00362d0a), /* " -6\0" */ | 1160 | /* " -6\0" */ |
1136 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1161 | BPF_MOV64_IMM(BPF_REG_0, |
1162 | bpf_ntohl(0x0a2d3600)), | ||
1163 | BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), | ||
1137 | 1164 | ||
1138 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1165 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
1139 | 1166 | ||
@@ -1175,8 +1202,10 @@ static struct sysctl_test tests[] = { | |||
1175 | /* arg1 (buf) */ | 1202 | /* arg1 (buf) */ |
1176 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1203 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1177 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), | 1204 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -8), |
1178 | BPF_MOV64_IMM(BPF_REG_0, 0x65667830), /* "0xfe" */ | 1205 | /* "0xfe" */ |
1179 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1206 | BPF_MOV64_IMM(BPF_REG_0, |
1207 | bpf_ntohl(0x30786665)), | ||
1208 | BPF_STX_MEM(BPF_W, BPF_REG_7, BPF_REG_0, 0), | ||
1180 | 1209 | ||
1181 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1210 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
1182 | 1211 | ||
@@ -1218,11 +1247,14 @@ static struct sysctl_test tests[] = { | |||
1218 | /* arg1 (buf) 9223372036854775807 */ | 1247 | /* arg1 (buf) 9223372036854775807 */ |
1219 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1248 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1220 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), | 1249 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), |
1221 | BPF_LD_IMM64(BPF_REG_0, 0x3032373333323239ULL), | 1250 | BPF_LD_IMM64(BPF_REG_0, |
1251 | bpf_be64_to_cpu(0x3932323333373230ULL)), | ||
1222 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1252 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
1223 | BPF_LD_IMM64(BPF_REG_0, 0x3537373435383633ULL), | 1253 | BPF_LD_IMM64(BPF_REG_0, |
1254 | bpf_be64_to_cpu(0x3336383534373735ULL)), | ||
1224 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), | 1255 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), |
1225 | BPF_LD_IMM64(BPF_REG_0, 0x0000000000373038ULL), | 1256 | BPF_LD_IMM64(BPF_REG_0, |
1257 | bpf_be64_to_cpu(0x3830370000000000ULL)), | ||
1226 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), | 1258 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), |
1227 | 1259 | ||
1228 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1260 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -1266,11 +1298,14 @@ static struct sysctl_test tests[] = { | |||
1266 | /* arg1 (buf) 9223372036854775808 */ | 1298 | /* arg1 (buf) 9223372036854775808 */ |
1267 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), | 1299 | BPF_MOV64_REG(BPF_REG_7, BPF_REG_10), |
1268 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), | 1300 | BPF_ALU64_IMM(BPF_ADD, BPF_REG_7, -24), |
1269 | BPF_LD_IMM64(BPF_REG_0, 0x3032373333323239ULL), | 1301 | BPF_LD_IMM64(BPF_REG_0, |
1302 | bpf_be64_to_cpu(0x3932323333373230ULL)), | ||
1270 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), | 1303 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 0), |
1271 | BPF_LD_IMM64(BPF_REG_0, 0x3537373435383633ULL), | 1304 | BPF_LD_IMM64(BPF_REG_0, |
1305 | bpf_be64_to_cpu(0x3336383534373735ULL)), | ||
1272 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), | 1306 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 8), |
1273 | BPF_LD_IMM64(BPF_REG_0, 0x0000000000383038ULL), | 1307 | BPF_LD_IMM64(BPF_REG_0, |
1308 | bpf_be64_to_cpu(0x3830380000000000ULL)), | ||
1274 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), | 1309 | BPF_STX_MEM(BPF_DW, BPF_REG_7, BPF_REG_0, 16), |
1275 | 1310 | ||
1276 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), | 1311 | BPF_MOV64_REG(BPF_REG_1, BPF_REG_7), |
@@ -1344,20 +1379,24 @@ static size_t probe_prog_length(const struct bpf_insn *fp) | |||
1344 | static int fixup_sysctl_value(const char *buf, size_t buf_len, | 1379 | static int fixup_sysctl_value(const char *buf, size_t buf_len, |
1345 | struct bpf_insn *prog, size_t insn_num) | 1380 | struct bpf_insn *prog, size_t insn_num) |
1346 | { | 1381 | { |
1347 | uint32_t value_num = 0; | 1382 | union { |
1383 | uint8_t raw[sizeof(uint64_t)]; | ||
1384 | uint64_t num; | ||
1385 | } value = {}; | ||
1348 | uint8_t c, i; | 1386 | uint8_t c, i; |
1349 | 1387 | ||
1350 | if (buf_len > sizeof(value_num)) { | 1388 | if (buf_len > sizeof(value)) { |
1351 | log_err("Value is too big (%zd) to use in fixup", buf_len); | 1389 | log_err("Value is too big (%zd) to use in fixup", buf_len); |
1352 | return -1; | 1390 | return -1; |
1353 | } | 1391 | } |
1354 | 1392 | if (prog[insn_num].code != (BPF_LD | BPF_DW | BPF_IMM)) { | |
1355 | for (i = 0; i < buf_len; ++i) { | 1393 | log_err("Can fixup only BPF_LD_IMM64 insns"); |
1356 | c = buf[i]; | 1394 | return -1; |
1357 | value_num |= (c << i * 8); | ||
1358 | } | 1395 | } |
1359 | 1396 | ||
1360 | prog[insn_num].imm = value_num; | 1397 | memcpy(value.raw, buf, buf_len); |
1398 | prog[insn_num].imm = (uint32_t)value.num; | ||
1399 | prog[insn_num + 1].imm = (uint32_t)(value.num >> 32); | ||
1361 | 1400 | ||
1362 | return 0; | 1401 | return 0; |
1363 | } | 1402 | } |