diff options
Diffstat (limited to 'arch')
| -rw-r--r-- | arch/sparc/net/bpf_jit_comp.c | 25 |
1 files changed, 18 insertions, 7 deletions
diff --git a/arch/sparc/net/bpf_jit_comp.c b/arch/sparc/net/bpf_jit_comp.c index 1f76c22a6a75..51ae87b483e0 100644 --- a/arch/sparc/net/bpf_jit_comp.c +++ b/arch/sparc/net/bpf_jit_comp.c | |||
| @@ -234,12 +234,18 @@ do { BUILD_BUG_ON(FIELD_SIZEOF(STRUCT, FIELD) != sizeof(u8)); \ | |||
| 234 | __emit_load8(BASE, STRUCT, FIELD, DEST); \ | 234 | __emit_load8(BASE, STRUCT, FIELD, DEST); \ |
| 235 | } while (0) | 235 | } while (0) |
| 236 | 236 | ||
| 237 | #define emit_ldmem(OFF, DEST) \ | 237 | #ifdef CONFIG_SPARC64 |
| 238 | do { *prog++ = LD32I | RS1(FP) | S13(-(OFF)) | RD(DEST); \ | 238 | #define BIAS (STACK_BIAS - 4) |
| 239 | #else | ||
| 240 | #define BIAS (-4) | ||
| 241 | #endif | ||
| 242 | |||
| 243 | #define emit_ldmem(OFF, DEST) \ | ||
| 244 | do { *prog++ = LD32I | RS1(SP) | S13(BIAS - (OFF)) | RD(DEST); \ | ||
| 239 | } while (0) | 245 | } while (0) |
| 240 | 246 | ||
| 241 | #define emit_stmem(OFF, SRC) \ | 247 | #define emit_stmem(OFF, SRC) \ |
| 242 | do { *prog++ = LD32I | RS1(FP) | S13(-(OFF)) | RD(SRC); \ | 248 | do { *prog++ = ST32I | RS1(SP) | S13(BIAS - (OFF)) | RD(SRC); \ |
| 243 | } while (0) | 249 | } while (0) |
| 244 | 250 | ||
| 245 | #ifdef CONFIG_SMP | 251 | #ifdef CONFIG_SMP |
| @@ -615,10 +621,11 @@ void bpf_jit_compile(struct bpf_prog *fp) | |||
| 615 | case BPF_ANC | SKF_AD_VLAN_TAG: | 621 | case BPF_ANC | SKF_AD_VLAN_TAG: |
| 616 | case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT: | 622 | case BPF_ANC | SKF_AD_VLAN_TAG_PRESENT: |
| 617 | emit_skb_load16(vlan_tci, r_A); | 623 | emit_skb_load16(vlan_tci, r_A); |
| 618 | if (code == (BPF_ANC | SKF_AD_VLAN_TAG)) { | 624 | if (code != (BPF_ANC | SKF_AD_VLAN_TAG)) { |
| 619 | emit_andi(r_A, VLAN_VID_MASK, r_A); | 625 | emit_alu_K(SRL, 12); |
| 626 | emit_andi(r_A, 1, r_A); | ||
| 620 | } else { | 627 | } else { |
| 621 | emit_loadimm(VLAN_TAG_PRESENT, r_TMP); | 628 | emit_loadimm(~VLAN_TAG_PRESENT, r_TMP); |
| 622 | emit_and(r_A, r_TMP, r_A); | 629 | emit_and(r_A, r_TMP, r_A); |
| 623 | } | 630 | } |
| 624 | break; | 631 | break; |
| @@ -630,15 +637,19 @@ void bpf_jit_compile(struct bpf_prog *fp) | |||
| 630 | emit_loadimm(K, r_X); | 637 | emit_loadimm(K, r_X); |
| 631 | break; | 638 | break; |
| 632 | case BPF_LD | BPF_MEM: | 639 | case BPF_LD | BPF_MEM: |
| 640 | seen |= SEEN_MEM; | ||
| 633 | emit_ldmem(K * 4, r_A); | 641 | emit_ldmem(K * 4, r_A); |
| 634 | break; | 642 | break; |
| 635 | case BPF_LDX | BPF_MEM: | 643 | case BPF_LDX | BPF_MEM: |
| 644 | seen |= SEEN_MEM | SEEN_XREG; | ||
| 636 | emit_ldmem(K * 4, r_X); | 645 | emit_ldmem(K * 4, r_X); |
| 637 | break; | 646 | break; |
| 638 | case BPF_ST: | 647 | case BPF_ST: |
| 648 | seen |= SEEN_MEM; | ||
| 639 | emit_stmem(K * 4, r_A); | 649 | emit_stmem(K * 4, r_A); |
| 640 | break; | 650 | break; |
| 641 | case BPF_STX: | 651 | case BPF_STX: |
| 652 | seen |= SEEN_MEM | SEEN_XREG; | ||
| 642 | emit_stmem(K * 4, r_X); | 653 | emit_stmem(K * 4, r_X); |
| 643 | break; | 654 | break; |
| 644 | 655 | ||
