Skip to content

Support array presets in veristat #5486

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
127 changes: 122 additions & 5 deletions tools/testing/selftests/bpf/prog_tests/test_veristat.c
Original file line number Diff line number Diff line change
Expand Up @@ -60,13 +60,19 @@ static void test_set_global_vars_succeeds(void)
" -G \"var_s8 = -128\" "\
" -G \"var_u8 = 255\" "\
" -G \"var_ea = EA2\" "\
" -G \"var_eb = EB2\" "\
" -G \"var_ec = EC2\" "\
" -G \"var_eb = EB2\" "\
" -G \"var_ec=EC2\" "\
" -G \"var_b = 1\" "\
" -G \"struct1.struct2.u.var_u8 = 170\" "\
" -G \"struct1[2].struct2[1][2].u.var_u8[2]=170\" "\
" -G \"union1.struct3.var_u8_l = 0xaa\" "\
" -G \"union1.struct3.var_u8_h = 0xaa\" "\
"-vl2 > %s", fix->veristat, fix->tmpfile);
" -G \"arr[3]= 171\" " \
" -G \"arr[EA2] =172\" " \
" -G \"enum_arr[EC2]=EA3\" " \
" -G \"three_d[31][7][EA2]=173\"" \
" -G \"struct1[2].struct2[1][2].u.mat[5][3]=174\" " \
" -G \"struct11[7][5].struct2[0][1].u.mat[3][0] = 175\" " \
" -vl2 > %s", fix->veristat, fix->tmpfile);

read(fix->fd, fix->output, fix->sz);
__CHECK_STR("_w=0xf000000000000001 ", "var_s64 = 0xf000000000000001");
Expand All @@ -81,8 +87,14 @@ static void test_set_global_vars_succeeds(void)
__CHECK_STR("_w=12 ", "var_eb = EB2");
__CHECK_STR("_w=13 ", "var_ec = EC2");
__CHECK_STR("_w=1 ", "var_b = 1");
__CHECK_STR("_w=170 ", "struct1.struct2.u.var_u8 = 170");
__CHECK_STR("_w=170 ", "struct1[2].struct2[1][2].u.var_u8[2]=170");
__CHECK_STR("_w=0xaaaa ", "union1.var_u16 = 0xaaaa");
__CHECK_STR("_w=171 ", "arr[3]= 171");
__CHECK_STR("_w=172 ", "arr[EA2] =172");
__CHECK_STR("_w=10 ", "enum_arr[EC2]=EA3");
__CHECK_STR("_w=173 ", "matrix[31][7][11]=173");
__CHECK_STR("_w=174 ", "struct1[2].struct2[1][2].u.mat[5][3]=174");
__CHECK_STR("_w=175 ", "struct11[7][5].struct2[0][1].u.mat[3][0]=175");

out:
teardown_fixture(fix);
Expand Down Expand Up @@ -129,6 +141,95 @@ static void test_set_global_vars_out_of_range(void)
teardown_fixture(fix);
}

static void test_unsupported_ptr_array_type(void)
{
struct fixture *fix = init_fixture();

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"ptr_arr[0] = 0\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

read(fix->fd, fix->output, fix->sz);
__CHECK_STR("Can't set ptr_arr[0]. Only ints and enums are supported", "ptr_arr");

out:
teardown_fixture(fix);
}

static void test_array_out_of_bounds(void)
{
struct fixture *fix = init_fixture();

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"arr[99] = 0\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

read(fix->fd, fix->output, fix->sz);
__CHECK_STR("Array index 99 is out of bounds", "arr[99]");

out:
teardown_fixture(fix);
}

static void test_array_index_not_found(void)
{
struct fixture *fix = init_fixture();

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"arr[EG2] = 0\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

read(fix->fd, fix->output, fix->sz);
__CHECK_STR("Can't resolve enum value EG2", "arr[EG2]");

out:
teardown_fixture(fix);
}

static void test_array_index_for_non_array(void)
{
struct fixture *fix = init_fixture();

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"var_b[0] = 1\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

pread(fix->fd, fix->output, fix->sz, 0);
__CHECK_STR("Array index is not expected for var_b", "var_b[0] = 1");

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"union1.struct3[0].var_u8_l=1\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

pread(fix->fd, fix->output, fix->sz, 0);
__CHECK_STR("Array index is not expected for struct3", "union1.struct3[0].var_u8_l=1");

out:
teardown_fixture(fix);
}

static void test_no_array_index_for_array(void)
{
struct fixture *fix = init_fixture();

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"arr = 1\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

pread(fix->fd, fix->output, fix->sz, 0);
__CHECK_STR("Can't set arr. Only ints and enums are supported", "arr = 1");

SYS_FAIL(out,
"%s set_global_vars.bpf.o -G \"struct1[0].struct2.u.var_u8[2]=1\" -vl2 2> %s",
fix->veristat, fix->tmpfile);

pread(fix->fd, fix->output, fix->sz, 0);
__CHECK_STR("Can't resolve field u for non-composite type", "struct1[0].struct2.u.var_u8[2]=1");

out:
teardown_fixture(fix);
}

void test_veristat(void)
{
if (test__start_subtest("set_global_vars_succeeds"))
Expand All @@ -139,6 +240,22 @@ void test_veristat(void)

if (test__start_subtest("set_global_vars_from_file_succeeds"))
test_set_global_vars_from_file_succeeds();

if (test__start_subtest("test_unsupported_ptr_array_type"))
test_unsupported_ptr_array_type();

if (test__start_subtest("test_array_out_of_bounds"))
test_array_out_of_bounds();

if (test__start_subtest("test_array_index_not_found"))
test_array_index_not_found();

if (test__start_subtest("test_array_index_for_non_array"))
test_array_index_for_non_array();

if (test__start_subtest("test_no_array_index_for_array"))
test_no_array_index_for_array();

}

#undef __CHECK_STR
56 changes: 37 additions & 19 deletions tools/testing/selftests/bpf/progs/set_global_vars.c
Original file line number Diff line number Diff line change
Expand Up @@ -7,22 +7,30 @@

char _license[] SEC("license") = "GPL";

enum Enum { EA1 = 0, EA2 = 11 };
typedef __s32 s32;
typedef s32 i32;
typedef __u8 u8;

enum Enum { EA1 = 0, EA2 = 11, EA3 = 10 };
enum Enumu64 {EB1 = 0llu, EB2 = 12llu };
enum Enums64 { EC1 = 0ll, EC2 = 13ll };

const volatile __s64 var_s64 = -1;
const volatile __u64 var_u64 = 0;
const volatile __s32 var_s32 = -1;
const volatile i32 var_s32 = -1;
const volatile __u32 var_u32 = 0;
const volatile __s16 var_s16 = -1;
const volatile __u16 var_u16 = 0;
const volatile __s8 var_s8 = -1;
const volatile __u8 var_u8 = 0;
const volatile u8 var_u8 = 0;
const volatile enum Enum var_ea = EA1;
const volatile enum Enumu64 var_eb = EB1;
const volatile enum Enums64 var_ec = EC1;
const volatile bool var_b = false;
const volatile i32 arr[32];
const volatile enum Enum enum_arr[32];
const volatile i32 three_d[47][19][17];
const volatile i32 *ptr_arr[32];

struct Struct {
int:16;
Expand All @@ -35,34 +43,38 @@ struct Struct {
volatile struct {
const int:1;
union {
const volatile __u8 var_u8;
const volatile u8 var_u8[3];
const volatile __s16 filler3;
const int:1;
s32 mat[7][5];
} u;
};
} struct2;
} struct2[2][4];
};

const volatile __u32 stru = 0; /* same prefix as below */
const volatile struct Struct struct1 = {.struct2 = {.u = {.var_u8 = 1}}};
const volatile struct Struct struct1[3];
const volatile struct Struct struct11[11][7];

union Union {
__u16 var_u16;
struct Struct3 {
struct {
__u8 var_u8_l;
};
struct Struct3 {
struct {
u8 var_u8_l;
};
struct {
struct {
struct {
__u8 var_u8_h;
};
u8 var_u8_h;
};
} struct3;
};
};

const volatile union Union union1 = {.var_u16 = -1};
typedef struct Struct3 Struct3_t;

char arr[4] = {0};
union Union {
__u16 var_u16;
Struct3_t struct3;
};

const volatile union Union union1 = {.var_u16 = -1};

SEC("socket")
int test_set_globals(void *ctx)
Expand All @@ -81,8 +93,14 @@ int test_set_globals(void *ctx)
a = var_eb;
a = var_ec;
a = var_b;
a = struct1.struct2.u.var_u8;
a = struct1[2].struct2[1][2].u.var_u8[2];
a = union1.var_u16;
a = arr[3];
a = arr[EA2];
a = enum_arr[EC2];
a = three_d[31][7][EA2];
a = struct1[2].struct2[1][2].u.mat[5][3];
a = struct11[7][5].struct2[0][1].u.mat[3][0];

return a;
}
Loading
Loading