diff options
| -rw-r--r-- | drivers/net/ethernet/netronome/nfp/bpf/jit.c | 13 |
1 files changed, 12 insertions, 1 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index f272247d1708..d4bf0e694541 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c | |||
| @@ -328,7 +328,18 @@ __emit_shf(struct nfp_prog *nfp_prog, u16 dst, enum alu_dst_ab dst_ab, | |||
| 328 | return; | 328 | return; |
| 329 | } | 329 | } |
| 330 | 330 | ||
| 331 | if (sc == SHF_SC_L_SHF) | 331 | /* NFP shift instruction has something special. If shift direction is |
| 332 | * left then shift amount of 1 to 31 is specified as 32 minus the amount | ||
| 333 | * to shift. | ||
| 334 | * | ||
| 335 | * But no need to do this for indirect shift which has shift amount be | ||
| 336 | * 0. Even after we do this subtraction, shift amount 0 will be turned | ||
| 337 | * into 32 which will eventually be encoded the same as 0 because only | ||
| 338 | * low 5 bits are encoded, but shift amount be 32 will fail the | ||
| 339 | * FIELD_PREP check done later on shift mask (0x1f), due to 32 is out of | ||
| 340 | * mask range. | ||
| 341 | */ | ||
| 342 | if (sc == SHF_SC_L_SHF && shift) | ||
| 332 | shift = 32 - shift; | 343 | shift = 32 - shift; |
| 333 | 344 | ||
| 334 | insn = OP_SHF_BASE | | 345 | insn = OP_SHF_BASE | |
