2019-01-31 15:40:07 -08:00
{
" spin_lock: test1 success " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_6 , 0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = ACCEPT ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test2 direct ld/st " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_1 , 0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " cannot be accessed directly " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test3 direct ld/st " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_6 , 1 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " cannot be accessed directly " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
2019-02-05 13:41:25 +01:00
. flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS ,
2019-01-31 15:40:07 -08:00
} ,
{
" spin_lock: test4 direct ld/st " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_H , BPF_REG_0 , BPF_REG_6 , 3 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " cannot be accessed directly " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
2019-02-05 13:41:25 +01:00
. flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS ,
2019-01-31 15:40:07 -08:00
} ,
{
" spin_lock: test5 call within a locked region " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_get_prandom_u32 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " calls are not allowed " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test6 missing unlock " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_6 , 0 ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " unlock is missing " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test7 unlock without lock " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_1 , 0 , 1 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_6 , 0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " without taking a lock " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test8 double lock " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_LDX_MEM ( BPF_W , BPF_REG_0 , BPF_REG_6 , 0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " calls are not allowed " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test9 different lock " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_7 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_7 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 , 11 } ,
. result = REJECT ,
. errstr = " unlock of different lock " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test10 lock in subprog without unlock " ,
. insns = {
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 1 , 0 , 5 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_6 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 3 } ,
. result = REJECT ,
. errstr = " unlock is missing " ,
. result_unpriv = REJECT ,
. errstr_unpriv = " " ,
. prog_type = BPF_PROG_TYPE_CGROUP_SKB ,
} ,
{
" spin_lock: test11 ld_abs under lock " ,
. insns = {
BPF_MOV64_REG ( BPF_REG_6 , BPF_REG_1 ) ,
BPF_ST_MEM ( BPF_W , BPF_REG_10 , - 4 , 0 ) ,
BPF_MOV64_REG ( BPF_REG_2 , BPF_REG_10 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_2 , - 4 ) ,
BPF_LD_MAP_FD ( BPF_REG_1 ,
0 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_map_lookup_elem ) ,
BPF_JMP_IMM ( BPF_JNE , BPF_REG_0 , 0 , 1 ) ,
BPF_EXIT_INSN ( ) ,
BPF_MOV64_REG ( BPF_REG_7 , BPF_REG_0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_0 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_lock ) ,
BPF_LD_ABS ( BPF_B , 0 ) ,
BPF_MOV64_REG ( BPF_REG_1 , BPF_REG_7 ) ,
BPF_ALU64_IMM ( BPF_ADD , BPF_REG_1 , 4 ) ,
BPF_RAW_INSN ( BPF_JMP | BPF_CALL , 0 , 0 , 0 , BPF_FUNC_spin_unlock ) ,
BPF_MOV64_IMM ( BPF_REG_0 , 0 ) ,
BPF_EXIT_INSN ( ) ,
} ,
. fixup_map_spin_lock = { 4 } ,
. result = REJECT ,
. errstr = " inside bpf_spin_lock " ,
. prog_type = BPF_PROG_TYPE_SCHED_CLS ,
} ,