2024-11-12 08:39:27 -08:00
|
|
|
// SPDX-License-Identifier: GPL-2.0
|
|
|
|
|
|
|
|
#include <vmlinux.h>
|
|
|
|
#include <bpf/bpf_helpers.h>
|
|
|
|
#include "bpf_misc.h"
|
|
|
|
#include "bpf_experimental.h"
|
|
|
|
|
|
|
|
/* From include/linux/filter.h */
|
|
|
|
#define MAX_BPF_STACK 512
|
|
|
|
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
#if defined(__TARGET_ARCH_x86) || defined(__TARGET_ARCH_arm64)
|
2024-11-12 08:39:27 -08:00
|
|
|
|
|
|
|
struct elem {
|
|
|
|
struct bpf_timer t;
|
|
|
|
char pad[256];
|
|
|
|
};
|
|
|
|
|
|
|
|
struct {
|
|
|
|
__uint(type, BPF_MAP_TYPE_ARRAY);
|
|
|
|
__uint(max_entries, 1);
|
|
|
|
__type(key, int);
|
|
|
|
__type(value, struct elem);
|
|
|
|
} array SEC(".maps");
|
|
|
|
|
|
|
|
SEC("kprobe")
|
|
|
|
__description("Private stack, single prog")
|
|
|
|
__success
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" movabsq $0x{{.*}}, %r9")
|
selftests/bpf: Fix verifier_private_stack test failure
Several verifier_private_stack tests failed with latest bpf-next.
For example, for 'Private stack, single prog' subtest, the
jitted code:
func #0:
0: f3 0f 1e fa endbr64
4: 0f 1f 44 00 00 nopl (%rax,%rax)
9: 0f 1f 00 nopl (%rax)
c: 55 pushq %rbp
d: 48 89 e5 movq %rsp, %rbp
10: f3 0f 1e fa endbr64
14: 49 b9 58 74 8a 8f 7d 60 00 00 movabsq $0x607d8f8a7458, %r9
1e: 65 4c 03 0c 25 28 c0 48 87 addq %gs:-0x78b73fd8, %r9
27: bf 2a 00 00 00 movl $0x2a, %edi
2c: 49 89 b9 00 ff ff ff movq %rdi, -0x100(%r9)
33: 31 c0 xorl %eax, %eax
35: c9 leave
36: e9 20 5d 0f e1 jmp 0xffffffffe10f5d5b
The insn 'addq %gs:-0x78b73fd8, %r9' does not match the expected
regex 'addq %gs:0x{{.*}}, %r9' and this caused test failure.
Fix it by changing '%gs:0x{{.*}}' to '%gs:{{.*}}' to accommodate the
possible negative offset. A few other subtests are fixed in a similar way.
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20250331033828.365077-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2025-03-30 20:38:28 -07:00
|
|
|
__jited(" addq %gs:{{.*}}, %r9")
|
2024-11-12 08:39:27 -08:00
|
|
|
__jited(" movl $0x2a, %edi")
|
|
|
|
__jited(" movq %rdi, -0x100(%r9)")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" stp x25, x27, [sp, {{.*}}]!")
|
|
|
|
__jited(" mov x27, {{.*}}")
|
|
|
|
__jited(" movk x27, {{.*}}, lsl #16")
|
|
|
|
__jited(" movk x27, {{.*}}")
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
|
|
|
__jited(" mov x0, #0x2a")
|
|
|
|
__jited(" str x0, [x27]")
|
|
|
|
__jited("...")
|
|
|
|
__jited(" ldp x25, x27, [sp], {{.*}}")
|
2024-11-12 08:39:27 -08:00
|
|
|
__naked void private_stack_single_prog(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - 256) = r1; \
|
|
|
|
r0 = 0; \
|
|
|
|
exit; \
|
|
|
|
" ::: __clobber_all);
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("raw_tp")
|
|
|
|
__description("No private stack")
|
|
|
|
__success
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" subq $0x8, %rsp")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" mov x25, sp")
|
|
|
|
__jited(" sub sp, sp, #0x10")
|
2024-11-12 08:39:27 -08:00
|
|
|
__naked void no_private_stack_nested(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - 8) = r1; \
|
|
|
|
r0 = 0; \
|
|
|
|
exit; \
|
|
|
|
" ::: __clobber_all);
|
|
|
|
}
|
|
|
|
|
|
|
|
__used
|
|
|
|
__naked static void cumulative_stack_depth_subprog(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 41; \
|
|
|
|
*(u64 *)(r10 - 32) = r1; \
|
|
|
|
call %[bpf_get_smp_processor_id]; \
|
|
|
|
exit; \
|
|
|
|
" :
|
|
|
|
: __imm(bpf_get_smp_processor_id)
|
|
|
|
: __clobber_all);
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("kprobe")
|
|
|
|
__description("Private stack, subtree > MAX_BPF_STACK")
|
|
|
|
__success
|
|
|
|
__arch_x86_64
|
|
|
|
/* private stack fp for the main prog */
|
|
|
|
__jited(" movabsq $0x{{.*}}, %r9")
|
selftests/bpf: Fix verifier_private_stack test failure
Several verifier_private_stack tests failed with latest bpf-next.
For example, for 'Private stack, single prog' subtest, the
jitted code:
func #0:
0: f3 0f 1e fa endbr64
4: 0f 1f 44 00 00 nopl (%rax,%rax)
9: 0f 1f 00 nopl (%rax)
c: 55 pushq %rbp
d: 48 89 e5 movq %rsp, %rbp
10: f3 0f 1e fa endbr64
14: 49 b9 58 74 8a 8f 7d 60 00 00 movabsq $0x607d8f8a7458, %r9
1e: 65 4c 03 0c 25 28 c0 48 87 addq %gs:-0x78b73fd8, %r9
27: bf 2a 00 00 00 movl $0x2a, %edi
2c: 49 89 b9 00 ff ff ff movq %rdi, -0x100(%r9)
33: 31 c0 xorl %eax, %eax
35: c9 leave
36: e9 20 5d 0f e1 jmp 0xffffffffe10f5d5b
The insn 'addq %gs:-0x78b73fd8, %r9' does not match the expected
regex 'addq %gs:0x{{.*}}, %r9' and this caused test failure.
Fix it by changing '%gs:0x{{.*}}' to '%gs:{{.*}}' to accommodate the
possible negative offset. A few other subtests are fixed in a similar way.
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20250331033828.365077-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2025-03-30 20:38:28 -07:00
|
|
|
__jited(" addq %gs:{{.*}}, %r9")
|
2024-11-12 08:39:27 -08:00
|
|
|
__jited(" movl $0x2a, %edi")
|
|
|
|
__jited(" movq %rdi, -0x200(%r9)")
|
|
|
|
__jited(" pushq %r9")
|
|
|
|
__jited(" callq 0x{{.*}}")
|
|
|
|
__jited(" popq %r9")
|
|
|
|
__jited(" xorl %eax, %eax")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" stp x25, x27, [sp, {{.*}}]!")
|
|
|
|
__jited(" mov x27, {{.*}}")
|
|
|
|
__jited(" movk x27, {{.*}}, lsl #16")
|
|
|
|
__jited(" movk x27, {{.*}}")
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
|
|
|
__jited(" mov x0, #0x2a")
|
|
|
|
__jited(" str x0, [x27]")
|
|
|
|
__jited(" bl {{.*}}")
|
|
|
|
__jited("...")
|
|
|
|
__jited(" ldp x25, x27, [sp], {{.*}}")
|
2024-11-12 08:39:27 -08:00
|
|
|
__naked void private_stack_nested_1(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - %[max_bpf_stack]) = r1; \
|
|
|
|
call cumulative_stack_depth_subprog; \
|
|
|
|
r0 = 0; \
|
|
|
|
exit; \
|
|
|
|
" :
|
|
|
|
: __imm_const(max_bpf_stack, MAX_BPF_STACK)
|
|
|
|
: __clobber_all);
|
|
|
|
}
|
|
|
|
|
|
|
|
__naked __noinline __used
|
|
|
|
static unsigned long loop_callback(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
call %[bpf_get_prandom_u32]; \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - 512) = r1; \
|
|
|
|
call cumulative_stack_depth_subprog; \
|
|
|
|
r0 = 0; \
|
|
|
|
exit; \
|
|
|
|
" :
|
|
|
|
: __imm(bpf_get_prandom_u32)
|
|
|
|
: __clobber_common);
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("raw_tp")
|
|
|
|
__description("Private stack, callback")
|
|
|
|
__success
|
|
|
|
__arch_x86_64
|
|
|
|
/* for func loop_callback */
|
|
|
|
__jited("func #1")
|
|
|
|
__jited(" endbr64")
|
|
|
|
__jited(" nopl (%rax,%rax)")
|
|
|
|
__jited(" nopl (%rax)")
|
|
|
|
__jited(" pushq %rbp")
|
|
|
|
__jited(" movq %rsp, %rbp")
|
|
|
|
__jited(" endbr64")
|
|
|
|
__jited(" movabsq $0x{{.*}}, %r9")
|
selftests/bpf: Fix verifier_private_stack test failure
Several verifier_private_stack tests failed with latest bpf-next.
For example, for 'Private stack, single prog' subtest, the
jitted code:
func #0:
0: f3 0f 1e fa endbr64
4: 0f 1f 44 00 00 nopl (%rax,%rax)
9: 0f 1f 00 nopl (%rax)
c: 55 pushq %rbp
d: 48 89 e5 movq %rsp, %rbp
10: f3 0f 1e fa endbr64
14: 49 b9 58 74 8a 8f 7d 60 00 00 movabsq $0x607d8f8a7458, %r9
1e: 65 4c 03 0c 25 28 c0 48 87 addq %gs:-0x78b73fd8, %r9
27: bf 2a 00 00 00 movl $0x2a, %edi
2c: 49 89 b9 00 ff ff ff movq %rdi, -0x100(%r9)
33: 31 c0 xorl %eax, %eax
35: c9 leave
36: e9 20 5d 0f e1 jmp 0xffffffffe10f5d5b
The insn 'addq %gs:-0x78b73fd8, %r9' does not match the expected
regex 'addq %gs:0x{{.*}}, %r9' and this caused test failure.
Fix it by changing '%gs:0x{{.*}}' to '%gs:{{.*}}' to accommodate the
possible negative offset. A few other subtests are fixed in a similar way.
Signed-off-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/r/20250331033828.365077-1-yonghong.song@linux.dev
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
2025-03-30 20:38:28 -07:00
|
|
|
__jited(" addq %gs:{{.*}}, %r9")
|
2024-11-12 08:39:27 -08:00
|
|
|
__jited(" pushq %r9")
|
|
|
|
__jited(" callq")
|
|
|
|
__jited(" popq %r9")
|
|
|
|
__jited(" movl $0x2a, %edi")
|
|
|
|
__jited(" movq %rdi, -0x200(%r9)")
|
|
|
|
__jited(" pushq %r9")
|
|
|
|
__jited(" callq")
|
|
|
|
__jited(" popq %r9")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited("func #1")
|
|
|
|
__jited("...")
|
|
|
|
__jited(" stp x25, x27, [sp, {{.*}}]!")
|
|
|
|
__jited(" mov x27, {{.*}}")
|
|
|
|
__jited(" movk x27, {{.*}}, lsl #16")
|
|
|
|
__jited(" movk x27, {{.*}}")
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
|
|
|
__jited(" bl 0x{{.*}}")
|
|
|
|
__jited(" add x7, x0, #0x0")
|
|
|
|
__jited(" mov x0, #0x2a")
|
|
|
|
__jited(" str x0, [x27]")
|
|
|
|
__jited(" bl 0x{{.*}}")
|
|
|
|
__jited(" add x7, x0, #0x0")
|
|
|
|
__jited(" mov x7, #0x0")
|
|
|
|
__jited(" ldp x25, x27, [sp], {{.*}}")
|
2024-11-12 08:39:27 -08:00
|
|
|
__naked void private_stack_callback(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 1; \
|
|
|
|
r2 = %[loop_callback]; \
|
|
|
|
r3 = 0; \
|
|
|
|
r4 = 0; \
|
|
|
|
call %[bpf_loop]; \
|
|
|
|
r0 = 0; \
|
|
|
|
exit; \
|
|
|
|
" :
|
|
|
|
: __imm_ptr(loop_callback),
|
|
|
|
__imm(bpf_loop)
|
|
|
|
: __clobber_common);
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("fentry/bpf_fentry_test9")
|
|
|
|
__description("Private stack, exception in main prog")
|
|
|
|
__success __retval(0)
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" pushq %r9")
|
|
|
|
__jited(" callq")
|
|
|
|
__jited(" popq %r9")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" stp x29, x30, [sp, #-0x10]!")
|
|
|
|
__jited(" mov x29, sp")
|
|
|
|
__jited(" stp xzr, x26, [sp, #-0x10]!")
|
|
|
|
__jited(" mov x26, sp")
|
|
|
|
__jited(" stp x19, x20, [sp, #-0x10]!")
|
|
|
|
__jited(" stp x21, x22, [sp, #-0x10]!")
|
|
|
|
__jited(" stp x23, x24, [sp, #-0x10]!")
|
|
|
|
__jited(" stp x25, x26, [sp, #-0x10]!")
|
|
|
|
__jited(" stp x27, x28, [sp, #-0x10]!")
|
|
|
|
__jited(" mov x27, {{.*}}")
|
|
|
|
__jited(" movk x27, {{.*}}, lsl #16")
|
|
|
|
__jited(" movk x27, {{.*}}")
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
|
|
|
__jited(" mov x0, #0x2a")
|
|
|
|
__jited(" str x0, [x27]")
|
|
|
|
__jited(" mov x0, #0x0")
|
|
|
|
__jited(" bl 0x{{.*}}")
|
|
|
|
__jited(" add x7, x0, #0x0")
|
|
|
|
__jited(" ldp x27, x28, [sp], #0x10")
|
2024-11-12 08:39:27 -08:00
|
|
|
int private_stack_exception_main_prog(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - 512) = r1; \
|
|
|
|
" ::: __clobber_common);
|
|
|
|
|
|
|
|
bpf_throw(0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
__used static int subprog_exception(void)
|
|
|
|
{
|
|
|
|
bpf_throw(0);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("fentry/bpf_fentry_test9")
|
|
|
|
__description("Private stack, exception in subprog")
|
|
|
|
__success __retval(0)
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" movq %rdi, -0x200(%r9)")
|
|
|
|
__jited(" pushq %r9")
|
|
|
|
__jited(" callq")
|
|
|
|
__jited(" popq %r9")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" stp x27, x28, [sp, #-0x10]!")
|
|
|
|
__jited(" mov x27, {{.*}}")
|
|
|
|
__jited(" movk x27, {{.*}}, lsl #16")
|
|
|
|
__jited(" movk x27, {{.*}}")
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
|
|
|
__jited(" mov x0, #0x2a")
|
|
|
|
__jited(" str x0, [x27]")
|
|
|
|
__jited(" bl 0x{{.*}}")
|
|
|
|
__jited(" add x7, x0, #0x0")
|
|
|
|
__jited(" ldp x27, x28, [sp], #0x10")
|
2024-11-12 08:39:27 -08:00
|
|
|
int private_stack_exception_sub_prog(void)
|
|
|
|
{
|
|
|
|
asm volatile (" \
|
|
|
|
r1 = 42; \
|
|
|
|
*(u64 *)(r10 - 512) = r1; \
|
|
|
|
call subprog_exception; \
|
|
|
|
" ::: __clobber_common);
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
int glob;
|
|
|
|
__noinline static void subprog2(int *val)
|
|
|
|
{
|
|
|
|
glob += val[0] * 2;
|
|
|
|
}
|
|
|
|
|
|
|
|
__noinline static void subprog1(int *val)
|
|
|
|
{
|
|
|
|
int tmp[64] = {};
|
|
|
|
|
|
|
|
tmp[0] = *val;
|
|
|
|
subprog2(tmp);
|
|
|
|
}
|
|
|
|
|
|
|
|
__noinline static int timer_cb1(void *map, int *key, struct bpf_timer *timer)
|
|
|
|
{
|
|
|
|
subprog1(key);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
__noinline static int timer_cb2(void *map, int *key, struct bpf_timer *timer)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("fentry/bpf_fentry_test9")
|
|
|
|
__description("Private stack, async callback, not nested")
|
|
|
|
__success __retval(0)
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" movabsq $0x{{.*}}, %r9")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" mrs x10, TPIDR_EL{{[0-1]}}")
|
|
|
|
__jited(" add x27, x27, x10")
|
|
|
|
__jited(" add x25, x27, {{.*}}")
|
2024-11-12 08:39:27 -08:00
|
|
|
int private_stack_async_callback_1(void)
|
|
|
|
{
|
|
|
|
struct bpf_timer *arr_timer;
|
|
|
|
int array_key = 0;
|
|
|
|
|
|
|
|
arr_timer = bpf_map_lookup_elem(&array, &array_key);
|
|
|
|
if (!arr_timer)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
bpf_timer_init(arr_timer, &array, 1);
|
|
|
|
bpf_timer_set_callback(arr_timer, timer_cb2);
|
|
|
|
bpf_timer_start(arr_timer, 0, 0);
|
|
|
|
subprog1(&array_key);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
SEC("fentry/bpf_fentry_test9")
|
|
|
|
__description("Private stack, async callback, potential nesting")
|
|
|
|
__success __retval(0)
|
|
|
|
__arch_x86_64
|
|
|
|
__jited(" subq $0x100, %rsp")
|
selftests/bpf: Enable private stack tests for arm64
As arm64 JIT now supports private stack, make sure all relevant tests
run on arm64 architecture.
Relevant tests:
#415/1 struct_ops_private_stack/private_stack:OK
#415/2 struct_ops_private_stack/private_stack_fail:OK
#415/3 struct_ops_private_stack/private_stack_recur:OK
#415 struct_ops_private_stack:OK
#549/1 verifier_private_stack/Private stack, single prog:OK
#549/2 verifier_private_stack/Private stack, subtree > MAX_BPF_STACK:OK
#549/3 verifier_private_stack/No private stack:OK
#549/4 verifier_private_stack/Private stack, callback:OK
#549/5 verifier_private_stack/Private stack, exception in mainprog:OK
#549/6 verifier_private_stack/Private stack, exception in subprog:OK
#549/7 verifier_private_stack/Private stack, async callback, not nested:OK
#549/8 verifier_private_stack/Private stack, async callback, potential nesting:OK
#549 verifier_private_stack:OK
Summary: 2/11 PASSED, 0 SKIPPED, 0 FAILED
Signed-off-by: Puranjay Mohan <puranjay@kernel.org>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Yonghong Song <yonghong.song@linux.dev>
Link: https://lore.kernel.org/bpf/20250724120257.7299-4-puranjay@kernel.org
2025-07-24 12:02:55 +00:00
|
|
|
__arch_arm64
|
|
|
|
__jited(" sub sp, sp, #0x100")
|
2024-11-12 08:39:27 -08:00
|
|
|
int private_stack_async_callback_2(void)
|
|
|
|
{
|
|
|
|
struct bpf_timer *arr_timer;
|
|
|
|
int array_key = 0;
|
|
|
|
|
|
|
|
arr_timer = bpf_map_lookup_elem(&array, &array_key);
|
|
|
|
if (!arr_timer)
|
|
|
|
return 0;
|
|
|
|
|
|
|
|
bpf_timer_init(arr_timer, &array, 1);
|
|
|
|
bpf_timer_set_callback(arr_timer, timer_cb1);
|
|
|
|
bpf_timer_start(arr_timer, 0, 0);
|
|
|
|
subprog1(&array_key);
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#else
|
|
|
|
|
|
|
|
SEC("kprobe")
|
|
|
|
__description("private stack is not supported, use a dummy test")
|
|
|
|
__success
|
|
|
|
int dummy_test(void)
|
|
|
|
{
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
char _license[] SEC("license") = "GPL";
|