diff options
author | Yang Shi <yang.shi@linaro.org> | 2015-11-30 17:24:07 -0500 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2015-12-03 11:38:31 -0500 |
commit | df849ba3a88cdf4480decd7008f95ff627387c0f (patch) | |
tree | 44808eda4e18942ec50fa20340fed46fd075e8d5 /arch/arm64/net | |
parent | 6bd4f355df2eae80b8a5c7b097371cd1e05f20d5 (diff) |
arm64: bpf: add 'store immediate' instruction
aarch64 doesn't have native store immediate instruction, such operation
has to be implemented by the below instruction sequence:
Load immediate to register
Store register
Signed-off-by: Yang Shi <yang.shi@linaro.org>
CC: Zi Shen Lim <zlim.lnx@gmail.com>
CC: Xi Wang <xi.wang@gmail.com>
Reviewed-by: Zi Shen Lim <zlim.lnx@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'arch/arm64/net')
-rw-r--r-- | arch/arm64/net/bpf_jit_comp.c | 20 |
1 files changed, 19 insertions, 1 deletions
diff --git a/arch/arm64/net/bpf_jit_comp.c b/arch/arm64/net/bpf_jit_comp.c index 7cf032bebf8c..b162ad70effc 100644 --- a/arch/arm64/net/bpf_jit_comp.c +++ b/arch/arm64/net/bpf_jit_comp.c | |||
@@ -590,7 +590,25 @@ emit_cond_jmp: | |||
590 | case BPF_ST | BPF_MEM | BPF_H: | 590 | case BPF_ST | BPF_MEM | BPF_H: |
591 | case BPF_ST | BPF_MEM | BPF_B: | 591 | case BPF_ST | BPF_MEM | BPF_B: |
592 | case BPF_ST | BPF_MEM | BPF_DW: | 592 | case BPF_ST | BPF_MEM | BPF_DW: |
593 | goto notyet; | 593 | /* Load imm to a register then store it */ |
594 | ctx->tmp_used = 1; | ||
595 | emit_a64_mov_i(1, tmp2, off, ctx); | ||
596 | emit_a64_mov_i(1, tmp, imm, ctx); | ||
597 | switch (BPF_SIZE(code)) { | ||
598 | case BPF_W: | ||
599 | emit(A64_STR32(tmp, dst, tmp2), ctx); | ||
600 | break; | ||
601 | case BPF_H: | ||
602 | emit(A64_STRH(tmp, dst, tmp2), ctx); | ||
603 | break; | ||
604 | case BPF_B: | ||
605 | emit(A64_STRB(tmp, dst, tmp2), ctx); | ||
606 | break; | ||
607 | case BPF_DW: | ||
608 | emit(A64_STR64(tmp, dst, tmp2), ctx); | ||
609 | break; | ||
610 | } | ||
611 | break; | ||
594 | 612 | ||
595 | /* STX: *(size *)(dst + off) = src */ | 613 | /* STX: *(size *)(dst + off) = src */ |
596 | case BPF_STX | BPF_MEM | BPF_W: | 614 | case BPF_STX | BPF_MEM | BPF_W: |