提交 488feeaf 编写于 作者: J Jakub Kicinski 提交者: Daniel Borkmann

nfp: bpf: add helpers for modifying branch addresses

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: NJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: NJiong Wang <jiong.wang@netronome.com>
Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
上级 1549921d
...@@ -2110,18 +2110,6 @@ static const instr_cb_t instr_cb[256] = { ...@@ -2110,18 +2110,6 @@ static const instr_cb_t instr_cb[256] = {
[BPF_JMP | BPF_EXIT] = goto_out, [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 --- */ /* --- Assembler logic --- */
static int nfp_fixup_branches(struct nfp_prog *nfp_prog) static int nfp_fixup_branches(struct nfp_prog *nfp_prog)
{ {
......
...@@ -50,6 +50,36 @@ const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE] = { ...@@ -50,6 +50,36 @@ const struct cmd_tgt_act cmd_tgt_act[__CMD_TGT_MAP_SIZE] = {
[CMD_TGT_READ_SWAP_LE] = { 0x03, 0x40 }, [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) static u16 nfp_swreg_to_unreg(swreg reg, bool is_dst)
{ {
bool lm_id, lm_dec = false; bool lm_id, lm_dec = false;
......
...@@ -93,6 +93,10 @@ enum br_ctx_signal_state { ...@@ -93,6 +93,10 @@ enum br_ctx_signal_state {
BR_CSS_NONE = 2, 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_BBYTE_BASE 0x0c800000000ULL
#define OP_BB_A_SRC 0x000000000ffULL #define OP_BB_A_SRC 0x000000000ffULL
#define OP_BB_BYTE 0x00000000300ULL #define OP_BB_BYTE 0x00000000300ULL
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册