mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
2db414c36b
PR 31843
3004 lines
94 KiB
C
3004 lines
94 KiB
C
/* Print NFP instructions for objdump.
|
|
Copyright (C) 2017-2024 Free Software Foundation, Inc.
|
|
Contributed by Francois H. Theron <francois.theron@netronome.com>
|
|
|
|
This file is part of the GNU opcodes library.
|
|
|
|
This library is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 3, or (at your option)
|
|
any later version.
|
|
|
|
It is distributed in the hope that it will be useful, but WITHOUT
|
|
ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
|
|
or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
|
|
License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston,
|
|
MA 02110-1301, USA. */
|
|
|
|
/* There will be many magic numbers here that are based on hardware.
|
|
Making #define macros for each encoded bit field will probably reduce
|
|
readability far more than the simple numbers will, so we make sure that
|
|
the context of the magic numbers make it clear what they are used for. */
|
|
|
|
#include "sysdep.h"
|
|
#include <stdio.h>
|
|
#include "disassemble.h"
|
|
#include "libiberty.h"
|
|
#include "elf/nfp.h"
|
|
#include "opcode/nfp.h"
|
|
#include "opintl.h"
|
|
#include "elf-bfd.h"
|
|
#include "bfd.h"
|
|
#include <stdint.h>
|
|
|
|
#define _NFP_ERR_STOP -1
|
|
#define _NFP_ERR_CONT -8
|
|
|
|
#define _BTST(v, b) (((v) >> b) & 1)
|
|
#define _BF(v, msb, lsb) (((v) >> (lsb)) & \
|
|
((1U << ((msb) - (lsb) + 1)) - 1))
|
|
#define _BFS(v, msb, lsb, lshift) (_BF(v, msb, lsb) << (lshift))
|
|
|
|
#define _NFP_ME27_28_CSR_CTX_ENABLES 0x18
|
|
#define _NFP_ME27_28_CSR_MISC_CONTROL 0x160
|
|
|
|
#define _NFP_ISLAND_MAX 64
|
|
#define _NFP_ME_MAX 12
|
|
|
|
typedef struct
|
|
{
|
|
unsigned char ctx4_mode:1;
|
|
unsigned char addr_3rdparty32:1;
|
|
unsigned char scs_cnt:2;
|
|
unsigned char _future:4;
|
|
}
|
|
nfp_priv_mecfg;
|
|
|
|
typedef struct
|
|
{
|
|
unsigned char show_pc;
|
|
unsigned char ctx_mode;
|
|
}
|
|
nfp_opts;
|
|
|
|
/* mecfgs[island][menum][is-text] */
|
|
typedef struct
|
|
{
|
|
nfp_priv_mecfg mecfgs[_NFP_ISLAND_MAX][_NFP_ME_MAX][2];
|
|
}
|
|
nfp_priv_data;
|
|
|
|
static const char *nfp_mealu_shf_op[8] =
|
|
{
|
|
/* 0b000 (0) */ "B",
|
|
/* 0b001 (1) */ "~B",
|
|
/* 0b010 (2) */ "AND",
|
|
/* 0b011 (3) */ "~AND",
|
|
/* 0b100 (4) */ "AND~",
|
|
/* 0b101 (5) */ "OR",
|
|
/* 0b110 (6) */ "asr",
|
|
/* 0b111 (7) */ "byte_align"
|
|
};
|
|
|
|
static const char *nfp_me27_28_alu_op[32] =
|
|
{
|
|
/* 0b00000 (0) */ "B",
|
|
/* 0b00001 (1) */ "+",
|
|
NULL,
|
|
/* 0b00011 (3) */ "pop_count3",
|
|
/* 0b00100 (4) */ "~B",
|
|
/* 0b00101 (5) */ "+16",
|
|
/* 0b00110 (6) */ "pop_count1",
|
|
/* 0b00111 (7) */ "pop_count2",
|
|
/* 0b01000 (8) */ "AND",
|
|
/* 0b01001 (9) */ "+8",
|
|
NULL,
|
|
/* 0b01011 (11) */ "cam_clear",
|
|
/* 0b01100 (12) */ "~AND",
|
|
/* 0b01101 (13) */ "-carry",
|
|
/* 0b01110 (14) */ "ffs",
|
|
/* 0b01111 (15) */ "cam_read_tag",
|
|
/* 0b10000 (16) */ "AND~",
|
|
/* 0b10001 (17) */ "+carry",
|
|
/* 0b10010 (18) */ "CRC",
|
|
/* 0b10011 (19) */ "cam_write",
|
|
/* 0b10100 (20) */ "OR",
|
|
/* 0b10101 (21) */ "-",
|
|
NULL,
|
|
/* 0b10111 (23) */ "cam_lookup",
|
|
/* 0b11000 (24) */ "XOR",
|
|
/* 0b11001 (25) */ "B-A",
|
|
NULL,
|
|
/* 0b11011 (27) */ "cam_write_state",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0b11111 (31) */ "cam_read_state"
|
|
};
|
|
|
|
static const char *nfp_me27_28_crc_op[8] =
|
|
{
|
|
/* 0b000 (0) */ "--",
|
|
NULL,
|
|
/* 0b010 (2) */ "crc_ccitt",
|
|
NULL,
|
|
/* 0b100 (4) */ "crc_32",
|
|
/* 0b101 (5) */ "crc_iscsi",
|
|
/* 0b110 (6) */ "crc_10",
|
|
/* 0b111 (7) */ "crc_5"
|
|
};
|
|
|
|
static const char *nfp_me27_28_crc_bytes[8] =
|
|
{
|
|
/* 0b000 (0) */ "bytes_0_3",
|
|
/* 0b001 (1) */ "bytes_1_3",
|
|
/* 0b010 (2) */ "bytes_2_3",
|
|
/* 0b011 (3) */ "byte_3",
|
|
/* 0b100 (4) */ "bytes_0_2",
|
|
/* 0b101 (5) */ "bytes_0_1",
|
|
/* 0b110 (6) */ "byte_0"
|
|
};
|
|
|
|
static const char *nfp_me27_28_mecsrs[] =
|
|
{
|
|
/* 0x000 (0) */ "UstorAddr",
|
|
/* 0x004 (1) */ "UstorDataLwr",
|
|
/* 0x008 (2) */ "UstorDataUpr",
|
|
/* 0x00c (3) */ "UstorErrStat",
|
|
/* 0x010 (4) */ "ALUOut",
|
|
/* 0x014 (5) */ "CtxArbCtrl",
|
|
/* 0x018 (6) */ "CtxEnables",
|
|
/* 0x01c (7) */ "CondCodeEn",
|
|
/* 0x020 (8) */ "CSRCtxPtr",
|
|
/* 0x024 (9) */ "PcBreakpoint0",
|
|
/* 0x028 (10) */ "PcBreakpoint1",
|
|
/* 0x02c (11) */ "PcBreakpointStatus",
|
|
/* 0x030 (12) */ "RegErrStatus",
|
|
/* 0x034 (13) */ "LMErrStatus",
|
|
/* 0x038 (14) */ "LMeccErrorMask",
|
|
NULL,
|
|
/* 0x040 (16) */ "IndCtxStatus",
|
|
/* 0x044 (17) */ "ActCtxStatus",
|
|
/* 0x048 (18) */ "IndCtxSglEvt",
|
|
/* 0x04c (19) */ "ActCtxSglEvt",
|
|
/* 0x050 (20) */ "IndCtxWkpEvt",
|
|
/* 0x054 (21) */ "ActCtxWkpEvt",
|
|
/* 0x058 (22) */ "IndCtxFtrCnt",
|
|
/* 0x05c (23) */ "ActCtxFtrCnt",
|
|
/* 0x060 (24) */ "IndLMAddr0",
|
|
/* 0x064 (25) */ "ActLMAddr0",
|
|
/* 0x068 (26) */ "IndLMAddr1",
|
|
/* 0x06c (27) */ "ActLMAddr1",
|
|
/* 0x070 (28) */ "ByteIndex",
|
|
/* 0x074 (29) */ "XferIndex",
|
|
/* 0x078 (30) */ "IndFtrCntSgl",
|
|
/* 0x07c (31) */ "ActFtrCntSgl",
|
|
/* 0x080 (32) */ "NNPut",
|
|
/* 0x084 (33) */ "NNGet",
|
|
NULL,
|
|
NULL,
|
|
/* 0x090 (36) */ "IndLMAddr2",
|
|
/* 0x094 (37) */ "ActLMAddr2",
|
|
/* 0x098 (38) */ "IndLMAddr3",
|
|
/* 0x09c (39) */ "ActLMAddr3",
|
|
/* 0x0a0 (40) */ "IndLMAddr2BytIdx",
|
|
/* 0x0a4 (41) */ "ActLMAddr2BytIdx",
|
|
/* 0x0a8 (42) */ "IndLMAddr3BytIdx",
|
|
/* 0x0ac (43) */ "ActLMAddr3BytIdx",
|
|
/* 0x0b0 (44) */ "IndPredCC",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0x0c0 (48) */ "TimestampLow",
|
|
/* 0x0c4 (49) */ "TimestampHgh",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0x0e0 (56) */ "IndLMAddr0BytIdx",
|
|
/* 0x0e4 (57) */ "ActLMAddr0BytIdx",
|
|
/* 0x0e8 (58) */ "IndLMAddr1BytIdx",
|
|
/* 0x0ec (59) */ "ActLMAddr1BytIdx",
|
|
NULL,
|
|
/* 0x0f4 (61) */ "XfrAndBytIdx",
|
|
NULL,
|
|
NULL,
|
|
/* 0x100 (64) */ "NxtNghbrSgl",
|
|
/* 0x104 (65) */ "PrvNghbrSgl",
|
|
/* 0x108 (66) */ "SameMESignal",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0x140 (80) */ "CRCRemainder",
|
|
/* 0x144 (81) */ "ProfileCnt",
|
|
/* 0x148 (82) */ "PseudoRndNum",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0x160 (88) */ "MiscControl",
|
|
/* 0x164 (89) */ "PcBreakpoint0Mask",
|
|
/* 0x168 (90) */ "PcBreakpoint1Mask",
|
|
NULL,
|
|
/* 0x170 (92) */ "Mailbox0",
|
|
/* 0x174 (93) */ "Mailbox1",
|
|
/* 0x178 (94) */ "Mailbox2",
|
|
/* 0x17c (95) */ "Mailbox3",
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
NULL,
|
|
/* 0x190 (100) */ "CmdIndirectRef0"
|
|
};
|
|
|
|
const char *nfp_me27_28_br_ops[32] =
|
|
{
|
|
/* 0b00000 (0) */ "beq",
|
|
/* 0b00001 (1) */ "bne",
|
|
/* 0b00010 (2) */ "bmi",
|
|
/* 0b00011 (3) */ "bpl",
|
|
/* 0b00100 (4) */ "bcs",
|
|
/* 0b00101 (5) */ "bcc",
|
|
/* 0b00110 (6) */ "bvs",
|
|
/* 0b00111 (7) */ "bvc",
|
|
/* 0b01000 (8) */ "bge",
|
|
/* 0b01001 (9) */ "blt",
|
|
/* 0b01010 (10) */ "ble",
|
|
/* 0b01011 (11) */ "bgt",
|
|
/* (12) */ NULL,
|
|
/* (13) */ NULL,
|
|
/* (14) */ NULL,
|
|
/* (15) */ NULL,
|
|
/* 0b10000 (16) */ "br=ctx",
|
|
/* 0b10001 (17) */ "br!=ctx",
|
|
/* 0b10010 (18) */ "br_signal",
|
|
/* 0b10011 (19) */ "br_!signal",
|
|
/* 0b10100 (20) */ "br_inp_state",
|
|
/* 0b10101 (21) */ "br_!inp_state",
|
|
/* 0b10110 (22) */ "br_cls_state",
|
|
/* 0b10111 (23) */ "br_!cls_state",
|
|
/* 0b11000 (24) */ "br",
|
|
/* (25) */ NULL,
|
|
/* (26) */ NULL,
|
|
/* (27) */ NULL,
|
|
/* (28) */ NULL,
|
|
/* (29) */ NULL,
|
|
/* (30) */ NULL,
|
|
/* (31) */ NULL
|
|
};
|
|
|
|
static const char *nfp_me27_br_inpstates[16] =
|
|
{
|
|
/* 0 */ "nn_empty",
|
|
/* 1 */ "nn_full",
|
|
/* 2 */ "scr_ring0_status",
|
|
/* 3 */ "scr_ring1_status",
|
|
/* 4 */ "scr_ring2_status",
|
|
/* 5 */ "scr_ring3_status",
|
|
/* 6 */ "scr_ring4_status",
|
|
/* 7 */ "scr_ring5_status",
|
|
/* 8 */ "scr_ring6_status",
|
|
/* 9 */ "scr_ring7_status",
|
|
/* 10 */ "scr_ring8_status",
|
|
/* 11 */ "scr_ring9_status",
|
|
/* 12 */ "scr_ring10_status",
|
|
/* 13 */ "scr_ring11_status",
|
|
/* 14 */ "fci_not_empty",
|
|
/* 15 */ "fci_full"
|
|
};
|
|
|
|
static const char *nfp_me28_br_inpstates[16] =
|
|
{
|
|
/* 0 */ "nn_empty",
|
|
/* 1 */ "nn_full",
|
|
/* 2 */ "ctm_ring0_status",
|
|
/* 3 */ "ctm_ring1_status",
|
|
/* 4 */ "ctm_ring2_status",
|
|
/* 5 */ "ctm_ring3_status",
|
|
/* 6 */ "ctm_ring4_status",
|
|
/* 7 */ "ctm_ring5_status",
|
|
/* 8 */ "ctm_ring6_status",
|
|
/* 9 */ "ctm_ring7_status",
|
|
/* 10 */ "ctm_ring8_status",
|
|
/* 11 */ "ctm_ring9_status",
|
|
/* 12 */ "ctm_ring10_status",
|
|
/* 13 */ "ctm_ring11_status",
|
|
/* 14 */ "ctm_ring12_status",
|
|
/* 15 */ "ctm_ring13_status"
|
|
};
|
|
|
|
static const char *nfp_me27_28_mult_steps[8] =
|
|
{
|
|
/* 0 */ "step1",
|
|
/* 1 */ "step2",
|
|
/* 2 */ "step3",
|
|
/* 3 */ "step4",
|
|
/* 4 */ "last",
|
|
/* 5 */ "last2",
|
|
NULL,
|
|
NULL
|
|
};
|
|
|
|
static const char *nfp_me27_28_mult_types[4] =
|
|
{
|
|
"start",
|
|
"24x8",
|
|
"16x16",
|
|
"32x32"
|
|
};
|
|
|
|
/* The cmd_mnemonics arrays are sorted here in its definition so that we can
|
|
use bsearch () on the first three fields. There can be multiple matches
|
|
and we assume that bsearch can return any of them, so we manually step
|
|
back to the first one. */
|
|
|
|
static const nfp_cmd_mnemonic nfp_me27_mnemonics[] =
|
|
{
|
|
{NFP_3200_CPPTGT_MSF0, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_MSF0, 0, 2, 0, 0, "read64"},
|
|
{NFP_3200_CPPTGT_MSF0, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_MSF0, 1, 1, 0, 0, "fast_wr"},
|
|
{NFP_3200_CPPTGT_MSF0, 1, 2, 0, 0, "write64"},
|
|
{NFP_3200_CPPTGT_QDR, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_QDR, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_QDR, 2, 0, 0, 0, "write_atomic"},
|
|
{NFP_3200_CPPTGT_QDR, 2, 1, 0, 0, "swap"},
|
|
{NFP_3200_CPPTGT_QDR, 3, 0, 0, 0, "set"},
|
|
{NFP_3200_CPPTGT_QDR, 3, 1, 0, 0, "test_and_set"},
|
|
{NFP_3200_CPPTGT_QDR, 4, 0, 0, 0, "clr"},
|
|
{NFP_3200_CPPTGT_QDR, 4, 1, 0, 0, "test_and_clr"},
|
|
{NFP_3200_CPPTGT_QDR, 5, 0, 0, 0, "add"},
|
|
{NFP_3200_CPPTGT_QDR, 5, 1, 0, 0, "test_and_add"},
|
|
{NFP_3200_CPPTGT_QDR, 6, 0, 0, 0, "read_queue"},
|
|
{NFP_3200_CPPTGT_QDR, 6, 1, 0, 0, "read_queue_ring"},
|
|
{NFP_3200_CPPTGT_QDR, 6, 2, 0, 0, "write_queue"},
|
|
{NFP_3200_CPPTGT_QDR, 6, 3, 0, 0, "write_queue_ring"},
|
|
{NFP_3200_CPPTGT_QDR, 7, 0, 0, 0, "incr"},
|
|
{NFP_3200_CPPTGT_QDR, 7, 1, 0, 0, "test_and_incr"},
|
|
{NFP_3200_CPPTGT_QDR, 8, 0, 0, 0, "decr"},
|
|
{NFP_3200_CPPTGT_QDR, 8, 1, 0, 0, "test_and_decr"},
|
|
{NFP_3200_CPPTGT_QDR, 9, 0, 0, 0, "put"},
|
|
{NFP_3200_CPPTGT_QDR, 9, 1, 0, 0, "get"},
|
|
{NFP_3200_CPPTGT_QDR, 9, 2, 0, 0, "put_imm"},
|
|
{NFP_3200_CPPTGT_QDR, 9, 3, 0, 0, "pop"},
|
|
{NFP_3200_CPPTGT_QDR, 10, 0, 0, 0, "journal"},
|
|
{NFP_3200_CPPTGT_QDR, 10, 1, 0, 0, "fast_journal"},
|
|
{NFP_3200_CPPTGT_QDR, 11, 0, 0, 0, "dequeue"},
|
|
{NFP_3200_CPPTGT_QDR, 12, 0, 0, 0, "enqueue"},
|
|
{NFP_3200_CPPTGT_QDR, 12, 1, 0, 0, "enueue_tail"},
|
|
{NFP_3200_CPPTGT_QDR, 12, 2, 0, 0, "nfp_enqueue"},
|
|
{NFP_3200_CPPTGT_QDR, 12, 3, 0, 0, "nfp_enueue_tail"},
|
|
{NFP_3200_CPPTGT_QDR, 13, 0, 0, 0, "csr_wr"},
|
|
{NFP_3200_CPPTGT_QDR, 13, 1, 0, 0, "csr_rd"},
|
|
{NFP_3200_CPPTGT_QDR, 14, 0, 0, 0, "wr_qdesc"},
|
|
{NFP_3200_CPPTGT_QDR, 14, 1, 0, 0, "nfp_wr_qdesc"},
|
|
{NFP_3200_CPPTGT_QDR, 14, 2, 0, 0, "wr_qdesc_count"},
|
|
{NFP_3200_CPPTGT_QDR, 14, 3, 0, 0, "push_qdesc"},
|
|
{NFP_3200_CPPTGT_QDR, 15, 0, 0, 0, "rd_qdesc_other"},
|
|
{NFP_3200_CPPTGT_QDR, 15, 1, 0, 0, "rd_qdesc_tail"},
|
|
{NFP_3200_CPPTGT_QDR, 15, 2, 0, 0, "rd_qdesc_head"},
|
|
{NFP_3200_CPPTGT_QDR, 15, 3, 0, 0, "nfp_rd_qdesc"},
|
|
{NFP_3200_CPPTGT_MSF1, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_MSF1, 0, 2, 0, 0, "read64"},
|
|
{NFP_3200_CPPTGT_MSF1, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_MSF1, 1, 1, 0, 0, "fast_wr"},
|
|
{NFP_3200_CPPTGT_MSF1, 1, 2, 0, 0, "write64"},
|
|
{NFP_3200_CPPTGT_HASH, 0, 0, 0, 0, "hash_48"},
|
|
{NFP_3200_CPPTGT_HASH, 0, 1, 0, 0, "hash_64"},
|
|
{NFP_3200_CPPTGT_HASH, 0, 2, 0, 0, "hash_128"},
|
|
{NFP_3200_CPPTGT_MU, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
|
|
{NFP_3200_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
|
|
{NFP_3200_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
|
|
{NFP_3200_CPPTGT_MU, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
|
|
{NFP_3200_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
|
|
{NFP_3200_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
|
|
{NFP_3200_CPPTGT_MU, 2, 0, 0, 0, "write8"},
|
|
{NFP_3200_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
|
|
{NFP_3200_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
|
|
{NFP_3200_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
|
|
{NFP_3200_CPPTGT_MU, 3, 0, 0, 0, "read_atomic"},
|
|
{NFP_3200_CPPTGT_MU, 3, 1, 0, 0, "read8"},
|
|
{NFP_3200_CPPTGT_MU, 3, 2, 0, 0, "compare_write"},
|
|
{NFP_3200_CPPTGT_MU, 3, 3, 0, 0, "test_and_compare_write"},
|
|
{NFP_3200_CPPTGT_MU, 4, 0, 0, 0, "write_atomic"},
|
|
{NFP_3200_CPPTGT_MU, 4, 1, 0, 0, "swap"},
|
|
{NFP_3200_CPPTGT_MU, 4, 2, 0, 0, "write_atomic_imm"},
|
|
{NFP_3200_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
|
|
{NFP_3200_CPPTGT_MU, 5, 0, 0, 0, "set"},
|
|
{NFP_3200_CPPTGT_MU, 5, 1, 0, 0, "test_and_set"},
|
|
{NFP_3200_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
|
|
{NFP_3200_CPPTGT_MU, 5, 3, 0, 0, "test_and_set_imm"},
|
|
{NFP_3200_CPPTGT_MU, 6, 0, 0, 0, "clr"},
|
|
{NFP_3200_CPPTGT_MU, 6, 1, 0, 0, "test_and_clr"},
|
|
{NFP_3200_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
|
|
{NFP_3200_CPPTGT_MU, 6, 3, 0, 0, "test_and_clr_imm"},
|
|
{NFP_3200_CPPTGT_MU, 7, 0, 0, 4, "add"},
|
|
{NFP_3200_CPPTGT_MU, 7, 0, 4, 4, "add64"},
|
|
{NFP_3200_CPPTGT_MU, 7, 1, 0, 4, "test_and_add"},
|
|
{NFP_3200_CPPTGT_MU, 7, 1, 4, 4, "test_and_add64"},
|
|
{NFP_3200_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
|
|
{NFP_3200_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
|
|
{NFP_3200_CPPTGT_MU, 7, 3, 0, 4, "test_and_add_imm"},
|
|
{NFP_3200_CPPTGT_MU, 7, 3, 4, 4, "test_and_add64_imm"},
|
|
{NFP_3200_CPPTGT_MU, 8, 0, 0, 4, "add_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 0, 4, 4, "add64_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 1, 0, 4, "test_and_add_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 1, 4, 4, "test_and_add64_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 2, 0, 4, "add_imm_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 2, 4, 4, "add_imm_sat"},
|
|
{NFP_3200_CPPTGT_MU, 8, 3, 0, 0, "test_and_add_sat_imm"},
|
|
{NFP_3200_CPPTGT_MU, 9, 0, 0, 4, "sub"},
|
|
{NFP_3200_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
|
|
{NFP_3200_CPPTGT_MU, 9, 1, 0, 4, "test_and_sub"},
|
|
{NFP_3200_CPPTGT_MU, 9, 1, 4, 4, "test_and_sub64"},
|
|
{NFP_3200_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
|
|
{NFP_3200_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
|
|
{NFP_3200_CPPTGT_MU, 9, 3, 0, 0, "tes_and_sub_imm"},
|
|
{NFP_3200_CPPTGT_MU, 10, 0, 0, 4, "sub_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 0, 4, 4, "sub64_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 1, 0, 4, "test_and_sub_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 1, 4, 4, "test_and_sub64_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 2, 0, 4, "sub_imm_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 2, 4, 4, "sub64_imm_sat"},
|
|
{NFP_3200_CPPTGT_MU, 10, 3, 0, 0, "test_and_sub_sat_imm"},
|
|
{NFP_3200_CPPTGT_MU, 11, 0, 0, 0, "release_ticket"},
|
|
{NFP_3200_CPPTGT_MU, 11, 1, 0, 0, "release_ticket_ind"},
|
|
{NFP_3200_CPPTGT_MU, 12, 0, 0, 0, "cam_lookup"},
|
|
{NFP_3200_CPPTGT_MU, 12, 1, 0, 0, "cam_lookup_add"},
|
|
{NFP_3200_CPPTGT_MU, 12, 2, 0, 0, "tcam_lookup"},
|
|
{NFP_3200_CPPTGT_MU, 12, 3, 0, 3, "lock"},
|
|
{NFP_3200_CPPTGT_MU, 12, 3, 2, 3, "cam_lookup_add_inc"},
|
|
{NFP_3200_CPPTGT_MU, 13, 0, 0, 4, "microq128_get"},
|
|
{NFP_3200_CPPTGT_MU, 13, 0, 4, 4, "microq256_get"},
|
|
{NFP_3200_CPPTGT_MU, 13, 1, 0, 4, "microq128_pop"},
|
|
{NFP_3200_CPPTGT_MU, 13, 1, 4, 4, "microq256_pop"},
|
|
{NFP_3200_CPPTGT_MU, 13, 2, 0, 4, "microq128_put"},
|
|
{NFP_3200_CPPTGT_MU, 13, 2, 4, 4, "microq256_put"},
|
|
{NFP_3200_CPPTGT_MU, 14, 0, 0, 4, "queue128_lock"},
|
|
{NFP_3200_CPPTGT_MU, 14, 0, 4, 4, "queue256_lock"},
|
|
{NFP_3200_CPPTGT_MU, 14, 1, 0, 4, "queue128_unlock"},
|
|
{NFP_3200_CPPTGT_MU, 14, 1, 4, 4, "queue256_unlock"},
|
|
{NFP_3200_CPPTGT_MU, 15, 0, 0, 0, "xor"},
|
|
{NFP_3200_CPPTGT_MU, 15, 1, 0, 0, "test_and_xor"},
|
|
{NFP_3200_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
|
|
{NFP_3200_CPPTGT_MU, 15, 3, 0, 0, "test_and_xor_imm"},
|
|
{NFP_3200_CPPTGT_MU, 16, 0, 0, 0, "rd_qdesc"},
|
|
{NFP_3200_CPPTGT_MU, 16, 1, 0, 0, "wr_qdesc"},
|
|
{NFP_3200_CPPTGT_MU, 16, 2, 0, 0, "push_qdesc"},
|
|
{NFP_3200_CPPTGT_MU, 16, 3, 0, 0, "tag_writeback"},
|
|
{NFP_3200_CPPTGT_MU, 17, 0, 0, 0, "enqueue"},
|
|
{NFP_3200_CPPTGT_MU, 17, 1, 0, 0, "enqueue_tail"},
|
|
{NFP_3200_CPPTGT_MU, 17, 2, 0, 0, "dequeue"},
|
|
{NFP_3200_CPPTGT_MU, 18, 0, 0, 0, "read_queue"},
|
|
{NFP_3200_CPPTGT_MU, 18, 1, 0, 0, "read_queue_ring"},
|
|
{NFP_3200_CPPTGT_MU, 18, 2, 0, 0, "write_queue"},
|
|
{NFP_3200_CPPTGT_MU, 18, 3, 0, 0, "write_queue_ring"},
|
|
{NFP_3200_CPPTGT_MU, 19, 0, 0, 0, "add_tail"},
|
|
{NFP_3200_CPPTGT_MU, 19, 1, 0, 0, "qadd_thread"},
|
|
{NFP_3200_CPPTGT_MU, 19, 2, 0, 0, "qadd_work"},
|
|
{NFP_3200_CPPTGT_MU, 19, 3, 0, 0, "qadd_work_imm"},
|
|
{NFP_3200_CPPTGT_MU, 20, 0, 0, 0, "put"},
|
|
{NFP_3200_CPPTGT_MU, 20, 1, 0, 0, "put_tag"},
|
|
{NFP_3200_CPPTGT_MU, 20, 2, 0, 0, "journal"},
|
|
{NFP_3200_CPPTGT_MU, 20, 3, 0, 0, "journal_tag"},
|
|
{NFP_3200_CPPTGT_MU, 21, 0, 0, 0, "get"},
|
|
{NFP_3200_CPPTGT_MU, 21, 1, 0, 0, "get_eop"},
|
|
{NFP_3200_CPPTGT_MU, 21, 2, 0, 0, "get_safe"},
|
|
{NFP_3200_CPPTGT_MU, 21, 3, 0, 0, "get_tag_safe"},
|
|
{NFP_3200_CPPTGT_MU, 22, 0, 0, 0, "pop"},
|
|
{NFP_3200_CPPTGT_MU, 22, 1, 0, 0, "pop_eop"},
|
|
{NFP_3200_CPPTGT_MU, 22, 2, 0, 0, "pop_safe"},
|
|
{NFP_3200_CPPTGT_MU, 22, 3, 0, 0, "pop_tag_safe"},
|
|
{NFP_3200_CPPTGT_MU, 23, 0, 0, 0, "fast_journal"},
|
|
{NFP_3200_CPPTGT_MU, 23, 1, 0, 0, "fast_journal_sig"},
|
|
{NFP_3200_CPPTGT_GS, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_GS, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_GS, 2, 0, 0, 0, "write_atomic"},
|
|
{NFP_3200_CPPTGT_GS, 2, 1, 0, 0, "swap"},
|
|
{NFP_3200_CPPTGT_GS, 3, 0, 0, 0, "set"},
|
|
{NFP_3200_CPPTGT_GS, 3, 1, 0, 0, "test_and_set"},
|
|
{NFP_3200_CPPTGT_GS, 4, 0, 0, 0, "clr"},
|
|
{NFP_3200_CPPTGT_GS, 4, 1, 0, 0, "test_and_clr"},
|
|
{NFP_3200_CPPTGT_GS, 5, 0, 0, 0, "add"},
|
|
{NFP_3200_CPPTGT_GS, 5, 1, 0, 0, "test_and_add"},
|
|
{NFP_3200_CPPTGT_GS, 6, 0, 0, 0, "sub"},
|
|
{NFP_3200_CPPTGT_GS, 6, 1, 0, 0, "test_and_sub"},
|
|
{NFP_3200_CPPTGT_GS, 7, 0, 0, 0, "inc"},
|
|
{NFP_3200_CPPTGT_GS, 7, 1, 0, 0, "test_and_inc"},
|
|
{NFP_3200_CPPTGT_GS, 8, 0, 0, 0, "dec"},
|
|
{NFP_3200_CPPTGT_GS, 8, 1, 0, 0, "test_and_dec"},
|
|
{NFP_3200_CPPTGT_GS, 9, 0, 0, 0, "get"},
|
|
{NFP_3200_CPPTGT_GS, 10, 0, 0, 0, "put"},
|
|
{NFP_3200_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_PCIE, 2, 0, 0, 0, "read_internal"},
|
|
{NFP_3200_CPPTGT_PCIE, 3, 0, 0, 0, "write_internal"},
|
|
{NFP_3200_CPPTGT_ARM, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_ARM, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
|
|
{NFP_3200_CPPTGT_CAP, 0, 0, 0, 0, "read_enum"},
|
|
{NFP_3200_CPPTGT_CAP, 0, 1, 0, 0, "read"},
|
|
{NFP_3200_CPPTGT_CAP, 0, 2, 0, 0, "read_reflect"},
|
|
{NFP_3200_CPPTGT_CAP, 1, 0, 0, 0, "write_enum"},
|
|
{NFP_3200_CPPTGT_CAP, 1, 1, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_CAP, 1, 2, 0, 0, "write_reflect"},
|
|
{NFP_3200_CPPTGT_CAP, 2, 0, 0, 0, "fast_wr_alu"},
|
|
{NFP_3200_CPPTGT_CAP, 3, 0, 0, 0, "fast_wr"},
|
|
{NFP_3200_CPPTGT_CT, 1, 0, 0, 0, "write"},
|
|
{NFP_3200_CPPTGT_CLS, 0, 0, 0, 0, "read_be"},
|
|
{NFP_3200_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
|
|
{NFP_3200_CPPTGT_CLS, 0, 2, 0, 0, "test_and_compare_write"},
|
|
{NFP_3200_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
|
|
{NFP_3200_CPPTGT_CLS, 1, 0, 0, 0, "write_be"},
|
|
{NFP_3200_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
|
|
{NFP_3200_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
|
|
{NFP_3200_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
|
|
{NFP_3200_CPPTGT_CLS, 2, 0, 0, 0, "set"},
|
|
{NFP_3200_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
|
|
{NFP_3200_CPPTGT_CLS, 2, 2, 0, 0, "test_and_set"},
|
|
{NFP_3200_CPPTGT_CLS, 2, 3, 0, 0, "test_and_clr"},
|
|
{NFP_3200_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 3, 2, 0, 0, "test_and_set_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 3, 3, 0, 0, "test_and_clr_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 4, 0, 0, 0, "add"},
|
|
{NFP_3200_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
|
|
{NFP_3200_CPPTGT_CLS, 4, 2, 0, 0, "add_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 4, 3, 0, 0, "test_and_add_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 5, 2, 0, 0, "add_imm_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 5, 3, 0, 0, "test_and_add_imm_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
|
|
{NFP_3200_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
|
|
{NFP_3200_CPPTGT_CLS, 6, 2, 0, 0, "sub_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 6, 3, 0, 0, "test_and_sub_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
|
|
{NFP_3200_CPPTGT_CLS, 7, 2, 0, 0, "sub_imm_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 7, 3, 0, 0, "test_and_sub_imm_sat"},
|
|
{NFP_3200_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
|
|
{NFP_3200_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
|
|
{NFP_3200_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
|
|
{NFP_3200_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
|
|
{NFP_3200_CPPTGT_CLS, 9, 0, 0, 0, "get"},
|
|
{NFP_3200_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
|
|
{NFP_3200_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
|
|
{NFP_3200_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
|
|
{NFP_3200_CPPTGT_CLS, 10, 0, 0, 0, "put"},
|
|
{NFP_3200_CPPTGT_CLS, 10, 1, 0, 0, "put_offset"},
|
|
{NFP_3200_CPPTGT_CLS, 10, 2, 0, 0, "journal"},
|
|
{NFP_3200_CPPTGT_CLS, 10, 3, 0, 0, "add_tail"},
|
|
{NFP_3200_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
|
|
{NFP_3200_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
|
|
{NFP_3200_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
|
|
{NFP_3200_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
|
|
{NFP_3200_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
|
|
{NFP_3200_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
|
|
{NFP_3200_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
|
|
{NFP_3200_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
|
|
{NFP_3200_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
|
|
{NFP_3200_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
|
|
{NFP_3200_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
|
|
{NFP_3200_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
|
|
{NFP_3200_CPPTGT_CLS, 14, 0, 0, 0, "reflect_from_sig_src"},
|
|
{NFP_3200_CPPTGT_CLS, 14, 1, 0, 0, "reflect_from_sig_dst"},
|
|
{NFP_3200_CPPTGT_CLS, 14, 2, 0, 0, "reflect_from_sig_both"},
|
|
{NFP_3200_CPPTGT_CLS, 15, 0, 0, 0, "reflect_to_sig_src"},
|
|
{NFP_3200_CPPTGT_CLS, 15, 1, 0, 0, "reflect_to_sig_dst"},
|
|
{NFP_3200_CPPTGT_CLS, 15, 2, 0, 0, "reflect_to_sig_both"}
|
|
};
|
|
|
|
static const nfp_cmd_mnemonic nfp_me28_mnemonics[] =
|
|
{
|
|
{NFP_6000_CPPTGT_NBI, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_NBI, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_NBI, 3, 0, 0, 0, "packet_ready_drop"},
|
|
{NFP_6000_CPPTGT_NBI, 3, 1, 0, 0, "packet_ready_unicast"},
|
|
{NFP_6000_CPPTGT_NBI, 3, 2, 0, 0, "packet_ready_multicast_dont_free"},
|
|
{NFP_6000_CPPTGT_NBI, 3, 3, 0, 0, "packet_ready_multicast_free_on_last"},
|
|
{NFP_6000_CPPTGT_ILA, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_ILA, 0, 1, 0, 0, "read_check_error"},
|
|
{NFP_6000_CPPTGT_ILA, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_ILA, 1, 1, 0, 0, "write_check_error"},
|
|
{NFP_6000_CPPTGT_ILA, 2, 0, 0, 0, "read_int"},
|
|
{NFP_6000_CPPTGT_ILA, 3, 0, 0, 7, "write_int"},
|
|
{NFP_6000_CPPTGT_ILA, 3, 0, 3, 7, "write_dma"},
|
|
{NFP_6000_CPPTGT_MU, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_MU, 0, 1, 0, 0, "read_le"},
|
|
{NFP_6000_CPPTGT_MU, 0, 2, 0, 0, "read_swap"},
|
|
{NFP_6000_CPPTGT_MU, 0, 3, 0, 0, "read_swap_le"},
|
|
{NFP_6000_CPPTGT_MU, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_MU, 1, 1, 0, 0, "write_le"},
|
|
{NFP_6000_CPPTGT_MU, 1, 2, 0, 0, "write_swap"},
|
|
{NFP_6000_CPPTGT_MU, 1, 3, 0, 0, "write_swap_le"},
|
|
{NFP_6000_CPPTGT_MU, 2, 0, 0, 0, "write8"},
|
|
{NFP_6000_CPPTGT_MU, 2, 1, 0, 0, "write8_le"},
|
|
{NFP_6000_CPPTGT_MU, 2, 2, 0, 0, "write8_swap"},
|
|
{NFP_6000_CPPTGT_MU, 2, 3, 0, 0, "write8_swap_le"},
|
|
{NFP_6000_CPPTGT_MU, 3, 0, 0, 0, "atomic_read"},
|
|
{NFP_6000_CPPTGT_MU, 3, 1, 0, 0, "read8"},
|
|
{NFP_6000_CPPTGT_MU, 3, 2, 0, 0,
|
|
"compare_write_or_incr/mask_compare_write"},
|
|
{NFP_6000_CPPTGT_MU, 3, 3, 0, 0,
|
|
"test_compare_write_or_incr/test_mask_compare_write"},
|
|
{NFP_6000_CPPTGT_MU, 4, 0, 0, 0, "atomic_write"},
|
|
{NFP_6000_CPPTGT_MU, 4, 1, 0, 0, "swap"},
|
|
{NFP_6000_CPPTGT_MU, 4, 2, 0, 0, "atomic_write_imm"},
|
|
{NFP_6000_CPPTGT_MU, 4, 3, 0, 0, "swap_imm"},
|
|
{NFP_6000_CPPTGT_MU, 5, 0, 0, 0, "set"},
|
|
{NFP_6000_CPPTGT_MU, 5, 1, 0, 0, "test_set"},
|
|
{NFP_6000_CPPTGT_MU, 5, 2, 0, 0, "set_imm"},
|
|
{NFP_6000_CPPTGT_MU, 5, 3, 0, 0, "test_set_imm"},
|
|
{NFP_6000_CPPTGT_MU, 6, 0, 0, 0, "clr"},
|
|
{NFP_6000_CPPTGT_MU, 6, 1, 0, 0, "test_clr"},
|
|
{NFP_6000_CPPTGT_MU, 6, 2, 0, 0, "clr_imm"},
|
|
{NFP_6000_CPPTGT_MU, 6, 3, 0, 0, "test_clr_imm"},
|
|
{NFP_6000_CPPTGT_MU, 7, 0, 0, 4, "add"},
|
|
{NFP_6000_CPPTGT_MU, 7, 0, 4, 4, "add64"},
|
|
{NFP_6000_CPPTGT_MU, 7, 1, 0, 4, "test_add"},
|
|
{NFP_6000_CPPTGT_MU, 7, 1, 4, 4, "test_add64"},
|
|
{NFP_6000_CPPTGT_MU, 7, 2, 0, 4, "add_imm"},
|
|
{NFP_6000_CPPTGT_MU, 7, 2, 4, 4, "add64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 7, 3, 0, 4, "test_add_imm"},
|
|
{NFP_6000_CPPTGT_MU, 7, 3, 4, 4, "test_add64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 8, 0, 0, 4, "addsat"},
|
|
{NFP_6000_CPPTGT_MU, 8, 0, 4, 4, "addsat64"},
|
|
{NFP_6000_CPPTGT_MU, 8, 1, 0, 4, "test_addsat"},
|
|
{NFP_6000_CPPTGT_MU, 8, 1, 4, 4, "test_addsat64"},
|
|
{NFP_6000_CPPTGT_MU, 8, 2, 0, 4, "addsat_imm"},
|
|
{NFP_6000_CPPTGT_MU, 8, 2, 4, 4, "addsat64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 8, 3, 0, 4, "test_addsat_imm"},
|
|
{NFP_6000_CPPTGT_MU, 8, 3, 4, 4, "test_addsat64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 9, 0, 0, 4, "sub"},
|
|
{NFP_6000_CPPTGT_MU, 9, 0, 4, 4, "sub64"},
|
|
{NFP_6000_CPPTGT_MU, 9, 1, 0, 4, "test_sub"},
|
|
{NFP_6000_CPPTGT_MU, 9, 1, 4, 4, "test_sub64"},
|
|
{NFP_6000_CPPTGT_MU, 9, 2, 0, 4, "sub_imm"},
|
|
{NFP_6000_CPPTGT_MU, 9, 2, 4, 4, "sub64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 9, 3, 0, 4, "test_sub_imm"},
|
|
{NFP_6000_CPPTGT_MU, 9, 3, 4, 4, "test_sub64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 10, 0, 0, 4, "subsat"},
|
|
{NFP_6000_CPPTGT_MU, 10, 0, 4, 4, "subsat64"},
|
|
{NFP_6000_CPPTGT_MU, 10, 1, 0, 4, "test_subsat"},
|
|
{NFP_6000_CPPTGT_MU, 10, 1, 4, 4, "test_subsat64"},
|
|
{NFP_6000_CPPTGT_MU, 10, 2, 0, 4, "subsat_imm"},
|
|
{NFP_6000_CPPTGT_MU, 10, 2, 4, 4, "subsat64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 10, 3, 0, 4, "test_subsat_imm"},
|
|
{NFP_6000_CPPTGT_MU, 10, 3, 4, 4, "test_subsat64_imm"},
|
|
{NFP_6000_CPPTGT_MU, 11, 0, 0, 0, "ticket_release"},
|
|
{NFP_6000_CPPTGT_MU, 11, 1, 0, 0, "ticket_release_ind"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 0, 7, "cam128_lookup8/cam384_lookup8"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 1, 7, "cam128_lookup16/cam384_lookup16"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 2, 7, "cam128_lookup24/cam384_lookup24"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 3, 7, "cam128_lookup32/cam384_lookup32"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 4, 7, "cam256_lookup8/cam512_lookup8"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 5, 7, "cam256_lookup16/cam512_lookup16"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 6, 7, "cam256_lookup24/cam512_lookup24"},
|
|
{NFP_6000_CPPTGT_MU, 12, 0, 7, 7, "cam256_lookup32/cam512_lookup32"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 0, 7,
|
|
"cam128_lookup8_add/cam384_lookup8_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 1, 7,
|
|
"cam128_lookup16_add/cam384_lookup16_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 2, 7,
|
|
"cam128_lookup24_add/cam384_lookup24_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 3, 7,
|
|
"cam128_lookup32_add/cam384_lookup32_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 4, 7,
|
|
"cam256_lookup8_add/cam512_lookup8_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 5, 7,
|
|
"cam256_lookup16_add/cam512_lookup16_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 6, 7,
|
|
"cam256_lookup24_add/cam512_lookup24_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 1, 7, 7,
|
|
"cam256_lookup32_add/cam512_lookup32_add"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 0, 7, "tcam128_lookup8/tcam384_lookup8"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 1, 7, "tcam128_lookup16/tcam384_lookup16"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 2, 7, "tcam128_lookup24/tcam384_lookup24"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 3, 7, "tcam128_lookup32/tcam384_lookup32"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 4, 7, "tcam256_lookup8/tcam512_lookup8"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 5, 7, "tcam256_lookup16/tcam512_lookup16"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 6, 7, "tcam256_lookup24/tcam512_lookup24"},
|
|
{NFP_6000_CPPTGT_MU, 12, 2, 7, 7, "tcam256_lookup32/tcam512_lookup32"},
|
|
{NFP_6000_CPPTGT_MU, 12, 3, 0, 7, "lock128/lock384"},
|
|
{NFP_6000_CPPTGT_MU, 12, 3, 2, 7,
|
|
"cam128_lookup24_add_inc/cam384_lookup24_add_inc"},
|
|
{NFP_6000_CPPTGT_MU, 12, 3, 4, 7, "lock256/lock512"},
|
|
{NFP_6000_CPPTGT_MU, 12, 3, 6, 7,
|
|
"cam256_lookup24_add_inc/cam512_lookup24_add_inc"},
|
|
{NFP_6000_CPPTGT_MU, 13, 0, 0, 7, "microq128_get"},
|
|
{NFP_6000_CPPTGT_MU, 13, 0, 4, 7, "microq256_get"},
|
|
{NFP_6000_CPPTGT_MU, 13, 1, 0, 7, "microq128_pop"},
|
|
{NFP_6000_CPPTGT_MU, 13, 1, 4, 7, "microq256_pop"},
|
|
{NFP_6000_CPPTGT_MU, 13, 2, 0, 7, "microq128_put"},
|
|
{NFP_6000_CPPTGT_MU, 13, 2, 4, 7, "microq256_put"},
|
|
{NFP_6000_CPPTGT_MU, 14, 0, 0, 7, "queue128_lock"},
|
|
{NFP_6000_CPPTGT_MU, 14, 0, 4, 7, "queue256_lock"},
|
|
{NFP_6000_CPPTGT_MU, 14, 1, 0, 7, "queue128_unlock"},
|
|
{NFP_6000_CPPTGT_MU, 14, 1, 4, 7, "queue256_unlock"},
|
|
{NFP_6000_CPPTGT_MU, 15, 0, 0, 0, "xor"},
|
|
{NFP_6000_CPPTGT_MU, 15, 1, 0, 0, "test_xor"},
|
|
{NFP_6000_CPPTGT_MU, 15, 2, 0, 0, "xor_imm"},
|
|
{NFP_6000_CPPTGT_MU, 15, 3, 0, 0, "test_xor_imm"},
|
|
{NFP_6000_CPPTGT_MU, 16, 0, 0, 0,
|
|
"ctm.packet_wait_packet_status/emem.rd_qdesc/imem.stats_log"},
|
|
{NFP_6000_CPPTGT_MU, 16, 1, 0, 0,
|
|
"ctm.packet_read_packet_status/emem.wr_qdesc/imem.stats_log_sat"},
|
|
{NFP_6000_CPPTGT_MU, 16, 2, 0, 0,
|
|
"emem.push_qdesc/imem.stats_log_event"},
|
|
{NFP_6000_CPPTGT_MU, 16, 3, 0, 0, "imem.stats_log_sat_event"},
|
|
{NFP_6000_CPPTGT_MU, 17, 0, 0, 0,
|
|
"ctm.packet_alloc/emem.enqueue/imem.stats_push"},
|
|
{NFP_6000_CPPTGT_MU, 17, 1, 0, 0,
|
|
"ctm.packet_credit_get/emem.enqueue_tail/imem.stats_push_clear"},
|
|
{NFP_6000_CPPTGT_MU, 17, 2, 0, 0, "ctm.packet_alloc_poll/emem.dequeue"},
|
|
{NFP_6000_CPPTGT_MU, 17, 3, 0, 0, "ctm.packet_add_thread"},
|
|
{NFP_6000_CPPTGT_MU, 18, 0, 0, 0,
|
|
"ctm.packet_free/emem.read_queue/imem.lb_write_desc"},
|
|
{NFP_6000_CPPTGT_MU, 18, 1, 0, 0,
|
|
"ctm.packet_free_and_signal/emem.read_queue_ring/imem.lb_read_desc"},
|
|
{NFP_6000_CPPTGT_MU, 18, 2, 0, 0,
|
|
"ctm.packet_free_and_return_pointer/emem.write_queue"},
|
|
{NFP_6000_CPPTGT_MU, 18, 3, 0, 0,
|
|
"ctm.packet_return_pointer/emem.write_queue_ring"},
|
|
{NFP_6000_CPPTGT_MU, 19, 0, 0, 0,
|
|
"ctm.packet_complete_drop/emem.add_tail/imem.lb_write_idtable"},
|
|
{NFP_6000_CPPTGT_MU, 19, 1, 0, 0,
|
|
"ctm.packet_complete_unicast/emem.qadd_thread/imem.lb_read_idtable"},
|
|
{NFP_6000_CPPTGT_MU, 19, 2, 0, 0,
|
|
"ctm.packet_complete_multicast/emem.qadd_work"},
|
|
{NFP_6000_CPPTGT_MU, 19, 3, 0, 0,
|
|
"ctm.packet_complete_multicast_free/emem.qadd_work_imm"},
|
|
{NFP_6000_CPPTGT_MU, 20, 0, 0, 0,
|
|
"ctm.pe_dma_to_memory_packet/emem.put/imem.lb_bucket_write_local"},
|
|
{NFP_6000_CPPTGT_MU, 20, 1, 0, 0,
|
|
"ctm.pe_dma_to_memory_packet_swap/imem.lb_bucket_write_dcache"},
|
|
{NFP_6000_CPPTGT_MU, 20, 2, 0, 0,
|
|
"ctm.pe_dma_to_memory_packet_free/emem.journal"},
|
|
{NFP_6000_CPPTGT_MU, 20, 3, 0, 0,
|
|
"ctm.pe_dma_to_memory_packet_free_swap"},
|
|
{NFP_6000_CPPTGT_MU, 21, 0, 0, 0,
|
|
"ctm.pe_dma_to_memory_indirect/emem.get/imem.lb_bucket_read_local"},
|
|
{NFP_6000_CPPTGT_MU, 21, 1, 0, 0,
|
|
"ctm.pe_dma_to_memory_indirect_swap/emem.get_eop/"
|
|
"imem.lb_bucket_read_dcache"},
|
|
{NFP_6000_CPPTGT_MU, 21, 2, 0, 0,
|
|
"ctm.pe_dma_to_memory_indirect_free/emem.get_freely"},
|
|
{NFP_6000_CPPTGT_MU, 21, 3, 0, 0,
|
|
"ctm.pe_dma_to_memory_indirect_free_swap"},
|
|
{NFP_6000_CPPTGT_MU, 22, 0, 0, 0,
|
|
"ctm.pe_dma_to_memory_buffer/emem.pop/imem.lb_lookup_bundleid"},
|
|
{NFP_6000_CPPTGT_MU, 22, 1, 0, 0,
|
|
"ctm.pe_dma_to_memory_buffer_le/emem.pop_eop/imem.lb_lookup_dcache"},
|
|
{NFP_6000_CPPTGT_MU, 22, 2, 0, 0,
|
|
"ctm.pe_dma_to_memory_buffer_swap/emem.pop_freely/imem.lb_lookup_idtable"},
|
|
{NFP_6000_CPPTGT_MU, 22, 3, 0, 0, "ctm.pe_dma_to_memory_buffer_le_swap"},
|
|
{NFP_6000_CPPTGT_MU, 23, 0, 0, 0,
|
|
"ctm.pe_dma_from_memory_buffer/emem.fast_journal/imem.lb_push_stats_local"},
|
|
{NFP_6000_CPPTGT_MU, 23, 1, 0, 0,
|
|
"ctm.pe_dma_from_memory_buffer_le/emem.fast_journal_sig/"
|
|
"imem.lb_push_stats_dcache"},
|
|
{NFP_6000_CPPTGT_MU, 23, 2, 0, 0,
|
|
"ctm.pe_dma_from_memory_buffer_swap/imem.lb_push_stats_local_clr"},
|
|
{NFP_6000_CPPTGT_MU, 23, 3, 0, 0,
|
|
"ctm.pe_dma_from_memory_buffer_le_swap/imem.lb_push_stats_dcache_clr"},
|
|
{NFP_6000_CPPTGT_MU, 26, 0, 0, 0, "emem.lookup/imem.lookup"},
|
|
{NFP_6000_CPPTGT_MU, 28, 0, 0, 0, "read32"},
|
|
{NFP_6000_CPPTGT_MU, 28, 1, 0, 0, "read32_le"},
|
|
{NFP_6000_CPPTGT_MU, 28, 2, 0, 0, "read32_swap"},
|
|
{NFP_6000_CPPTGT_MU, 28, 3, 0, 0, "read32_swap_le"},
|
|
{NFP_6000_CPPTGT_MU, 29, 1, 0, 0, "cam_lookup_add_lock"},
|
|
{NFP_6000_CPPTGT_MU, 29, 2, 0, 0, "cam_lookup_add_extend"},
|
|
{NFP_6000_CPPTGT_MU, 29, 3, 0, 0, "cam_lookup_add_inc"},
|
|
{NFP_6000_CPPTGT_MU, 30, 2, 0, 0, "meter"},
|
|
{NFP_6000_CPPTGT_MU, 31, 0, 0, 0, "write32"},
|
|
{NFP_6000_CPPTGT_MU, 31, 1, 0, 0, "write32_le"},
|
|
{NFP_6000_CPPTGT_MU, 31, 2, 0, 0, "write32_swap"},
|
|
{NFP_6000_CPPTGT_MU, 31, 3, 0, 0, "write32_swap_le"},
|
|
{NFP_6000_CPPTGT_PCIE, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_PCIE, 0, 1, 0, 0, "read_rid"},
|
|
{NFP_6000_CPPTGT_PCIE, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_PCIE, 1, 1, 0, 0, "write_rid"},
|
|
{NFP_6000_CPPTGT_PCIE, 1, 2, 0, 0, "write_vdm"},
|
|
{NFP_6000_CPPTGT_PCIE, 2, 0, 0, 0, "read_int"},
|
|
{NFP_6000_CPPTGT_PCIE, 3, 0, 0, 0, "write_int"},
|
|
{NFP_6000_CPPTGT_ARM, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_ARM, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_CRYPTO, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_CRYPTO, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_CRYPTO, 2, 0, 0, 0, "write_fifo"},
|
|
{NFP_6000_CPPTGT_CTXPB, 0, 0, 0, 0, "xpb_read"},
|
|
{NFP_6000_CPPTGT_CTXPB, 0, 1, 0, 0, "ring_get"},
|
|
{NFP_6000_CPPTGT_CTXPB, 0, 2, 0, 0, "interthread_signal"},
|
|
{NFP_6000_CPPTGT_CTXPB, 1, 0, 0, 0, "xpb_write"},
|
|
{NFP_6000_CPPTGT_CTXPB, 1, 1, 0, 0, "ring_put"},
|
|
{NFP_6000_CPPTGT_CTXPB, 1, 2, 0, 0, "ctnn_write"},
|
|
{NFP_6000_CPPTGT_CTXPB, 2, 0, 0, 0, "reflect_read_none"},
|
|
{NFP_6000_CPPTGT_CTXPB, 2, 1, 0, 0, "reflect_read_sig_init"},
|
|
{NFP_6000_CPPTGT_CTXPB, 2, 2, 0, 0, "reflect_read_sig_remote"},
|
|
{NFP_6000_CPPTGT_CTXPB, 2, 3, 0, 0, "reflect_read_sig_both"},
|
|
{NFP_6000_CPPTGT_CTXPB, 3, 0, 0, 0, "reflect_write_none"},
|
|
{NFP_6000_CPPTGT_CTXPB, 3, 1, 0, 0, "reflect_write_sig_init"},
|
|
{NFP_6000_CPPTGT_CTXPB, 3, 2, 0, 0, "reflect_write_sig_remote"},
|
|
{NFP_6000_CPPTGT_CTXPB, 3, 3, 0, 0, "reflect_write_sig_both"},
|
|
{NFP_6000_CPPTGT_CLS, 0, 0, 0, 0, "read"},
|
|
{NFP_6000_CPPTGT_CLS, 0, 1, 0, 0, "read_le"},
|
|
{NFP_6000_CPPTGT_CLS, 0, 2, 0, 0, "swap/test_compare_write"},
|
|
{NFP_6000_CPPTGT_CLS, 0, 3, 0, 0, "xor"},
|
|
{NFP_6000_CPPTGT_CLS, 1, 0, 0, 0, "write"},
|
|
{NFP_6000_CPPTGT_CLS, 1, 1, 0, 0, "write_le"},
|
|
{NFP_6000_CPPTGT_CLS, 1, 2, 0, 0, "write8_be"},
|
|
{NFP_6000_CPPTGT_CLS, 1, 3, 0, 0, "write8_le"},
|
|
{NFP_6000_CPPTGT_CLS, 2, 0, 0, 0, "set"},
|
|
{NFP_6000_CPPTGT_CLS, 2, 1, 0, 0, "clr"},
|
|
{NFP_6000_CPPTGT_CLS, 2, 2, 0, 0, "test_set"},
|
|
{NFP_6000_CPPTGT_CLS, 2, 3, 0, 0, "test_clr"},
|
|
{NFP_6000_CPPTGT_CLS, 3, 0, 0, 0, "set_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 3, 1, 0, 0, "clr_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 3, 2, 0, 0, "test_set_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 3, 3, 0, 0, "test_clr_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 4, 0, 0, 0, "add"},
|
|
{NFP_6000_CPPTGT_CLS, 4, 1, 0, 0, "add64"},
|
|
{NFP_6000_CPPTGT_CLS, 4, 2, 0, 0, "addsat"},
|
|
{NFP_6000_CPPTGT_CLS, 5, 0, 0, 0, "add_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 5, 1, 0, 0, "add64_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 5, 2, 0, 0, "addsat_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 6, 0, 0, 0, "sub"},
|
|
{NFP_6000_CPPTGT_CLS, 6, 1, 0, 0, "sub64"},
|
|
{NFP_6000_CPPTGT_CLS, 6, 2, 0, 0, "subsat"},
|
|
{NFP_6000_CPPTGT_CLS, 7, 0, 0, 0, "sub_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 7, 1, 0, 0, "sub64_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 7, 2, 0, 0, "subsat_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 8, 0, 0, 0, "queue_lock"},
|
|
{NFP_6000_CPPTGT_CLS, 8, 1, 0, 0, "queue_unlock"},
|
|
{NFP_6000_CPPTGT_CLS, 8, 2, 0, 0, "hash_mask"},
|
|
{NFP_6000_CPPTGT_CLS, 8, 3, 0, 0, "hash_mask_clear"},
|
|
{NFP_6000_CPPTGT_CLS, 9, 0, 0, 0, "get"},
|
|
{NFP_6000_CPPTGT_CLS, 9, 1, 0, 0, "pop"},
|
|
{NFP_6000_CPPTGT_CLS, 9, 2, 0, 0, "get_safe"},
|
|
{NFP_6000_CPPTGT_CLS, 9, 3, 0, 0, "pop_safe"},
|
|
{NFP_6000_CPPTGT_CLS, 10, 0, 0, 0, "ring_put"},
|
|
{NFP_6000_CPPTGT_CLS, 10, 2, 0, 0, "ring_journal"},
|
|
{NFP_6000_CPPTGT_CLS, 11, 0, 0, 0, "cam_lookup32"},
|
|
{NFP_6000_CPPTGT_CLS, 11, 1, 0, 0, "cam_lookup32_add"},
|
|
{NFP_6000_CPPTGT_CLS, 11, 2, 0, 0, "cam_lookup24"},
|
|
{NFP_6000_CPPTGT_CLS, 11, 3, 0, 0, "cam_lookup24_add"},
|
|
{NFP_6000_CPPTGT_CLS, 12, 0, 0, 0, "cam_lookup8"},
|
|
{NFP_6000_CPPTGT_CLS, 12, 1, 0, 0, "cam_lookup8_add"},
|
|
{NFP_6000_CPPTGT_CLS, 12, 2, 0, 0, "cam_lookup16"},
|
|
{NFP_6000_CPPTGT_CLS, 12, 3, 0, 0, "cam_lookup16_add"},
|
|
{NFP_6000_CPPTGT_CLS, 13, 0, 0, 0, "tcam_lookup32"},
|
|
{NFP_6000_CPPTGT_CLS, 13, 1, 0, 0, "tcam_lookup24"},
|
|
{NFP_6000_CPPTGT_CLS, 13, 2, 0, 0, "tcam_lookup16"},
|
|
{NFP_6000_CPPTGT_CLS, 13, 3, 0, 0, "tcam_lookup8"},
|
|
{NFP_6000_CPPTGT_CLS, 14, 0, 0, 0, "reflect_write_sig_local"},
|
|
{NFP_6000_CPPTGT_CLS, 14, 1, 0, 0, "reflect_write_sig_remote"},
|
|
{NFP_6000_CPPTGT_CLS, 14, 2, 0, 0, "reflect_write_sig_both"},
|
|
{NFP_6000_CPPTGT_CLS, 15, 0, 0, 0, "reflect_read_sig_remote"},
|
|
{NFP_6000_CPPTGT_CLS, 15, 1, 0, 0, "reflect_read_sig_local"},
|
|
{NFP_6000_CPPTGT_CLS, 15, 2, 0, 0, "reflect_read_sig_both"},
|
|
{NFP_6000_CPPTGT_CLS, 16, 1, 0, 0, "cam_lookup32_add_lock"},
|
|
{NFP_6000_CPPTGT_CLS, 16, 2, 0, 0, "cam_lookup24_add_inc"},
|
|
{NFP_6000_CPPTGT_CLS, 16, 3, 0, 0, "cam_lookup32_add_extend"},
|
|
{NFP_6000_CPPTGT_CLS, 17, 0, 0, 0, "meter"},
|
|
{NFP_6000_CPPTGT_CLS, 17, 2, 0, 0, "statistic"},
|
|
{NFP_6000_CPPTGT_CLS, 17, 3, 0, 0, "statistic_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 20, 0, 0, 0, "test_add"},
|
|
{NFP_6000_CPPTGT_CLS, 20, 1, 0, 0, "test_add64"},
|
|
{NFP_6000_CPPTGT_CLS, 20, 2, 0, 0, "test_addsat"},
|
|
{NFP_6000_CPPTGT_CLS, 21, 0, 0, 0, "test_add_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 21, 1, 0, 0, "test_add64_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 21, 2, 0, 0, "test_addsat_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 22, 0, 0, 0, "test_sub"},
|
|
{NFP_6000_CPPTGT_CLS, 22, 1, 0, 0, "test_sub64"},
|
|
{NFP_6000_CPPTGT_CLS, 22, 2, 0, 0, "test_subsat"},
|
|
{NFP_6000_CPPTGT_CLS, 23, 0, 0, 0, "test_sub_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 23, 1, 0, 0, "test_sub64_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 23, 2, 0, 0, "test_subsat_imm"},
|
|
{NFP_6000_CPPTGT_CLS, 24, 0, 0, 0, "ring_read"},
|
|
{NFP_6000_CPPTGT_CLS, 24, 1, 0, 0, "ring_write"},
|
|
{NFP_6000_CPPTGT_CLS, 24, 2, 0, 0, "ring_ordered_lock"},
|
|
{NFP_6000_CPPTGT_CLS, 24, 3, 0, 0, "ring_ordered_unlock"},
|
|
{NFP_6000_CPPTGT_CLS, 25, 0, 0, 0, "ring_workq_add_thread"},
|
|
{NFP_6000_CPPTGT_CLS, 25, 1, 0, 0, "ring_workq_add_work"}
|
|
};
|
|
|
|
static int
|
|
nfp_me_print_invalid (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
const char * err_msg = N_("<invalid_instruction>:");
|
|
dinfo->fprintf_func (dinfo->stream, "%s 0x%" PRIx64, err_msg, instr);
|
|
return _NFP_ERR_CONT;
|
|
}
|
|
|
|
static bool
|
|
nfp_me_is_imm_opnd10 (unsigned int opnd)
|
|
{
|
|
return _BF (opnd, 9, 8) == 0x3;
|
|
}
|
|
|
|
static bool
|
|
nfp_me_is_imm_opnd8 (unsigned int opnd)
|
|
{
|
|
return _BTST (opnd, 5);
|
|
}
|
|
|
|
static unsigned int
|
|
nfp_me_imm_opnd10 (unsigned int opnd)
|
|
{
|
|
return nfp_me_is_imm_opnd10 (opnd) ? (opnd & 0xff) : ~0U;
|
|
}
|
|
|
|
static unsigned int
|
|
nfp_me_imm_opnd8 (unsigned int opnd, unsigned int imm8_msb)
|
|
{
|
|
unsigned int v = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
|
|
|
|
return nfp_me_is_imm_opnd8 (opnd) ? v : ~0U;
|
|
}
|
|
|
|
/* Print an unrestricted/10-bit operand.
|
|
This can mostly be generic across NFP families at the moment. */
|
|
static bool
|
|
nfp_me_print_opnd10 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
|
|
|
|
/* Absolute GPR. */
|
|
if (_BF (opnd, 9, 7) == 0x1)
|
|
dinfo->fprintf_func (dinfo->stream, "@gpr%c_%d", bank, _BF (opnd, 6, 0));
|
|
|
|
/* Relative GPR. */
|
|
else if (_BF (opnd, 9, 6) == 0x0)
|
|
dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
|
|
|
|
/* Indexed Xfer. */
|
|
else if (_BF (opnd, 9, 7) == 0x2)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "*$index");
|
|
if (_BF (opnd, 2, 1) == 0x1)
|
|
dinfo->fprintf_func (dinfo->stream, "++");
|
|
else if (_BF (opnd, 2, 1) == 0x2)
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
}
|
|
|
|
/* Relative Xfer. */
|
|
else if (_BF (opnd, 9, 7) == 0x3)
|
|
{
|
|
if (_BTST (opnd, 6))
|
|
n += (num_ctx == 8 ? 16 : 32);
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
|
|
}
|
|
|
|
/* Indexed Next Neighbour. */
|
|
else if (_BF (opnd, 9, 6) == 0x9)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "*n$index");
|
|
if (_BTST (opnd, 1))
|
|
dinfo->fprintf_func (dinfo->stream, "++");
|
|
}
|
|
|
|
/* Relative Next Neighbour. */
|
|
else if (_BF (opnd, 9, 6) == 0xa)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "n$reg_%d", n);
|
|
}
|
|
|
|
/* Indexed LMEM. */
|
|
else if (_BF (opnd, 9, 6) == 0x8)
|
|
{
|
|
n = _BF (opnd, 5, 5) + (lmem_ext * 2);
|
|
dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
|
|
if (_BTST (opnd, 4))
|
|
dinfo->fprintf_func (dinfo->stream, _BTST (opnd, 0) ? "--" : "++");
|
|
else if (_BF (opnd, 3, 0))
|
|
dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 3, 0));
|
|
}
|
|
|
|
/* 8-bit Constant value. */
|
|
else if (_BF (opnd, 9, 8) == 0x3)
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x", _BF (opnd, 7, 0));
|
|
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/* Print a restricted/8-bit operand.
|
|
This can mostly be generic across NFP families at the moment. */
|
|
|
|
static bool
|
|
nfp_me_print_opnd8 (unsigned int opnd, char bank, int num_ctx, int lmem_ext,
|
|
unsigned int imm8_msb, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int n = _BF (opnd, (num_ctx == 8) ? 3 : 4, 0);
|
|
|
|
/* Relative GPR. */
|
|
if (_BF (opnd, 7, 5) == 0x0)
|
|
dinfo->fprintf_func (dinfo->stream, "gpr%c_%d", bank, n);
|
|
|
|
/* Relative Xfer. */
|
|
else if (_BF (opnd, 7, 5) == 0x4)
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
|
|
|
|
/* Relative Xfer. */
|
|
else if (_BF (opnd, 7, 5) == 0x6)
|
|
{
|
|
n += (num_ctx == 8 ? 16 : 32);
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d", n);
|
|
}
|
|
|
|
/* Indexed Xfer. */
|
|
else if ((_BF (opnd, 7, 4) == 0x4) && (!_BTST (opnd, 0)))
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "*$index");
|
|
if (_BF (opnd, 2, 1) == 0x1)
|
|
dinfo->fprintf_func (dinfo->stream, "++");
|
|
else if (_BF (opnd, 2, 1) == 0x2)
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
}
|
|
|
|
/* Indexed NN. */
|
|
else if ((_BF (opnd, 7, 4) == 0x4) && (_BTST (opnd, 0)))
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "*n$index");
|
|
if (_BTST (opnd, 1))
|
|
dinfo->fprintf_func (dinfo->stream, "++");
|
|
}
|
|
|
|
/* Indexed LMEM. */
|
|
else if (_BF (opnd, 7, 4) == 0x5)
|
|
{
|
|
n = _BF (opnd, 3, 3) + (lmem_ext * 2);
|
|
dinfo->fprintf_func (dinfo->stream, "*l$index%d", n);
|
|
if (_BF (opnd, 2, 0))
|
|
dinfo->fprintf_func (dinfo->stream, "[%d]", _BF (opnd, 2, 0));
|
|
}
|
|
|
|
/* 7+1-bit Constant value. */
|
|
else if (_BTST (opnd, 5))
|
|
{
|
|
n = (imm8_msb << 7) | _BFS (opnd, 7, 6, 5) | _BF (opnd, 4, 0);
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x", n);
|
|
}
|
|
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "<opnd:0x%x>", opnd);
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_alu_shf (uint64_t instr, unsigned int pred_cc,
|
|
unsigned int dst_lmext, unsigned int src_lmext,
|
|
unsigned int gpr_wrboth,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int op = _BF (instr, 35, 33);
|
|
unsigned int srcA = _BF (instr, 7, 0);
|
|
unsigned int srcB = _BF (instr, 17, 10);
|
|
unsigned int dst = _BF (instr, 27, 20);
|
|
unsigned int sc = _BF (instr, 9, 8);
|
|
unsigned int imm_msb = _BTST (instr, 18);
|
|
unsigned int swap = _BTST (instr, 19);
|
|
unsigned int shift = _BF (instr, 32, 28);
|
|
char dst_bank = 'A' + _BTST (instr, 36);
|
|
unsigned int nocc = _BTST (instr, 40);
|
|
bool err = false;
|
|
|
|
if (swap)
|
|
{
|
|
unsigned int tmp = srcA;
|
|
srcA = srcB;
|
|
srcB = tmp;
|
|
}
|
|
|
|
/* alu_shf, dbl_shf, asr. */
|
|
if (op < 7)
|
|
{
|
|
if (sc == 3)
|
|
dinfo->fprintf_func (dinfo->stream, "dbl_shf[");
|
|
else if (op == 6)
|
|
dinfo->fprintf_func (dinfo->stream, "asr[");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "alu_shf[");
|
|
|
|
/* dest operand */
|
|
if (nfp_me_is_imm_opnd8 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
|
|
dst_lmext, imm_msb, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* A operand. */
|
|
if (op != 6)
|
|
{
|
|
if ((op < 2) && (sc != 3)) /* Not dbl_shf. */
|
|
dinfo->fprintf_func (dinfo->stream, "--"); /* B or ~B operator. */
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A',
|
|
num_ctx, src_lmext, imm_msb,
|
|
dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* Operator (not for dbl_shf). */
|
|
if (sc != 3)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "%s, ",
|
|
nfp_mealu_shf_op[op]);
|
|
}
|
|
}
|
|
|
|
/* B operand. */
|
|
err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B',
|
|
num_ctx, src_lmext, imm_msb, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* Shift */
|
|
if (sc == 0)
|
|
dinfo->fprintf_func (dinfo->stream, ">>rot%d", shift);
|
|
else if (sc == 2)
|
|
{
|
|
if (shift)
|
|
dinfo->fprintf_func (dinfo->stream, "<<%d", (32 - shift));
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "<<indirect");
|
|
}
|
|
else
|
|
{
|
|
if (shift)
|
|
dinfo->fprintf_func (dinfo->stream, ">>%d", shift);
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, ">>indirect");
|
|
}
|
|
}
|
|
/* Byte Align. */
|
|
else if (op == 7)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "byte_align_%s[",
|
|
((sc == 2) ? "le" : "be"));
|
|
|
|
/* Dest operand. */
|
|
if (nfp_me_is_imm_opnd8 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (dst, dst_bank, num_ctx,
|
|
dst_lmext, imm_msb, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
if (sc == 2)
|
|
err = err || !nfp_me_print_opnd8 (srcA, (swap) ? 'B' : 'A', num_ctx,
|
|
0, imm_msb, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (srcB, (swap) ? 'A' : 'B', num_ctx,
|
|
0, imm_msb, dinfo);
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
if (nocc)
|
|
dinfo->fprintf_func (dinfo->stream, ", no_cc");
|
|
if (gpr_wrboth)
|
|
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
|
|
if (pred_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_alu (uint64_t instr, unsigned int pred_cc,
|
|
unsigned int dst_lmext, unsigned int src_lmext,
|
|
unsigned int gpr_wrboth,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int op = _BF (instr, 35, 31);
|
|
unsigned int srcA = _BF (instr, 9, 0);
|
|
unsigned int srcB = _BF (instr, 19, 10);
|
|
unsigned int dst = _BF (instr, 29, 20);
|
|
unsigned int swap = _BTST (instr, 30);
|
|
char dst_bank = 'A' + _BTST (instr, 36);
|
|
unsigned int nocc = _BTST (instr, 40);
|
|
int do_close_bracket = 1;
|
|
bool err = false;
|
|
|
|
if (swap)
|
|
{
|
|
unsigned int tmp = srcA;
|
|
srcA = srcB;
|
|
srcB = tmp;
|
|
}
|
|
|
|
switch (op)
|
|
{
|
|
case 3: /* pop_count3[dst, srcB] */
|
|
case 6: /* pop_count1[srcB] */
|
|
case 7: /* pop_count2[srcB] */
|
|
case 14: /* ffs[dst, srcB] */
|
|
case 15: /* cam_read_tag[dst, srcB] */
|
|
case 31: /* cam_read_state[dst, srcB] */
|
|
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
|
|
|
|
/* No dest for pop_count1/2. */
|
|
if ((op != 6) && (op != 7))
|
|
{
|
|
/* dest operand */
|
|
if (nfp_me_is_imm_opnd10 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
|
|
dst_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
}
|
|
|
|
/* B operand. */
|
|
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
|
|
num_ctx, src_lmext, dinfo);
|
|
break;
|
|
|
|
/* cam_clear. */
|
|
case 11:
|
|
do_close_bracket = 0;
|
|
dinfo->fprintf_func (dinfo->stream, "cam_clear");
|
|
break;
|
|
|
|
/* cam_lookup. */
|
|
case 23:
|
|
do_close_bracket = 0;
|
|
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
|
|
|
|
/* Dest operand. */
|
|
if (nfp_me_is_imm_opnd10 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
|
|
dst_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* A operand. */
|
|
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
|
|
num_ctx, src_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (_BF (srcB, 1, 0))
|
|
{
|
|
unsigned int n = _BTST (srcB, 1);
|
|
if (_BTST (srcB, 4)) /* Only for MEv28. */
|
|
n += 2;
|
|
dinfo->fprintf_func (dinfo->stream, ", lm_addr%d[%d]", n,
|
|
_BF (srcB, 3, 2));
|
|
}
|
|
|
|
break;
|
|
|
|
case 19: /* cam_write. */
|
|
case 27: /* cam_write_state. */
|
|
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_alu_op[op]);
|
|
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
|
|
num_ctx, src_lmext, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
if (op == 19)
|
|
{
|
|
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
|
|
num_ctx, src_lmext, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
}
|
|
dinfo->fprintf_func (dinfo->stream, "%d", (dst & 0xf));
|
|
break;
|
|
|
|
/* CRC. */
|
|
case 18:
|
|
do_close_bracket = 0;
|
|
dinfo->fprintf_func (dinfo->stream, "crc_%s[",
|
|
_BTST (srcA, 3) ? "le" : "be");
|
|
if (!nfp_me27_28_crc_op[_BF (srcA, 7, 5)])
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _(", <invalid CRC operator>, "));
|
|
err = true;
|
|
}
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "%s, ",
|
|
nfp_me27_28_crc_op[_BF (srcA, 7, 5)]);
|
|
}
|
|
|
|
/* Dest operand. */
|
|
if (nfp_me_is_imm_opnd10 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
|
|
dst_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* B operand. */
|
|
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
|
|
num_ctx, src_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
if (_BF (srcA, 2, 0))
|
|
dinfo->fprintf_func (dinfo->stream, ", %s",
|
|
nfp_me27_28_crc_bytes[_BF (srcA, 2, 0)]);
|
|
if (_BTST (srcA, 4))
|
|
dinfo->fprintf_func (dinfo->stream, ", bit_swap");
|
|
break;
|
|
|
|
default:
|
|
/* s += 'alu[%s, %s, %s, %s]' % (dst, srcAs, op, srcBs). */
|
|
dinfo->fprintf_func (dinfo->stream, "alu[");
|
|
|
|
/* Dest operand. */
|
|
if (nfp_me_is_imm_opnd10 (dst))
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (dst, dst_bank, num_ctx,
|
|
dst_lmext, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
/* A operand. */
|
|
if ((op == 0) || (op == 4)) /* B only operators. */
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A',
|
|
num_ctx, src_lmext, dinfo);
|
|
|
|
if (!nfp_me27_28_alu_op[op])
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, ", <operator:0x%x>, ", op);
|
|
err = true;
|
|
}
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, ", %s, ",
|
|
nfp_me27_28_alu_op[op]);
|
|
}
|
|
|
|
/* B operand. */
|
|
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B',
|
|
num_ctx, src_lmext, dinfo);
|
|
break;
|
|
}
|
|
|
|
if (do_close_bracket)
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (nocc)
|
|
dinfo->fprintf_func (dinfo->stream, ", no_cc");
|
|
if (gpr_wrboth)
|
|
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
|
|
if (pred_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_immed (uint64_t instr, unsigned int pred_cc,
|
|
unsigned int dst_lmext,
|
|
unsigned int gpr_wrboth,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 9, 0);
|
|
unsigned int srcB = _BF (instr, 19, 10);
|
|
unsigned int imm = _BF (instr, 27, 20);
|
|
unsigned int by = _BTST (instr, 29);
|
|
unsigned int wd = _BTST (instr, 30);
|
|
unsigned int inv = _BTST (instr, 31);
|
|
unsigned int byte_shift = _BF (instr, 34, 33);
|
|
bool err = false;
|
|
|
|
if (nfp_me_is_imm_opnd10 (srcB))
|
|
{
|
|
imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
|
|
if (nfp_me_is_imm_opnd10 (srcA) && (imm == 0))
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "nop");
|
|
return 0;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
|
|
}
|
|
|
|
if (inv)
|
|
imm = (imm ^ 0xffff) | 0xffff0000U;
|
|
|
|
if (by)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "immed_b%d[", byte_shift);
|
|
imm &= 0xff;
|
|
}
|
|
else if (wd)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "immed_w%d[", (byte_shift / 2));
|
|
imm &= 0xffff;
|
|
}
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "immed[");
|
|
|
|
/* Dest. */
|
|
if (nfp_me_is_imm_opnd10 (srcA) && nfp_me_is_imm_opnd10 (srcB))
|
|
dinfo->fprintf_func (dinfo->stream, "--"); /* No Dest. */
|
|
else if (nfp_me_is_imm_opnd10 (srcA))
|
|
err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, dst_lmext, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, dst_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", 0x%x", imm);
|
|
|
|
if ((!by) && (!wd) && (byte_shift))
|
|
dinfo->fprintf_func (dinfo->stream, ", <<%d", (byte_shift * 8));
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (gpr_wrboth)
|
|
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
|
|
if (pred_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_ld_field (uint64_t instr, unsigned int pred_cc,
|
|
unsigned int dst_lmext, unsigned int src_lmext,
|
|
unsigned int gpr_wrboth,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int load_cc = _BTST (instr, 34);
|
|
unsigned int shift = _BF (instr, 32, 28);
|
|
unsigned int byte_mask = _BF (instr, 27, 24);
|
|
unsigned int zerof = _BTST (instr, 20);
|
|
unsigned int swap = _BTST (instr, 19);
|
|
unsigned int imm_msb = _BTST (instr, 18);
|
|
unsigned int src = _BF (instr, 17, 10);
|
|
unsigned int sc = _BF (instr, 9, 8);
|
|
unsigned int dst = _BF (instr, 7, 0);
|
|
bool err = false;
|
|
|
|
if (swap)
|
|
{
|
|
unsigned int tmp = src;
|
|
src = dst;
|
|
dst = tmp;
|
|
}
|
|
|
|
if (zerof)
|
|
dinfo->fprintf_func (dinfo->stream, "ld_field_w_clr[");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "ld_field[");
|
|
|
|
err = err || !nfp_me_print_opnd8 (dst, (swap) ? 'B' : 'A', num_ctx,
|
|
dst_lmext, imm_msb, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d%d%d%d, ",
|
|
_BTST (byte_mask, 3),
|
|
_BTST (byte_mask, 2),
|
|
_BTST (byte_mask, 1), _BTST (byte_mask, 0));
|
|
err = err || !nfp_me_print_opnd8 (src, (swap) ? 'A' : 'B', num_ctx,
|
|
src_lmext, imm_msb, dinfo);
|
|
|
|
if ((sc == 0) && (shift != 0))
|
|
dinfo->fprintf_func (dinfo->stream, ", >>rot%d", shift);
|
|
else if (sc == 1)
|
|
{
|
|
if (shift)
|
|
dinfo->fprintf_func (dinfo->stream, ", >>%d", shift);
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, ", >>indirect");
|
|
}
|
|
else if (sc == 2)
|
|
{
|
|
if (shift)
|
|
dinfo->fprintf_func (dinfo->stream, ", <<%d", (32 - shift));
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, ", <<indirect");
|
|
}
|
|
else if (sc == 3)
|
|
dinfo->fprintf_func (dinfo->stream, ", >>dbl%d", shift);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (load_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", load_cc");
|
|
if (gpr_wrboth)
|
|
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
|
|
if (pred_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int resume_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
|
|
unsigned int defer = _BF (instr, 21, 20);
|
|
unsigned int no_load = _BTST (instr, 19);
|
|
unsigned int resume = _BTST (instr, 18);
|
|
unsigned int bpt = _BTST (instr, 17);
|
|
unsigned int sig_or = _BTST (instr, 16);
|
|
unsigned int ev_mask = _BF (instr, 15, 0);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "ctx_arb[");
|
|
if (bpt)
|
|
dinfo->fprintf_func (dinfo->stream, "bpt");
|
|
else if (ev_mask == 1)
|
|
dinfo->fprintf_func (dinfo->stream, "voluntary");
|
|
else if ((!no_load) && (ev_mask == 0))
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "kill");
|
|
sig_or = 0;
|
|
}
|
|
else if (ev_mask == 0)
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
{
|
|
int first_print = 1;
|
|
unsigned int n;
|
|
|
|
for (n = 1; n < 16; n++)
|
|
{
|
|
if (!_BTST (ev_mask, n))
|
|
continue;
|
|
dinfo->fprintf_func (dinfo->stream, "%ssig%d",
|
|
(first_print) ? "" : ", ", n);
|
|
first_print = 0;
|
|
}
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (sig_or)
|
|
dinfo->fprintf_func (dinfo->stream, ", any");
|
|
if (resume)
|
|
dinfo->fprintf_func (dinfo->stream, ", br[.%d]", resume_addr);
|
|
if (defer)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
|
|
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_local_csr (uint64_t instr,
|
|
unsigned int src_lmext,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 9, 0);
|
|
unsigned int srcB = _BF (instr, 19, 10);
|
|
unsigned int wr = _BTST (instr, 21);
|
|
unsigned int csr_num = _BF (instr, 32, 22);
|
|
unsigned int src = srcA;
|
|
char src_bank = 'A';
|
|
bool err = false;
|
|
|
|
if (nfp_me_is_imm_opnd10 (srcA) && !nfp_me_is_imm_opnd10 (srcB))
|
|
{
|
|
src_bank = 'B';
|
|
src = srcB;
|
|
}
|
|
|
|
/* MEv28 does not have urd/uwr. */
|
|
if (csr_num == 1)
|
|
{
|
|
if (wr)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "uwr[*u$index%d++, ",
|
|
(int) _BTST (instr, 20));
|
|
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
|
|
src_lmext, dinfo);
|
|
}
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "urd[");
|
|
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
|
|
src_lmext, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", *u$index%d++",
|
|
(int) _BTST (instr, 20));
|
|
}
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
}
|
|
else
|
|
{
|
|
const char *nm = NULL;
|
|
|
|
if (csr_num < ARRAY_SIZE (nfp_me27_28_mecsrs))
|
|
nm = nfp_me27_28_mecsrs[csr_num];
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "local_csr_%s[",
|
|
(wr) ? "wr" : "rd");
|
|
if (nm)
|
|
dinfo->fprintf_func (dinfo->stream, "%s", nm);
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x", (csr_num * 4));
|
|
|
|
if (wr)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
err = err || !nfp_me_print_opnd10 (src, src_bank, num_ctx,
|
|
src_lmext, dinfo);
|
|
}
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
}
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_branch (uint64_t instr,
|
|
const char *br_inpstates[16],
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int br_op = _BF (instr, 4, 0);
|
|
unsigned int ctx_sig_state = _BF (instr, 17, 14);
|
|
unsigned int defer = _BF (instr, 21, 20);
|
|
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
|
|
int ret = 0;
|
|
|
|
if (!nfp_me27_28_br_ops[br_op])
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("<invalid branch>["));
|
|
ret = _NFP_ERR_CONT;
|
|
}
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "%s[", nfp_me27_28_br_ops[br_op]);
|
|
|
|
switch (br_op)
|
|
{
|
|
case 16: /* br=ctx */
|
|
case 17: /* br!=ctx */
|
|
case 18: /* br_signal */
|
|
case 19: /* br_!signal */
|
|
dinfo->fprintf_func (dinfo->stream, "%d, ", ctx_sig_state);
|
|
break;
|
|
case 20: /* "br_inp_state" */
|
|
case 21: /* "br_!inp_state" */
|
|
dinfo->fprintf_func (dinfo->stream, "%s, ",
|
|
br_inpstates[ctx_sig_state]);
|
|
break;
|
|
case 22: /* "br_cls_state" */
|
|
case 23: /* "br_!cls_state" */
|
|
dinfo->fprintf_func (dinfo->stream, "cls_ring%d_status, ",
|
|
ctx_sig_state);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ".%d]", br_addr);
|
|
|
|
if (defer)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
|
|
|
|
return ret;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_br_byte (uint64_t instr,
|
|
unsigned int src_lmext, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 7, 0);
|
|
unsigned int by = _BF (instr, 9, 8);
|
|
unsigned int srcB = _BF (instr, 17, 10);
|
|
unsigned int imm_msb = _BTST (instr, 18);
|
|
unsigned int eq = _BTST (instr, 19);
|
|
unsigned int defer = _BF (instr, 21, 20);
|
|
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
|
|
bool err = false;
|
|
|
|
if (eq)
|
|
dinfo->fprintf_func (dinfo->stream, "br=byte[");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "br!=byte[");
|
|
|
|
if (nfp_me_is_imm_opnd8 (srcA))
|
|
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
|
|
src_lmext, imm_msb, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
|
|
src_lmext, imm_msb, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", %d, ", by);
|
|
|
|
if (nfp_me_is_imm_opnd8 (srcA))
|
|
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx,
|
|
src_lmext, imm_msb, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx,
|
|
src_lmext, imm_msb, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", .%d]", br_addr);
|
|
|
|
if (defer)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_br_bit (uint64_t instr, unsigned int src_lmext,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 7, 0);
|
|
unsigned int srcB = _BF (instr, 17, 10);
|
|
unsigned int b = _BTST (instr, 18);
|
|
unsigned int defer = _BF (instr, 21, 20);
|
|
unsigned int br_addr = _BFS (instr, 40, 40, 13) | _BF (instr, 34, 22);
|
|
bool err = false;
|
|
|
|
if (b)
|
|
dinfo->fprintf_func (dinfo->stream, "br_bset[");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "br_bclr[");
|
|
|
|
if (nfp_me_is_imm_opnd8 (srcA))
|
|
{
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcB, 'B', num_ctx, src_lmext, 0, dinfo);
|
|
b = (nfp_me_imm_opnd8 (srcA, 0) - 1) & 0x1f;
|
|
}
|
|
else
|
|
{
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcA, 'A', num_ctx, src_lmext, 0, dinfo);
|
|
b = (nfp_me_imm_opnd8 (srcB, 0) - 1) & 0x1f;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", %d, .%d]", b, br_addr);
|
|
|
|
if (defer)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_br_alu (uint64_t instr, unsigned int src_lmext,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 9, 0);
|
|
unsigned int srcB = _BF (instr, 19, 10);
|
|
unsigned int defer = _BF (instr, 21, 20);
|
|
unsigned int imm = _BF (instr, 30, 22);
|
|
bool err = false;
|
|
|
|
if (nfp_me_is_imm_opnd10 (srcA))
|
|
imm = (imm << 8) | nfp_me_imm_opnd10 (srcA);
|
|
else
|
|
imm = (imm << 8) | nfp_me_imm_opnd10 (srcB);
|
|
|
|
if (!imm)
|
|
dinfo->fprintf_func (dinfo->stream, "rtn[");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "jump[");
|
|
|
|
if (nfp_me_is_imm_opnd10 (srcA))
|
|
err = err || !nfp_me_print_opnd10 (srcB, 'B', num_ctx, src_lmext, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (srcA, 'A', num_ctx, src_lmext, dinfo);
|
|
|
|
if (imm)
|
|
dinfo->fprintf_func (dinfo->stream, ", .%d", imm);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (defer)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", defer);
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_28_print_mult (uint64_t instr, unsigned int pred_cc,
|
|
unsigned int dst_lmext, unsigned int src_lmext,
|
|
unsigned int gpr_wrboth,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 9, 0);
|
|
unsigned int srcB = _BF (instr, 19, 10);
|
|
unsigned int mstep = _BF (instr, 22, 20);
|
|
char dst_bank = 'A' + _BTST (instr, 23);
|
|
unsigned int swap = _BTST (instr, 30);
|
|
unsigned int mtype = _BF (instr, 32, 31);
|
|
unsigned int nocc = _BTST (instr, 40);
|
|
bool err = false;
|
|
|
|
if (swap)
|
|
{
|
|
unsigned int tmp = srcA;
|
|
srcA = srcB;
|
|
srcB = tmp;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "mul_step[");
|
|
|
|
if (mstep >= 4)
|
|
err = err
|
|
|| !nfp_me_print_opnd10 (srcA, dst_bank, num_ctx, dst_lmext, dinfo);
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (srcA, (swap) ? 'B' : 'A', num_ctx,
|
|
src_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
|
|
if (mstep >= 4)
|
|
dinfo->fprintf_func (dinfo->stream, "--");
|
|
else
|
|
err = err || !nfp_me_print_opnd10 (srcB, (swap) ? 'A' : 'B', num_ctx,
|
|
src_lmext, dinfo);
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "], %s", nfp_me27_28_mult_types[mtype]);
|
|
if (mtype > 0)
|
|
{
|
|
const char *s = nfp_me27_28_mult_steps[mstep];
|
|
if (!s)
|
|
{
|
|
s = "<invalid mul_step>";
|
|
err = true;
|
|
}
|
|
dinfo->fprintf_func (dinfo->stream, "_%s", s);
|
|
}
|
|
|
|
if (nocc)
|
|
dinfo->fprintf_func (dinfo->stream, ", no_cc");
|
|
if (gpr_wrboth)
|
|
dinfo->fprintf_func (dinfo->stream, ", gpr_wrboth");
|
|
if (pred_cc)
|
|
dinfo->fprintf_func (dinfo->stream, ", predicate_cc");
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
_nfp_cmp_mnmnc (const void *arg_a, const void *arg_b)
|
|
{
|
|
const nfp_cmd_mnemonic *a = arg_a;
|
|
const nfp_cmd_mnemonic *b = arg_b;
|
|
|
|
if (a->cpp_target != b->cpp_target)
|
|
return (a->cpp_target > b->cpp_target) - (a->cpp_target < b->cpp_target);
|
|
|
|
if (a->cpp_action != b->cpp_action)
|
|
return (a->cpp_action > b->cpp_action) - (a->cpp_action < b->cpp_action);
|
|
|
|
return (a->cpp_token > b->cpp_token) - (a->cpp_token < b->cpp_token);
|
|
}
|
|
|
|
static const char *
|
|
nfp_me_find_mnemonic (unsigned int cpp_tgt, unsigned int cpp_act,
|
|
unsigned int cpp_tok, unsigned int cpp_len,
|
|
const nfp_cmd_mnemonic * mnemonics,
|
|
size_t mnemonics_cnt)
|
|
{
|
|
nfp_cmd_mnemonic search_key = { cpp_tgt, cpp_act, cpp_tok, 0, 0, NULL };
|
|
const nfp_cmd_mnemonic *cmd = NULL;
|
|
|
|
cmd = bsearch (&search_key, mnemonics, mnemonics_cnt,
|
|
sizeof (nfp_cmd_mnemonic), _nfp_cmp_mnmnc);
|
|
|
|
if (!cmd)
|
|
return NULL;
|
|
|
|
/* Make sure we backtrack to the first entry that still matches the three
|
|
bsearched fields - then we simply iterate and compare cpp_len. */
|
|
while ((cmd > mnemonics) && (_nfp_cmp_mnmnc (&cmd[-1], &search_key) == 0))
|
|
--cmd;
|
|
|
|
/* Now compare by cpp_len and make sure we stay in range. */
|
|
for (; (cmd < (mnemonics + mnemonics_cnt))
|
|
&& (_nfp_cmp_mnmnc (cmd, &search_key) == 0); ++cmd)
|
|
{
|
|
if ((cpp_len & cmd->len_mask) == cmd->len_fixed)
|
|
return cmd->mnemonic;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
/* NFP-32xx (ME Version 2.7). */
|
|
|
|
static int
|
|
nfp_me27_print_cmd (uint64_t instr, int third_party_32bit,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 7, 0);
|
|
unsigned int ctxswap_defer = _BF (instr, 9, 8);
|
|
unsigned int srcB = _BF (instr, 17, 10);
|
|
unsigned int token = _BF (instr, 19, 18);
|
|
unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
|
|
unsigned int cpp_len = _BF (instr, 27, 25);
|
|
unsigned int sig = _BF (instr, 31, 28);
|
|
unsigned int tgtcmd = _BF (instr, 38, 32);
|
|
unsigned int indref = _BTST (instr, 41);
|
|
unsigned int mode = _BF (instr, 44, 42);
|
|
|
|
bool err = false;
|
|
int cpp_target = -1;
|
|
int cpp_action = -1;
|
|
const char *mnemonic = NULL;
|
|
unsigned int imm;
|
|
unsigned int valBA;
|
|
int visswap = ((mode == 1) || (mode == 3));
|
|
|
|
imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
|
|
valBA = (srcB << 8) | srcA;
|
|
|
|
if (mode == 6)
|
|
{
|
|
token = 0;
|
|
sig = 0;
|
|
xfer = 0;
|
|
}
|
|
|
|
/* Convert tgtcmd to action/token tuple. */
|
|
if (_BF (tgtcmd, 6, 5) == 0x0)
|
|
{
|
|
switch (_BF (tgtcmd, 4, 2))
|
|
{
|
|
case 0:
|
|
cpp_target = NFP_3200_CPPTGT_CAP;
|
|
dinfo->fprintf_func (dinfo->stream, "cap[");
|
|
break;
|
|
case 1:
|
|
cpp_target = NFP_3200_CPPTGT_MSF0;
|
|
dinfo->fprintf_func (dinfo->stream, "msf0[");
|
|
break;
|
|
case 2:
|
|
cpp_target = NFP_3200_CPPTGT_MSF1;
|
|
dinfo->fprintf_func (dinfo->stream, "msf1[");
|
|
break;
|
|
case 3:
|
|
cpp_target = NFP_3200_CPPTGT_PCIE;
|
|
dinfo->fprintf_func (dinfo->stream, "pcie[");
|
|
break;
|
|
case 4:
|
|
cpp_target = NFP_3200_CPPTGT_HASH;
|
|
break;
|
|
case 5:
|
|
cpp_target = NFP_3200_CPPTGT_CRYPTO;
|
|
dinfo->fprintf_func (dinfo->stream, "crypto[");
|
|
break;
|
|
case 6:
|
|
cpp_target = NFP_3200_CPPTGT_ARM;
|
|
dinfo->fprintf_func (dinfo->stream, "arm[");
|
|
break;
|
|
case 7:
|
|
cpp_target = NFP_3200_CPPTGT_CT;
|
|
dinfo->fprintf_func (dinfo->stream, "ct[");
|
|
break;
|
|
}
|
|
cpp_action = _BF (tgtcmd, 1, 0);
|
|
}
|
|
else
|
|
{
|
|
switch (_BF (tgtcmd, 6, 4))
|
|
{
|
|
case 2:
|
|
cpp_target = NFP_3200_CPPTGT_GS;
|
|
dinfo->fprintf_func (dinfo->stream, "scratch[");
|
|
break;
|
|
case 3:
|
|
cpp_target = NFP_3200_CPPTGT_QDR; /* A.k.a. SRAM. */
|
|
dinfo->fprintf_func (dinfo->stream, "sram[");
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
cpp_target = NFP_3200_CPPTGT_MU;
|
|
dinfo->fprintf_func (dinfo->stream, "mem[");
|
|
break;
|
|
case 6:
|
|
case 7:
|
|
cpp_target = NFP_3200_CPPTGT_CLS;
|
|
dinfo->fprintf_func (dinfo->stream, "cls[");
|
|
break;
|
|
}
|
|
cpp_action = _BF (tgtcmd, 3, 0);
|
|
}
|
|
|
|
if (cpp_target < 0)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
|
|
cpp_target, cpp_action, token);
|
|
return _NFP_ERR_CONT;
|
|
}
|
|
|
|
mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
|
|
nfp_me27_mnemonics,
|
|
ARRAY_SIZE (nfp_me27_mnemonics));
|
|
|
|
if (!mnemonic)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
|
|
cpp_target, cpp_action, token);
|
|
return _NFP_ERR_CONT;
|
|
}
|
|
|
|
if (cpp_target == NFP_3200_CPPTGT_HASH)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "%s[$xfer_%d, %d",
|
|
mnemonic, xfer, cpp_len);
|
|
goto print_opt_toks;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
|
|
|
|
if (visswap)
|
|
{
|
|
unsigned int tmp = srcA;
|
|
srcA = srcB;
|
|
srcB = tmp;
|
|
}
|
|
|
|
switch (mode)
|
|
{
|
|
case 0: /* (A << 8) + B. */
|
|
case 1: /* (B << 8) + A. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", <<8, ");
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
|
|
case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
|
|
if (third_party_32bit)
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, ", <<8, ");
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 4: /* A + B. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
|
|
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 5: /* Immediate address. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
|
|
(cpp_len + 1));
|
|
break;
|
|
case 6: /* Immediate address and data. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
|
|
break;
|
|
case 7: /* Immediate data. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
|
|
((xfer << 16) | valBA), (cpp_len + 1));
|
|
break;
|
|
}
|
|
|
|
print_opt_toks:
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (indref && (mode != 2) && (mode != 3))
|
|
dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
|
|
|
|
if (ctxswap_defer != 3)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
|
|
if (sig)
|
|
dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "--]");
|
|
|
|
if (ctxswap_defer != 0)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
|
|
}
|
|
else if (sig)
|
|
dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_alu_shf (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_alu (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_alu_shf (instr, 0, 0, 0, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_immed (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_immed (instr, 0, 0, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_ld_field (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_ld_field (instr, 0, 0, 0, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_ctx_arb (instr, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_local_csr (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_local_csr (instr, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_branch (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_branch (instr, nfp_me27_br_inpstates, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_br_byte (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_br_byte (instr, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_br_bit (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_br_bit (instr, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_br_alu (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_br_alu (instr, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me27_print_mult (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_mult (instr, 0, 0, 0, 0, num_ctx, dinfo);
|
|
}
|
|
|
|
/*NFP-6xxx/4xxx (ME Version 2.8). */
|
|
|
|
static int
|
|
nfp_me28_print_cmd (uint64_t instr, int third_party_32bit,
|
|
int num_ctx, struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int srcA = _BF (instr, 7, 0);
|
|
unsigned int ctxswap_defer = _BF (instr, 9, 8);
|
|
unsigned int srcB = _BF (instr, 17, 10);
|
|
unsigned int token = _BF (instr, 19, 18);
|
|
unsigned int xfer = _BFS (instr, 40, 40, 5) | _BF (instr, 24, 20);
|
|
unsigned int cpp_len = _BF (instr, 27, 25);
|
|
unsigned int sig = _BF (instr, 31, 28);
|
|
unsigned int tgtcmd = _BF (instr, 38, 32);
|
|
unsigned int indref = _BTST (instr, 41);
|
|
unsigned int mode = _BF (instr, 44, 42);
|
|
|
|
bool err = false;
|
|
int cpp_target = -1;
|
|
int cpp_action = -1;
|
|
const char *mnemonic = NULL;
|
|
unsigned int imm;
|
|
unsigned int valBA;
|
|
int visswap = ((mode == 1) || (mode == 3));
|
|
|
|
imm = (sig << 10) | (cpp_len << 7) | ((xfer & 0x1f) << 2) | token;
|
|
valBA = (srcB << 8) | srcA;
|
|
|
|
if (mode == 6)
|
|
{
|
|
token = 0;
|
|
sig = 0;
|
|
xfer = 0;
|
|
}
|
|
|
|
/* Convert tgtcmd to action/token tuple. */
|
|
if (_BF (tgtcmd, 6, 5) == 0x0)
|
|
{
|
|
switch (_BF (tgtcmd, 4, 2))
|
|
{
|
|
case 0:
|
|
cpp_target = NFP_6000_CPPTGT_ILA;
|
|
dinfo->fprintf_func (dinfo->stream, "ila[");
|
|
break;
|
|
case 1:
|
|
cpp_target = NFP_6000_CPPTGT_NBI;
|
|
dinfo->fprintf_func (dinfo->stream, "nbi[");
|
|
break;
|
|
case 3:
|
|
cpp_target = NFP_6000_CPPTGT_PCIE;
|
|
dinfo->fprintf_func (dinfo->stream, "pcie[");
|
|
break;
|
|
case 5:
|
|
cpp_target = NFP_6000_CPPTGT_CRYPTO;
|
|
dinfo->fprintf_func (dinfo->stream, "crypto[");
|
|
break;
|
|
case 6:
|
|
cpp_target = NFP_6000_CPPTGT_ARM;
|
|
dinfo->fprintf_func (dinfo->stream, "arm[");
|
|
break;
|
|
case 7:
|
|
cpp_target = NFP_6000_CPPTGT_CTXPB;
|
|
dinfo->fprintf_func (dinfo->stream, "ct[");
|
|
break;
|
|
}
|
|
cpp_action = _BF (tgtcmd, 1, 0);
|
|
}
|
|
else
|
|
{
|
|
/* One bit overlap between "t" and "a" fields, for sram it's "t" and
|
|
for mem/cls it's "a". */
|
|
cpp_action = _BF (tgtcmd, 4, 0);
|
|
switch (_BF (tgtcmd, 6, 4))
|
|
{
|
|
case 3:
|
|
cpp_target = NFP_6000_CPPTGT_VQDR;
|
|
cpp_action = _BF (tgtcmd, 3, 0);
|
|
dinfo->fprintf_func (dinfo->stream, "sram[");
|
|
break;
|
|
case 4:
|
|
case 5:
|
|
cpp_target = NFP_6000_CPPTGT_MU;
|
|
dinfo->fprintf_func (dinfo->stream, "mem[");
|
|
break;
|
|
case 6:
|
|
case 7:
|
|
cpp_target = NFP_6000_CPPTGT_CLS;
|
|
dinfo->fprintf_func (dinfo->stream, "cls[");
|
|
break;
|
|
}
|
|
}
|
|
|
|
if (cpp_target < 0)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd target %d:%d:%d>[]"),
|
|
cpp_target, cpp_action, token);
|
|
return _NFP_ERR_CONT;
|
|
}
|
|
|
|
mnemonic = nfp_me_find_mnemonic (cpp_target, cpp_action, token, cpp_len,
|
|
nfp_me28_mnemonics,
|
|
ARRAY_SIZE (nfp_me28_mnemonics));
|
|
|
|
if (!mnemonic)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("<invalid cmd action %d:%d:%d>[]"),
|
|
cpp_target, cpp_action, token);
|
|
return _NFP_ERR_CONT;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "%s, ", mnemonic);
|
|
|
|
if (visswap)
|
|
{
|
|
unsigned int tmp = srcA;
|
|
srcA = srcB;
|
|
srcB = tmp;
|
|
}
|
|
|
|
switch (mode)
|
|
{
|
|
case 0: /* (A << 8) + B. */
|
|
case 1: /* (B << 8) + A. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", <<8, ");
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 2: /* Accelerated 3rd party (A[ << 8]) + B. */
|
|
case 3: /* Accelerated 3rd party (B[ << 8]) + A. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, ", (indref << 6) | xfer);
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcA, 'A' + visswap, num_ctx, 0, 0, dinfo);
|
|
if (third_party_32bit)
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, ", <<8, ");
|
|
err = err
|
|
|| !nfp_me_print_opnd8 (srcB, 'B' - visswap, num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 4: /* A + B. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, ", xfer);
|
|
err = err || !nfp_me_print_opnd8 (srcA, 'A', num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", ");
|
|
err = err || !nfp_me_print_opnd8 (srcB, 'B', num_ctx, 0, 0, dinfo);
|
|
dinfo->fprintf_func (dinfo->stream, ", %d", (cpp_len + 1));
|
|
break;
|
|
case 5: /* Immediate address. */
|
|
dinfo->fprintf_func (dinfo->stream, "$xfer_%d, 0x%x, %d", xfer, valBA,
|
|
(cpp_len + 1));
|
|
break;
|
|
case 6: /* Immediate address and data. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, 0x%x", valBA, imm);
|
|
break;
|
|
case 7: /* Immediate data. */
|
|
dinfo->fprintf_func (dinfo->stream, "0x%x, --, %d",
|
|
((xfer << 16) | valBA), (cpp_len + 1));
|
|
break;
|
|
}
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "]");
|
|
|
|
if (indref && (mode != 2) && (mode != 3))
|
|
dinfo->fprintf_func (dinfo->stream, ", indirect_ref");
|
|
|
|
if (ctxswap_defer != 3)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, ", ctx_swap[");
|
|
if (sig)
|
|
dinfo->fprintf_func (dinfo->stream, "sig%d]", sig);
|
|
else
|
|
dinfo->fprintf_func (dinfo->stream, "--]");
|
|
|
|
if (ctxswap_defer != 0)
|
|
dinfo->fprintf_func (dinfo->stream, ", defer[%d]", ctxswap_defer);
|
|
}
|
|
else if (sig)
|
|
dinfo->fprintf_func (dinfo->stream, ", sig_done[sig%d]", sig);
|
|
|
|
if (err)
|
|
return _NFP_ERR_CONT;
|
|
return 0;
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_alu_shf (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int gpr_wrboth = _BTST (instr, 41);
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
unsigned int dst_lmext = _BTST (instr, 43);
|
|
unsigned int pred_cc = _BTST (instr, 44);
|
|
|
|
return nfp_me27_28_print_alu_shf (instr, pred_cc, dst_lmext,
|
|
src_lmext, gpr_wrboth, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_alu (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int gpr_wrboth = _BTST (instr, 41);
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
unsigned int dst_lmext = _BTST (instr, 43);
|
|
unsigned int pred_cc = _BTST (instr, 44);
|
|
|
|
return nfp_me27_28_print_alu (instr, pred_cc, dst_lmext, src_lmext,
|
|
gpr_wrboth, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_immed (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int gpr_wrboth = _BTST (instr, 41);
|
|
unsigned int dst_lmext = _BTST (instr, 43);
|
|
unsigned int pred_cc = _BTST (instr, 44);
|
|
|
|
return nfp_me27_28_print_immed (instr, pred_cc, dst_lmext, gpr_wrboth,
|
|
num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_ld_field (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int gpr_wrboth = _BTST (instr, 41);
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
unsigned int dst_lmext = _BTST (instr, 43);
|
|
unsigned int pred_cc = _BTST (instr, 44);
|
|
|
|
return nfp_me27_28_print_ld_field (instr, pred_cc, dst_lmext,
|
|
src_lmext, gpr_wrboth, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_ctx_arb (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_ctx_arb (instr, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_local_csr (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
|
|
return nfp_me27_28_print_local_csr (instr, src_lmext, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_branch (uint64_t instr, struct disassemble_info *dinfo)
|
|
{
|
|
return nfp_me27_28_print_branch (instr, nfp_me28_br_inpstates, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_br_byte (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
return nfp_me27_28_print_br_byte (instr, src_lmext, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_br_bit (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
return nfp_me27_28_print_br_bit (instr, src_lmext, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_br_alu (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
return nfp_me27_28_print_br_alu (instr, src_lmext, num_ctx, dinfo);
|
|
}
|
|
|
|
static int
|
|
nfp_me28_print_mult (uint64_t instr, int num_ctx,
|
|
struct disassemble_info *dinfo)
|
|
{
|
|
unsigned int gpr_wrboth = _BTST (instr, 41);
|
|
unsigned int src_lmext = _BTST (instr, 42);
|
|
unsigned int dst_lmext = _BTST (instr, 43);
|
|
unsigned int pred_cc = _BTST (instr, 44);
|
|
|
|
return nfp_me27_28_print_mult (instr, pred_cc, dst_lmext, src_lmext,
|
|
gpr_wrboth, num_ctx, dinfo);
|
|
}
|
|
|
|
static bool
|
|
init_nfp3200_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
|
|
{
|
|
Elf_Internal_Shdr *sec = NULL;
|
|
Elf_Nfp_MeConfig mecfg_ent;
|
|
unsigned char buffer[sizeof (Elf_Nfp_MeConfig)];
|
|
file_ptr roff = 0;
|
|
unsigned int sec_cnt = 0;
|
|
unsigned int sec_idx;
|
|
size_t menum_linear = 0;
|
|
|
|
if (!dinfo->section)
|
|
/* No section info, will use default values. */
|
|
return true;
|
|
|
|
sec_cnt = elf_numsections (dinfo->section->owner);
|
|
|
|
/* Find the MECONFIG section. It's index is also in e_flags, but it has
|
|
a unique SHT and we'll use that. */
|
|
for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
|
|
{
|
|
sec = elf_elfsections (dinfo->section->owner)[sec_idx];
|
|
|
|
if (sec->sh_type == SHT_NFP_MECONFIG)
|
|
break;
|
|
}
|
|
|
|
if (sec_idx == sec_cnt)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("File has no ME-Config section."));
|
|
return false;
|
|
}
|
|
|
|
if (sec->bfd_section == NULL)
|
|
{
|
|
/* See PR 31843 for an example of this. */
|
|
dinfo->fprintf_func (dinfo->stream, _("The ME-Config section is corrupt."));
|
|
return false;
|
|
}
|
|
|
|
for (roff = 0; (bfd_size_type) roff < sec->sh_size;
|
|
roff += sec->sh_entsize, menum_linear++)
|
|
{
|
|
nfp_priv_mecfg *mecfg;
|
|
int isl = menum_linear >> 3;
|
|
int menum = menum_linear & 7;
|
|
|
|
if (menum_linear >= 40)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream,
|
|
_("File has invalid ME-Config section."));
|
|
return false;
|
|
}
|
|
|
|
mecfg = &priv->mecfgs[isl][menum][1];
|
|
|
|
if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
|
|
buffer, roff, sizeof (buffer)))
|
|
return false;
|
|
|
|
mecfg_ent.ctx_enables = bfd_getl32 (buffer + offsetof (Elf_Nfp_MeConfig,
|
|
ctx_enables));
|
|
mecfg_ent.misc_control = bfd_getl32 (buffer
|
|
+ offsetof (Elf_Nfp_MeConfig, misc_control));
|
|
|
|
mecfg->ctx4_mode = _BTST (mecfg_ent.ctx_enables, 31);
|
|
mecfg->addr_3rdparty32 = _BTST (mecfg_ent.misc_control, 4);
|
|
mecfg->scs_cnt = _BTST (mecfg_ent.misc_control, 2);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool
|
|
init_nfp6000_mecsr_sec (nfp_priv_data * priv, Elf_Internal_Shdr * sec,
|
|
bool is_for_text, struct disassemble_info *dinfo)
|
|
{
|
|
Elf_Nfp_InitRegEntry ireg;
|
|
unsigned char buffer[sizeof (Elf_Nfp_InitRegEntry)];
|
|
file_ptr ireg_off = 0;
|
|
size_t isl, menum;
|
|
|
|
if (sec->sh_entsize != sizeof (ireg))
|
|
return false;
|
|
|
|
isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
|
|
|
|
/* For these sections we know that the address will only be 32 bits
|
|
so we only need cpp_offset_lo.
|
|
Address is encoded as follows:
|
|
<31:30> 0
|
|
<29:24> island (already got this from sh_info)
|
|
<23:17> 0
|
|
<16:16> XferCsrRegSel (1 for these sections)
|
|
<15:14> 0
|
|
<13:10> DataMasterID (MEnum = this - 4)
|
|
<9:2> register (index)
|
|
<1:0> 0b0 (register byte address if appened to the previous field). */
|
|
for (ireg_off = 0; (bfd_size_type) ireg_off < sec->sh_size;
|
|
ireg_off += sec->sh_entsize)
|
|
{
|
|
uint32_t csr_off;
|
|
nfp_priv_mecfg *mecfg;
|
|
|
|
if (!bfd_get_section_contents (dinfo->section->owner, sec->bfd_section,
|
|
buffer, ireg_off, sizeof (buffer)))
|
|
return false;
|
|
|
|
ireg.cpp_offset_lo = bfd_getl32 (buffer
|
|
+ offsetof (Elf_Nfp_InitRegEntry, cpp_offset_lo));
|
|
ireg.mask = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, mask));
|
|
ireg.val = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, val));
|
|
ireg.w0 = bfd_getl32 (buffer + offsetof (Elf_Nfp_InitRegEntry, w0));
|
|
|
|
if (NFP_IREG_ENTRY_WO_NLW (ireg.w0))
|
|
continue;
|
|
|
|
/* Only consider entries that are permanent for runtime. */
|
|
if ((NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_CONST)
|
|
&& (NFP_IREG_ENTRY_WO_VTP (ireg.w0) != NFP_IREG_VTP_FORCE))
|
|
continue;
|
|
|
|
menum = _BF (ireg.cpp_offset_lo, 13, 10) - 4;
|
|
csr_off = _BF (ireg.cpp_offset_lo, 9, 0);
|
|
|
|
if (isl >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
|
|
return false;
|
|
|
|
mecfg = &priv->mecfgs[isl][menum][is_for_text];
|
|
switch (csr_off)
|
|
{
|
|
case _NFP_ME27_28_CSR_CTX_ENABLES:
|
|
mecfg->ctx4_mode = _BTST (ireg.val, 31);
|
|
break;
|
|
case _NFP_ME27_28_CSR_MISC_CONTROL:
|
|
mecfg->addr_3rdparty32 = _BTST (ireg.val, 4);
|
|
mecfg->scs_cnt = _BTST (ireg.val, 2);
|
|
break;
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static bool
|
|
init_nfp6000_priv (nfp_priv_data * priv, struct disassemble_info *dinfo)
|
|
{
|
|
int mecfg_orders[64][2];
|
|
size_t isl;
|
|
unsigned int sec_cnt = 0;
|
|
unsigned int sec_idx;
|
|
bool is_for_text;
|
|
|
|
memset (mecfg_orders, -1, sizeof (mecfg_orders));
|
|
|
|
if (dinfo->section == NULL
|
|
|| dinfo->section->owner == NULL
|
|
|| elf_elfsections (dinfo->section->owner) == NULL)
|
|
/* No section info, will use default values. */
|
|
return true;
|
|
|
|
sec_cnt = elf_numsections (dinfo->section->owner);
|
|
|
|
/* Go through all MECSR init sections to find ME configs. */
|
|
for (sec_idx = 0; sec_idx < sec_cnt; sec_idx++)
|
|
{
|
|
Elf_Internal_Shdr *sec;
|
|
int sec_order;
|
|
|
|
sec = elf_elfsections (dinfo->section->owner)[sec_idx];
|
|
sec_order = (int) SHI_NFP_IREG_ORDER (sec->sh_info);
|
|
|
|
is_for_text = (sec->sh_flags & (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
|
|
|
|
/* If we have an init2 section, that is the one that applies to the
|
|
ME when executing init code. So we make it's order higher than
|
|
any plain init section. */
|
|
if (sec->sh_flags & SHF_NFP_INIT2)
|
|
sec_order += SHI_NFP_IREG_ORDER (~0U) + 1;
|
|
|
|
if (sec->sh_type != SHT_NFP_INITREG)
|
|
continue;
|
|
if (!SHI_NFP_6000_IS_IREG_MECSR (sec->sh_info))
|
|
continue;
|
|
|
|
isl = SHI_NFP_IREG_ISLAND (sec->sh_info);
|
|
if ((sec_order < mecfg_orders[isl][is_for_text]))
|
|
/* Lower order or transient, skip it. */
|
|
continue;
|
|
|
|
mecfg_orders[isl][is_for_text] = sec_order;
|
|
|
|
if (!init_nfp6000_mecsr_sec (priv, sec, is_for_text, dinfo))
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream,
|
|
_("Error processing section %u "), sec_idx);
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
static int
|
|
parse_disassembler_options (nfp_opts * opts, struct disassemble_info *dinfo)
|
|
{
|
|
const char *option;
|
|
|
|
if (dinfo->disassembler_options == NULL)
|
|
return 0;
|
|
|
|
FOR_EACH_DISASSEMBLER_OPTION (option, dinfo->disassembler_options)
|
|
{
|
|
if (disassembler_options_cmp (option, "no-pc") == 0)
|
|
opts->show_pc = 0;
|
|
else if (disassembler_options_cmp (option, "ctx4") == 0)
|
|
{
|
|
if (!opts->ctx_mode)
|
|
opts->ctx_mode = 4;
|
|
}
|
|
else if (disassembler_options_cmp (option, "ctx8") == 0)
|
|
opts->ctx_mode = 8;
|
|
else
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, _("Invalid NFP option: %s"), option);
|
|
return _NFP_ERR_STOP;
|
|
}
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/* Called on first disassembly attempt so that dinfo->section is valid
|
|
so that we can get the bfd owner to find ME configs. */
|
|
|
|
static nfp_priv_data *
|
|
init_nfp_priv (struct disassemble_info *dinfo)
|
|
{
|
|
nfp_priv_data *priv;
|
|
int ret = false;
|
|
|
|
if (dinfo->private_data)
|
|
return (nfp_priv_data *) dinfo->private_data;
|
|
|
|
#if 0 /* Right now only section-related info is kept in priv.
|
|
So don't even calloc it if we don't need it. */
|
|
if (!dinfo->section)
|
|
return NULL;
|
|
#endif
|
|
|
|
/* Alloc with no free, seems to be either this or a static global variable
|
|
and this at least keeps a large struct unallocated until really needed. */
|
|
priv = calloc (1, sizeof (*priv));
|
|
if (!priv)
|
|
return NULL;
|
|
|
|
switch (dinfo->mach)
|
|
{
|
|
case E_NFP_MACH_3200:
|
|
ret = init_nfp3200_priv (priv, dinfo);
|
|
break;
|
|
case E_NFP_MACH_6000:
|
|
ret = init_nfp6000_priv (priv, dinfo);
|
|
break;
|
|
}
|
|
|
|
if (!ret)
|
|
{
|
|
free (priv);
|
|
return NULL;
|
|
}
|
|
|
|
dinfo->private_data = priv;
|
|
return priv;
|
|
}
|
|
|
|
static int
|
|
_print_instrs (bfd_vma addr, struct disassemble_info *dinfo, nfp_opts * opts)
|
|
{
|
|
nfp_priv_data *priv = init_nfp_priv (dinfo);
|
|
bfd_byte buffer[8];
|
|
int err;
|
|
uint64_t instr = 0;
|
|
size_t island, menum;
|
|
int num_ctx, scs_cnt, addr_3rdparty32, pc, tmpi, tmpj;
|
|
int is_text = 1;
|
|
|
|
err = dinfo->read_memory_func (addr, buffer, 8, dinfo);
|
|
if (err)
|
|
return _NFP_ERR_STOP;
|
|
|
|
if (!dinfo->section)
|
|
{
|
|
num_ctx = 8;
|
|
scs_cnt = 0;
|
|
addr_3rdparty32 = 0;
|
|
}
|
|
else
|
|
{
|
|
unsigned int sh_info = 0;
|
|
nfp_priv_mecfg *mecfg;
|
|
|
|
/* We have a section, presumably all ELF sections. Try to find
|
|
proper ME configs to produce better disassembly. */
|
|
if (!priv)
|
|
return _NFP_ERR_STOP; /* Sanity check */
|
|
|
|
is_text = (elf_section_flags (dinfo->section)
|
|
& (SHF_NFP_INIT | SHF_NFP_INIT2)) == 0;
|
|
|
|
sh_info = elf_section_info (dinfo->section);
|
|
|
|
switch (dinfo->mach)
|
|
{
|
|
case E_NFP_MACH_3200:
|
|
island = SHI_NFP_3200_ISLAND (sh_info);
|
|
menum = SHI_NFP_3200_MENUM (sh_info);
|
|
break;
|
|
default:
|
|
island = SHI_NFP_ISLAND (sh_info);
|
|
menum = SHI_NFP_MENUM (sh_info);
|
|
break;
|
|
}
|
|
|
|
if (island >= _NFP_ISLAND_MAX || menum >= _NFP_ME_MAX)
|
|
{
|
|
dinfo->fprintf_func (dinfo->stream, "Invalid island or me.");
|
|
return _NFP_ERR_STOP;
|
|
}
|
|
|
|
mecfg = &priv->mecfgs[island][menum][is_text];
|
|
num_ctx = (mecfg->ctx4_mode) ? 4 : 8;
|
|
addr_3rdparty32 = mecfg->addr_3rdparty32;
|
|
scs_cnt = mecfg->scs_cnt;
|
|
}
|
|
|
|
if (opts->ctx_mode)
|
|
num_ctx = opts->ctx_mode;
|
|
|
|
dinfo->bytes_per_line = 8;
|
|
dinfo->bytes_per_chunk = 8;
|
|
|
|
instr = bfd_getl64 (buffer);
|
|
|
|
if (opts->show_pc)
|
|
{
|
|
pc = (int) (addr >> 3);
|
|
|
|
/* Guess max PC for formatting */
|
|
tmpj = (int) (dinfo->buffer_length >> 3);
|
|
if (scs_cnt == 1)
|
|
{
|
|
pc *= 2;
|
|
tmpj *= 2;
|
|
if (! !(menum & 1))
|
|
{
|
|
pc++;
|
|
tmpj++;
|
|
}
|
|
}
|
|
|
|
for (tmpi = 1; tmpj > 9; tmpj /= 10)
|
|
tmpi++;
|
|
|
|
tmpj = pc;
|
|
for (; tmpj > 9; tmpj /= 10)
|
|
tmpi--;
|
|
|
|
dinfo->fprintf_func (dinfo->stream, "%*c%d ", tmpi, '.', pc);
|
|
}
|
|
|
|
switch (dinfo->mach)
|
|
{
|
|
case E_NFP_MACH_3200:
|
|
if (NFP_ME27_INSTR_IS_CMD (instr))
|
|
err = nfp_me27_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_ALU_SHF (instr))
|
|
err = nfp_me27_print_alu_shf (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_ALU (instr))
|
|
err = nfp_me27_print_alu (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_IMMED (instr))
|
|
err = nfp_me27_print_immed (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_LD_FIELD (instr))
|
|
err = nfp_me27_print_ld_field (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_CTX_ARB (instr))
|
|
err = nfp_me27_print_ctx_arb (instr, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_LOCAL_CSR (instr))
|
|
err = nfp_me27_print_local_csr (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_BRANCH (instr))
|
|
err = nfp_me27_print_branch (instr, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_BR_BYTE (instr))
|
|
err = nfp_me27_print_br_byte (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_BR_BIT (instr))
|
|
err = nfp_me27_print_br_bit (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_BR_ALU (instr))
|
|
err = nfp_me27_print_br_alu (instr, num_ctx, dinfo);
|
|
else if (NFP_ME27_INSTR_IS_MULT (instr))
|
|
err = nfp_me27_print_mult (instr, num_ctx, dinfo);
|
|
else
|
|
err = nfp_me_print_invalid (instr, dinfo);
|
|
break;
|
|
|
|
case E_NFP_MACH_6000:
|
|
if (NFP_ME28_INSTR_IS_CMD (instr))
|
|
err = nfp_me28_print_cmd (instr, addr_3rdparty32, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_ALU_SHF (instr))
|
|
err = nfp_me28_print_alu_shf (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_ALU (instr))
|
|
err = nfp_me28_print_alu (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_IMMED (instr))
|
|
err = nfp_me28_print_immed (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_LD_FIELD (instr))
|
|
err = nfp_me28_print_ld_field (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_CTX_ARB (instr))
|
|
err = nfp_me28_print_ctx_arb (instr, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_LOCAL_CSR (instr))
|
|
err = nfp_me28_print_local_csr (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_BRANCH (instr))
|
|
err = nfp_me28_print_branch (instr, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_BR_BYTE (instr))
|
|
err = nfp_me28_print_br_byte (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_BR_BIT (instr))
|
|
err = nfp_me28_print_br_bit (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_BR_ALU (instr))
|
|
err = nfp_me28_print_br_alu (instr, num_ctx, dinfo);
|
|
else if (NFP_ME28_INSTR_IS_MULT (instr))
|
|
err = nfp_me28_print_mult (instr, num_ctx, dinfo);
|
|
else
|
|
err = nfp_me_print_invalid (instr, dinfo);
|
|
break;
|
|
}
|
|
|
|
if (err < 0)
|
|
return err;
|
|
return 8;
|
|
}
|
|
|
|
int
|
|
print_insn_nfp (bfd_vma addr, struct disassemble_info *dinfo)
|
|
{
|
|
nfp_opts opts;
|
|
int err;
|
|
|
|
opts.show_pc = 1;
|
|
opts.ctx_mode = 0;
|
|
err = parse_disassembler_options (&opts, dinfo);
|
|
if (err < 0)
|
|
goto end;
|
|
|
|
err = _print_instrs (addr, dinfo, &opts);
|
|
|
|
end:
|
|
if (err != 8)
|
|
dinfo->fprintf_func (dinfo->stream, "\t # ERROR");
|
|
if (err == _NFP_ERR_CONT)
|
|
return 8;
|
|
return err;
|
|
}
|
|
|
|
void
|
|
print_nfp_disassembler_options (FILE * stream)
|
|
{
|
|
fprintf (stream, _("\n\
|
|
The following NFP specific disassembler options are supported for use\n\
|
|
with the -M switch (multiple options should be separated by commas):\n"));
|
|
|
|
fprintf (stream, _("\n\
|
|
no-pc Don't print program counter prefix.\n\
|
|
ctx4 Force disassembly using 4-context mode.\n\
|
|
ctx8 Force 8-context mode, takes precedence."));
|
|
|
|
fprintf (stream, _("\n"));
|
|
}
|