0001 {
0002 "jset: functional",
0003 .insns = {
0004 BPF_DIRECT_PKT_R2,
0005 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0006
0007
0008 BPF_LD_IMM64(BPF_REG_8, 0x8000000000000001),
0009 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0010 BPF_EXIT_INSN(),
0011
0012
0013 BPF_LD_IMM64(BPF_REG_8, 0x4000000000000000),
0014 BPF_JMP_REG(BPF_JSET, BPF_REG_7, BPF_REG_8, 1),
0015 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0016 BPF_EXIT_INSN(),
0017
0018
0019 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, -1, 1),
0020 BPF_EXIT_INSN(),
0021
0022
0023 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
0024 BPF_EXIT_INSN(),
0025
0026
0027 BPF_MOV64_IMM(BPF_REG_0, 2),
0028 BPF_EXIT_INSN(),
0029 },
0030 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0031 .result = ACCEPT,
0032 .runs = 7,
0033 .retvals = {
0034 { .retval = 2,
0035 .data64 = { (1ULL << 63) | (1U << 31) | (1U << 0), }
0036 },
0037 { .retval = 2,
0038 .data64 = { (1ULL << 63) | (1U << 31), }
0039 },
0040 { .retval = 2,
0041 .data64 = { (1ULL << 31) | (1U << 0), }
0042 },
0043 { .retval = 2,
0044 .data64 = { (__u32)-1, }
0045 },
0046 { .retval = 2,
0047 .data64 = { ~0x4000000000000000ULL, }
0048 },
0049 { .retval = 0,
0050 .data64 = { 0, }
0051 },
0052 { .retval = 0,
0053 .data64 = { ~0ULL, }
0054 },
0055 },
0056 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0057 },
0058 {
0059 "jset: sign-extend",
0060 .insns = {
0061 BPF_DIRECT_PKT_R2,
0062 BPF_LDX_MEM(BPF_DW, BPF_REG_7, BPF_REG_2, 0),
0063
0064 BPF_JMP_IMM(BPF_JSET, BPF_REG_7, 0x80000000, 1),
0065 BPF_EXIT_INSN(),
0066
0067 BPF_MOV64_IMM(BPF_REG_0, 2),
0068 BPF_EXIT_INSN(),
0069 },
0070 .prog_type = BPF_PROG_TYPE_SCHED_CLS,
0071 .result = ACCEPT,
0072 .retval = 2,
0073 .data = { 1, 0, 0, 0, 0, 0, 0, 1, },
0074 .flags = F_NEEDS_EFFICIENT_UNALIGNED_ACCESS,
0075 },
0076 {
0077 "jset: known const compare",
0078 .insns = {
0079 BPF_MOV64_IMM(BPF_REG_0, 1),
0080 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
0081 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0082 BPF_EXIT_INSN(),
0083 },
0084 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0085 .errstr_unpriv = "R9 !read_ok",
0086 .result_unpriv = REJECT,
0087 .retval = 1,
0088 .result = ACCEPT,
0089 },
0090 {
0091 "jset: known const compare bad",
0092 .insns = {
0093 BPF_MOV64_IMM(BPF_REG_0, 0),
0094 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
0095 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0096 BPF_EXIT_INSN(),
0097 },
0098 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0099 .errstr_unpriv = "!read_ok",
0100 .result_unpriv = REJECT,
0101 .errstr = "!read_ok",
0102 .result = REJECT,
0103 },
0104 {
0105 "jset: unknown const compare taken",
0106 .insns = {
0107 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
0108 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
0109 BPF_JMP_IMM(BPF_JA, 0, 0, 1),
0110 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0111 BPF_EXIT_INSN(),
0112 },
0113 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0114 .errstr_unpriv = "!read_ok",
0115 .result_unpriv = REJECT,
0116 .errstr = "!read_ok",
0117 .result = REJECT,
0118 },
0119 {
0120 "jset: unknown const compare not taken",
0121 .insns = {
0122 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
0123 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 1, 1),
0124 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0125 BPF_EXIT_INSN(),
0126 },
0127 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0128 .errstr_unpriv = "!read_ok",
0129 .result_unpriv = REJECT,
0130 .errstr = "!read_ok",
0131 .result = REJECT,
0132 },
0133 {
0134 "jset: half-known const compare",
0135 .insns = {
0136 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
0137 BPF_ALU64_IMM(BPF_OR, BPF_REG_0, 2),
0138 BPF_JMP_IMM(BPF_JSET, BPF_REG_0, 3, 1),
0139 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0140 BPF_MOV64_IMM(BPF_REG_0, 0),
0141 BPF_EXIT_INSN(),
0142 },
0143 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0144 .errstr_unpriv = "R9 !read_ok",
0145 .result_unpriv = REJECT,
0146 .result = ACCEPT,
0147 },
0148 {
0149 "jset: range",
0150 .insns = {
0151 BPF_RAW_INSN(BPF_JMP | BPF_CALL, 0, 0, 0, BPF_FUNC_get_prandom_u32),
0152 BPF_MOV64_REG(BPF_REG_1, BPF_REG_0),
0153 BPF_MOV64_IMM(BPF_REG_0, 0),
0154 BPF_ALU64_IMM(BPF_AND, BPF_REG_1, 0xff),
0155 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0xf0, 3),
0156 BPF_JMP_IMM(BPF_JLT, BPF_REG_1, 0x10, 1),
0157 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0158 BPF_EXIT_INSN(),
0159 BPF_JMP_IMM(BPF_JSET, BPF_REG_1, 0x10, 1),
0160 BPF_EXIT_INSN(),
0161 BPF_JMP_IMM(BPF_JGE, BPF_REG_1, 0x10, 1),
0162 BPF_LDX_MEM(BPF_B, BPF_REG_8, BPF_REG_9, 0),
0163 BPF_EXIT_INSN(),
0164 },
0165 .prog_type = BPF_PROG_TYPE_SOCKET_FILTER,
0166 .errstr_unpriv = "R9 !read_ok",
0167 .result_unpriv = REJECT,
0168 .result = ACCEPT,
0169 },