]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
nfp: bpf: add helpers for modifying branch addresses
authorJakub Kicinski <jakub.kicinski@netronome.com>
Wed, 10 Jan 2018 12:26:00 +0000 (12:26 +0000)
committerDaniel Borkmann <daniel@iogearbox.net>
Wed, 10 Jan 2018 12:49:35 +0000 (13:49 +0100)
In preparation for better handling of relocations move existing
helper for setting branch offset to nfp_asm.c and add two more.

Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: Jiong Wang <jiong.wang@netronome.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
drivers/net/ethernet/netronome/nfp/bpf/jit.c
drivers/net/ethernet/netronome/nfp/nfp_asm.c
drivers/net/ethernet/netronome/nfp/nfp_asm.h

index 9caff3a7505a9f67390c991e0714bf79028f0890..c5d1628a5414655d5b51e09e9b67a084de2dfa73 100644 (file)
@@ -2110,18 +2110,6 @@ static const instr_cb_t instr_cb[256] = {
        [BPF_JMP | BPF_EXIT] =          goto_out,
 };
 
-/* --- Misc code --- */
-static void br_set_offset(u64 *instr, u16 offset)
-{
-       u16 addr_lo, addr_hi;
-
-       addr_lo = offset & (OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO));
-       addr_hi = offset != addr_lo;
-       *instr &= ~(OP_BR_ADDR_HI | OP_BR_ADDR_LO);
-       *instr |= FIELD_PREP(OP_BR_ADDR_HI, addr_hi);
-       *instr |= FIELD_PREP(OP_BR_ADDR_LO, addr_lo);
-}
-
 /* --- Assembler logic --- */
 static int nfp_fixup_branches(struct nfp_prog *nfp_prog)
 {
index d3610987fb0733be2df8017665739e9fb2094f16..9ee3a3f60cc7ae65041157dca64f1ecb004f10f1 100644 (file)
@@ -50,6 +50,36 @@ const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE] = {
        [CMD_TGT_READ_SWAP_LE] =        { 0x03, 0x40 },
 };
 
+u16 br_get_offset(u64 instr)
+{
+       u16 addr_lo, addr_hi;
+
+       addr_lo = FIELD_GET(OP_BR_ADDR_LO, instr);
+       addr_hi = FIELD_GET(OP_BR_ADDR_HI, instr);
+
+       return (addr_hi * ((OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO)) + 1)) |
+               addr_lo;
+}
+
+void br_set_offset(u64 *instr, u16 offset)
+{
+       u16 addr_lo, addr_hi;
+
+       addr_lo = offset & (OP_BR_ADDR_LO >> __bf_shf(OP_BR_ADDR_LO));
+       addr_hi = offset != addr_lo;
+       *instr &= ~(OP_BR_ADDR_HI | OP_BR_ADDR_LO);
+       *instr |= FIELD_PREP(OP_BR_ADDR_HI, addr_hi);
+       *instr |= FIELD_PREP(OP_BR_ADDR_LO, addr_lo);
+}
+
+void br_add_offset(u64 *instr, u16 offset)
+{
+       u16 addr;
+
+       addr = br_get_offset(*instr);
+       br_set_offset(instr, addr + offset);
+}
+
 static u16 nfp_swreg_to_unreg(swreg reg, bool is_dst)
 {
        bool lm_id, lm_dec = false;
index a24daeab1a775840e382e14ff1db407764bd49f6..a50240ab0ce259cf46fdb31ec2c6201954f38927 100644 (file)
@@ -93,6 +93,10 @@ enum br_ctx_signal_state {
        BR_CSS_NONE = 2,
 };
 
+u16 br_get_offset(u64 instr);
+void br_set_offset(u64 *instr, u16 offset);
+void br_add_offset(u64 *instr, u16 offset);
+
 #define OP_BBYTE_BASE          0x0c800000000ULL
 #define OP_BB_A_SRC            0x000000000ffULL
 #define OP_BB_BYTE             0x00000000300ULL