Increase MAX_TAIL_CALL_CNT to 33 tail calls (#2826)

* Initial Commit

* Added tail call max exceed native test case

* Initial commit

* Initial commit

* Added bpf2c_tests/expected changed files

* Fixed the return value in bind_tailcall_max_native_test

* Addressed PR comments

* Update tests/unit/libbpf_test.cpp

Co-authored-by: Dave Thaler <dthaler@microsoft.com>

* Update tests/unit/libbpf_test.cpp

Co-authored-by: Dave Thaler <dthaler@microsoft.com>

* tests/unit/libbpf_test.cpp

* Moved MAX_TAIL_CALL_CNT to ebpf_structs.h as suggested

* Removed MAX_TAIL_CALL_CNT in api_test and stress_tests_km file

* Add the generated expected file for tail_call_max_exceed

* Removed MAX_TAIL_CALL_CNT from bpf_helpers.h

---------

Co-authored-by: Dave Thaler <dthaler@microsoft.com>
This commit is contained in:
Sharmi 2023-09-11 09:55:56 -07:00 коммит произвёл GitHub
Родитель f595311665
Коммит 5cc488fb08
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4AEE18F83AFDEB23
22 изменённых файлов: 32349 добавлений и 6558 удалений

Просмотреть файл

@ -26,5 +26,3 @@
#endif
#include "bpf_helper_defs.h"
#define MAX_TAIL_CALL_CNT 32

Просмотреть файл

@ -20,6 +20,8 @@ typedef unsigned int uint32_t;
typedef unsigned long long uint64_t;
#endif
#define MAX_TAIL_CALL_CNT 33
#define BPF_ENUM_TO_STRING(X) #X
typedef enum bpf_map_type

Просмотреть файл

@ -994,6 +994,18 @@ SPDX-License-Identifier: MIT
<Component Id="TAIL_CALL_MULTIPLE_UM.PDB" DiskId="1" Guid="{D918F2DB-BC80-406F-B0AD-0C340D5EF280}">
<File Id="TAIL_CALL_MULTIPLE_UM.PDB" Name="tail_call_multiple_um.pdb" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_multiple_um.pdb" />
</Component>
<Component Id="TAIL_CALL_MAX_EXCEED.O" DiskId="1" Guid="{A3E840BD-B510-4F02-80A6-1EA0553C6746}">
<File Id="TAIL_CALL_MAX_EXCEED.O" Name="tail_call_max_exceed.o" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_recursive.o" />
</Component>
<Component Id="TAIL_CALL_MAX_EXCEED.SYS" DiskId="1" Guid="{D3EE01E4-8258-46D4-89FA-C207960C90E6}">
<File Id="TAIL_CALL_MAX_EXCEED.SYS" Name="tail_call_max_exceed.sys" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_recursive.sys" />
</Component>
<Component Id="TAIL_CALL_MAX_EXCEED_UM.DLL" DiskId="1" Guid="{916F7BF5-6B8A-4C99-A09F-102CBB404AA5}">
<File Id="TAIL_CALL_MAX_EXCEED_UM.DLL" Name="tail_call_max_exceed_um.dll" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_recursive_um.dll" />
</Component>
<Component Id="TAIL_CALL_MAX_EXCEED_UM.PDB" DiskId="1" Guid="{9A1BFAAD-D94F-4805-842F-B8DB77B6FC6C}">
<File Id="TAIL_CALL_MAX_EXCEED_UM.PDB" Name="tail_call_max_exceed_um.pdb" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_recursive_um.pdb" />
</Component>
<Component Id="TAIL_CALL_RECURSIVE.O" DiskId="1" Guid="{7469C19C-7706-44B7-BA35-6F27195F311A}">
<File Id="TAIL_CALL_RECURSIVE.O" Name="tail_call_recursive.o" Source="$(var.SolutionDir)$(var.Platform)\$(var.Configuration)\tail_call_recursive.o" />
</Component>

Просмотреть файл

@ -1348,10 +1348,12 @@ ebpf_program_set_tail_call(_In_ const ebpf_program_t* next_program)
}
if (state == NULL) {
EBPF_LOG_MESSAGE_STRING(
EBPF_TRACELOG_LEVEL_ERROR, EBPF_TRACELOG_KEYWORD_PROGRAM, "ebpf tail call state load:", "NULL");
return EBPF_INVALID_ARGUMENT;
}
if (state->tail_call_state.count == (MAX_TAIL_CALL_CNT - 1)) {
if (state->tail_call_state.count == (MAX_TAIL_CALL_CNT)) {
EBPF_OBJECT_RELEASE_REFERENCE(&((ebpf_program_t*)next_program)->object);
return EBPF_NO_MORE_TAIL_CALLS;
}
@ -1389,7 +1391,8 @@ ebpf_program_invoke(
// High volume call - Skip entry/exit logging.
const ebpf_program_t* current_program = program;
for (execution_state->tail_call_state.count = 0; execution_state->tail_call_state.count < MAX_TAIL_CALL_CNT;
// Top-level tail caller(1) + tail callees(33).
for (execution_state->tail_call_state.count = 0; execution_state->tail_call_state.count < MAX_TAIL_CALL_CNT + 1;
execution_state->tail_call_state.count++) {
if (current_program->parameters.code_type == EBPF_CODE_JIT ||

Просмотреть файл

@ -189,6 +189,10 @@ $source_directory="."
"tail_call_map_um.dll",
"tail_call_map_um.pdb",
"tail_call_map.sys",
"tail_call_max_exceed.o",
"tail_call_max_exceed_um.dll",
"tail_call_max_exceed_um.pdb",
"tail_call_max_exceed.sys",
"tail_call_multiple.o",
"tail_call_multiple_um.dll",
"tail_call_multiple_um.pdb",

Просмотреть файл

@ -714,6 +714,63 @@ TEST_CASE("bindmonitor_tailcall_native_test", "[native_tests]")
cleanup();
}
void
bind_tailcall_test(_In_ struct bpf_object* object)
{
UNREFERENCED_PARAMETER(object);
WSAData data;
SOCKET sockets[2];
REQUIRE(WSAStartup(2, &data) == 0);
// Now, trigger bind. bind should not succeed.
REQUIRE(perform_bind(&sockets[0], 30000) != 0);
REQUIRE(perform_bind(&sockets[1], 30001) != 0);
WSACleanup();
}
#define MAX_TAIL_CALL_PROGS MAX_TAIL_CALL_CNT + 2
TEST_CASE("bind_tailcall_max_native_test", "[native_tests]")
{
struct bpf_object* object = nullptr;
hook_helper_t hook(EBPF_ATTACH_TYPE_BIND);
program_load_attach_helper_t _helper;
_helper.initialize(
"tail_call_max_exceed.sys",
BPF_PROG_TYPE_BIND,
"bind_test_caller",
EBPF_EXECUTION_NATIVE,
nullptr,
0,
hook);
object = _helper.get_object();
fd_t prog_map_fd = bpf_object__find_map_fd_by_name(object, "bind_tail_call_map");
REQUIRE(prog_map_fd > 0);
struct bpf_program* caller = bpf_object__find_program_by_name(object, "bind_test_caller");
REQUIRE(caller != nullptr);
// Check each tail call program in the map.
for (int i = 0; i < MAX_TAIL_CALL_PROGS; i++) {
std::string program_name{"bind_test_callee"};
program_name += std::to_string(i);
struct bpf_program* program = bpf_object__find_program_by_name(object, program_name.c_str());
REQUIRE(program != nullptr);
}
// Perform bind test.
bind_tailcall_test(object);
// Clean up tail calls.
for (int index = 0; index < MAX_TAIL_CALL_PROGS; index++) {
REQUIRE(bpf_map_update_elem(prog_map_fd, &index, &ebpf_fd_invalid, 0) == 0);
}
}
#define SOCKET_TEST_PORT 0x3bbf
TEST_CASE("bpf_get_current_pid_tgid", "[helpers]")

Просмотреть файл

@ -238,6 +238,7 @@ DECLARE_TEST("sockops", _test_mode::Verify)
DECLARE_TEST("tail_call", _test_mode::Verify)
DECLARE_TEST("tail_call_bad", _test_mode::Verify)
DECLARE_TEST("tail_call_map", _test_mode::Verify)
DECLARE_TEST("tail_call_max_exceed", _test_mode::Verify)
DECLARE_TEST("tail_call_multiple", _test_mode::Verify)
DECLARE_TEST("tail_call_recursive", _test_mode::Verify)
DECLARE_TEST("tail_call_sequential", _test_mode::Verify)

Просмотреть файл

@ -45,7 +45,7 @@ static map_entry_t _maps[] = {
BPF_MAP_TYPE_PROG_ARRAY, // Type of map.
4, // Size in bytes of a map key.
4, // Size in bytes of a map value.
31, // Maximum number of entries allowed in the map.
33, // Maximum number of entries allowed in the map.
0, // Inner map index.
PIN_NONE, // Pinning type for the map.
0, // Identifier for a map template.
@ -4293,38 +4293,380 @@ label_1:
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee30_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee30_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee30_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee30_maps[] = {
0,
};
#pragma code_seg(push, "bind/30")
static uint64_t
BindMonitor_Callee30(void* context)
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
{
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 83 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[1].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[1].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 83 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee31_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee31_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee31_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee31_maps[] = {
0,
};
#pragma code_seg(push, "bind/31")
static uint64_t
BindMonitor_Callee31(void* context)
#line 84 "sample/bindmonitor_mt_tailcall.c"
{
#line 84 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 84 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 84 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[1].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[1].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 84 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static GUID BindMonitor_Callee32_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee32_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
#pragma code_seg(push, "bind/32")
static uint64_t
BindMonitor_Callee32(void* context)
#line 97 "sample/bindmonitor_mt_tailcall.c"
{
#line 97 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 97 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_IMM pc=0 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(0);
// EBPF_OP_EXIT pc=1 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
@ -5715,13 +6057,41 @@ static program_entry_t _programs[] = {
"bind/30",
"bind/30",
"BindMonitor_Callee30",
BindMonitor_Callee30_maps,
1,
BindMonitor_Callee30_helpers,
2,
38,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
},
{
0,
BindMonitor_Callee31,
"bind/31",
"bind/31",
"BindMonitor_Callee31",
BindMonitor_Callee31_maps,
1,
BindMonitor_Callee31_helpers,
2,
38,
&BindMonitor_Callee31_program_type_guid,
&BindMonitor_Callee31_attach_type_guid,
},
{
0,
BindMonitor_Callee32,
"bind/32",
"bind/32",
"BindMonitor_Callee32",
NULL,
0,
NULL,
0,
2,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
&BindMonitor_Callee32_program_type_guid,
&BindMonitor_Callee32_attach_type_guid,
},
{
0,
@ -5814,7 +6184,7 @@ static void
_get_programs(_Outptr_result_buffer_(*count) program_entry_t** programs, _Out_ size_t* count)
{
*programs = _programs;
*count = 32;
*count = 34;
}
static void

Просмотреть файл

@ -19,7 +19,7 @@ static map_entry_t _maps[] = {
BPF_MAP_TYPE_PROG_ARRAY, // Type of map.
4, // Size in bytes of a map key.
4, // Size in bytes of a map value.
31, // Maximum number of entries allowed in the map.
33, // Maximum number of entries allowed in the map.
0, // Inner map index.
PIN_NONE, // Pinning type for the map.
0, // Identifier for a map template.
@ -4267,38 +4267,380 @@ label_1:
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee30_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee30_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee30_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee30_maps[] = {
0,
};
#pragma code_seg(push, "bind/30")
static uint64_t
BindMonitor_Callee30(void* context)
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
{
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 83 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[1].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[1].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 83 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee31_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee31_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee31_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee31_maps[] = {
0,
};
#pragma code_seg(push, "bind/31")
static uint64_t
BindMonitor_Callee31(void* context)
#line 84 "sample/bindmonitor_mt_tailcall.c"
{
#line 84 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 84 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 84 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[1].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[1].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 84 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static GUID BindMonitor_Callee32_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee32_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
#pragma code_seg(push, "bind/32")
static uint64_t
BindMonitor_Callee32(void* context)
#line 97 "sample/bindmonitor_mt_tailcall.c"
{
#line 97 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 97 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_IMM pc=0 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(0);
// EBPF_OP_EXIT pc=1 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
@ -5689,13 +6031,41 @@ static program_entry_t _programs[] = {
"bind/30",
"bind/30",
"BindMonitor_Callee30",
BindMonitor_Callee30_maps,
1,
BindMonitor_Callee30_helpers,
2,
38,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
},
{
0,
BindMonitor_Callee31,
"bind/31",
"bind/31",
"BindMonitor_Callee31",
BindMonitor_Callee31_maps,
1,
BindMonitor_Callee31_helpers,
2,
38,
&BindMonitor_Callee31_program_type_guid,
&BindMonitor_Callee31_attach_type_guid,
},
{
0,
BindMonitor_Callee32,
"bind/32",
"bind/32",
"BindMonitor_Callee32",
NULL,
0,
NULL,
0,
2,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
&BindMonitor_Callee32_program_type_guid,
&BindMonitor_Callee32_attach_type_guid,
},
{
0,
@ -5788,7 +6158,7 @@ static void
_get_programs(_Outptr_result_buffer_(*count) program_entry_t** programs, _Out_ size_t* count)
{
*programs = _programs;
*count = 32;
*count = 34;
}
static void

Просмотреть файл

@ -180,7 +180,7 @@ static map_entry_t _maps[] = {
BPF_MAP_TYPE_PROG_ARRAY, // Type of map.
4, // Size in bytes of a map key.
4, // Size in bytes of a map value.
31, // Maximum number of entries allowed in the map.
33, // Maximum number of entries allowed in the map.
0, // Inner map index.
PIN_NONE, // Pinning type for the map.
0, // Identifier for a map template.
@ -4428,38 +4428,380 @@ label_1:
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee30_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee30_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee30_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee30_maps[] = {
0,
};
#pragma code_seg(push, "bind/30")
static uint64_t
BindMonitor_Callee30(void* context)
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
{
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 83 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 83 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[1].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[1].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 83 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 83 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 83 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=31
#line 83 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(31);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee30_helpers[0].address
#line 83 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 83 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee30_helpers[0].tail_call) && (r0 == 0))
#line 83 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 83 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 83 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 83 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static helper_function_entry_t BindMonitor_Callee31_helpers[] = {
{NULL, 13, "helper_id_13"},
{NULL, 5, "helper_id_5"},
};
static GUID BindMonitor_Callee31_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee31_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
static uint16_t BindMonitor_Callee31_maps[] = {
0,
};
#pragma code_seg(push, "bind/31")
static uint64_t
BindMonitor_Callee31(void* context)
#line 84 "sample/bindmonitor_mt_tailcall.c"
{
#line 84 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 84 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r2 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r3 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r4 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r5 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r6 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r7 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 84 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_REG pc=0 dst=r6 src=r1 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r6 = r1;
// EBPF_OP_MOV64_IMM pc=1 dst=r1 src=r0 offset=0 imm=680997
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(680997);
// EBPF_OP_STXW pc=2 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=3 dst=r1 src=r0 offset=0 imm=1852383340
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)2339731488442490988;
// EBPF_OP_STXDW pc=5 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=6 dst=r7 src=r0 offset=0 imm=1818845524
#line 84 "sample/bindmonitor_mt_tailcall.c"
r7 = (uint64_t)7809632219746099540;
// EBPF_OP_STXDW pc=8 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=9 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=10 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=11 dst=r2 src=r0 offset=0 imm=20
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(20);
// EBPF_OP_MOV64_IMM pc=12 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=13 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_MOV64_REG pc=14 dst=r1 src=r6 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r6;
// EBPF_OP_LDDW pc=15 dst=r2 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = POINTER(_maps[0].address);
// EBPF_OP_MOV64_IMM pc=17 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=18 dst=r0 src=r0 offset=0 imm=5
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[1].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[1].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
// EBPF_OP_JSGT_IMM pc=19 dst=r0 src=r0 offset=16 imm=-1
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((int64_t)r0 > IMMEDIATE(-1))
#line 84 "sample/bindmonitor_mt_tailcall.c"
goto label_1;
// EBPF_OP_MOV64_IMM pc=20 dst=r1 src=r0 offset=0 imm=10
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(10);
// EBPF_OP_STXH pc=21 dst=r10 src=r1 offset=-4 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint16_t*)(uintptr_t)(r10 + OFFSET(-4)) = (uint16_t)r1;
// EBPF_OP_MOV64_IMM pc=22 dst=r1 src=r0 offset=0 imm=1680154744
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = IMMEDIATE(1680154744);
// EBPF_OP_STXW pc=23 dst=r10 src=r1 offset=-8 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint32_t*)(uintptr_t)(r10 + OFFSET(-8)) = (uint32_t)r1;
// EBPF_OP_LDDW pc=24 dst=r1 src=r0 offset=0 imm=544497952
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7306085893296906528;
// EBPF_OP_STXDW pc=26 dst=r10 src=r1 offset=-16 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-16)) = (uint64_t)r1;
// EBPF_OP_LDDW pc=27 dst=r1 src=r0 offset=0 imm=1634082924
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = (uint64_t)7234307576302018668;
// EBPF_OP_STXDW pc=29 dst=r10 src=r1 offset=-24 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-24)) = (uint64_t)r1;
// EBPF_OP_STXDW pc=30 dst=r10 src=r7 offset=-32 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
*(uint64_t*)(uintptr_t)(r10 + OFFSET(-32)) = (uint64_t)r7;
// EBPF_OP_MOV64_REG pc=31 dst=r1 src=r10 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 = r10;
// EBPF_OP_ADD64_IMM pc=32 dst=r1 src=r0 offset=0 imm=-32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r1 += IMMEDIATE(-32);
// EBPF_OP_MOV64_IMM pc=33 dst=r2 src=r0 offset=0 imm=30
#line 84 "sample/bindmonitor_mt_tailcall.c"
r2 = IMMEDIATE(30);
// EBPF_OP_MOV64_IMM pc=34 dst=r3 src=r0 offset=0 imm=32
#line 84 "sample/bindmonitor_mt_tailcall.c"
r3 = IMMEDIATE(32);
// EBPF_OP_CALL pc=35 dst=r0 src=r0 offset=0 imm=13
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = BindMonitor_Callee31_helpers[0].address
#line 84 "sample/bindmonitor_mt_tailcall.c"
(r1, r2, r3, r4, r5);
#line 84 "sample/bindmonitor_mt_tailcall.c"
if ((BindMonitor_Callee31_helpers[0].tail_call) && (r0 == 0))
#line 84 "sample/bindmonitor_mt_tailcall.c"
return 0;
label_1:
// EBPF_OP_MOV64_IMM pc=36 dst=r0 src=r0 offset=0 imm=1
#line 84 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(1);
// EBPF_OP_EXIT pc=37 dst=r0 src=r0 offset=0 imm=0
#line 84 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 84 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
static GUID BindMonitor_Callee32_program_type_guid = {
0x608c517c, 0x6c52, 0x4a26, {0xb6, 0x77, 0xbb, 0x1c, 0x34, 0x42, 0x5a, 0xdf}};
static GUID BindMonitor_Callee32_attach_type_guid = {
0xb9707e04, 0x8127, 0x4c72, {0x83, 0x3e, 0x05, 0xb1, 0xfb, 0x43, 0x94, 0x96}};
#pragma code_seg(push, "bind/32")
static uint64_t
BindMonitor_Callee32(void* context)
#line 97 "sample/bindmonitor_mt_tailcall.c"
{
#line 97 "sample/bindmonitor_mt_tailcall.c"
// Prologue
#line 97 "sample/bindmonitor_mt_tailcall.c"
uint64_t stack[(UBPF_STACK_SIZE + 7) / 8];
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r0 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r1 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
register uint64_t r10 = 0;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r1 = (uintptr_t)context;
#line 97 "sample/bindmonitor_mt_tailcall.c"
r10 = (uintptr_t)((uint8_t*)stack + sizeof(stack));
// EBPF_OP_MOV64_IMM pc=0 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
r0 = IMMEDIATE(0);
// EBPF_OP_EXIT pc=1 dst=r0 src=r0 offset=0 imm=0
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
return r0;
#line 95 "sample/bindmonitor_mt_tailcall.c"
#line 97 "sample/bindmonitor_mt_tailcall.c"
}
#pragma code_seg(pop)
#line __LINE__ __FILE__
@ -5850,13 +6192,41 @@ static program_entry_t _programs[] = {
"bind/30",
"bind/30",
"BindMonitor_Callee30",
BindMonitor_Callee30_maps,
1,
BindMonitor_Callee30_helpers,
2,
38,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
},
{
0,
BindMonitor_Callee31,
"bind/31",
"bind/31",
"BindMonitor_Callee31",
BindMonitor_Callee31_maps,
1,
BindMonitor_Callee31_helpers,
2,
38,
&BindMonitor_Callee31_program_type_guid,
&BindMonitor_Callee31_attach_type_guid,
},
{
0,
BindMonitor_Callee32,
"bind/32",
"bind/32",
"BindMonitor_Callee32",
NULL,
0,
NULL,
0,
2,
&BindMonitor_Callee30_program_type_guid,
&BindMonitor_Callee30_attach_type_guid,
&BindMonitor_Callee32_program_type_guid,
&BindMonitor_Callee32_attach_type_guid,
},
{
0,
@ -5949,7 +6319,7 @@ static void
_get_programs(_Outptr_result_buffer_(*count) program_entry_t** programs, _Out_ size_t* count)
{
*programs = _programs;
*count = 32;
*count = 34;
}
static void

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Разница между файлами не показана из-за своего большого размера Загрузить разницу

Просмотреть файл

@ -24,7 +24,7 @@ struct bpf_map_def bind_tail_call_map = {
.type = BPF_MAP_TYPE_PROG_ARRAY,
.key_size = sizeof(uint32_t),
.value_size = sizeof(uint32_t),
.max_entries = MAX_TAIL_CALL_CNT - 1};
.max_entries = MAX_TAIL_CALL_CNT};
SEC("bind")
bind_action_t
@ -80,15 +80,17 @@ DEFINE_BIND_TAIL_FUNC(26)
DEFINE_BIND_TAIL_FUNC(27)
DEFINE_BIND_TAIL_FUNC(28)
DEFINE_BIND_TAIL_FUNC(29)
DEFINE_BIND_TAIL_FUNC(30)
DEFINE_BIND_TAIL_FUNC(31)
// This line verifies that the BindMonitor_Caller prototype is correct by declaring a bind_hook_t
// variable with the same name as the first tail call function.
// This line is optional.
bind_hook_t BindMonitor_Caller;
SEC("bind/30")
SEC("bind/32")
bind_action_t
BindMonitor_Callee30(bind_md_t* ctx)
BindMonitor_Callee32(bind_md_t* ctx)
{
// This function is the last tail call function for the bind hook.
// This function returns BIND_PERMIT to allow the bind request to proceed.

Просмотреть файл

@ -0,0 +1,142 @@
// Copyright (c) Microsoft Corporation
// SPDX-License-Identifier: MIT
// Whenever this sample program changes, bpf2c_tests will fail unless the
// expected files in tests\bpf2c_tests\expected are updated. The following
// script can be used to regenerate the expected files:
// generate_expected_bpf2c_output.ps1
//
// Usage:
// .\scripts\generate_expected_bpf2c_output.ps1 <build_output_path>
// Example:
// .\scripts\generate_expected_bpf2c_output.ps1 .\x64\Debug\
#include "bpf_helpers.h"
#include "ebpf_nethooks.h"
// Define a macro that defines a program which tail calls a function for the bind hook.
#define DEFINE_BIND_TAIL_FUNC(x) \
SEC("bind/" #x) \
bind_action_t bind_test_callee##x(bind_md_t* ctx) \
{ \
int i = x + 1; \
bpf_printk("Calling tail call index [x = %d], [x+1 = %d]\n", x, i); \
if (bpf_tail_call(ctx, &bind_tail_call_map, i) < 0) { \
bpf_printk("Tail call failed at index %d\n", i); \
} \
return BIND_DENY; \
}
#define DECLARE_BIND_TAIL_FUNC(x) bind_action_t bind_test_callee##x(bind_md_t* ctx);
DECLARE_BIND_TAIL_FUNC(0)
DECLARE_BIND_TAIL_FUNC(1)
DECLARE_BIND_TAIL_FUNC(2)
DECLARE_BIND_TAIL_FUNC(3)
DECLARE_BIND_TAIL_FUNC(4)
DECLARE_BIND_TAIL_FUNC(5)
DECLARE_BIND_TAIL_FUNC(6)
DECLARE_BIND_TAIL_FUNC(7)
DECLARE_BIND_TAIL_FUNC(8)
DECLARE_BIND_TAIL_FUNC(9)
DECLARE_BIND_TAIL_FUNC(10)
DECLARE_BIND_TAIL_FUNC(11)
DECLARE_BIND_TAIL_FUNC(12)
DECLARE_BIND_TAIL_FUNC(13)
DECLARE_BIND_TAIL_FUNC(14)
DECLARE_BIND_TAIL_FUNC(15)
DECLARE_BIND_TAIL_FUNC(16)
DECLARE_BIND_TAIL_FUNC(17)
DECLARE_BIND_TAIL_FUNC(18)
DECLARE_BIND_TAIL_FUNC(19)
DECLARE_BIND_TAIL_FUNC(20)
DECLARE_BIND_TAIL_FUNC(21)
DECLARE_BIND_TAIL_FUNC(22)
DECLARE_BIND_TAIL_FUNC(23)
DECLARE_BIND_TAIL_FUNC(24)
DECLARE_BIND_TAIL_FUNC(25)
DECLARE_BIND_TAIL_FUNC(26)
DECLARE_BIND_TAIL_FUNC(27)
DECLARE_BIND_TAIL_FUNC(28)
DECLARE_BIND_TAIL_FUNC(29)
DECLARE_BIND_TAIL_FUNC(30)
DECLARE_BIND_TAIL_FUNC(31)
DECLARE_BIND_TAIL_FUNC(32)
DECLARE_BIND_TAIL_FUNC(33)
DECLARE_BIND_TAIL_FUNC(34)
struct
{
__uint(type, BPF_MAP_TYPE_PROG_ARRAY);
__type(key, uint32_t);
__uint(max_entries, MAX_TAIL_CALL_CNT + 2);
__array(values, bind_action_t(bind_md_t* ctx));
} bind_tail_call_map SEC(".maps") = {
.values = {
bind_test_callee0, bind_test_callee1, bind_test_callee2, bind_test_callee3, bind_test_callee4,
bind_test_callee5, bind_test_callee6, bind_test_callee7, bind_test_callee8, bind_test_callee9,
bind_test_callee10, bind_test_callee11, bind_test_callee12, bind_test_callee13, bind_test_callee14,
bind_test_callee15, bind_test_callee16, bind_test_callee17, bind_test_callee18, bind_test_callee19,
bind_test_callee20, bind_test_callee21, bind_test_callee22, bind_test_callee23, bind_test_callee24,
bind_test_callee25, bind_test_callee26, bind_test_callee27, bind_test_callee28, bind_test_callee29,
bind_test_callee30, bind_test_callee31, bind_test_callee32, bind_test_callee33, bind_test_callee34,
}};
DEFINE_BIND_TAIL_FUNC(0)
DEFINE_BIND_TAIL_FUNC(1)
DEFINE_BIND_TAIL_FUNC(2)
DEFINE_BIND_TAIL_FUNC(3)
DEFINE_BIND_TAIL_FUNC(4)
DEFINE_BIND_TAIL_FUNC(5)
DEFINE_BIND_TAIL_FUNC(6)
DEFINE_BIND_TAIL_FUNC(7)
DEFINE_BIND_TAIL_FUNC(8)
DEFINE_BIND_TAIL_FUNC(9)
DEFINE_BIND_TAIL_FUNC(10)
DEFINE_BIND_TAIL_FUNC(11)
DEFINE_BIND_TAIL_FUNC(12)
DEFINE_BIND_TAIL_FUNC(13)
DEFINE_BIND_TAIL_FUNC(14)
DEFINE_BIND_TAIL_FUNC(15)
DEFINE_BIND_TAIL_FUNC(16)
DEFINE_BIND_TAIL_FUNC(17)
DEFINE_BIND_TAIL_FUNC(18)
DEFINE_BIND_TAIL_FUNC(19)
DEFINE_BIND_TAIL_FUNC(20)
DEFINE_BIND_TAIL_FUNC(21)
DEFINE_BIND_TAIL_FUNC(22)
DEFINE_BIND_TAIL_FUNC(23)
DEFINE_BIND_TAIL_FUNC(24)
DEFINE_BIND_TAIL_FUNC(25)
DEFINE_BIND_TAIL_FUNC(26)
DEFINE_BIND_TAIL_FUNC(27)
DEFINE_BIND_TAIL_FUNC(28)
DEFINE_BIND_TAIL_FUNC(29)
DEFINE_BIND_TAIL_FUNC(30)
DEFINE_BIND_TAIL_FUNC(31)
DEFINE_BIND_TAIL_FUNC(32)
DEFINE_BIND_TAIL_FUNC(33)
bind_hook_t bind_test_caller;
SEC("bind")
bind_action_t
bind_test_caller(bind_md_t* ctx)
{
bpf_printk("bind_test_caller: Start tail caller.\n");
if (bpf_tail_call(ctx, &bind_tail_call_map, 0) < 0) {
bpf_printk("Failed tail call index %d\n", 0);
}
return BIND_DENY;
}
SEC("bind/34")
bind_action_t
bind_test_callee34(bind_md_t* ctx)
{
bpf_printk("Last tail call index: bind_test_callee34\n");
// This function is the last tail call function for the bind hook.
// This function returns BIND_PERMIT to allow the bind request to proceed.
return BIND_PERMIT;
}

Просмотреть файл

@ -79,6 +79,10 @@ int
sequential31(struct xdp_md* ctx);
int
sequential32(struct xdp_md* ctx);
int
sequential33(struct xdp_md* ctx);
int
sequential34(struct xdp_md* ctx);
struct
{
@ -93,7 +97,7 @@ struct
sequential7, sequential8, sequential9, sequential10, sequential11, sequential12, sequential13,
sequential14, sequential15, sequential16, sequential17, sequential18, sequential19, sequential20,
sequential21, sequential22, sequential23, sequential24, sequential25, sequential26, sequential27,
sequential28, sequential29, sequential30, sequential31, sequential32,
sequential28, sequential29, sequential30, sequential31, sequential32, sequential33, sequential34
},
};
@ -106,8 +110,8 @@ struct
} canary SEC(".maps");
// Define a program that calls the next program in the array.
// The first program in the array is at index 0.
// The last program in the array is at index 32.
// There are 33 tail calls in the array, starting from index 1 to 33.
// The last program in the array is at index 33, to test MAX_TAIL_CALL_COUNT.
// Each program increments the value in the canary map at index 0.
// If the canary value is not equal to the program index, the program returns 1
// which will cause the test to fail.
@ -161,3 +165,5 @@ TAIL_CALL(29)
TAIL_CALL(30)
TAIL_CALL(31)
TAIL_CALL(32)
TAIL_CALL(33)
TAIL_CALL(34)

Просмотреть файл

@ -13,13 +13,6 @@
#include "socket_helper.h"
#include "socket_tests_common.h"
// The helper function definitions in bpf_helpers.h conflict with the definitions
// in libbpf.h, but this code needs to use MAX_TAIL_CALL_CNT from bpf_helpers.h.
// Work around this by defining MAX_TAIL_CALL_CNT here.
#if !defined(MAX_TAIL_CALL_CNT)
#define MAX_TAIL_CALL_CNT 32
#endif
// Note: The 'program' and 'execution' types are not required for km tests.
static const std::map<std::string, test_program_attributes> _test_program_info = {
{{"cgroup_sock_addr"},
@ -1126,7 +1119,7 @@ _set_up_tailcall_program(bpf_object* object, const std::string& map_name)
LOG_VERBOSE("({}) Opened fd:{} for map:{}", __func__, prog_map_fd, map_name.c_str());
// Set up tail calls.
for (int index = 0; index < MAX_TAIL_CALL_CNT - 1; index++) {
for (int index = 0; index < MAX_TAIL_CALL_CNT; index++) {
try {
std::string bind_program_name{"BindMonitor_Callee"};
bind_program_name += std::to_string(index);

Просмотреть файл

@ -104,7 +104,7 @@ Sample command line invocations:
- Delay of 250 ms between successive extension restarts.
## 1.6. bindmonitor_tail_call_invoke_program_test
This test first loads a specific native eBPF program. It then loads all the MAX_TAIL_CALL_CNT-1 tail call programs and updates the program array map. It then creates the specified number of threads where each thread attempts a TCP 'bind' to the same port continuously in a loop. The test setup guarantees that the `thread_index` passed in each `thread_context` is unique to that thread, so that each thread gets a unique port (base_port + thread_index).
This test first loads a specific native eBPF program. It then loads all the MAX_TAIL_CALL_CNT tail call programs and updates the program array map. It then creates the specified number of threads where each thread attempts a TCP 'bind' to the same port continuously in a loop. The test setup guarantees that the `thread_index` passed in each `thread_context` is unique to that thread, so that each thread gets a unique port (base_port + thread_index).
This causes the invocation of the in-kernel eBPF tail call programs to be executed in sequence. The last tail call program returns a PERMIT verdict.

Просмотреть файл

@ -20,13 +20,6 @@
#include <stop_token>
#include <thread>
// The helper function definitions in bpf_helpers.h conflict with the definitions
// in libbpf.h, but this code needs to use MAX_TAIL_CALL_CNT from bpf_helpers.h.
// Work around this by defining MAX_TAIL_CALL_CNT here.
#if !defined(MAX_TAIL_CALL_CNT)
#define MAX_TAIL_CALL_CNT 32
#endif
// libbpf.h uses enum types and generates the
// following warning whenever an enum type is used below:
// "The enum type 'bpf_attach_type' is unscoped.
@ -2899,8 +2892,10 @@ TEST_CASE("recursive_tail_call", "[libbpf]")
}
// Verify that the printk output is correct.
REQUIRE(output.size() == MAX_TAIL_CALL_CNT);
for (size_t i = 0; i < MAX_TAIL_CALL_CNT; i++) {
// In 'recurse' ebpf program, the printk is added even to the caller.
// Hence the printk count is called MAX_TAIL_CALL_CNT + 1 times.
REQUIRE(output.size() == MAX_TAIL_CALL_CNT + 1);
for (size_t i = 0; i < MAX_TAIL_CALL_CNT + 1; i++) {
REQUIRE(output[i] == std::format("recurse: *value={}", i));
}
@ -2910,8 +2905,8 @@ TEST_CASE("recursive_tail_call", "[libbpf]")
// Read the map to determine how many times the program was called.
REQUIRE(bpf_map_lookup_elem(canary_map_fd, &key, &value) == 0);
// The program should have been called MAX_TAIL_CALL_CNT times.
REQUIRE(value == MAX_TAIL_CALL_CNT);
// The program should have been called MAX_TAIL_CALL_CNT + 1 times.
REQUIRE(value == MAX_TAIL_CALL_CNT + 1);
// Close the map and programs.
bpf_object__close(object);
@ -2967,8 +2962,10 @@ TEST_CASE("sequential_tail_call", "[libbpf]")
}
// Verify that the printk output is correct.
REQUIRE(output.size() == MAX_TAIL_CALL_CNT);
for (size_t i = 0; i < MAX_TAIL_CALL_CNT; i++) {
// In 'sequential' ebpf program, the printk is added even to the caller.
// Hence the printk count is called MAX_TAIL_CALL_CNT + 1 times.
REQUIRE(output.size() == MAX_TAIL_CALL_CNT + 1);
for (size_t i = 0; i < MAX_TAIL_CALL_CNT + 1; i++) {
REQUIRE(output[i] == std::format("sequential{}: *value={}", i, i));
}
@ -2978,8 +2975,90 @@ TEST_CASE("sequential_tail_call", "[libbpf]")
REQUIRE(bpf_map_lookup_elem(canary_map_fd, &key, &value) == 0);
// The program should have been called MAX_TAIL_CALL_CNT times.
REQUIRE(value == MAX_TAIL_CALL_CNT);
REQUIRE(value == MAX_TAIL_CALL_CNT + 1);
// The last program should have returned -EBPF_NO_MORE_TAIL_CALLS.
REQUIRE(opts.retval == -EBPF_NO_MORE_TAIL_CALLS);
}
bind_action_t
emulate_bind_tail_call(std::function<ebpf_result_t(void*, uint32_t*)>& invoke, uint64_t pid, const char* appid)
{
uint32_t result;
std::string app_id = appid;
bind_md_t ctx{0};
ctx.app_id_start = (uint8_t*)app_id.c_str();
ctx.app_id_end = (uint8_t*)(app_id.c_str()) + app_id.size();
ctx.process_id = pid;
ctx.operation = BIND_OPERATION_BIND;
REQUIRE(invoke(reinterpret_cast<void*>(&ctx), &result) == EBPF_SUCCESS);
return static_cast<bind_action_t>(result);
}
TEST_CASE("bind_tail_call_max_exceed", "[libbpf]")
{
const int TOTAL_TAIL_CALL = MAX_TAIL_CALL_CNT + 2;
usersim_trace_logging_set_enabled(true, _EBPF_TRACELOG_LEVEL_ERROR, MAXUINT64);
_test_helper_end_to_end test_helper;
test_helper.initialize();
program_info_provider_t bind_program_info;
REQUIRE(bind_program_info.initialize(EBPF_PROGRAM_TYPE_BIND) == EBPF_SUCCESS);
struct bpf_object* object = bpf_object__open("tail_call_max_exceed_um.dll");
REQUIRE(object != nullptr);
// Load the BPF program.
REQUIRE(bpf_object__load(object) == 0);
// Get the map used to store the next program to call.
struct bpf_map* map = bpf_object__find_map_by_name(object, "bind_tail_call_map");
REQUIRE(map != nullptr);
// Get the fd of the prog array map.
fd_t map_fd = bpf_map__fd(map);
REQUIRE(map_fd > 0);
std::string first_program_name{"bind_test_caller"};
struct bpf_program* first_program = bpf_object__find_program_by_name(object, first_program_name.c_str());
REQUIRE(first_program != nullptr);
fd_t first_program_fd = bpf_program__fd(first_program);
REQUIRE(first_program_fd > 0);
// Verify that the prog_array map contains the correct number of TOTAL_TAIL_CALL programs.
uint32_t key = 0;
uint32_t val = 0;
bpf_map_lookup_elem(map_fd, &key, &val);
for (int x = 0; x < TOTAL_TAIL_CALL - 1; x++) {
REQUIRE(bpf_map_get_next_key(map_fd, &key, &key) == 0);
uint32_t value = 0;
bpf_map_lookup_elem(map_fd, &key, &value);
REQUIRE(key != 0);
}
REQUIRE(bpf_map_get_next_key(map_fd, &key, &key) < 0);
REQUIRE(errno == ENOENT);
// Create a hook for the bind program.
single_instance_hook_t hook(EBPF_PROGRAM_TYPE_BIND, EBPF_ATTACH_TYPE_BIND);
REQUIRE(hook.initialize() == EBPF_SUCCESS);
// Attach the hook.
bpf_link_ptr link;
uint32_t ifindex = 0;
uint64_t fake_pid = 123456;
REQUIRE(hook.attach_link(first_program_fd, &ifindex, sizeof(ifindex), &link) == EBPF_SUCCESS);
std::function<ebpf_result_t(void*, uint32_t*)> invoke =
[&hook](_Inout_ void* context, _Out_ uint32_t* result) -> ebpf_result_t { return hook.fire(context, result); };
// Binding to the port should be denied because the number of tail call programs exceeds MAX_TAIL_CALL_COUNT.
REQUIRE(emulate_bind_tail_call(invoke, fake_pid, "fake_app_1") == BIND_DENY);
hook.detach_and_close_link(&link);
usersim_trace_logging_set_enabled(false, 0, 0);
}