117849Swosch// SPDX-License-Identifier: GPL-2.0 217849Swosch/* Converted from tools/testing/selftests/bpf/verifier/value_adj_spill.c */ 37630Sjkh 47630Sjkh#include <linux/bpf.h> 57630Sjkh#include <bpf/bpf_helpers.h> 67630Sjkh#include "bpf_misc.h" 77630Sjkh 87630Sjkh#define MAX_ENTRIES 11 97630Sjkh 107630Sjkhstruct test_val { 117630Sjkh unsigned int index; 127630Sjkh int foo[MAX_ENTRIES]; 137630Sjkh}; 147630Sjkh 157630Sjkhstruct { 167630Sjkh __uint(type, BPF_MAP_TYPE_HASH); 177630Sjkh __uint(max_entries, 1); 187630Sjkh __type(key, long long); 197630Sjkh __type(value, struct test_val); 207630Sjkh} map_hash_48b SEC(".maps"); 217630Sjkh 227630SjkhSEC("socket") 237630Sjkh__description("map element value is preserved across register spilling") 247630Sjkh__success __failure_unpriv __msg_unpriv("R0 leaks addr") 2550479Speter__retval(0) 26107583Sru__naked void is_preserved_across_register_spilling(void) 277630Sjkh{ 2879537Sru asm volatile (" \ 297630Sjkh r2 = r10; \ 307630Sjkh r2 += -8; \ 317630Sjkh r1 = 0; \ 32271095Sse *(u64*)(r2 + 0) = r1; \ 337630Sjkh r1 = %[map_hash_48b] ll; \ 3468965Sru call %[bpf_map_lookup_elem]; \ 3579755Sdd if r0 == 0 goto l0_%=; \ 3679755Sdd r1 = 42; \ 37165545Sru *(u64*)(r0 + 0) = r1; \ 38165545Sru r1 = r10; \ 39165545Sru r1 += -184; \ 40165545Sru *(u64*)(r1 + 0) = r0; \ 41165545Sru r3 = *(u64*)(r1 + 0); \ 42165545Sru r1 = 42; \ 43165545Sru *(u64*)(r3 + 0) = r1; \ 4479755Sddl0_%=: exit; \ 4520840Smpp" : 4695127Scharnier : __imm(bpf_map_lookup_elem), 4795127Scharnier __imm_addr(map_hash_48b) 4895127Scharnier : __clobber_all); 4979755Sdd} 5020840Smpp 5120840SmppSEC("socket") 5220840Smpp__description("map element value or null is marked on register spilling") 5320840Smpp__success __failure_unpriv __msg_unpriv("R0 leaks addr") 5482919Smurray__retval(0) 5582919Smurray__naked void is_marked_on_register_spilling(void) 5682919Smurray{ 5720840Smpp asm volatile (" \ 5879755Sdd r2 = r10; \ 5979755Sdd r2 += -8; \ 6020840Smpp r1 = 0; \ 6157673Ssheldonh *(u64*)(r2 + 0) = r1; \ 6279755Sdd r1 = %[map_hash_48b] ll; \ 6379755Sdd call %[bpf_map_lookup_elem]; \ 6479755Sdd r1 = r10; \ 6579755Sdd r1 += -152; \ 6620840Smpp *(u64*)(r1 + 0) = r0; \ 6779755Sdd if r0 == 0 goto l0_%=; \ 6879755Sdd r3 = *(u64*)(r1 + 0); \ 6920840Smpp r1 = 42; \ 7056484Scharnier *(u64*)(r3 + 0) = r1; \ 7156484Scharnierl0_%=: exit; \ 7256484Scharnier" : 7317631Swosch : __imm(bpf_map_lookup_elem), 7417631Swosch __imm_addr(map_hash_48b) 7582959Sru : __clobber_all); 7617631Swosch} 7717631Swosch 7882959Sruchar _license[] SEC("license") = "GPL"; 79165545Sru