hc
2024-12-19 9370bb92b2d16684ee45cf24e879c93c509162da
kernel/arch/mips/net/bpf_jit.c
....@@ -694,7 +694,7 @@
694694 emit_load_imm(r_A, k, ctx);
695695 break;
696696 case BPF_LD | BPF_W | BPF_LEN:
697
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, len) != 4);
697
+ BUILD_BUG_ON(sizeof_field(struct sk_buff, len) != 4);
698698 /* A <- len ==> lw r_A, offset(skb) */
699699 ctx->flags |= SEEN_SKB | SEEN_A;
700700 off = offsetof(struct sk_buff, len);
....@@ -1117,7 +1117,7 @@
11171117 case BPF_ANC | SKF_AD_PROTOCOL:
11181118 /* A = ntohs(skb->protocol */
11191119 ctx->flags |= SEEN_SKB | SEEN_OFF | SEEN_A;
1120
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
1120
+ BUILD_BUG_ON(sizeof_field(struct sk_buff,
11211121 protocol) != 2);
11221122 off = offsetof(struct sk_buff, protocol);
11231123 emit_half_load(r_A, r_skb, off, ctx);
....@@ -1142,7 +1142,7 @@
11421142 case BPF_ANC | SKF_AD_CPU:
11431143 ctx->flags |= SEEN_A | SEEN_OFF;
11441144 /* A = current_thread_info()->cpu */
1145
- BUILD_BUG_ON(FIELD_SIZEOF(struct thread_info,
1145
+ BUILD_BUG_ON(sizeof_field(struct thread_info,
11461146 cpu) != 4);
11471147 off = offsetof(struct thread_info, cpu);
11481148 /* $28/gp points to the thread_info struct */
....@@ -1163,41 +1163,41 @@
11631163 emit_bcond(MIPS_COND_EQ, r_s0, r_zero, b_off, ctx);
11641164 emit_reg_move(r_ret, r_zero, ctx);
11651165 if (code == (BPF_ANC | SKF_AD_IFINDEX)) {
1166
- BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, ifindex) != 4);
1166
+ BUILD_BUG_ON(sizeof_field(struct net_device, ifindex) != 4);
11671167 off = offsetof(struct net_device, ifindex);
11681168 emit_load(r_A, r_s0, off, ctx);
11691169 } else { /* (code == (BPF_ANC | SKF_AD_HATYPE) */
1170
- BUILD_BUG_ON(FIELD_SIZEOF(struct net_device, type) != 2);
1170
+ BUILD_BUG_ON(sizeof_field(struct net_device, type) != 2);
11711171 off = offsetof(struct net_device, type);
11721172 emit_half_load_unsigned(r_A, r_s0, off, ctx);
11731173 }
11741174 break;
11751175 case BPF_ANC | SKF_AD_MARK:
11761176 ctx->flags |= SEEN_SKB | SEEN_A;
1177
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, mark) != 4);
1177
+ BUILD_BUG_ON(sizeof_field(struct sk_buff, mark) != 4);
11781178 off = offsetof(struct sk_buff, mark);
11791179 emit_load(r_A, r_skb, off, ctx);
11801180 break;
11811181 case BPF_ANC | SKF_AD_RXHASH:
11821182 ctx->flags |= SEEN_SKB | SEEN_A;
1183
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff, hash) != 4);
1183
+ BUILD_BUG_ON(sizeof_field(struct sk_buff, hash) != 4);
11841184 off = offsetof(struct sk_buff, hash);
11851185 emit_load(r_A, r_skb, off, ctx);
11861186 break;
11871187 case BPF_ANC | SKF_AD_VLAN_TAG:
1188
- case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
11891188 ctx->flags |= SEEN_SKB | SEEN_A;
1190
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
1189
+ BUILD_BUG_ON(sizeof_field(struct sk_buff,
11911190 vlan_tci) != 2);
11921191 off = offsetof(struct sk_buff, vlan_tci);
1193
- emit_half_load_unsigned(r_s0, r_skb, off, ctx);
1194
- if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) {
1195
- emit_andi(r_A, r_s0, (u16)~VLAN_TAG_PRESENT, ctx);
1196
- } else {
1197
- emit_andi(r_A, r_s0, VLAN_TAG_PRESENT, ctx);
1198
- /* return 1 if present */
1199
- emit_sltu(r_A, r_zero, r_A, ctx);
1200
- }
1192
+ emit_half_load_unsigned(r_A, r_skb, off, ctx);
1193
+ break;
1194
+ case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT:
1195
+ ctx->flags |= SEEN_SKB | SEEN_A;
1196
+ emit_load_byte(r_A, r_skb, PKT_VLAN_PRESENT_OFFSET(), ctx);
1197
+ if (PKT_VLAN_PRESENT_BIT)
1198
+ emit_srl(r_A, r_A, PKT_VLAN_PRESENT_BIT, ctx);
1199
+ if (PKT_VLAN_PRESENT_BIT < 7)
1200
+ emit_andi(r_A, r_A, 1, ctx);
12011201 break;
12021202 case BPF_ANC | SKF_AD_PKTTYPE:
12031203 ctx->flags |= SEEN_SKB;
....@@ -1212,7 +1212,7 @@
12121212 break;
12131213 case BPF_ANC | SKF_AD_QUEUE:
12141214 ctx->flags |= SEEN_SKB | SEEN_A;
1215
- BUILD_BUG_ON(FIELD_SIZEOF(struct sk_buff,
1215
+ BUILD_BUG_ON(sizeof_field(struct sk_buff,
12161216 queue_mapping) != 2);
12171217 BUILD_BUG_ON(offsetof(struct sk_buff,
12181218 queue_mapping) > 0xff);