162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0 262306a36Sopenharmony_ci/* Converted from tools/testing/selftests/bpf/verifier/value.c */ 362306a36Sopenharmony_ci 462306a36Sopenharmony_ci#include <linux/bpf.h> 562306a36Sopenharmony_ci#include <bpf/bpf_helpers.h> 662306a36Sopenharmony_ci#include "bpf_misc.h" 762306a36Sopenharmony_ci 862306a36Sopenharmony_ci#define MAX_ENTRIES 11 962306a36Sopenharmony_ci 1062306a36Sopenharmony_cistruct test_val { 1162306a36Sopenharmony_ci unsigned int index; 1262306a36Sopenharmony_ci int foo[MAX_ENTRIES]; 1362306a36Sopenharmony_ci}; 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_cistruct { 1662306a36Sopenharmony_ci __uint(type, BPF_MAP_TYPE_HASH); 1762306a36Sopenharmony_ci __uint(max_entries, 1); 1862306a36Sopenharmony_ci __type(key, long long); 1962306a36Sopenharmony_ci __type(value, struct test_val); 2062306a36Sopenharmony_ci} map_hash_48b SEC(".maps"); 2162306a36Sopenharmony_ci 2262306a36Sopenharmony_ciSEC("socket") 2362306a36Sopenharmony_ci__description("map element value store of cleared call register") 2462306a36Sopenharmony_ci__failure __msg("R1 !read_ok") 2562306a36Sopenharmony_ci__failure_unpriv __msg_unpriv("R1 !read_ok") 2662306a36Sopenharmony_ci__naked void store_of_cleared_call_register(void) 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci asm volatile (" \ 2962306a36Sopenharmony_ci r2 = r10; \ 3062306a36Sopenharmony_ci r2 += -8; \ 3162306a36Sopenharmony_ci r1 = 0; \ 3262306a36Sopenharmony_ci *(u64*)(r2 + 0) = r1; \ 3362306a36Sopenharmony_ci r1 = %[map_hash_48b] ll; \ 3462306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 3562306a36Sopenharmony_ci if r0 == 0 goto l0_%=; \ 3662306a36Sopenharmony_ci *(u64*)(r0 + 0) = r1; \ 3762306a36Sopenharmony_cil0_%=: exit; \ 3862306a36Sopenharmony_ci" : 3962306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 4062306a36Sopenharmony_ci __imm_addr(map_hash_48b) 4162306a36Sopenharmony_ci : __clobber_all); 4262306a36Sopenharmony_ci} 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciSEC("socket") 4562306a36Sopenharmony_ci__description("map element value with unaligned store") 4662306a36Sopenharmony_ci__success __failure_unpriv __msg_unpriv("R0 leaks addr") 4762306a36Sopenharmony_ci__retval(0) __flag(BPF_F_ANY_ALIGNMENT) 4862306a36Sopenharmony_ci__naked void element_value_with_unaligned_store(void) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci asm volatile (" \ 5162306a36Sopenharmony_ci r2 = r10; \ 5262306a36Sopenharmony_ci r2 += -8; \ 5362306a36Sopenharmony_ci r1 = 0; \ 5462306a36Sopenharmony_ci *(u64*)(r2 + 0) = r1; \ 5562306a36Sopenharmony_ci r1 = %[map_hash_48b] ll; \ 5662306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 5762306a36Sopenharmony_ci if r0 == 0 goto l0_%=; \ 5862306a36Sopenharmony_ci r0 += 3; \ 5962306a36Sopenharmony_ci r1 = 42; \ 6062306a36Sopenharmony_ci *(u64*)(r0 + 0) = r1; \ 6162306a36Sopenharmony_ci r1 = 43; \ 6262306a36Sopenharmony_ci *(u64*)(r0 + 2) = r1; \ 6362306a36Sopenharmony_ci r1 = 44; \ 6462306a36Sopenharmony_ci *(u64*)(r0 - 2) = r1; \ 6562306a36Sopenharmony_ci r8 = r0; \ 6662306a36Sopenharmony_ci r1 = 32; \ 6762306a36Sopenharmony_ci *(u64*)(r8 + 0) = r1; \ 6862306a36Sopenharmony_ci r1 = 33; \ 6962306a36Sopenharmony_ci *(u64*)(r8 + 2) = r1; \ 7062306a36Sopenharmony_ci r1 = 34; \ 7162306a36Sopenharmony_ci *(u64*)(r8 - 2) = r1; \ 7262306a36Sopenharmony_ci r8 += 5; \ 7362306a36Sopenharmony_ci r1 = 22; \ 7462306a36Sopenharmony_ci *(u64*)(r8 + 0) = r1; \ 7562306a36Sopenharmony_ci r1 = 23; \ 7662306a36Sopenharmony_ci *(u64*)(r8 + 4) = r1; \ 7762306a36Sopenharmony_ci r1 = 24; \ 7862306a36Sopenharmony_ci *(u64*)(r8 - 7) = r1; \ 7962306a36Sopenharmony_ci r7 = r8; \ 8062306a36Sopenharmony_ci r7 += 3; \ 8162306a36Sopenharmony_ci r1 = 22; \ 8262306a36Sopenharmony_ci *(u64*)(r7 + 0) = r1; \ 8362306a36Sopenharmony_ci r1 = 23; \ 8462306a36Sopenharmony_ci *(u64*)(r7 + 4) = r1; \ 8562306a36Sopenharmony_ci r1 = 24; \ 8662306a36Sopenharmony_ci *(u64*)(r7 - 4) = r1; \ 8762306a36Sopenharmony_cil0_%=: exit; \ 8862306a36Sopenharmony_ci" : 8962306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 9062306a36Sopenharmony_ci __imm_addr(map_hash_48b) 9162306a36Sopenharmony_ci : __clobber_all); 9262306a36Sopenharmony_ci} 9362306a36Sopenharmony_ci 9462306a36Sopenharmony_ciSEC("socket") 9562306a36Sopenharmony_ci__description("map element value with unaligned load") 9662306a36Sopenharmony_ci__success __failure_unpriv __msg_unpriv("R0 leaks addr") 9762306a36Sopenharmony_ci__retval(0) __flag(BPF_F_ANY_ALIGNMENT) 9862306a36Sopenharmony_ci__naked void element_value_with_unaligned_load(void) 9962306a36Sopenharmony_ci{ 10062306a36Sopenharmony_ci asm volatile (" \ 10162306a36Sopenharmony_ci r2 = r10; \ 10262306a36Sopenharmony_ci r2 += -8; \ 10362306a36Sopenharmony_ci r1 = 0; \ 10462306a36Sopenharmony_ci *(u64*)(r2 + 0) = r1; \ 10562306a36Sopenharmony_ci r1 = %[map_hash_48b] ll; \ 10662306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 10762306a36Sopenharmony_ci if r0 == 0 goto l0_%=; \ 10862306a36Sopenharmony_ci r1 = *(u32*)(r0 + 0); \ 10962306a36Sopenharmony_ci if r1 >= %[max_entries] goto l0_%=; \ 11062306a36Sopenharmony_ci r0 += 3; \ 11162306a36Sopenharmony_ci r7 = *(u64*)(r0 + 0); \ 11262306a36Sopenharmony_ci r7 = *(u64*)(r0 + 2); \ 11362306a36Sopenharmony_ci r8 = r0; \ 11462306a36Sopenharmony_ci r7 = *(u64*)(r8 + 0); \ 11562306a36Sopenharmony_ci r7 = *(u64*)(r8 + 2); \ 11662306a36Sopenharmony_ci r0 += 5; \ 11762306a36Sopenharmony_ci r7 = *(u64*)(r0 + 0); \ 11862306a36Sopenharmony_ci r7 = *(u64*)(r0 + 4); \ 11962306a36Sopenharmony_cil0_%=: exit; \ 12062306a36Sopenharmony_ci" : 12162306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 12262306a36Sopenharmony_ci __imm_addr(map_hash_48b), 12362306a36Sopenharmony_ci __imm_const(max_entries, MAX_ENTRIES) 12462306a36Sopenharmony_ci : __clobber_all); 12562306a36Sopenharmony_ci} 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ciSEC("socket") 12862306a36Sopenharmony_ci__description("map element value is preserved across register spilling") 12962306a36Sopenharmony_ci__success __failure_unpriv __msg_unpriv("R0 leaks addr") 13062306a36Sopenharmony_ci__retval(0) __flag(BPF_F_ANY_ALIGNMENT) 13162306a36Sopenharmony_ci__naked void is_preserved_across_register_spilling(void) 13262306a36Sopenharmony_ci{ 13362306a36Sopenharmony_ci asm volatile (" \ 13462306a36Sopenharmony_ci r2 = r10; \ 13562306a36Sopenharmony_ci r2 += -8; \ 13662306a36Sopenharmony_ci r1 = 0; \ 13762306a36Sopenharmony_ci *(u64*)(r2 + 0) = r1; \ 13862306a36Sopenharmony_ci r1 = %[map_hash_48b] ll; \ 13962306a36Sopenharmony_ci call %[bpf_map_lookup_elem]; \ 14062306a36Sopenharmony_ci if r0 == 0 goto l0_%=; \ 14162306a36Sopenharmony_ci r0 += %[test_val_foo]; \ 14262306a36Sopenharmony_ci r1 = 42; \ 14362306a36Sopenharmony_ci *(u64*)(r0 + 0) = r1; \ 14462306a36Sopenharmony_ci r1 = r10; \ 14562306a36Sopenharmony_ci r1 += -184; \ 14662306a36Sopenharmony_ci *(u64*)(r1 + 0) = r0; \ 14762306a36Sopenharmony_ci r3 = *(u64*)(r1 + 0); \ 14862306a36Sopenharmony_ci r1 = 42; \ 14962306a36Sopenharmony_ci *(u64*)(r3 + 0) = r1; \ 15062306a36Sopenharmony_cil0_%=: exit; \ 15162306a36Sopenharmony_ci" : 15262306a36Sopenharmony_ci : __imm(bpf_map_lookup_elem), 15362306a36Sopenharmony_ci __imm_addr(map_hash_48b), 15462306a36Sopenharmony_ci __imm_const(test_val_foo, offsetof(struct test_val, foo)) 15562306a36Sopenharmony_ci : __clobber_all); 15662306a36Sopenharmony_ci} 15762306a36Sopenharmony_ci 15862306a36Sopenharmony_cichar _license[] SEC("license") = "GPL"; 159