// SPDX-License-Identifier: GPL-2.0 #include #include #include "bpf_misc.h" #if defined(__TARGET_ARCH_x86) int percpu_data SEC(".percpu"); /* * An ld_imm64 of a per-CPU map value is followed by a mov_percpu_addr that * reuses the same register, so check that the add resolves into the register * the address was loaded into, for every register. */ SEC("raw_tp") __description("per-CPU address resolution") __success __arch_x86_64 __jited(" movabsq $0x{{.*}}, %rax") __jited(" addq %gs:{{.*}}, %rax") __jited(" movabsq $0x{{.*}}, %rdi") __jited(" addq %gs:{{.*}}, %rdi") __jited(" movabsq $0x{{.*}}, %rsi") __jited(" addq %gs:{{.*}}, %rsi") __jited(" movabsq $0x{{.*}}, %rdx") __jited(" addq %gs:{{.*}}, %rdx") __jited(" movabsq $0x{{.*}}, %rcx") __jited(" addq %gs:{{.*}}, %rcx") __jited(" movabsq $0x{{.*}}, %r8") __jited(" addq %gs:{{.*}}, %r8") __jited(" movabsq $0x{{.*}}, %rbx") __jited(" addq %gs:{{.*}}, %rbx") __jited(" movabsq $0x{{.*}}, %r13") __jited(" addq %gs:{{.*}}, %r13") __jited(" movabsq $0x{{.*}}, %r14") __jited(" addq %gs:{{.*}}, %r14") __jited(" movabsq $0x{{.*}}, %r15") __jited(" addq %gs:{{.*}}, %r15") __naked void percpu_addr(void) { asm volatile (" \ r0 = %[percpu_data] ll; \ r1 = %[percpu_data] ll; \ r2 = %[percpu_data] ll; \ r3 = %[percpu_data] ll; \ r4 = %[percpu_data] ll; \ r5 = %[percpu_data] ll; \ r6 = %[percpu_data] ll; \ r7 = %[percpu_data] ll; \ r8 = %[percpu_data] ll; \ r9 = %[percpu_data] ll; \ r0 = 0; \ exit; \ " : : __imm_addr(percpu_data) : __clobber_all); } #else SEC("raw_tp") __description("percpu addr dummy") __success int dummy_test(void) { return 0; } #endif char _license[] SEC("license") = "GPL";