mirror of https://gitee.com/openkylin/linux.git
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: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Jiong Wang <jiong.wang@netronome.com> Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
This commit is contained in:
parent
1549921da3
commit
488feeaf6d
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue