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