Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v6.16 144 lines 4.0 kB view raw
1// SPDX-License-Identifier: GPL-2.0 2/* Copyright (c) 2025 Meta Platforms, Inc. and affiliates. */ 3#include <test_progs.h> 4#include <string.h> 5#include <stdio.h> 6 7#define __CHECK_STR(str, name) \ 8 do { \ 9 if (!ASSERT_HAS_SUBSTR(fix->output, (str), (name))) \ 10 goto out; \ 11 } while (0) 12 13struct fixture { 14 char tmpfile[80]; 15 int fd; 16 char *output; 17 size_t sz; 18 char veristat[80]; 19}; 20 21static struct fixture *init_fixture(void) 22{ 23 struct fixture *fix = malloc(sizeof(struct fixture)); 24 25 /* for no_alu32 and cpuv4 veristat is in parent folder */ 26 if (access("./veristat", F_OK) == 0) 27 strcpy(fix->veristat, "./veristat"); 28 else if (access("../veristat", F_OK) == 0) 29 strcpy(fix->veristat, "../veristat"); 30 else 31 PRINT_FAIL("Can't find veristat binary"); 32 33 snprintf(fix->tmpfile, sizeof(fix->tmpfile), "/tmp/test_veristat.XXXXXX"); 34 fix->fd = mkstemp(fix->tmpfile); 35 fix->sz = 1000000; 36 fix->output = malloc(fix->sz); 37 return fix; 38} 39 40static void teardown_fixture(struct fixture *fix) 41{ 42 free(fix->output); 43 close(fix->fd); 44 remove(fix->tmpfile); 45 free(fix); 46} 47 48static void test_set_global_vars_succeeds(void) 49{ 50 struct fixture *fix = init_fixture(); 51 52 SYS(out, 53 "%s set_global_vars.bpf.o"\ 54 " -G \"var_s64 = 0xf000000000000001\" "\ 55 " -G \"var_u64 = 0xfedcba9876543210\" "\ 56 " -G \"var_s32 = -0x80000000\" "\ 57 " -G \"var_u32 = 0x76543210\" "\ 58 " -G \"var_s16 = -32768\" "\ 59 " -G \"var_u16 = 60652\" "\ 60 " -G \"var_s8 = -128\" "\ 61 " -G \"var_u8 = 255\" "\ 62 " -G \"var_ea = EA2\" "\ 63 " -G \"var_eb = EB2\" "\ 64 " -G \"var_ec = EC2\" "\ 65 " -G \"var_b = 1\" "\ 66 " -G \"struct1.struct2.u.var_u8 = 170\" "\ 67 " -G \"union1.struct3.var_u8_l = 0xaa\" "\ 68 " -G \"union1.struct3.var_u8_h = 0xaa\" "\ 69 "-vl2 > %s", fix->veristat, fix->tmpfile); 70 71 read(fix->fd, fix->output, fix->sz); 72 __CHECK_STR("_w=0xf000000000000001 ", "var_s64 = 0xf000000000000001"); 73 __CHECK_STR("_w=0xfedcba9876543210 ", "var_u64 = 0xfedcba9876543210"); 74 __CHECK_STR("_w=0x80000000 ", "var_s32 = -0x80000000"); 75 __CHECK_STR("_w=0x76543210 ", "var_u32 = 0x76543210"); 76 __CHECK_STR("_w=0x8000 ", "var_s16 = -32768"); 77 __CHECK_STR("_w=0xecec ", "var_u16 = 60652"); 78 __CHECK_STR("_w=128 ", "var_s8 = -128"); 79 __CHECK_STR("_w=255 ", "var_u8 = 255"); 80 __CHECK_STR("_w=11 ", "var_ea = EA2"); 81 __CHECK_STR("_w=12 ", "var_eb = EB2"); 82 __CHECK_STR("_w=13 ", "var_ec = EC2"); 83 __CHECK_STR("_w=1 ", "var_b = 1"); 84 __CHECK_STR("_w=170 ", "struct1.struct2.u.var_u8 = 170"); 85 __CHECK_STR("_w=0xaaaa ", "union1.var_u16 = 0xaaaa"); 86 87out: 88 teardown_fixture(fix); 89} 90 91static void test_set_global_vars_from_file_succeeds(void) 92{ 93 struct fixture *fix = init_fixture(); 94 char input_file[80]; 95 const char *vars = "var_s16 = -32768\nvar_u16 = 60652"; 96 int fd; 97 98 snprintf(input_file, sizeof(input_file), "/tmp/veristat_input.XXXXXX"); 99 fd = mkstemp(input_file); 100 if (!ASSERT_GE(fd, 0, "valid fd")) 101 goto out; 102 103 write(fd, vars, strlen(vars)); 104 syncfs(fd); 105 SYS(out, "%s set_global_vars.bpf.o -G \"@%s\" -vl2 > %s", 106 fix->veristat, input_file, fix->tmpfile); 107 read(fix->fd, fix->output, fix->sz); 108 __CHECK_STR("_w=0x8000 ", "var_s16 = -32768"); 109 __CHECK_STR("_w=0xecec ", "var_u16 = 60652"); 110 111out: 112 close(fd); 113 remove(input_file); 114 teardown_fixture(fix); 115} 116 117static void test_set_global_vars_out_of_range(void) 118{ 119 struct fixture *fix = init_fixture(); 120 121 SYS_FAIL(out, 122 "%s set_global_vars.bpf.o -G \"var_s32 = 2147483648\" -vl2 2> %s", 123 fix->veristat, fix->tmpfile); 124 125 read(fix->fd, fix->output, fix->sz); 126 __CHECK_STR("is out of range [-2147483648; 2147483647]", "out of range"); 127 128out: 129 teardown_fixture(fix); 130} 131 132void test_veristat(void) 133{ 134 if (test__start_subtest("set_global_vars_succeeds")) 135 test_set_global_vars_succeeds(); 136 137 if (test__start_subtest("set_global_vars_out_of_range")) 138 test_set_global_vars_out_of_range(); 139 140 if (test__start_subtest("set_global_vars_from_file_succeeds")) 141 test_set_global_vars_from_file_succeeds(); 142} 143 144#undef __CHECK_STR