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:
Родитель
f595311665
Коммит
5cc488fb08
|
@ -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);
|
||||
}
|
||||
|
|
Загрузка…
Ссылка в новой задаче