178a20541SKenta Tada /* SPDX-License-Identifier: GPL-2.0 */ 278a20541SKenta Tada #ifndef __BPF_MISC_H__ 378a20541SKenta Tada #define __BPF_MISC_H__ 478a20541SKenta Tada 535cbf7f9SAndrii Nakryiko /* This set of attributes controls behavior of the 635cbf7f9SAndrii Nakryiko * test_loader.c:test_loader__run_subtests(). 735cbf7f9SAndrii Nakryiko * 81d56ade0SEduard Zingerman * The test_loader sequentially loads each program in a skeleton. 91d56ade0SEduard Zingerman * Programs could be loaded in privileged and unprivileged modes. 101d56ade0SEduard Zingerman * - __success, __failure, __msg imply privileged mode; 111d56ade0SEduard Zingerman * - __success_unpriv, __failure_unpriv, __msg_unpriv imply 121d56ade0SEduard Zingerman * unprivileged mode. 131d56ade0SEduard Zingerman * If combination of privileged and unprivileged attributes is present 141d56ade0SEduard Zingerman * both modes are used. If none are present privileged mode is implied. 151d56ade0SEduard Zingerman * 161d56ade0SEduard Zingerman * See test_loader.c:drop_capabilities() for exact set of capabilities 171d56ade0SEduard Zingerman * that differ between privileged and unprivileged modes. 181d56ade0SEduard Zingerman * 191d56ade0SEduard Zingerman * For test filtering purposes the name of the program loaded in 201d56ade0SEduard Zingerman * unprivileged mode is derived from the usual program name by adding 211d56ade0SEduard Zingerman * `@unpriv' suffix. 221d56ade0SEduard Zingerman * 2335cbf7f9SAndrii Nakryiko * __msg Message expected to be found in the verifier log. 2435cbf7f9SAndrii Nakryiko * Multiple __msg attributes could be specified. 251d56ade0SEduard Zingerman * __msg_unpriv Same as __msg but for unprivileged mode. 2635cbf7f9SAndrii Nakryiko * 2735cbf7f9SAndrii Nakryiko * __success Expect program load success in privileged mode. 281d56ade0SEduard Zingerman * __success_unpriv Expect program load success in unprivileged mode. 2935cbf7f9SAndrii Nakryiko * 3035cbf7f9SAndrii Nakryiko * __failure Expect program load failure in privileged mode. 311d56ade0SEduard Zingerman * __failure_unpriv Expect program load failure in unprivileged mode. 321d56ade0SEduard Zingerman * 3319a8e06fSEduard Zingerman * __retval Execute the program using BPF_PROG_TEST_RUN command, 3419a8e06fSEduard Zingerman * expect return value to match passed parameter: 3519a8e06fSEduard Zingerman * - a decimal number 3619a8e06fSEduard Zingerman * - a hexadecimal number, when starts from 0x 3719a8e06fSEduard Zingerman * - literal INT_MIN 3819a8e06fSEduard Zingerman * - literal POINTER_VALUE (see definition below) 3919a8e06fSEduard Zingerman * - literal TEST_DATA_LEN (see definition below) 4019a8e06fSEduard Zingerman * __retval_unpriv Same, but load program in unprivileged mode. 4119a8e06fSEduard Zingerman * 421d56ade0SEduard Zingerman * __description Text to be used instead of a program name for display 431d56ade0SEduard Zingerman * and filtering purposes. 4435cbf7f9SAndrii Nakryiko * 4535cbf7f9SAndrii Nakryiko * __log_level Log level to use for the program, numeric value expected. 4635cbf7f9SAndrii Nakryiko * 4735cbf7f9SAndrii Nakryiko * __flag Adds one flag use for the program, the following values are valid: 4835cbf7f9SAndrii Nakryiko * - BPF_F_STRICT_ALIGNMENT; 4935cbf7f9SAndrii Nakryiko * - BPF_F_TEST_RND_HI32; 5035cbf7f9SAndrii Nakryiko * - BPF_F_TEST_STATE_FREQ; 5135cbf7f9SAndrii Nakryiko * - BPF_F_SLEEPABLE; 5235cbf7f9SAndrii Nakryiko * - BPF_F_XDP_HAS_FRAGS; 5335cbf7f9SAndrii Nakryiko * - A numeric value. 5435cbf7f9SAndrii Nakryiko * Multiple __flag attributes could be specified, the final flags 5535cbf7f9SAndrii Nakryiko * value is derived by applying binary "or" to all specified values. 5663bb645bSEduard Zingerman * 5763bb645bSEduard Zingerman * __auxiliary Annotated program is not a separate test, but used as auxiliary 5863bb645bSEduard Zingerman * for some other test cases and should always be loaded. 5963bb645bSEduard Zingerman * __auxiliary_unpriv Same, but load program in unprivileged mode. 6035cbf7f9SAndrii Nakryiko */ 61537c3f66SAndrii Nakryiko #define __msg(msg) __attribute__((btf_decl_tag("comment:test_expect_msg=" msg))) 62537c3f66SAndrii Nakryiko #define __failure __attribute__((btf_decl_tag("comment:test_expect_failure"))) 63537c3f66SAndrii Nakryiko #define __success __attribute__((btf_decl_tag("comment:test_expect_success"))) 641d56ade0SEduard Zingerman #define __description(desc) __attribute__((btf_decl_tag("comment:test_description=" desc))) 651d56ade0SEduard Zingerman #define __msg_unpriv(msg) __attribute__((btf_decl_tag("comment:test_expect_msg_unpriv=" msg))) 661d56ade0SEduard Zingerman #define __failure_unpriv __attribute__((btf_decl_tag("comment:test_expect_failure_unpriv"))) 671d56ade0SEduard Zingerman #define __success_unpriv __attribute__((btf_decl_tag("comment:test_expect_success_unpriv"))) 68537c3f66SAndrii Nakryiko #define __log_level(lvl) __attribute__((btf_decl_tag("comment:test_log_level="#lvl))) 6935cbf7f9SAndrii Nakryiko #define __flag(flag) __attribute__((btf_decl_tag("comment:test_prog_flags="#flag))) 7019a8e06fSEduard Zingerman #define __retval(val) __attribute__((btf_decl_tag("comment:test_retval="#val))) 7119a8e06fSEduard Zingerman #define __retval_unpriv(val) __attribute__((btf_decl_tag("comment:test_retval_unpriv="#val))) 7263bb645bSEduard Zingerman #define __auxiliary __attribute__((btf_decl_tag("comment:test_auxiliary"))) 7363bb645bSEduard Zingerman #define __auxiliary_unpriv __attribute__((btf_decl_tag("comment:test_auxiliary_unpriv"))) 74537c3f66SAndrii Nakryiko 7591b875a5SEduard Zingerman /* Convenience macro for use with 'asm volatile' blocks */ 7691b875a5SEduard Zingerman #define __naked __attribute__((naked)) 7791b875a5SEduard Zingerman #define __clobber_all "r0", "r1", "r2", "r3", "r4", "r5", "r6", "r7", "r8", "r9", "memory" 7891b875a5SEduard Zingerman #define __clobber_common "r0", "r1", "r2", "r3", "r4", "r5", "memory" 7991b875a5SEduard Zingerman #define __imm(name) [name]"i"(name) 80207b1ba3SEduard Zingerman #define __imm_const(name, expr) [name]"i"(expr) 8191b875a5SEduard Zingerman #define __imm_addr(name) [name]"i"(&name) 8257400dccSAndrii Nakryiko #define __imm_ptr(name) [name]"p"(&name) 83207b1ba3SEduard Zingerman #define __imm_insn(name, expr) [name]"i"(*(long *)&(expr)) 8491b875a5SEduard Zingerman 8519a8e06fSEduard Zingerman /* Magic constants used with __retval() */ 8619a8e06fSEduard Zingerman #define POINTER_VALUE 0xcafe4all 8719a8e06fSEduard Zingerman #define TEST_DATA_LEN 64 8819a8e06fSEduard Zingerman 893ef3d217SAndrii Nakryiko #ifndef __used 903ef3d217SAndrii Nakryiko #define __used __attribute__((used)) 913ef3d217SAndrii Nakryiko #endif 923ef3d217SAndrii Nakryiko 9378a20541SKenta Tada #if defined(__TARGET_ARCH_x86) 9478a20541SKenta Tada #define SYSCALL_WRAPPER 1 9578a20541SKenta Tada #define SYS_PREFIX "__x64_" 9678a20541SKenta Tada #elif defined(__TARGET_ARCH_s390) 9778a20541SKenta Tada #define SYSCALL_WRAPPER 1 9878a20541SKenta Tada #define SYS_PREFIX "__s390x_" 9978a20541SKenta Tada #elif defined(__TARGET_ARCH_arm64) 10078a20541SKenta Tada #define SYSCALL_WRAPPER 1 10178a20541SKenta Tada #define SYS_PREFIX "__arm64_" 102*25503a83SBjörn Töpel #elif defined(__TARGET_ARCH_riscv) 103*25503a83SBjörn Töpel #define SYSCALL_WRAPPER 1 104*25503a83SBjörn Töpel #define SYS_PREFIX "__riscv_" 10578a20541SKenta Tada #else 10678a20541SKenta Tada #define SYSCALL_WRAPPER 0 107046b841eSNaveen N. Rao #define SYS_PREFIX "__se_" 10878a20541SKenta Tada #endif 10978a20541SKenta Tada 110bc72742bSAndrii Nakryiko /* How many arguments are passed to function in register */ 111bc72742bSAndrii Nakryiko #if defined(__TARGET_ARCH_x86) || defined(__x86_64__) 112bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 6 113bc72742bSAndrii Nakryiko #elif defined(__i386__) 114bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 3 115bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_s390) || defined(__s390x__) 116bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 5 117bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_arm) || defined(__arm__) 118bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 4 119bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_arm64) || defined(__aarch64__) 120bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 8 121bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_mips) || defined(__mips__) 122bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 8 123bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_powerpc) || defined(__powerpc__) || defined(__powerpc64__) 124bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 8 125bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_sparc) || defined(__sparc__) 126bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 6 127bc72742bSAndrii Nakryiko #elif defined(__TARGET_ARCH_riscv) || defined(__riscv__) 128bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 8 129bc72742bSAndrii Nakryiko #else 130bc72742bSAndrii Nakryiko /* default to 5 for others */ 131bc72742bSAndrii Nakryiko #define FUNC_REG_ARG_CNT 5 132bc72742bSAndrii Nakryiko #endif 133bc72742bSAndrii Nakryiko 134713461b8SAndrii Nakryiko /* make it look to compiler like value is read and written */ 135713461b8SAndrii Nakryiko #define __sink(expr) asm volatile("" : "+g"(expr)) 136713461b8SAndrii Nakryiko 13778a20541SKenta Tada #endif 138