xref: /linux/tools/testing/selftests/bpf/progs/verifier_percpu_addr.c (revision 5a8cd539ac19f7a68e68e1d25ef9ca2ff55b8500)
1*f61306e8SVineet Gupta // SPDX-License-Identifier: GPL-2.0
2*f61306e8SVineet Gupta 
3*f61306e8SVineet Gupta #include <vmlinux.h>
4*f61306e8SVineet Gupta #include <bpf/bpf_helpers.h>
5*f61306e8SVineet Gupta #include "bpf_misc.h"
6*f61306e8SVineet Gupta 
7*f61306e8SVineet Gupta #if defined(__TARGET_ARCH_x86)
8*f61306e8SVineet Gupta 
9*f61306e8SVineet Gupta int percpu_data SEC(".percpu");
10*f61306e8SVineet Gupta 
11*f61306e8SVineet Gupta /*
12*f61306e8SVineet Gupta  * An ld_imm64 of a per-CPU map value is followed by a mov_percpu_addr that
13*f61306e8SVineet Gupta  * reuses the same register, so check that the add resolves into the register
14*f61306e8SVineet Gupta  * the address was loaded into, for every register.
15*f61306e8SVineet Gupta  */
16*f61306e8SVineet Gupta SEC("raw_tp")
17*f61306e8SVineet Gupta __description("per-CPU address resolution")
18*f61306e8SVineet Gupta __success
19*f61306e8SVineet Gupta __arch_x86_64
20*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rax")
21*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rax")
22*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rdi")
23*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rdi")
24*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rsi")
25*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rsi")
26*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rdx")
27*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rdx")
28*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rcx")
29*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rcx")
30*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %r8")
31*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %r8")
32*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %rbx")
33*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %rbx")
34*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %r13")
35*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %r13")
36*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %r14")
37*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %r14")
38*f61306e8SVineet Gupta __jited("	movabsq	$0x{{.*}}, %r15")
39*f61306e8SVineet Gupta __jited("	addq	%gs:{{.*}}, %r15")
percpu_addr(void)40*f61306e8SVineet Gupta __naked void percpu_addr(void)
41*f61306e8SVineet Gupta {
42*f61306e8SVineet Gupta 	asm volatile ("					\
43*f61306e8SVineet Gupta 	r0 = %[percpu_data] ll;				\
44*f61306e8SVineet Gupta 	r1 = %[percpu_data] ll;				\
45*f61306e8SVineet Gupta 	r2 = %[percpu_data] ll;				\
46*f61306e8SVineet Gupta 	r3 = %[percpu_data] ll;				\
47*f61306e8SVineet Gupta 	r4 = %[percpu_data] ll;				\
48*f61306e8SVineet Gupta 	r5 = %[percpu_data] ll;				\
49*f61306e8SVineet Gupta 	r6 = %[percpu_data] ll;				\
50*f61306e8SVineet Gupta 	r7 = %[percpu_data] ll;				\
51*f61306e8SVineet Gupta 	r8 = %[percpu_data] ll;				\
52*f61306e8SVineet Gupta 	r9 = %[percpu_data] ll;				\
53*f61306e8SVineet Gupta 	r0 = 0;						\
54*f61306e8SVineet Gupta 	exit;						\
55*f61306e8SVineet Gupta "	:
56*f61306e8SVineet Gupta 	: __imm_addr(percpu_data)
57*f61306e8SVineet Gupta 	: __clobber_all);
58*f61306e8SVineet Gupta }
59*f61306e8SVineet Gupta 
60*f61306e8SVineet Gupta #else
61*f61306e8SVineet Gupta 
62*f61306e8SVineet Gupta SEC("raw_tp")
63*f61306e8SVineet Gupta __description("percpu addr dummy")
64*f61306e8SVineet Gupta __success
dummy_test(void)65*f61306e8SVineet Gupta int dummy_test(void)
66*f61306e8SVineet Gupta {
67*f61306e8SVineet Gupta 	return 0;
68*f61306e8SVineet Gupta }
69*f61306e8SVineet Gupta 
70*f61306e8SVineet Gupta #endif
71*f61306e8SVineet Gupta 
72*f61306e8SVineet Gupta char _license[] SEC("license") = "GPL";
73