Merge git://git.kernel.org/pub/scm/linux/kernel/git/bpf/bpf
Daniel Borkmann says: ==================== pull-request: bpf 2020-08-15 The following pull-request contains BPF updates for your *net* tree. We've added 23 non-merge commits during the last 4 day(s) which contain a total of 32 files changed, 421 insertions(+), 141 deletions(-). The main changes are: 1) Fix sock_ops ctx access splat due to register override, from John Fastabend. 2) Batch of various fixes to libbpf, bpftool, and selftests when testing build in 32-bit mode, from Andrii Nakryiko. 3) Fix vmlinux.h generation on ARM by mapping GCC built-in types (__Poly*_t) to equivalent ones clang can work with, from Jean-Philippe Brucker. 4) Fix build_id lookup in bpf_get_stackid() helper by walking all NOTE ELF sections instead of just first, from Jiri Olsa. 5) Avoid use of __builtin_offsetof() in libbpf for CO-RE, from Yonghong Song. 6) Fix segfault in test_mmap due to inconsistent length params, from Jianlin Lv. 7) Don't override errno in libbpf when logging errors, from Toke Høiland-Jørgensen. 8) Fix v4_to_v6 sockaddr conversion in sk_lookup test, from Stanislav Fomichev. 9) Add link to bpf-helpers(7) man page to BPF doc, from Joe Stringer. ==================== Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
@@ -159,15 +159,15 @@ void test_bpf_obj_id(void)
|
||||
/* Check getting link info */
|
||||
info_len = sizeof(struct bpf_link_info) * 2;
|
||||
bzero(&link_infos[i], info_len);
|
||||
link_infos[i].raw_tracepoint.tp_name = (__u64)&tp_name;
|
||||
link_infos[i].raw_tracepoint.tp_name = ptr_to_u64(&tp_name);
|
||||
link_infos[i].raw_tracepoint.tp_name_len = sizeof(tp_name);
|
||||
err = bpf_obj_get_info_by_fd(bpf_link__fd(links[i]),
|
||||
&link_infos[i], &info_len);
|
||||
if (CHECK(err ||
|
||||
link_infos[i].type != BPF_LINK_TYPE_RAW_TRACEPOINT ||
|
||||
link_infos[i].prog_id != prog_infos[i].id ||
|
||||
link_infos[i].raw_tracepoint.tp_name != (__u64)&tp_name ||
|
||||
strcmp((char *)link_infos[i].raw_tracepoint.tp_name,
|
||||
link_infos[i].raw_tracepoint.tp_name != ptr_to_u64(&tp_name) ||
|
||||
strcmp(u64_to_ptr(link_infos[i].raw_tracepoint.tp_name),
|
||||
"sys_enter") ||
|
||||
info_len != sizeof(struct bpf_link_info),
|
||||
"get-link-info(fd)",
|
||||
@@ -178,7 +178,7 @@ void test_bpf_obj_id(void)
|
||||
link_infos[i].type, BPF_LINK_TYPE_RAW_TRACEPOINT,
|
||||
link_infos[i].id,
|
||||
link_infos[i].prog_id, prog_infos[i].id,
|
||||
(char *)link_infos[i].raw_tracepoint.tp_name,
|
||||
(const char *)u64_to_ptr(link_infos[i].raw_tracepoint.tp_name),
|
||||
"sys_enter"))
|
||||
goto done;
|
||||
|
||||
|
||||
@@ -12,15 +12,16 @@ void btf_dump_printf(void *ctx, const char *fmt, va_list args)
|
||||
static struct btf_dump_test_case {
|
||||
const char *name;
|
||||
const char *file;
|
||||
bool known_ptr_sz;
|
||||
struct btf_dump_opts opts;
|
||||
} btf_dump_test_cases[] = {
|
||||
{"btf_dump: syntax", "btf_dump_test_case_syntax", {}},
|
||||
{"btf_dump: ordering", "btf_dump_test_case_ordering", {}},
|
||||
{"btf_dump: padding", "btf_dump_test_case_padding", {}},
|
||||
{"btf_dump: packing", "btf_dump_test_case_packing", {}},
|
||||
{"btf_dump: bitfields", "btf_dump_test_case_bitfields", {}},
|
||||
{"btf_dump: multidim", "btf_dump_test_case_multidim", {}},
|
||||
{"btf_dump: namespacing", "btf_dump_test_case_namespacing", {}},
|
||||
{"btf_dump: syntax", "btf_dump_test_case_syntax", true, {}},
|
||||
{"btf_dump: ordering", "btf_dump_test_case_ordering", false, {}},
|
||||
{"btf_dump: padding", "btf_dump_test_case_padding", true, {}},
|
||||
{"btf_dump: packing", "btf_dump_test_case_packing", true, {}},
|
||||
{"btf_dump: bitfields", "btf_dump_test_case_bitfields", true, {}},
|
||||
{"btf_dump: multidim", "btf_dump_test_case_multidim", false, {}},
|
||||
{"btf_dump: namespacing", "btf_dump_test_case_namespacing", false, {}},
|
||||
};
|
||||
|
||||
static int btf_dump_all_types(const struct btf *btf,
|
||||
@@ -62,6 +63,18 @@ static int test_btf_dump_case(int n, struct btf_dump_test_case *t)
|
||||
goto done;
|
||||
}
|
||||
|
||||
/* tests with t->known_ptr_sz have no "long" or "unsigned long" type,
|
||||
* so it's impossible to determine correct pointer size; but if they
|
||||
* do, it should be 8 regardless of host architecture, becaues BPF
|
||||
* target is always 64-bit
|
||||
*/
|
||||
if (!t->known_ptr_sz) {
|
||||
btf__set_pointer_size(btf, 8);
|
||||
} else {
|
||||
CHECK(btf__pointer_size(btf) != 8, "ptr_sz", "exp %d, got %zu\n",
|
||||
8, btf__pointer_size(btf));
|
||||
}
|
||||
|
||||
snprintf(out_file, sizeof(out_file), "/tmp/%s.output.XXXXXX", t->file);
|
||||
fd = mkstemp(out_file);
|
||||
if (CHECK(fd < 0, "create_tmp", "failed to create file: %d\n", fd)) {
|
||||
|
||||
@@ -159,8 +159,8 @@ void test_core_extern(void)
|
||||
exp = (uint64_t *)&t->data;
|
||||
for (j = 0; j < n; j++) {
|
||||
CHECK(got[j] != exp[j], "check_res",
|
||||
"result #%d: expected %lx, but got %lx\n",
|
||||
j, exp[j], got[j]);
|
||||
"result #%d: expected %llx, but got %llx\n",
|
||||
j, (__u64)exp[j], (__u64)got[j]);
|
||||
}
|
||||
cleanup:
|
||||
test_core_extern__destroy(skel);
|
||||
|
||||
@@ -237,8 +237,8 @@
|
||||
.union_sz = sizeof(((type *)0)->union_field), \
|
||||
.arr_sz = sizeof(((type *)0)->arr_field), \
|
||||
.arr_elem_sz = sizeof(((type *)0)->arr_field[0]), \
|
||||
.ptr_sz = sizeof(((type *)0)->ptr_field), \
|
||||
.enum_sz = sizeof(((type *)0)->enum_field), \
|
||||
.ptr_sz = 8, /* always 8-byte pointer for BPF */ \
|
||||
.enum_sz = sizeof(((type *)0)->enum_field), \
|
||||
}
|
||||
|
||||
#define SIZE_CASE(name) { \
|
||||
@@ -432,20 +432,20 @@ static struct core_reloc_test_case test_cases[] = {
|
||||
.sb4 = -1,
|
||||
.sb20 = -0x17654321,
|
||||
.u32 = 0xBEEF,
|
||||
.s32 = -0x3FEDCBA987654321,
|
||||
.s32 = -0x3FEDCBA987654321LL,
|
||||
}),
|
||||
BITFIELDS_CASE(bitfields___bitfield_vs_int, {
|
||||
.ub1 = 0xFEDCBA9876543210,
|
||||
.ub1 = 0xFEDCBA9876543210LL,
|
||||
.ub2 = 0xA6,
|
||||
.ub7 = -0x7EDCBA987654321,
|
||||
.sb4 = -0x6123456789ABCDE,
|
||||
.sb20 = 0xD00D,
|
||||
.ub7 = -0x7EDCBA987654321LL,
|
||||
.sb4 = -0x6123456789ABCDELL,
|
||||
.sb20 = 0xD00DLL,
|
||||
.u32 = -0x76543,
|
||||
.s32 = 0x0ADEADBEEFBADB0B,
|
||||
.s32 = 0x0ADEADBEEFBADB0BLL,
|
||||
}),
|
||||
BITFIELDS_CASE(bitfields___just_big_enough, {
|
||||
.ub1 = 0xF,
|
||||
.ub2 = 0x0812345678FEDCBA,
|
||||
.ub1 = 0xFLL,
|
||||
.ub2 = 0x0812345678FEDCBALL,
|
||||
}),
|
||||
BITFIELDS_ERR_CASE(bitfields___err_too_big_bitfield),
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
|
||||
__u32 duration = 0, retval;
|
||||
struct bpf_map *data_map;
|
||||
const int zero = 0;
|
||||
u64 *result = NULL;
|
||||
__u64 *result = NULL;
|
||||
|
||||
err = bpf_prog_load(target_obj_file, BPF_PROG_TYPE_UNSPEC,
|
||||
&pkt_obj, &pkt_fd);
|
||||
@@ -29,7 +29,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
|
||||
|
||||
link = calloc(sizeof(struct bpf_link *), prog_cnt);
|
||||
prog = calloc(sizeof(struct bpf_program *), prog_cnt);
|
||||
result = malloc((prog_cnt + 32 /* spare */) * sizeof(u64));
|
||||
result = malloc((prog_cnt + 32 /* spare */) * sizeof(__u64));
|
||||
if (CHECK(!link || !prog || !result, "alloc_memory",
|
||||
"failed to alloc memory"))
|
||||
goto close_prog;
|
||||
@@ -72,7 +72,7 @@ static void test_fexit_bpf2bpf_common(const char *obj_file,
|
||||
goto close_prog;
|
||||
|
||||
for (i = 0; i < prog_cnt; i++)
|
||||
if (CHECK(result[i] != 1, "result", "fexit_bpf2bpf failed err %ld\n",
|
||||
if (CHECK(result[i] != 1, "result", "fexit_bpf2bpf failed err %llu\n",
|
||||
result[i]))
|
||||
goto close_prog;
|
||||
|
||||
|
||||
@@ -591,7 +591,7 @@ void test_flow_dissector(void)
|
||||
CHECK_ATTR(tattr.data_size_out != sizeof(flow_keys) ||
|
||||
err || tattr.retval != 1,
|
||||
tests[i].name,
|
||||
"err %d errno %d retval %d duration %d size %u/%lu\n",
|
||||
"err %d errno %d retval %d duration %d size %u/%zu\n",
|
||||
err, errno, tattr.retval, tattr.duration,
|
||||
tattr.data_size_out, sizeof(flow_keys));
|
||||
CHECK_FLOW_KEYS(tests[i].name, flow_keys, tests[i].keys);
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
static void test_global_data_number(struct bpf_object *obj, __u32 duration)
|
||||
{
|
||||
int i, err, map_fd;
|
||||
uint64_t num;
|
||||
__u64 num;
|
||||
|
||||
map_fd = bpf_find_map(__func__, obj, "result_number");
|
||||
if (CHECK_FAIL(map_fd < 0))
|
||||
@@ -14,7 +14,7 @@ static void test_global_data_number(struct bpf_object *obj, __u32 duration)
|
||||
struct {
|
||||
char *name;
|
||||
uint32_t key;
|
||||
uint64_t num;
|
||||
__u64 num;
|
||||
} tests[] = {
|
||||
{ "relocate .bss reference", 0, 0 },
|
||||
{ "relocate .data reference", 1, 42 },
|
||||
@@ -32,7 +32,7 @@ static void test_global_data_number(struct bpf_object *obj, __u32 duration)
|
||||
for (i = 0; i < sizeof(tests) / sizeof(tests[0]); i++) {
|
||||
err = bpf_map_lookup_elem(map_fd, &tests[i].key, &num);
|
||||
CHECK(err || num != tests[i].num, tests[i].name,
|
||||
"err %d result %lx expected %lx\n",
|
||||
"err %d result %llx expected %llx\n",
|
||||
err, num, tests[i].num);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -21,7 +21,7 @@ void test_mmap(void)
|
||||
const long page_size = sysconf(_SC_PAGE_SIZE);
|
||||
int err, duration = 0, i, data_map_fd, data_map_id, tmp_fd, rdmap_fd;
|
||||
struct bpf_map *data_map, *bss_map;
|
||||
void *bss_mmaped = NULL, *map_mmaped = NULL, *tmp1, *tmp2;
|
||||
void *bss_mmaped = NULL, *map_mmaped = NULL, *tmp0, *tmp1, *tmp2;
|
||||
struct test_mmap__bss *bss_data;
|
||||
struct bpf_map_info map_info;
|
||||
__u32 map_info_sz = sizeof(map_info);
|
||||
@@ -183,16 +183,23 @@ void test_mmap(void)
|
||||
|
||||
/* check some more advanced mmap() manipulations */
|
||||
|
||||
/* map all but last page: pages 1-3 mapped */
|
||||
tmp1 = mmap(NULL, 3 * page_size, PROT_READ, MAP_SHARED,
|
||||
data_map_fd, 0);
|
||||
if (CHECK(tmp1 == MAP_FAILED, "adv_mmap1", "errno %d\n", errno))
|
||||
tmp0 = mmap(NULL, 4 * page_size, PROT_READ, MAP_SHARED | MAP_ANONYMOUS,
|
||||
-1, 0);
|
||||
if (CHECK(tmp0 == MAP_FAILED, "adv_mmap0", "errno %d\n", errno))
|
||||
goto cleanup;
|
||||
|
||||
/* map all but last page: pages 1-3 mapped */
|
||||
tmp1 = mmap(tmp0, 3 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED,
|
||||
data_map_fd, 0);
|
||||
if (CHECK(tmp0 != tmp1, "adv_mmap1", "tmp0: %p, tmp1: %p\n", tmp0, tmp1)) {
|
||||
munmap(tmp0, 4 * page_size);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
/* unmap second page: pages 1, 3 mapped */
|
||||
err = munmap(tmp1 + page_size, page_size);
|
||||
if (CHECK(err, "adv_mmap2", "errno %d\n", errno)) {
|
||||
munmap(tmp1, map_sz);
|
||||
munmap(tmp1, 4 * page_size);
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
@@ -201,7 +208,7 @@ void test_mmap(void)
|
||||
MAP_SHARED | MAP_FIXED, data_map_fd, 0);
|
||||
if (CHECK(tmp2 == MAP_FAILED, "adv_mmap3", "errno %d\n", errno)) {
|
||||
munmap(tmp1, page_size);
|
||||
munmap(tmp1 + 2*page_size, page_size);
|
||||
munmap(tmp1 + 2*page_size, 2 * page_size);
|
||||
goto cleanup;
|
||||
}
|
||||
CHECK(tmp1 + page_size != tmp2, "adv_mmap4",
|
||||
@@ -211,7 +218,7 @@ void test_mmap(void)
|
||||
tmp2 = mmap(tmp1, 4 * page_size, PROT_READ, MAP_SHARED | MAP_FIXED,
|
||||
data_map_fd, 0);
|
||||
if (CHECK(tmp2 == MAP_FAILED, "adv_mmap5", "errno %d\n", errno)) {
|
||||
munmap(tmp1, 3 * page_size); /* unmap page 1 */
|
||||
munmap(tmp1, 4 * page_size); /* unmap page 1 */
|
||||
goto cleanup;
|
||||
}
|
||||
CHECK(tmp1 != tmp2, "adv_mmap6", "tmp1: %p, tmp2: %p\n", tmp1, tmp2);
|
||||
|
||||
@@ -28,7 +28,7 @@ void test_prog_run_xattr(void)
|
||||
"err %d errno %d retval %d\n", err, errno, tattr.retval);
|
||||
|
||||
CHECK_ATTR(tattr.data_size_out != sizeof(pkt_v4), "data_size_out",
|
||||
"incorrect output size, want %lu have %u\n",
|
||||
"incorrect output size, want %zu have %u\n",
|
||||
sizeof(pkt_v4), tattr.data_size_out);
|
||||
|
||||
CHECK_ATTR(buf[5] != 0, "overflow",
|
||||
|
||||
@@ -309,6 +309,7 @@ static void v4_to_v6(struct sockaddr_storage *ss)
|
||||
v6->sin6_addr.s6_addr[10] = 0xff;
|
||||
v6->sin6_addr.s6_addr[11] = 0xff;
|
||||
memcpy(&v6->sin6_addr.s6_addr[12], &v4.sin_addr.s_addr, 4);
|
||||
memset(&v6->sin6_addr.s6_addr[0], 0, 10);
|
||||
}
|
||||
|
||||
static int udp_recv_send(int server_fd)
|
||||
|
||||
@@ -81,7 +81,7 @@ void test_skb_ctx(void)
|
||||
|
||||
CHECK_ATTR(tattr.ctx_size_out != sizeof(skb),
|
||||
"ctx_size_out",
|
||||
"incorrect output size, want %lu have %u\n",
|
||||
"incorrect output size, want %zu have %u\n",
|
||||
sizeof(skb), tattr.ctx_size_out);
|
||||
|
||||
for (i = 0; i < 5; i++)
|
||||
|
||||
@@ -44,25 +44,25 @@ void test_varlen(void)
|
||||
CHECK_VAL(bss->payload1_len2, size2);
|
||||
CHECK_VAL(bss->total1, size1 + size2);
|
||||
CHECK(memcmp(bss->payload1, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
"doesn't match!\n");
|
||||
|
||||
CHECK_VAL(data->payload2_len1, size1);
|
||||
CHECK_VAL(data->payload2_len2, size2);
|
||||
CHECK_VAL(data->total2, size1 + size2);
|
||||
CHECK(memcmp(data->payload2, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
"doesn't match!\n");
|
||||
|
||||
CHECK_VAL(data->payload3_len1, size1);
|
||||
CHECK_VAL(data->payload3_len2, size2);
|
||||
CHECK_VAL(data->total3, size1 + size2);
|
||||
CHECK(memcmp(data->payload3, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
"doesn't match!\n");
|
||||
|
||||
CHECK_VAL(data->payload4_len1, size1);
|
||||
CHECK_VAL(data->payload4_len2, size2);
|
||||
CHECK_VAL(data->total4, size1 + size2);
|
||||
CHECK(memcmp(data->payload4, exp_str, size1 + size2), "content_check",
|
||||
"doesn't match!");
|
||||
"doesn't match!\n");
|
||||
cleanup:
|
||||
test_varlen__destroy(skel);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,10 @@
|
||||
#include <stdint.h>
|
||||
#include <stdbool.h>
|
||||
|
||||
void preserce_ptr_sz_fn(long x) {}
|
||||
|
||||
#define __bpf_aligned __attribute__((aligned(8)))
|
||||
|
||||
/*
|
||||
* KERNEL
|
||||
*/
|
||||
@@ -444,51 +449,51 @@ struct core_reloc_primitives {
|
||||
char a;
|
||||
int b;
|
||||
enum core_reloc_primitives_enum c;
|
||||
void *d;
|
||||
int (*f)(const char *);
|
||||
void *d __bpf_aligned;
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___diff_enum_def {
|
||||
char a;
|
||||
int b;
|
||||
void *d;
|
||||
int (*f)(const char *);
|
||||
void *d __bpf_aligned;
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
enum {
|
||||
X = 100,
|
||||
Y = 200,
|
||||
} c; /* inline enum def with differing set of values */
|
||||
} c __bpf_aligned; /* inline enum def with differing set of values */
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___diff_func_proto {
|
||||
void (*f)(int); /* incompatible function prototype */
|
||||
void *d;
|
||||
enum core_reloc_primitives_enum c;
|
||||
void (*f)(int) __bpf_aligned; /* incompatible function prototype */
|
||||
void *d __bpf_aligned;
|
||||
enum core_reloc_primitives_enum c __bpf_aligned;
|
||||
int b;
|
||||
char a;
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___diff_ptr_type {
|
||||
const char * const d; /* different pointee type + modifiers */
|
||||
char a;
|
||||
const char * const d __bpf_aligned; /* different pointee type + modifiers */
|
||||
char a __bpf_aligned;
|
||||
int b;
|
||||
enum core_reloc_primitives_enum c;
|
||||
int (*f)(const char *);
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___err_non_enum {
|
||||
char a[1];
|
||||
int b;
|
||||
int c; /* int instead of enum */
|
||||
void *d;
|
||||
int (*f)(const char *);
|
||||
void *d __bpf_aligned;
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___err_non_int {
|
||||
char a[1];
|
||||
int *b; /* ptr instead of int */
|
||||
enum core_reloc_primitives_enum c;
|
||||
void *d;
|
||||
int (*f)(const char *);
|
||||
int *b __bpf_aligned; /* ptr instead of int */
|
||||
enum core_reloc_primitives_enum c __bpf_aligned;
|
||||
void *d __bpf_aligned;
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
};
|
||||
|
||||
struct core_reloc_primitives___err_non_ptr {
|
||||
@@ -496,7 +501,7 @@ struct core_reloc_primitives___err_non_ptr {
|
||||
int b;
|
||||
enum core_reloc_primitives_enum c;
|
||||
int d; /* int instead of ptr */
|
||||
int (*f)(const char *);
|
||||
int (*f)(const char *) __bpf_aligned;
|
||||
};
|
||||
|
||||
/*
|
||||
@@ -507,7 +512,7 @@ struct core_reloc_mods_output {
|
||||
};
|
||||
|
||||
typedef const int int_t;
|
||||
typedef const char *char_ptr_t;
|
||||
typedef const char *char_ptr_t __bpf_aligned;
|
||||
typedef const int arr_t[7];
|
||||
|
||||
struct core_reloc_mods_substruct {
|
||||
@@ -523,9 +528,9 @@ typedef struct {
|
||||
struct core_reloc_mods {
|
||||
int a;
|
||||
int_t b;
|
||||
char *c;
|
||||
char *c __bpf_aligned;
|
||||
char_ptr_t d;
|
||||
int e[3];
|
||||
int e[3] __bpf_aligned;
|
||||
arr_t f;
|
||||
struct core_reloc_mods_substruct g;
|
||||
core_reloc_mods_substruct_t h;
|
||||
@@ -535,9 +540,9 @@ struct core_reloc_mods {
|
||||
struct core_reloc_mods___mod_swap {
|
||||
int b;
|
||||
int_t a;
|
||||
char *d;
|
||||
char *d __bpf_aligned;
|
||||
char_ptr_t c;
|
||||
int f[3];
|
||||
int f[3] __bpf_aligned;
|
||||
arr_t e;
|
||||
struct {
|
||||
int y;
|
||||
@@ -555,7 +560,7 @@ typedef arr1_t arr2_t;
|
||||
typedef arr2_t arr3_t;
|
||||
typedef arr3_t arr4_t;
|
||||
|
||||
typedef const char * const volatile fancy_char_ptr_t;
|
||||
typedef const char * const volatile fancy_char_ptr_t __bpf_aligned;
|
||||
|
||||
typedef core_reloc_mods_substruct_t core_reloc_mods_substruct_tt;
|
||||
|
||||
@@ -567,7 +572,7 @@ struct core_reloc_mods___typedefs {
|
||||
arr4_t e;
|
||||
fancy_char_ptr_t d;
|
||||
fancy_char_ptr_t c;
|
||||
int3_t b;
|
||||
int3_t b __bpf_aligned;
|
||||
int3_t a;
|
||||
};
|
||||
|
||||
@@ -739,19 +744,19 @@ struct core_reloc_bitfields___bit_sz_change {
|
||||
int8_t sb4: 1; /* 4 -> 1 */
|
||||
int32_t sb20: 30; /* 20 -> 30 */
|
||||
/* non-bitfields */
|
||||
uint16_t u32; /* 32 -> 16 */
|
||||
int64_t s32; /* 32 -> 64 */
|
||||
uint16_t u32; /* 32 -> 16 */
|
||||
int64_t s32 __bpf_aligned; /* 32 -> 64 */
|
||||
};
|
||||
|
||||
/* turn bitfield into non-bitfield and vice versa */
|
||||
struct core_reloc_bitfields___bitfield_vs_int {
|
||||
uint64_t ub1; /* 3 -> 64 non-bitfield */
|
||||
uint8_t ub2; /* 20 -> 8 non-bitfield */
|
||||
int64_t ub7; /* 7 -> 64 non-bitfield signed */
|
||||
int64_t sb4; /* 4 -> 64 non-bitfield signed */
|
||||
uint64_t sb20; /* 20 -> 16 non-bitfield unsigned */
|
||||
int32_t u32: 20; /* 32 non-bitfield -> 20 bitfield */
|
||||
uint64_t s32: 60; /* 32 non-bitfield -> 60 bitfield */
|
||||
int64_t ub7 __bpf_aligned; /* 7 -> 64 non-bitfield signed */
|
||||
int64_t sb4 __bpf_aligned; /* 4 -> 64 non-bitfield signed */
|
||||
uint64_t sb20 __bpf_aligned; /* 20 -> 16 non-bitfield unsigned */
|
||||
int32_t u32: 20; /* 32 non-bitfield -> 20 bitfield */
|
||||
uint64_t s32: 60 __bpf_aligned; /* 32 non-bitfield -> 60 bitfield */
|
||||
};
|
||||
|
||||
struct core_reloc_bitfields___just_big_enough {
|
||||
|
||||
@@ -54,6 +54,7 @@ SEC("sockops")
|
||||
int bpf_testcb(struct bpf_sock_ops *skops)
|
||||
{
|
||||
char header[sizeof(struct ipv6hdr) + sizeof(struct tcphdr)];
|
||||
struct bpf_sock_ops *reuse = skops;
|
||||
struct tcphdr *thdr;
|
||||
int good_call_rv = 0;
|
||||
int bad_call_rv = 0;
|
||||
@@ -62,6 +63,46 @@ int bpf_testcb(struct bpf_sock_ops *skops)
|
||||
int v = 0;
|
||||
int op;
|
||||
|
||||
/* Test reading fields in bpf_sock_ops using single register */
|
||||
asm volatile (
|
||||
"%[reuse] = *(u32 *)(%[reuse] +96)"
|
||||
: [reuse] "+r"(reuse)
|
||||
:);
|
||||
|
||||
asm volatile (
|
||||
"%[op] = *(u32 *)(%[skops] +96)"
|
||||
: [op] "+r"(op)
|
||||
: [skops] "r"(skops)
|
||||
:);
|
||||
|
||||
asm volatile (
|
||||
"r9 = %[skops];\n"
|
||||
"r8 = *(u32 *)(r9 +164);\n"
|
||||
"*(u32 *)(r9 +164) = r8;\n"
|
||||
:: [skops] "r"(skops)
|
||||
: "r9", "r8");
|
||||
|
||||
asm volatile (
|
||||
"r1 = %[skops];\n"
|
||||
"r1 = *(u64 *)(r1 +184);\n"
|
||||
"if r1 == 0 goto +1;\n"
|
||||
"r1 = *(u32 *)(r1 +4);\n"
|
||||
:: [skops] "r"(skops):"r1");
|
||||
|
||||
asm volatile (
|
||||
"r9 = %[skops];\n"
|
||||
"r9 = *(u64 *)(r9 +184);\n"
|
||||
"if r9 == 0 goto +1;\n"
|
||||
"r9 = *(u32 *)(r9 +4);\n"
|
||||
:: [skops] "r"(skops):"r9");
|
||||
|
||||
asm volatile (
|
||||
"r1 = %[skops];\n"
|
||||
"r2 = *(u64 *)(r1 +184);\n"
|
||||
"if r2 == 0 goto +1;\n"
|
||||
"r2 = *(u32 *)(r2 +4);\n"
|
||||
:: [skops] "r"(skops):"r1", "r2");
|
||||
|
||||
op = (int) skops->op;
|
||||
|
||||
update_event_map(op);
|
||||
|
||||
@@ -15,9 +15,9 @@ int test_pid = 0;
|
||||
bool capture = false;
|
||||
|
||||
/* .bss */
|
||||
long payload1_len1 = 0;
|
||||
long payload1_len2 = 0;
|
||||
long total1 = 0;
|
||||
__u64 payload1_len1 = 0;
|
||||
__u64 payload1_len2 = 0;
|
||||
__u64 total1 = 0;
|
||||
char payload1[MAX_LEN + MAX_LEN] = {};
|
||||
|
||||
/* .data */
|
||||
|
||||
@@ -3883,7 +3883,7 @@ static int test_big_btf_info(unsigned int test_num)
|
||||
info_garbage.garbage = 0;
|
||||
err = bpf_obj_get_info_by_fd(btf_fd, info, &info_len);
|
||||
if (CHECK(err || info_len != sizeof(*info),
|
||||
"err:%d errno:%d info_len:%u sizeof(*info):%lu",
|
||||
"err:%d errno:%d info_len:%u sizeof(*info):%zu",
|
||||
err, errno, info_len, sizeof(*info))) {
|
||||
err = -1;
|
||||
goto done;
|
||||
@@ -4094,7 +4094,7 @@ static int do_test_get_info(unsigned int test_num)
|
||||
if (CHECK(err || !info.id || info_len != sizeof(info) ||
|
||||
info.btf_size != raw_btf_size ||
|
||||
(ret = memcmp(raw_btf, user_btf, expected_nbytes)),
|
||||
"err:%d errno:%d info.id:%u info_len:%u sizeof(info):%lu raw_btf_size:%u info.btf_size:%u expected_nbytes:%u memcmp:%d",
|
||||
"err:%d errno:%d info.id:%u info_len:%u sizeof(info):%zu raw_btf_size:%u info.btf_size:%u expected_nbytes:%u memcmp:%d",
|
||||
err, errno, info.id, info_len, sizeof(info),
|
||||
raw_btf_size, info.btf_size, expected_nbytes, ret)) {
|
||||
err = -1;
|
||||
@@ -4730,7 +4730,7 @@ ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,
|
||||
|
||||
nexpected_line = snprintf(expected_line, line_size,
|
||||
"%s%u: {%u,0,%d,0x%x,0x%x,0x%x,"
|
||||
"{%lu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
|
||||
"{%llu|[%u,%u,%u,%u,%u,%u,%u,%u]},%s,"
|
||||
"%u,0x%x,[[%d,%d],[%d,%d]]}\n",
|
||||
percpu_map ? "\tcpu" : "",
|
||||
percpu_map ? cpu : next_key,
|
||||
@@ -4738,7 +4738,7 @@ ssize_t get_pprint_expected_line(enum pprint_mapv_kind_t mapv_kind,
|
||||
v->unused_bits2a,
|
||||
v->bits28,
|
||||
v->unused_bits2b,
|
||||
v->ui64,
|
||||
(__u64)v->ui64,
|
||||
v->ui8a[0], v->ui8a[1],
|
||||
v->ui8a[2], v->ui8a[3],
|
||||
v->ui8a[4], v->ui8a[5],
|
||||
|
||||
@@ -135,6 +135,11 @@ static inline __u64 ptr_to_u64(const void *ptr)
|
||||
return (__u64) (unsigned long) ptr;
|
||||
}
|
||||
|
||||
static inline void *u64_to_ptr(__u64 ptr)
|
||||
{
|
||||
return (void *) (unsigned long) ptr;
|
||||
}
|
||||
|
||||
int bpf_find_map(const char *test, struct bpf_object *obj, const char *name);
|
||||
int compare_map_keys(int map1_fd, int map2_fd);
|
||||
int compare_stack_ips(int smap_fd, int amap_fd, int stack_trace_len);
|
||||
|
||||
Reference in New Issue
Block a user