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