Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

powerpc/xmon: Remove SPU debug and disassembly

Now that the IBM Cell Blade support is removed, the xmon SPU support is
effectively unusable. That is because PS3 doesn't implement udbg_getc
which is required to send input to xmon.

So remove the xmon SPU support.

Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Link: https://patch.msgid.link/20241218105523.416573-6-mpe@ellerman.id.au

authored by

Michael Ellerman and committed by
Madhavan Srinivasan
41cc49ef 11923e0d

+1 -1066
-2
arch/powerpc/include/asm/xmon.h
··· 12 12 13 13 #ifdef CONFIG_XMON 14 14 extern void xmon_setup(void); 15 - void __init xmon_register_spus(struct list_head *list); 16 15 struct pt_regs; 17 16 extern int xmon(struct pt_regs *excp); 18 17 extern irqreturn_t xmon_irq(int, void *); 19 18 #else 20 19 static inline void xmon_setup(void) { } 21 - static inline void xmon_register_spus(struct list_head *list) { } 22 20 #endif 23 21 24 22 #if defined(CONFIG_XMON) && defined(CONFIG_SMP)
-2
arch/powerpc/platforms/cell/spu_base.c
··· 23 23 #include <asm/spu.h> 24 24 #include <asm/spu_priv1.h> 25 25 #include <asm/spu_csa.h> 26 - #include <asm/xmon.h> 27 26 #include <asm/kexec.h> 28 27 29 28 const struct spu_management_ops *spu_management_ops; ··· 771 772 fb_append_extra_logo(&logo_spe_clut224, ret); 772 773 773 774 mutex_lock(&spu_full_list_mutex); 774 - xmon_register_spus(&spu_full_list); 775 775 crash_register_spus(&spu_full_list); 776 776 mutex_unlock(&spu_full_list_mutex); 777 777 spu_add_dev_attr(&dev_attr_stat);
+1 -4
arch/powerpc/xmon/Makefile
··· 16 16 17 17 obj-y += xmon.o nonstdio.o spr_access.o xmon_bpts.o 18 18 19 - ifdef CONFIG_XMON_DISASSEMBLY 20 - obj-y += ppc-dis.o ppc-opc.o 21 - obj-$(CONFIG_SPU_BASE) += spu-dis.o spu-opc.o 22 - endif 19 + obj-$(CONFIG_XMON_DISASSEMBLY) += ppc-dis.o ppc-opc.o
-237
arch/powerpc/xmon/spu-dis.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* Disassemble SPU instructions 3 - 4 - Copyright 2006 Free Software Foundation, Inc. 5 - 6 - This file is part of GDB, GAS, and the GNU binutils. 7 - 8 - */ 9 - 10 - #include <linux/string.h> 11 - #include "nonstdio.h" 12 - #include "ansidecl.h" 13 - #include "spu.h" 14 - #include "dis-asm.h" 15 - 16 - /* This file provides a disassembler function which uses 17 - the disassembler interface defined in dis-asm.h. */ 18 - 19 - extern const struct spu_opcode spu_opcodes[]; 20 - extern const int spu_num_opcodes; 21 - 22 - #define SPU_DISASM_TBL_SIZE (1 << 11) 23 - static const struct spu_opcode *spu_disassemble_table[SPU_DISASM_TBL_SIZE]; 24 - 25 - static void 26 - init_spu_disassemble (void) 27 - { 28 - int i; 29 - 30 - /* If two instructions have the same opcode then we prefer the first 31 - * one. In most cases it is just an alternate mnemonic. */ 32 - for (i = 0; i < spu_num_opcodes; i++) 33 - { 34 - int o = spu_opcodes[i].opcode; 35 - if (o >= SPU_DISASM_TBL_SIZE) 36 - continue; /* abort (); */ 37 - if (spu_disassemble_table[o] == 0) 38 - spu_disassemble_table[o] = &spu_opcodes[i]; 39 - } 40 - } 41 - 42 - /* Determine the instruction from the 10 least significant bits. */ 43 - static const struct spu_opcode * 44 - get_index_for_opcode (unsigned int insn) 45 - { 46 - const struct spu_opcode *index; 47 - unsigned int opcode = insn >> (32-11); 48 - 49 - /* Init the table. This assumes that element 0/opcode 0 (currently 50 - * NOP) is always used */ 51 - if (spu_disassemble_table[0] == 0) 52 - init_spu_disassemble (); 53 - 54 - if ((index = spu_disassemble_table[opcode & 0x780]) != 0 55 - && index->insn_type == RRR) 56 - return index; 57 - 58 - if ((index = spu_disassemble_table[opcode & 0x7f0]) != 0 59 - && (index->insn_type == RI18 || index->insn_type == LBT)) 60 - return index; 61 - 62 - if ((index = spu_disassemble_table[opcode & 0x7f8]) != 0 63 - && index->insn_type == RI10) 64 - return index; 65 - 66 - if ((index = spu_disassemble_table[opcode & 0x7fc]) != 0 67 - && (index->insn_type == RI16)) 68 - return index; 69 - 70 - if ((index = spu_disassemble_table[opcode & 0x7fe]) != 0 71 - && (index->insn_type == RI8)) 72 - return index; 73 - 74 - if ((index = spu_disassemble_table[opcode & 0x7ff]) != 0) 75 - return index; 76 - 77 - return NULL; 78 - } 79 - 80 - /* Print a Spu instruction. */ 81 - 82 - int 83 - print_insn_spu (unsigned long insn, unsigned long memaddr) 84 - { 85 - int value; 86 - int hex_value; 87 - const struct spu_opcode *index; 88 - enum spu_insns tag; 89 - 90 - index = get_index_for_opcode (insn); 91 - 92 - if (index == 0) 93 - { 94 - printf(".long 0x%lx", insn); 95 - } 96 - else 97 - { 98 - int i; 99 - int paren = 0; 100 - tag = (enum spu_insns)(index - spu_opcodes); 101 - printf("%s", index->mnemonic); 102 - if (tag == M_BI || tag == M_BISL || tag == M_IRET || tag == M_BISLED 103 - || tag == M_BIHNZ || tag == M_BIHZ || tag == M_BINZ || tag == M_BIZ 104 - || tag == M_SYNC || tag == M_HBR) 105 - { 106 - int fb = (insn >> (32-18)) & 0x7f; 107 - if (fb & 0x40) 108 - printf(tag == M_SYNC ? "c" : "p"); 109 - if (fb & 0x20) 110 - printf("d"); 111 - if (fb & 0x10) 112 - printf("e"); 113 - } 114 - if (index->arg[0] != 0) 115 - printf("\t"); 116 - hex_value = 0; 117 - for (i = 1; i <= index->arg[0]; i++) 118 - { 119 - int arg = index->arg[i]; 120 - if (arg != A_P && !paren && i > 1) 121 - printf(","); 122 - 123 - switch (arg) 124 - { 125 - case A_T: 126 - printf("$%lu", 127 - DECODE_INSN_RT (insn)); 128 - break; 129 - case A_A: 130 - printf("$%lu", 131 - DECODE_INSN_RA (insn)); 132 - break; 133 - case A_B: 134 - printf("$%lu", 135 - DECODE_INSN_RB (insn)); 136 - break; 137 - case A_C: 138 - printf("$%lu", 139 - DECODE_INSN_RC (insn)); 140 - break; 141 - case A_S: 142 - printf("$sp%lu", 143 - DECODE_INSN_RA (insn)); 144 - break; 145 - case A_H: 146 - printf("$ch%lu", 147 - DECODE_INSN_RA (insn)); 148 - break; 149 - case A_P: 150 - paren++; 151 - printf("("); 152 - break; 153 - case A_U7A: 154 - printf("%lu", 155 - 173 - DECODE_INSN_U8 (insn)); 156 - break; 157 - case A_U7B: 158 - printf("%lu", 159 - 155 - DECODE_INSN_U8 (insn)); 160 - break; 161 - case A_S3: 162 - case A_S6: 163 - case A_S7: 164 - case A_S7N: 165 - case A_U3: 166 - case A_U5: 167 - case A_U6: 168 - case A_U7: 169 - hex_value = DECODE_INSN_I7 (insn); 170 - printf("%d", hex_value); 171 - break; 172 - case A_S11: 173 - print_address(memaddr + DECODE_INSN_I9a (insn) * 4); 174 - break; 175 - case A_S11I: 176 - print_address(memaddr + DECODE_INSN_I9b (insn) * 4); 177 - break; 178 - case A_S10: 179 - case A_S10B: 180 - hex_value = DECODE_INSN_I10 (insn); 181 - printf("%d", hex_value); 182 - break; 183 - case A_S14: 184 - hex_value = DECODE_INSN_I10 (insn) * 16; 185 - printf("%d", hex_value); 186 - break; 187 - case A_S16: 188 - hex_value = DECODE_INSN_I16 (insn); 189 - printf("%d", hex_value); 190 - break; 191 - case A_X16: 192 - hex_value = DECODE_INSN_U16 (insn); 193 - printf("%u", hex_value); 194 - break; 195 - case A_R18: 196 - value = DECODE_INSN_I16 (insn) * 4; 197 - if (value == 0) 198 - printf("%d", value); 199 - else 200 - { 201 - hex_value = memaddr + value; 202 - print_address(hex_value & 0x3ffff); 203 - } 204 - break; 205 - case A_S18: 206 - value = DECODE_INSN_U16 (insn) * 4; 207 - if (value == 0) 208 - printf("%d", value); 209 - else 210 - print_address(value); 211 - break; 212 - case A_U18: 213 - value = DECODE_INSN_U18 (insn); 214 - if (value == 0 || 1) 215 - { 216 - hex_value = value; 217 - printf("%u", value); 218 - } 219 - else 220 - print_address(value); 221 - break; 222 - case A_U14: 223 - hex_value = DECODE_INSN_U14 (insn); 224 - printf("%u", hex_value); 225 - break; 226 - } 227 - if (arg != A_P && paren) 228 - { 229 - printf(")"); 230 - paren--; 231 - } 232 - } 233 - if (hex_value > 16) 234 - printf("\t# %x", hex_value); 235 - } 236 - return 4; 237 - }
-399
arch/powerpc/xmon/spu-insns.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* SPU ELF support for BFD. 3 - 4 - Copyright 2006 Free Software Foundation, Inc. 5 - 6 - This file is part of BFD, the Binary File Descriptor library. 7 - 8 - */ 9 - 10 - /* SPU Opcode Table 11 - 12 - -=-=-= FORMAT =-=-=- 13 - 14 - +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ 15 - RRR | op | RC | RB | RA | RT | RI7 | op | I7 | RA | RT | 16 - +----+-------+-------+-------+-------+ +------------+-------+-------+-------+ 17 - 0 3 1 1 2 3 0 1 1 2 3 18 - 0 7 4 1 0 7 4 1 19 - 20 - +-----------+--------+-------+-------+ +---------+----------+-------+-------+ 21 - RI8 | op | I8 | RA | RT | RI10 | op | I10 | RA | RT | 22 - +-----------+--------+-------+-------+ +---------+----------+-------+-------+ 23 - 0 9 1 2 3 0 7 1 2 3 24 - 7 4 1 7 4 1 25 - 26 - +----------+-----------------+-------+ +--------+-------------------+-------+ 27 - RI16 | op | I16 | RT | RI18 | op | I18 | RT | 28 - +----------+-----------------+-------+ +--------+-------------------+-------+ 29 - 0 8 2 3 0 6 2 3 30 - 4 1 4 1 31 - 32 - +------------+-------+-------+-------+ +-------+--+-----------------+-------+ 33 - RR | op | RB | RA | RT | LBT | op |RO| I16 | RO | 34 - +------------+-------+-------+-------+ +-------+--+-----------------+-------+ 35 - 0 1 1 2 3 0 6 8 2 3 36 - 0 7 4 1 4 1 37 - 38 - +------------+----+--+-------+-------+ 39 - LBTI | op | // |RO| RA | RO | 40 - +------------+----+--+-------+-------+ 41 - 0 1 1 1 2 3 42 - 0 5 7 4 1 43 - 44 - -=-=-= OPCODE =-=-=- 45 - 46 - OPCODE field specifies the most significant 11bit of the instruction. Some formats don't have 11bits for opcode field, and in this 47 - case, bit field other than op are defined as 0s. For example, opcode of fma instruction which is RRR format is defined as 0x700, 48 - since 0x700 -> 11'b11100000000, this means opcode is 4'b1110, and other 7bits are defined as 7'b0000000. 49 - 50 - -=-=-= ASM_FORMAT =-=-=- 51 - 52 - RRR category RI7 category 53 - ASM_RRR mnemonic RC, RA, RB, RT ASM_RI4 mnemonic RT, RA, I4 54 - ASM_RI7 mnemonic RT, RA, I7 55 - 56 - RI8 category RI10 category 57 - ASM_RUI8 mnemonic RT, RA, UI8 ASM_AI10 mnemonic RA, I10 58 - ASM_RI10 mnemonic RT, RA, R10 59 - ASM_RI10IDX mnemonic RT, I10(RA) 60 - 61 - RI16 category RI18 category 62 - ASM_I16W mnemonic I16W ASM_RI18 mnemonic RT, I18 63 - ASM_RI16 mnemonic RT, I16 64 - ASM_RI16W mnemonic RT, I16W 65 - 66 - RR category LBT category 67 - ASM_MFSPR mnemonic RT, SA ASM_LBT mnemonic brinst, brtarg 68 - ASM_MTSPR mnemonic SA, RT 69 - ASM_NOOP mnemonic LBTI category 70 - ASM_RA mnemonic RA ASM_LBTI mnemonic brinst, RA 71 - ASM_RAB mnemonic RA, RB 72 - ASM_RDCH mnemonic RT, CA 73 - ASM_RR mnemonic RT, RA, RB 74 - ASM_RT mnemonic RT 75 - ASM_RTA mnemonic RT, RA 76 - ASM_WRCH mnemonic CA, RT 77 - 78 - Note that RRR instructions have the names for RC and RT reversed from 79 - what's in the ISA, in order to put RT in the same position it appears 80 - for other formats. 81 - 82 - -=-=-= DEPENDENCY =-=-=- 83 - 84 - DEPENDENCY filed consists of 5 digits. This represents which register is used as source and which register is used as target. 85 - The first(most significant) digit is always 0. Then it is followd by RC, RB, RA and RT digits. 86 - If the digit is 0, this means the corresponding register is not used in the instruction. 87 - If the digit is 1, this means the corresponding register is used as a source in the instruction. 88 - If the digit is 2, this means the corresponding register is used as a target in the instruction. 89 - If the digit is 3, this means the corresponding register is used as both source and target in the instruction. 90 - For example, fms instruction has 00113 as the DEPENDENCY field. This means RC is not used in this operation, RB and RA are 91 - used as sources and RT is the target. 92 - 93 - -=-=-= PIPE =-=-=- 94 - 95 - This field shows which execution pipe is used for the instruction 96 - 97 - pipe0 execution pipelines: 98 - FP6 SP floating pipeline 99 - FP7 integer operations executed in SP floating pipeline 100 - FPD DP floating pipeline 101 - FX2 FXU pipeline 102 - FX3 Rotate/Shift pipeline 103 - FXB Byte pipeline 104 - NOP No pipeline 105 - 106 - pipe1 execution pipelines: 107 - BR Branch pipeline 108 - LNOP No pipeline 109 - LS Load/Store pipeline 110 - SHUF Shuffle pipeline 111 - SPR SPR/CH pipeline 112 - 113 - */ 114 - 115 - #define _A0() {0} 116 - #define _A1(a) {1,a} 117 - #define _A2(a,b) {2,a,b} 118 - #define _A3(a,b,c) {3,a,b,c} 119 - #define _A4(a,b,c,d) {4,a,b,c,d} 120 - 121 - /* TAG FORMAT OPCODE MNEMONIC ASM_FORMAT DEPENDENCY PIPE COMMENT */ 122 - /* 0[RC][RB][RA][RT] */ 123 - /* 1:src, 2:target */ 124 - 125 - APUOP(M_BR, RI16, 0x190, "br", _A1(A_R18), 00000, BR) /* BRel IP<-IP+I16 */ 126 - APUOP(M_BRSL, RI16, 0x198, "brsl", _A2(A_T,A_R18), 00002, BR) /* BRelSetLink RT,IP<-IP,IP+I16 */ 127 - APUOP(M_BRA, RI16, 0x180, "bra", _A1(A_S18), 00000, BR) /* BRAbs IP<-I16 */ 128 - APUOP(M_BRASL, RI16, 0x188, "brasl", _A2(A_T,A_S18), 00002, BR) /* BRAbsSetLink RT,IP<-IP,I16 */ 129 - APUOP(M_FSMBI, RI16, 0x194, "fsmbi", _A2(A_T,A_X16), 00002, SHUF) /* FormSelMask%I RT<-fsm(I16) */ 130 - APUOP(M_LQA, RI16, 0x184, "lqa", _A2(A_T,A_S18), 00002, LS) /* LoadQAbs RT<-M[I16] */ 131 - APUOP(M_LQR, RI16, 0x19C, "lqr", _A2(A_T,A_R18), 00002, LS) /* LoadQRel RT<-M[IP+I16] */ 132 - APUOP(M_STOP, RR, 0x000, "stop", _A0(), 00000, BR) /* STOP stop */ 133 - APUOP(M_STOP2, RR, 0x000, "stop", _A1(A_U14), 00000, BR) /* STOP stop */ 134 - APUOP(M_STOPD, RR, 0x140, "stopd", _A3(A_T,A_A,A_B), 00111, BR) /* STOPD stop (with register dependencies) */ 135 - APUOP(M_LNOP, RR, 0x001, "lnop", _A0(), 00000, LNOP) /* LNOP no_operation */ 136 - APUOP(M_SYNC, RR, 0x002, "sync", _A0(), 00000, BR) /* SYNC flush_pipe */ 137 - APUOP(M_DSYNC, RR, 0x003, "dsync", _A0(), 00000, BR) /* DSYNC flush_store_queue */ 138 - APUOP(M_MFSPR, RR, 0x00c, "mfspr", _A2(A_T,A_S), 00002, SPR) /* MFSPR RT<-SA */ 139 - APUOP(M_RDCH, RR, 0x00d, "rdch", _A2(A_T,A_H), 00002, SPR) /* ReaDCHannel RT<-CA:data */ 140 - APUOP(M_RCHCNT, RR, 0x00f, "rchcnt", _A2(A_T,A_H), 00002, SPR) /* ReaDCHanCouNT RT<-CA:count */ 141 - APUOP(M_HBRA, LBT, 0x080, "hbra", _A2(A_S11,A_S18), 00000, LS) /* HBRA BTB[B9]<-M[I16] */ 142 - APUOP(M_HBRR, LBT, 0x090, "hbrr", _A2(A_S11,A_R18), 00000, LS) /* HBRR BTB[B9]<-M[IP+I16] */ 143 - APUOP(M_BRZ, RI16, 0x100, "brz", _A2(A_T,A_R18), 00001, BR) /* BRZ IP<-IP+I16_if(RT) */ 144 - APUOP(M_BRNZ, RI16, 0x108, "brnz", _A2(A_T,A_R18), 00001, BR) /* BRNZ IP<-IP+I16_if(RT) */ 145 - APUOP(M_BRHZ, RI16, 0x110, "brhz", _A2(A_T,A_R18), 00001, BR) /* BRHZ IP<-IP+I16_if(RT) */ 146 - APUOP(M_BRHNZ, RI16, 0x118, "brhnz", _A2(A_T,A_R18), 00001, BR) /* BRHNZ IP<-IP+I16_if(RT) */ 147 - APUOP(M_STQA, RI16, 0x104, "stqa", _A2(A_T,A_S18), 00001, LS) /* SToreQAbs M[I16]<-RT */ 148 - APUOP(M_STQR, RI16, 0x11C, "stqr", _A2(A_T,A_R18), 00001, LS) /* SToreQRel M[IP+I16]<-RT */ 149 - APUOP(M_MTSPR, RR, 0x10c, "mtspr", _A2(A_S,A_T), 00001, SPR) /* MTSPR SA<-RT */ 150 - APUOP(M_WRCH, RR, 0x10d, "wrch", _A2(A_H,A_T), 00001, SPR) /* ChanWRite CA<-RT */ 151 - APUOP(M_LQD, RI10, 0x1a0, "lqd", _A4(A_T,A_S14,A_P,A_A), 00012, LS) /* LoadQDisp RT<-M[Ra+I10] */ 152 - APUOP(M_BI, RR, 0x1a8, "bi", _A1(A_A), 00010, BR) /* BI IP<-RA */ 153 - APUOP(M_BISL, RR, 0x1a9, "bisl", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ 154 - APUOP(M_IRET, RR, 0x1aa, "iret", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ 155 - APUOP(M_IRET2, RR, 0x1aa, "iret", _A0(), 00010, BR) /* IRET IP<-SRR0 */ 156 - APUOP(M_BISLED, RR, 0x1ab, "bisled", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ 157 - APUOP(M_HBR, LBTI, 0x1ac, "hbr", _A2(A_S11I,A_A), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ 158 - APUOP(M_FREST, RR, 0x1b8, "frest", _A2(A_T,A_A), 00012, SHUF) /* FREST RT<-recip(RA) */ 159 - APUOP(M_FRSQEST, RR, 0x1b9, "frsqest", _A2(A_T,A_A), 00012, SHUF) /* FRSQEST RT<-rsqrt(RA) */ 160 - APUOP(M_FSM, RR, 0x1b4, "fsm", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ 161 - APUOP(M_FSMH, RR, 0x1b5, "fsmh", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ 162 - APUOP(M_FSMB, RR, 0x1b6, "fsmb", _A2(A_T,A_A), 00012, SHUF) /* FormSelMask% RT<-expand(Ra) */ 163 - APUOP(M_GB, RR, 0x1b0, "gb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ 164 - APUOP(M_GBH, RR, 0x1b1, "gbh", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ 165 - APUOP(M_GBB, RR, 0x1b2, "gbb", _A2(A_T,A_A), 00012, SHUF) /* GatherBits% RT<-gather(RA) */ 166 - APUOP(M_CBD, RI7, 0x1f4, "cbd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ 167 - APUOP(M_CHD, RI7, 0x1f5, "chd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ 168 - APUOP(M_CWD, RI7, 0x1f6, "cwd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ 169 - APUOP(M_CDD, RI7, 0x1f7, "cdd", _A4(A_T,A_U7,A_P,A_A), 00012, SHUF) /* genCtl%%insD RT<-sta(Ra+I4,siz) */ 170 - APUOP(M_ROTQBII, RI7, 0x1f8, "rotqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* ROTQBII RT<-RA<<<I7 */ 171 - APUOP(M_ROTQBYI, RI7, 0x1fc, "rotqbyi", _A3(A_T,A_A,A_S7N), 00012, SHUF) /* ROTQBYI RT<-RA<<<(I7*8) */ 172 - APUOP(M_ROTQMBII, RI7, 0x1f9, "rotqmbii", _A3(A_T,A_A,A_S3), 00012, SHUF) /* ROTQMBII RT<-RA<<I7 */ 173 - APUOP(M_ROTQMBYI, RI7, 0x1fd, "rotqmbyi", _A3(A_T,A_A,A_S6), 00012, SHUF) /* ROTQMBYI RT<-RA<<I7 */ 174 - APUOP(M_SHLQBII, RI7, 0x1fb, "shlqbii", _A3(A_T,A_A,A_U3), 00012, SHUF) /* SHLQBII RT<-RA<<I7 */ 175 - APUOP(M_SHLQBYI, RI7, 0x1ff, "shlqbyi", _A3(A_T,A_A,A_U5), 00012, SHUF) /* SHLQBYI RT<-RA<<I7 */ 176 - APUOP(M_STQD, RI10, 0x120, "stqd", _A4(A_T,A_S14,A_P,A_A), 00011, LS) /* SToreQDisp M[Ra+I10]<-RT */ 177 - APUOP(M_BIHNZ, RR, 0x12b, "bihnz", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ 178 - APUOP(M_BIHZ, RR, 0x12a, "bihz", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 179 - APUOP(M_BINZ, RR, 0x129, "binz", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ 180 - APUOP(M_BIZ, RR, 0x128, "biz", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 181 - APUOP(M_CBX, RR, 0x1d4, "cbx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ 182 - APUOP(M_CHX, RR, 0x1d5, "chx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ 183 - APUOP(M_CWX, RR, 0x1d6, "cwx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ 184 - APUOP(M_CDX, RR, 0x1d7, "cdx", _A3(A_T,A_A,A_B), 00112, SHUF) /* genCtl%%insX RT<-sta(Ra+Rb,siz) */ 185 - APUOP(M_LQX, RR, 0x1c4, "lqx", _A3(A_T,A_A,A_B), 00112, LS) /* LoadQindeX RT<-M[Ra+Rb] */ 186 - APUOP(M_ROTQBI, RR, 0x1d8, "rotqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBI RT<-RA<<<Rb */ 187 - APUOP(M_ROTQMBI, RR, 0x1d9, "rotqmbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBI RT<-RA<<Rb */ 188 - APUOP(M_SHLQBI, RR, 0x1db, "shlqbi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBI RT<-RA<<Rb */ 189 - APUOP(M_ROTQBY, RR, 0x1dc, "rotqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBY RT<-RA<<<(Rb*8) */ 190 - APUOP(M_ROTQMBY, RR, 0x1dd, "rotqmby", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBY RT<-RA<<Rb */ 191 - APUOP(M_SHLQBY, RR, 0x1df, "shlqby", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBY RT<-RA<<Rb */ 192 - APUOP(M_ROTQBYBI, RR, 0x1cc, "rotqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQBYBI RT<-RA<<Rb */ 193 - APUOP(M_ROTQMBYBI, RR, 0x1cd, "rotqmbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* ROTQMBYBI RT<-RA<<Rb */ 194 - APUOP(M_SHLQBYBI, RR, 0x1cf, "shlqbybi", _A3(A_T,A_A,A_B), 00112, SHUF) /* SHLQBYBI RT<-RA<<Rb */ 195 - APUOP(M_STQX, RR, 0x144, "stqx", _A3(A_T,A_A,A_B), 00111, LS) /* SToreQindeX M[Ra+Rb]<-RT */ 196 - APUOP(M_SHUFB, RRR, 0x580, "shufb", _A4(A_C,A_A,A_B,A_T), 02111, SHUF) /* SHUFfleBytes RC<-f(RA,RB,RT) */ 197 - APUOP(M_IL, RI16, 0x204, "il", _A2(A_T,A_S16), 00002, FX2) /* ImmLoad RT<-sxt(I16) */ 198 - APUOP(M_ILH, RI16, 0x20c, "ilh", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadH RT<-I16 */ 199 - APUOP(M_ILHU, RI16, 0x208, "ilhu", _A2(A_T,A_X16), 00002, FX2) /* ImmLoadHUpper RT<-I16<<16 */ 200 - APUOP(M_ILA, RI18, 0x210, "ila", _A2(A_T,A_U18), 00002, FX2) /* ImmLoadAddr RT<-zxt(I18) */ 201 - APUOP(M_NOP, RR, 0x201, "nop", _A1(A_T), 00000, NOP) /* XNOP no_operation */ 202 - APUOP(M_NOP2, RR, 0x201, "nop", _A0(), 00000, NOP) /* XNOP no_operation */ 203 - APUOP(M_IOHL, RI16, 0x304, "iohl", _A2(A_T,A_X16), 00003, FX2) /* AddImmeXt RT<-RT+sxt(I16) */ 204 - APUOP(M_ANDBI, RI10, 0x0b0, "andbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* AND%I RT<-RA&I10 */ 205 - APUOP(M_ANDHI, RI10, 0x0a8, "andhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ 206 - APUOP(M_ANDI, RI10, 0x0a0, "andi", _A3(A_T,A_A,A_S10), 00012, FX2) /* AND%I RT<-RA&I10 */ 207 - APUOP(M_ORBI, RI10, 0x030, "orbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* OR%I RT<-RA|I10 */ 208 - APUOP(M_ORHI, RI10, 0x028, "orhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ 209 - APUOP(M_ORI, RI10, 0x020, "ori", _A3(A_T,A_A,A_S10), 00012, FX2) /* OR%I RT<-RA|I10 */ 210 - APUOP(M_ORX, RR, 0x1f0, "orx", _A2(A_T,A_A), 00012, BR) /* ORX RT<-RA.w0|RA.w1|RA.w2|RA.w3 */ 211 - APUOP(M_XORBI, RI10, 0x230, "xorbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* XOR%I RT<-RA^I10 */ 212 - APUOP(M_XORHI, RI10, 0x228, "xorhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ 213 - APUOP(M_XORI, RI10, 0x220, "xori", _A3(A_T,A_A,A_S10), 00012, FX2) /* XOR%I RT<-RA^I10 */ 214 - APUOP(M_AHI, RI10, 0x0e8, "ahi", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ 215 - APUOP(M_AI, RI10, 0x0e0, "ai", _A3(A_T,A_A,A_S10), 00012, FX2) /* Add%Immed RT<-RA+I10 */ 216 - APUOP(M_SFHI, RI10, 0x068, "sfhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ 217 - APUOP(M_SFI, RI10, 0x060, "sfi", _A3(A_T,A_A,A_S10), 00012, FX2) /* SubFrom%Imm RT<-I10-RA */ 218 - APUOP(M_CGTBI, RI10, 0x270, "cgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CGT%I RT<-(RA>I10) */ 219 - APUOP(M_CGTHI, RI10, 0x268, "cgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ 220 - APUOP(M_CGTI, RI10, 0x260, "cgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CGT%I RT<-(RA>I10) */ 221 - APUOP(M_CLGTBI, RI10, 0x2f0, "clgtbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ 222 - APUOP(M_CLGTHI, RI10, 0x2e8, "clgthi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ 223 - APUOP(M_CLGTI, RI10, 0x2e0, "clgti", _A3(A_T,A_A,A_S10), 00012, FX2) /* CLGT%I RT<-(RA>I10) */ 224 - APUOP(M_CEQBI, RI10, 0x3f0, "ceqbi", _A3(A_T,A_A,A_S10B), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ 225 - APUOP(M_CEQHI, RI10, 0x3e8, "ceqhi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ 226 - APUOP(M_CEQI, RI10, 0x3e0, "ceqi", _A3(A_T,A_A,A_S10), 00012, FX2) /* CEQ%I RT<-(RA=I10) */ 227 - APUOP(M_HGTI, RI10, 0x278, "hgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ 228 - APUOP(M_HGTI2, RI10, 0x278, "hgti", _A2(A_A,A_S10), 00010, FX2) /* HaltGTI halt_if(RA>I10) */ 229 - APUOP(M_HLGTI, RI10, 0x2f8, "hlgti", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ 230 - APUOP(M_HLGTI2, RI10, 0x2f8, "hlgti", _A2(A_A,A_S10), 00010, FX2) /* HaltLGTI halt_if(RA>I10) */ 231 - APUOP(M_HEQI, RI10, 0x3f8, "heqi", _A3(A_T,A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ 232 - APUOP(M_HEQI2, RI10, 0x3f8, "heqi", _A2(A_A,A_S10), 00010, FX2) /* HaltEQImm halt_if(RA=I10) */ 233 - APUOP(M_MPYI, RI10, 0x3a0, "mpyi", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYI RT<-RA*I10 */ 234 - APUOP(M_MPYUI, RI10, 0x3a8, "mpyui", _A3(A_T,A_A,A_S10), 00012, FP7) /* MPYUI RT<-RA*I10 */ 235 - APUOP(M_CFLTS, RI8, 0x3b0, "cflts", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTS RT<-int(RA,I8) */ 236 - APUOP(M_CFLTU, RI8, 0x3b2, "cfltu", _A3(A_T,A_A,A_U7A), 00012, FP7) /* CFLTU RT<-int(RA,I8) */ 237 - APUOP(M_CSFLT, RI8, 0x3b4, "csflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CSFLT RT<-flt(RA,I8) */ 238 - APUOP(M_CUFLT, RI8, 0x3b6, "cuflt", _A3(A_T,A_A,A_U7B), 00012, FP7) /* CUFLT RT<-flt(RA,I8) */ 239 - APUOP(M_FESD, RR, 0x3b8, "fesd", _A2(A_T,A_A), 00012, FPD) /* FESD RT<-double(RA) */ 240 - APUOP(M_FRDS, RR, 0x3b9, "frds", _A2(A_T,A_A), 00012, FPD) /* FRDS RT<-single(RA) */ 241 - APUOP(M_FSCRRD, RR, 0x398, "fscrrd", _A1(A_T), 00002, FPD) /* FSCRRD RT<-FP_status */ 242 - APUOP(M_FSCRWR, RR, 0x3ba, "fscrwr", _A2(A_T,A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ 243 - APUOP(M_FSCRWR2, RR, 0x3ba, "fscrwr", _A1(A_A), 00010, FP7) /* FSCRWR FP_status<-RA */ 244 - APUOP(M_CLZ, RR, 0x2a5, "clz", _A2(A_T,A_A), 00012, FX2) /* CLZ RT<-clz(RA) */ 245 - APUOP(M_CNTB, RR, 0x2b4, "cntb", _A2(A_T,A_A), 00012, FXB) /* CNT RT<-pop(RA) */ 246 - APUOP(M_XSBH, RR, 0x2b6, "xsbh", _A2(A_T,A_A), 00012, FX2) /* eXtSignBtoH RT<-sign_ext(RA) */ 247 - APUOP(M_XSHW, RR, 0x2ae, "xshw", _A2(A_T,A_A), 00012, FX2) /* eXtSignHtoW RT<-sign_ext(RA) */ 248 - APUOP(M_XSWD, RR, 0x2a6, "xswd", _A2(A_T,A_A), 00012, FX2) /* eXtSignWtoD RT<-sign_ext(RA) */ 249 - APUOP(M_ROTI, RI7, 0x078, "roti", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ 250 - APUOP(M_ROTMI, RI7, 0x079, "rotmi", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ 251 - APUOP(M_ROTMAI, RI7, 0x07a, "rotmai", _A3(A_T,A_A,A_S7), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ 252 - APUOP(M_SHLI, RI7, 0x07b, "shli", _A3(A_T,A_A,A_U6), 00012, FX3) /* SHL%I RT<-RA<<I7 */ 253 - APUOP(M_ROTHI, RI7, 0x07c, "rothi", _A3(A_T,A_A,A_S7N), 00012, FX3) /* ROT%I RT<-RA<<<I7 */ 254 - APUOP(M_ROTHMI, RI7, 0x07d, "rothmi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROT%MI RT<-RA<<I7 */ 255 - APUOP(M_ROTMAHI, RI7, 0x07e, "rotmahi", _A3(A_T,A_A,A_S6), 00012, FX3) /* ROTMA%I RT<-RA<<I7 */ 256 - APUOP(M_SHLHI, RI7, 0x07f, "shlhi", _A3(A_T,A_A,A_U5), 00012, FX3) /* SHL%I RT<-RA<<I7 */ 257 - APUOP(M_A, RR, 0x0c0, "a", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ 258 - APUOP(M_AH, RR, 0x0c8, "ah", _A3(A_T,A_A,A_B), 00112, FX2) /* Add% RT<-RA+RB */ 259 - APUOP(M_SF, RR, 0x040, "sf", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ 260 - APUOP(M_SFH, RR, 0x048, "sfh", _A3(A_T,A_A,A_B), 00112, FX2) /* SubFrom% RT<-RB-RA */ 261 - APUOP(M_CGT, RR, 0x240, "cgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ 262 - APUOP(M_CGTB, RR, 0x250, "cgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ 263 - APUOP(M_CGTH, RR, 0x248, "cgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CGT% RT<-(RA>RB) */ 264 - APUOP(M_CLGT, RR, 0x2c0, "clgt", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ 265 - APUOP(M_CLGTB, RR, 0x2d0, "clgtb", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ 266 - APUOP(M_CLGTH, RR, 0x2c8, "clgth", _A3(A_T,A_A,A_B), 00112, FX2) /* CLGT% RT<-(RA>RB) */ 267 - APUOP(M_CEQ, RR, 0x3c0, "ceq", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ 268 - APUOP(M_CEQB, RR, 0x3d0, "ceqb", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ 269 - APUOP(M_CEQH, RR, 0x3c8, "ceqh", _A3(A_T,A_A,A_B), 00112, FX2) /* CEQ% RT<-(RA=RB) */ 270 - APUOP(M_HGT, RR, 0x258, "hgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ 271 - APUOP(M_HGT2, RR, 0x258, "hgt", _A2(A_A,A_B), 00110, FX2) /* HaltGT halt_if(RA>RB) */ 272 - APUOP(M_HLGT, RR, 0x2d8, "hlgt", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ 273 - APUOP(M_HLGT2, RR, 0x2d8, "hlgt", _A2(A_A,A_B), 00110, FX2) /* HaltLGT halt_if(RA>RB) */ 274 - APUOP(M_HEQ, RR, 0x3d8, "heq", _A3(A_T,A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ 275 - APUOP(M_HEQ2, RR, 0x3d8, "heq", _A2(A_A,A_B), 00110, FX2) /* HaltEQ halt_if(RA=RB) */ 276 - APUOP(M_FCEQ, RR, 0x3c2, "fceq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCEQ RT<-(RA=RB) */ 277 - APUOP(M_FCMEQ, RR, 0x3ca, "fcmeq", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMEQ RT<-(|RA|=|RB|) */ 278 - APUOP(M_FCGT, RR, 0x2c2, "fcgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCGT RT<-(RA<RB) */ 279 - APUOP(M_FCMGT, RR, 0x2ca, "fcmgt", _A3(A_T,A_A,A_B), 00112, FX2) /* FCMGT RT<-(|RA|<|RB|) */ 280 - APUOP(M_AND, RR, 0x0c1, "and", _A3(A_T,A_A,A_B), 00112, FX2) /* AND RT<-RA&RB */ 281 - APUOP(M_NAND, RR, 0x0c9, "nand", _A3(A_T,A_A,A_B), 00112, FX2) /* NAND RT<-!(RA&RB) */ 282 - APUOP(M_OR, RR, 0x041, "or", _A3(A_T,A_A,A_B), 00112, FX2) /* OR RT<-RA|RB */ 283 - APUOP(M_NOR, RR, 0x049, "nor", _A3(A_T,A_A,A_B), 00112, FX2) /* NOR RT<-!(RA&RB) */ 284 - APUOP(M_XOR, RR, 0x241, "xor", _A3(A_T,A_A,A_B), 00112, FX2) /* XOR RT<-RA^RB */ 285 - APUOP(M_EQV, RR, 0x249, "eqv", _A3(A_T,A_A,A_B), 00112, FX2) /* EQuiValent RT<-!(RA^RB) */ 286 - APUOP(M_ANDC, RR, 0x2c1, "andc", _A3(A_T,A_A,A_B), 00112, FX2) /* ANDComplement RT<-RA&!RB */ 287 - APUOP(M_ORC, RR, 0x2c9, "orc", _A3(A_T,A_A,A_B), 00112, FX2) /* ORComplement RT<-RA|!RB */ 288 - APUOP(M_ABSDB, RR, 0x053, "absdb", _A3(A_T,A_A,A_B), 00112, FXB) /* ABSoluteDiff RT<-|RA-RB| */ 289 - APUOP(M_AVGB, RR, 0x0d3, "avgb", _A3(A_T,A_A,A_B), 00112, FXB) /* AVG% RT<-(RA+RB+1)/2 */ 290 - APUOP(M_SUMB, RR, 0x253, "sumb", _A3(A_T,A_A,A_B), 00112, FXB) /* SUM% RT<-f(RA,RB) */ 291 - APUOP(M_DFA, RR, 0x2cc, "dfa", _A3(A_T,A_A,A_B), 00112, FPD) /* DFAdd RT<-RA+RB */ 292 - APUOP(M_DFM, RR, 0x2ce, "dfm", _A3(A_T,A_A,A_B), 00112, FPD) /* DFMul RT<-RA*RB */ 293 - APUOP(M_DFS, RR, 0x2cd, "dfs", _A3(A_T,A_A,A_B), 00112, FPD) /* DFSub RT<-RA-RB */ 294 - APUOP(M_FA, RR, 0x2c4, "fa", _A3(A_T,A_A,A_B), 00112, FP6) /* FAdd RT<-RA+RB */ 295 - APUOP(M_FM, RR, 0x2c6, "fm", _A3(A_T,A_A,A_B), 00112, FP6) /* FMul RT<-RA*RB */ 296 - APUOP(M_FS, RR, 0x2c5, "fs", _A3(A_T,A_A,A_B), 00112, FP6) /* FSub RT<-RA-RB */ 297 - APUOP(M_MPY, RR, 0x3c4, "mpy", _A3(A_T,A_A,A_B), 00112, FP7) /* MPY RT<-RA*RB */ 298 - APUOP(M_MPYH, RR, 0x3c5, "mpyh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYH RT<-(RAh*RB)<<16 */ 299 - APUOP(M_MPYHH, RR, 0x3c6, "mpyhh", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHH RT<-RAh*RBh */ 300 - APUOP(M_MPYHHU, RR, 0x3ce, "mpyhhu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYHHU RT<-RAh*RBh */ 301 - APUOP(M_MPYS, RR, 0x3c7, "mpys", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYS RT<-(RA*RB)>>16 */ 302 - APUOP(M_MPYU, RR, 0x3cc, "mpyu", _A3(A_T,A_A,A_B), 00112, FP7) /* MPYU RT<-RA*RB */ 303 - APUOP(M_FI, RR, 0x3d4, "fi", _A3(A_T,A_A,A_B), 00112, FP7) /* FInterpolate RT<-f(RA,RB) */ 304 - APUOP(M_ROT, RR, 0x058, "rot", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ 305 - APUOP(M_ROTM, RR, 0x059, "rotm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ 306 - APUOP(M_ROTMA, RR, 0x05a, "rotma", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ 307 - APUOP(M_SHL, RR, 0x05b, "shl", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ 308 - APUOP(M_ROTH, RR, 0x05c, "roth", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT% RT<-RA<<<RB */ 309 - APUOP(M_ROTHM, RR, 0x05d, "rothm", _A3(A_T,A_A,A_B), 00112, FX3) /* ROT%M RT<-RA<<Rb */ 310 - APUOP(M_ROTMAH, RR, 0x05e, "rotmah", _A3(A_T,A_A,A_B), 00112, FX3) /* ROTMA% RT<-RA<<Rb */ 311 - APUOP(M_SHLH, RR, 0x05f, "shlh", _A3(A_T,A_A,A_B), 00112, FX3) /* SHL% RT<-RA<<Rb */ 312 - APUOP(M_MPYHHA, RR, 0x346, "mpyhha", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHA RT<-RAh*RBh+RT */ 313 - APUOP(M_MPYHHAU, RR, 0x34e, "mpyhhau", _A3(A_T,A_A,A_B), 00113, FP7) /* MPYHHAU RT<-RAh*RBh+RT */ 314 - APUOP(M_DFMA, RR, 0x35c, "dfma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMAdd RT<-RT+RA*RB */ 315 - APUOP(M_DFMS, RR, 0x35d, "dfms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFMSub RT<-RA*RB-RT */ 316 - APUOP(M_DFNMS, RR, 0x35e, "dfnms", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMSub RT<-RT-RA*RB */ 317 - APUOP(M_DFNMA, RR, 0x35f, "dfnma", _A3(A_T,A_A,A_B), 00113, FPD) /* DFNMAdd RT<-(-RT)-RA*RB */ 318 - APUOP(M_FMA, RRR, 0x700, "fma", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMAdd RC<-RT+RA*RB */ 319 - APUOP(M_FMS, RRR, 0x780, "fms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FMSub RC<-RA*RB-RT */ 320 - APUOP(M_FNMS, RRR, 0x680, "fnms", _A4(A_C,A_A,A_B,A_T), 02111, FP6) /* FNMSub RC<-RT-RA*RB */ 321 - APUOP(M_MPYA, RRR, 0x600, "mpya", _A4(A_C,A_A,A_B,A_T), 02111, FP7) /* MPYA RC<-RA*RB+RT */ 322 - APUOP(M_SELB, RRR, 0x400, "selb", _A4(A_C,A_A,A_B,A_T), 02111, FX2) /* SELectBits RC<-RA&RT|RB&!RT */ 323 - /* for system function call, this uses op-code of mtspr */ 324 - APUOP(M_SYSCALL, RI7, 0x10c, "syscall", _A3(A_T,A_A,A_S7N), 00002, SPR) /* System Call */ 325 - /* 326 - pseudo instruction: 327 - system call 328 - value of I9 operation 329 - 0 halt 330 - 1 rt[0] = open(MEM[ra[0]], ra[1]) 331 - 2 rt[0] = close(ra[0]) 332 - 3 rt[0] = read(ra[0], MEM[ra[1]], ra[2]) 333 - 4 rt[0] = write(ra[0], MEM[ra[1]], ra[2]) 334 - 5 printf(MEM[ra[0]], ra[1], ra[2], ra[3]) 335 - 42 rt[0] = clock() 336 - 52 rt[0] = lseek(ra0, ra1, ra2) 337 - 338 - */ 339 - 340 - 341 - /* new multiprecision add/sub */ 342 - APUOP(M_ADDX, RR, 0x340, "addx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ 343 - APUOP(M_CG, RR, 0x0c2, "cg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ 344 - APUOP(M_CGX, RR, 0x342, "cgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ 345 - APUOP(M_SFX, RR, 0x341, "sfx", _A3(A_T,A_A,A_B), 00113, FX2) /* Add_eXtended RT<-RA+RB+RT */ 346 - APUOP(M_BG, RR, 0x042, "bg", _A3(A_T,A_A,A_B), 00112, FX2) /* CarryGenerate RT<-cout(RA+RB) */ 347 - APUOP(M_BGX, RR, 0x343, "bgx", _A3(A_T,A_A,A_B), 00113, FX2) /* CarryGen_eXtd RT<-cout(RA+RB+RT) */ 348 - 349 - /* 350 - 351 - The following ops are a subset of above except with feature bits set. 352 - Feature bits are bits 11-17 of the instruction: 353 - 354 - 11 - C & P feature bit 355 - 12 - disable interrupts 356 - 13 - enable interrupts 357 - 358 - */ 359 - APUOPFB(M_BID, RR, 0x1a8, 0x20, "bid", _A1(A_A), 00010, BR) /* BI IP<-RA */ 360 - APUOPFB(M_BIE, RR, 0x1a8, 0x10, "bie", _A1(A_A), 00010, BR) /* BI IP<-RA */ 361 - APUOPFB(M_BISLD, RR, 0x1a9, 0x20, "bisld", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ 362 - APUOPFB(M_BISLE, RR, 0x1a9, 0x10, "bisle", _A2(A_T,A_A), 00012, BR) /* BISL RT,IP<-IP,RA */ 363 - APUOPFB(M_IRETD, RR, 0x1aa, 0x20, "iretd", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ 364 - APUOPFB(M_IRETD2, RR, 0x1aa, 0x20, "iretd", _A0(), 00010, BR) /* IRET IP<-SRR0 */ 365 - APUOPFB(M_IRETE, RR, 0x1aa, 0x10, "irete", _A1(A_A), 00010, BR) /* IRET IP<-SRR0 */ 366 - APUOPFB(M_IRETE2, RR, 0x1aa, 0x10, "irete", _A0(), 00010, BR) /* IRET IP<-SRR0 */ 367 - APUOPFB(M_BISLEDD, RR, 0x1ab, 0x20, "bisledd", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ 368 - APUOPFB(M_BISLEDE, RR, 0x1ab, 0x10, "bislede", _A2(A_T,A_A), 00012, BR) /* BISLED RT,IP<-IP,RA_if(ext) */ 369 - APUOPFB(M_BIHNZD, RR, 0x12b, 0x20, "bihnzd", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ 370 - APUOPFB(M_BIHNZE, RR, 0x12b, 0x10, "bihnze", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ 371 - APUOPFB(M_BIHZD, RR, 0x12a, 0x20, "bihzd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 372 - APUOPFB(M_BIHZE, RR, 0x12a, 0x10, "bihze", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 373 - APUOPFB(M_BINZD, RR, 0x129, 0x20, "binzd", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ 374 - APUOPFB(M_BINZE, RR, 0x129, 0x10, "binze", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ 375 - APUOPFB(M_BIZD, RR, 0x128, 0x20, "bizd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 376 - APUOPFB(M_BIZE, RR, 0x128, 0x10, "bize", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 377 - APUOPFB(M_SYNCC, RR, 0x002, 0x40, "syncc", _A0(), 00000, BR) /* SYNCC flush_pipe */ 378 - APUOPFB(M_HBRP, LBTI, 0x1ac, 0x40, "hbrp", _A0(), 00010, LS) /* HBR BTB[B9]<-M[Ra] */ 379 - 380 - /* Synonyms required by the AS manual. */ 381 - APUOP(M_LR, RI10, 0x020, "lr", _A2(A_T,A_A), 00012, FX2) /* OR%I RT<-RA|I10 */ 382 - APUOP(M_BIHT, RR, 0x12b, "biht", _A2(A_T,A_A), 00011, BR) /* BIHNZ IP<-RA_if(RT) */ 383 - APUOP(M_BIHF, RR, 0x12a, "bihf", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 384 - APUOP(M_BIT, RR, 0x129, "bit", _A2(A_T,A_A), 00011, BR) /* BINZ IP<-RA_if(RT) */ 385 - APUOP(M_BIF, RR, 0x128, "bif", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 386 - APUOPFB(M_BIHTD, RR, 0x12b, 0x20, "bihtd", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ 387 - APUOPFB(M_BIHTE, RR, 0x12b, 0x10, "bihte", _A2(A_T,A_A), 00011, BR) /* BIHNF IP<-RA_if(RT) */ 388 - APUOPFB(M_BIHFD, RR, 0x12a, 0x20, "bihfd", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 389 - APUOPFB(M_BIHFE, RR, 0x12a, 0x10, "bihfe", _A2(A_T,A_A), 00011, BR) /* BIHZ IP<-RA_if(RT) */ 390 - APUOPFB(M_BITD, RR, 0x129, 0x20, "bitd", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ 391 - APUOPFB(M_BITE, RR, 0x129, 0x10, "bite", _A2(A_T,A_A), 00011, BR) /* BINF IP<-RA_if(RT) */ 392 - APUOPFB(M_BIFD, RR, 0x128, 0x20, "bifd", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 393 - APUOPFB(M_BIFE, RR, 0x128, 0x10, "bife", _A2(A_T,A_A), 00011, BR) /* BIZ IP<-RA_if(RT) */ 394 - 395 - #undef _A0 396 - #undef _A1 397 - #undef _A2 398 - #undef _A3 399 - #undef _A4
-34
arch/powerpc/xmon/spu-opc.c
··· 1 - // SPDX-License-Identifier: GPL-2.0-or-later 2 - /* SPU opcode list 3 - 4 - Copyright 2006 Free Software Foundation, Inc. 5 - 6 - This file is part of GDB, GAS, and the GNU binutils. 7 - 8 - */ 9 - 10 - #include <linux/kernel.h> 11 - #include <linux/bug.h> 12 - #include "spu.h" 13 - 14 - /* This file holds the Spu opcode table */ 15 - 16 - 17 - /* 18 - Example contents of spu-insn.h 19 - id_tag mode mode type opcode mnemonic asmtype dependency FPU L/S? branch? instruction 20 - QUAD WORD (0,RC,RB,RA,RT) latency 21 - APUOP(M_LQD, 1, 0, RI9, 0x1f8, "lqd", ASM_RI9IDX, 00012, FXU, 1, 0) Load Quadword d-form 22 - */ 23 - 24 - const struct spu_opcode spu_opcodes[] = { 25 - #define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ 26 - { MACFORMAT, OPCODE, MNEMONIC, ASMFORMAT }, 27 - #define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ 28 - { MACFORMAT, OPCODE, MNEMONIC, ASMFORMAT }, 29 - #include "spu-insns.h" 30 - #undef APUOP 31 - #undef APUOPFB 32 - }; 33 - 34 - const int spu_num_opcodes = ARRAY_SIZE(spu_opcodes);
-115
arch/powerpc/xmon/spu.h
··· 1 - /* SPDX-License-Identifier: GPL-2.0-or-later */ 2 - /* SPU ELF support for BFD. 3 - 4 - Copyright 2006 Free Software Foundation, Inc. 5 - 6 - This file is part of GDB, GAS, and the GNU binutils. 7 - 8 - */ 9 - 10 - 11 - /* These two enums are from rel_apu/common/spu_asm_format.h */ 12 - /* definition of instruction format */ 13 - typedef enum { 14 - RRR, 15 - RI18, 16 - RI16, 17 - RI10, 18 - RI8, 19 - RI7, 20 - RR, 21 - LBT, 22 - LBTI, 23 - IDATA, 24 - UNKNOWN_IFORMAT 25 - } spu_iformat; 26 - 27 - /* These values describe assembly instruction arguments. They indicate 28 - * how to encode, range checking and which relocation to use. */ 29 - typedef enum { 30 - A_T, /* register at pos 0 */ 31 - A_A, /* register at pos 7 */ 32 - A_B, /* register at pos 14 */ 33 - A_C, /* register at pos 21 */ 34 - A_S, /* special purpose register at pos 7 */ 35 - A_H, /* channel register at pos 7 */ 36 - A_P, /* parenthesis, this has to separate regs from immediates */ 37 - A_S3, 38 - A_S6, 39 - A_S7N, 40 - A_S7, 41 - A_U7A, 42 - A_U7B, 43 - A_S10B, 44 - A_S10, 45 - A_S11, 46 - A_S11I, 47 - A_S14, 48 - A_S16, 49 - A_S18, 50 - A_R18, 51 - A_U3, 52 - A_U5, 53 - A_U6, 54 - A_U7, 55 - A_U14, 56 - A_X16, 57 - A_U18, 58 - A_MAX 59 - } spu_aformat; 60 - 61 - enum spu_insns { 62 - #define APUOP(TAG,MACFORMAT,OPCODE,MNEMONIC,ASMFORMAT,DEP,PIPE) \ 63 - TAG, 64 - #define APUOPFB(TAG,MACFORMAT,OPCODE,FB,MNEMONIC,ASMFORMAT,DEP,PIPE) \ 65 - TAG, 66 - #include "spu-insns.h" 67 - #undef APUOP 68 - #undef APUOPFB 69 - M_SPU_MAX 70 - }; 71 - 72 - struct spu_opcode 73 - { 74 - spu_iformat insn_type; 75 - unsigned int opcode; 76 - char *mnemonic; 77 - int arg[5]; 78 - }; 79 - 80 - #define SIGNED_EXTRACT(insn,size,pos) (((int)((insn) << (32-size-pos))) >> (32-size)) 81 - #define UNSIGNED_EXTRACT(insn,size,pos) (((insn) >> pos) & ((1 << size)-1)) 82 - 83 - #define DECODE_INSN_RT(insn) (insn & 0x7f) 84 - #define DECODE_INSN_RA(insn) ((insn >> 7) & 0x7f) 85 - #define DECODE_INSN_RB(insn) ((insn >> 14) & 0x7f) 86 - #define DECODE_INSN_RC(insn) ((insn >> 21) & 0x7f) 87 - 88 - #define DECODE_INSN_I10(insn) SIGNED_EXTRACT(insn,10,14) 89 - #define DECODE_INSN_U10(insn) UNSIGNED_EXTRACT(insn,10,14) 90 - 91 - /* For branching, immediate loads, hbr and lqa/stqa. */ 92 - #define DECODE_INSN_I16(insn) SIGNED_EXTRACT(insn,16,7) 93 - #define DECODE_INSN_U16(insn) UNSIGNED_EXTRACT(insn,16,7) 94 - 95 - /* for stop */ 96 - #define DECODE_INSN_U14(insn) UNSIGNED_EXTRACT(insn,14,0) 97 - 98 - /* For ila */ 99 - #define DECODE_INSN_I18(insn) SIGNED_EXTRACT(insn,18,7) 100 - #define DECODE_INSN_U18(insn) UNSIGNED_EXTRACT(insn,18,7) 101 - 102 - /* For rotate and shift and generate control mask */ 103 - #define DECODE_INSN_I7(insn) SIGNED_EXTRACT(insn,7,14) 104 - #define DECODE_INSN_U7(insn) UNSIGNED_EXTRACT(insn,7,14) 105 - 106 - /* For float <-> int conversion */ 107 - #define DECODE_INSN_I8(insn) SIGNED_EXTRACT(insn,8,14) 108 - #define DECODE_INSN_U8(insn) UNSIGNED_EXTRACT(insn,8,14) 109 - 110 - /* For hbr */ 111 - #define DECODE_INSN_I9a(insn) ((SIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) 112 - #define DECODE_INSN_I9b(insn) ((SIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) 113 - #define DECODE_INSN_U9a(insn) ((UNSIGNED_EXTRACT(insn,2,23) << 7) | UNSIGNED_EXTRACT(insn,7,0)) 114 - #define DECODE_INSN_U9b(insn) ((UNSIGNED_EXTRACT(insn,2,14) << 7) | UNSIGNED_EXTRACT(insn,7,0)) 115 -
-273
arch/powerpc/xmon/xmon.c
··· 41 41 #include <asm/rtas.h> 42 42 #include <asm/sstep.h> 43 43 #include <asm/irq_regs.h> 44 - #include <asm/spu.h> 45 - #include <asm/spu_priv1.h> 46 44 #include <asm/setjmp.h> 47 45 #include <asm/reg.h> 48 46 #include <asm/debug.h> ··· 186 188 const char *after); 187 189 static const char *getvecname(unsigned long vec); 188 190 189 - static int do_spu_cmd(void); 190 - 191 191 #ifdef CONFIG_44x 192 192 static void dump_tlb_44x(void); 193 193 #endif ··· 268 272 P list processes/tasks\n\ 269 273 r print registers\n\ 270 274 s single step\n" 271 - #ifdef CONFIG_SPU_BASE 272 - " ss stop execution on all spus\n\ 273 - sr restore execution on stopped spus\n\ 274 - sf # dump spu fields for spu # (in hex)\n\ 275 - sd # dump spu local store for spu # (in hex)\n\ 276 - sdi # disassemble spu local store for spu # (in hex)\n" 277 - #endif 278 275 " S print special registers\n\ 279 276 Sa print all SPRs\n\ 280 277 Sr # read SPR #\n\ ··· 1101 1112 cacheflush(); 1102 1113 break; 1103 1114 case 's': 1104 - if (do_spu_cmd() == 0) 1105 - break; 1106 1115 if (do_step(excp)) 1107 1116 return cmd; 1108 1117 break; ··· 4094 4107 if (xmon_early) 4095 4108 debugger(NULL); 4096 4109 } 4097 - 4098 - #ifdef CONFIG_SPU_BASE 4099 - 4100 - struct spu_info { 4101 - struct spu *spu; 4102 - u64 saved_mfc_sr1_RW; 4103 - u32 saved_spu_runcntl_RW; 4104 - unsigned long dump_addr; 4105 - u8 stopped_ok; 4106 - }; 4107 - 4108 - #define XMON_NUM_SPUS 16 /* Enough for current hardware */ 4109 - 4110 - static struct spu_info spu_info[XMON_NUM_SPUS]; 4111 - 4112 - void __init xmon_register_spus(struct list_head *list) 4113 - { 4114 - struct spu *spu; 4115 - 4116 - list_for_each_entry(spu, list, full_list) { 4117 - if (spu->number >= XMON_NUM_SPUS) { 4118 - WARN_ON(1); 4119 - continue; 4120 - } 4121 - 4122 - spu_info[spu->number].spu = spu; 4123 - spu_info[spu->number].stopped_ok = 0; 4124 - spu_info[spu->number].dump_addr = (unsigned long) 4125 - spu_info[spu->number].spu->local_store; 4126 - } 4127 - } 4128 - 4129 - static void stop_spus(void) 4130 - { 4131 - struct spu *spu; 4132 - volatile int i; 4133 - u64 tmp; 4134 - 4135 - for (i = 0; i < XMON_NUM_SPUS; i++) { 4136 - if (!spu_info[i].spu) 4137 - continue; 4138 - 4139 - if (setjmp(bus_error_jmp) == 0) { 4140 - catch_memory_errors = 1; 4141 - sync(); 4142 - 4143 - spu = spu_info[i].spu; 4144 - 4145 - spu_info[i].saved_spu_runcntl_RW = 4146 - in_be32(&spu->problem->spu_runcntl_RW); 4147 - 4148 - tmp = spu_mfc_sr1_get(spu); 4149 - spu_info[i].saved_mfc_sr1_RW = tmp; 4150 - 4151 - tmp &= ~MFC_STATE1_MASTER_RUN_CONTROL_MASK; 4152 - spu_mfc_sr1_set(spu, tmp); 4153 - 4154 - sync(); 4155 - __delay(200); 4156 - 4157 - spu_info[i].stopped_ok = 1; 4158 - 4159 - printf("Stopped spu %.2d (was %s)\n", i, 4160 - spu_info[i].saved_spu_runcntl_RW ? 4161 - "running" : "stopped"); 4162 - } else { 4163 - catch_memory_errors = 0; 4164 - printf("*** Error stopping spu %.2d\n", i); 4165 - } 4166 - catch_memory_errors = 0; 4167 - } 4168 - } 4169 - 4170 - static void restart_spus(void) 4171 - { 4172 - struct spu *spu; 4173 - volatile int i; 4174 - 4175 - for (i = 0; i < XMON_NUM_SPUS; i++) { 4176 - if (!spu_info[i].spu) 4177 - continue; 4178 - 4179 - if (!spu_info[i].stopped_ok) { 4180 - printf("*** Error, spu %d was not successfully stopped" 4181 - ", not restarting\n", i); 4182 - continue; 4183 - } 4184 - 4185 - if (setjmp(bus_error_jmp) == 0) { 4186 - catch_memory_errors = 1; 4187 - sync(); 4188 - 4189 - spu = spu_info[i].spu; 4190 - spu_mfc_sr1_set(spu, spu_info[i].saved_mfc_sr1_RW); 4191 - out_be32(&spu->problem->spu_runcntl_RW, 4192 - spu_info[i].saved_spu_runcntl_RW); 4193 - 4194 - sync(); 4195 - __delay(200); 4196 - 4197 - printf("Restarted spu %.2d\n", i); 4198 - } else { 4199 - catch_memory_errors = 0; 4200 - printf("*** Error restarting spu %.2d\n", i); 4201 - } 4202 - catch_memory_errors = 0; 4203 - } 4204 - } 4205 - 4206 - #define DUMP_WIDTH 23 4207 - #define DUMP_VALUE(format, field, value) \ 4208 - do { \ 4209 - if (setjmp(bus_error_jmp) == 0) { \ 4210 - catch_memory_errors = 1; \ 4211 - sync(); \ 4212 - printf(" %-*s = "format"\n", DUMP_WIDTH, \ 4213 - #field, value); \ 4214 - sync(); \ 4215 - __delay(200); \ 4216 - } else { \ 4217 - catch_memory_errors = 0; \ 4218 - printf(" %-*s = *** Error reading field.\n", \ 4219 - DUMP_WIDTH, #field); \ 4220 - } \ 4221 - catch_memory_errors = 0; \ 4222 - } while (0) 4223 - 4224 - #define DUMP_FIELD(obj, format, field) \ 4225 - DUMP_VALUE(format, field, obj->field) 4226 - 4227 - static void dump_spu_fields(struct spu *spu) 4228 - { 4229 - printf("Dumping spu fields at address %p:\n", spu); 4230 - 4231 - DUMP_FIELD(spu, "0x%x", number); 4232 - DUMP_FIELD(spu, "%s", name); 4233 - DUMP_FIELD(spu, "0x%lx", local_store_phys); 4234 - DUMP_FIELD(spu, "0x%p", local_store); 4235 - DUMP_FIELD(spu, "0x%lx", ls_size); 4236 - DUMP_FIELD(spu, "0x%x", node); 4237 - DUMP_FIELD(spu, "0x%lx", flags); 4238 - DUMP_FIELD(spu, "%llu", class_0_pending); 4239 - DUMP_FIELD(spu, "0x%llx", class_0_dar); 4240 - DUMP_FIELD(spu, "0x%llx", class_1_dar); 4241 - DUMP_FIELD(spu, "0x%llx", class_1_dsisr); 4242 - DUMP_FIELD(spu, "0x%x", irqs[0]); 4243 - DUMP_FIELD(spu, "0x%x", irqs[1]); 4244 - DUMP_FIELD(spu, "0x%x", irqs[2]); 4245 - DUMP_FIELD(spu, "0x%x", slb_replace); 4246 - DUMP_FIELD(spu, "%d", pid); 4247 - DUMP_FIELD(spu, "0x%p", mm); 4248 - DUMP_FIELD(spu, "0x%p", ctx); 4249 - DUMP_FIELD(spu, "0x%p", rq); 4250 - DUMP_FIELD(spu, "0x%llx", timestamp); 4251 - DUMP_FIELD(spu, "0x%lx", problem_phys); 4252 - DUMP_FIELD(spu, "0x%p", problem); 4253 - DUMP_VALUE("0x%x", problem->spu_runcntl_RW, 4254 - in_be32(&spu->problem->spu_runcntl_RW)); 4255 - DUMP_VALUE("0x%x", problem->spu_status_R, 4256 - in_be32(&spu->problem->spu_status_R)); 4257 - DUMP_VALUE("0x%x", problem->spu_npc_RW, 4258 - in_be32(&spu->problem->spu_npc_RW)); 4259 - DUMP_FIELD(spu, "0x%p", priv2); 4260 - DUMP_FIELD(spu, "0x%p", pdata); 4261 - } 4262 - 4263 - static int spu_inst_dump(unsigned long adr, long count, int praddr) 4264 - { 4265 - return generic_inst_dump(adr, count, praddr, print_insn_spu); 4266 - } 4267 - 4268 - static void dump_spu_ls(unsigned long num, int subcmd) 4269 - { 4270 - unsigned long offset, addr, ls_addr; 4271 - 4272 - if (setjmp(bus_error_jmp) == 0) { 4273 - catch_memory_errors = 1; 4274 - sync(); 4275 - ls_addr = (unsigned long)spu_info[num].spu->local_store; 4276 - sync(); 4277 - __delay(200); 4278 - } else { 4279 - catch_memory_errors = 0; 4280 - printf("*** Error: accessing spu info for spu %ld\n", num); 4281 - return; 4282 - } 4283 - catch_memory_errors = 0; 4284 - 4285 - if (scanhex(&offset)) 4286 - addr = ls_addr + offset; 4287 - else 4288 - addr = spu_info[num].dump_addr; 4289 - 4290 - if (addr >= ls_addr + LS_SIZE) { 4291 - printf("*** Error: address outside of local store\n"); 4292 - return; 4293 - } 4294 - 4295 - switch (subcmd) { 4296 - case 'i': 4297 - addr += spu_inst_dump(addr, 16, 1); 4298 - last_cmd = "sdi\n"; 4299 - break; 4300 - default: 4301 - prdump(addr, 64); 4302 - addr += 64; 4303 - last_cmd = "sd\n"; 4304 - break; 4305 - } 4306 - 4307 - spu_info[num].dump_addr = addr; 4308 - } 4309 - 4310 - static int do_spu_cmd(void) 4311 - { 4312 - static unsigned long num = 0; 4313 - int cmd, subcmd = 0; 4314 - 4315 - cmd = inchar(); 4316 - switch (cmd) { 4317 - case 's': 4318 - stop_spus(); 4319 - break; 4320 - case 'r': 4321 - restart_spus(); 4322 - break; 4323 - case 'd': 4324 - subcmd = inchar(); 4325 - if (isxdigit(subcmd) || subcmd == '\n') 4326 - termch = subcmd; 4327 - fallthrough; 4328 - case 'f': 4329 - scanhex(&num); 4330 - if (num >= XMON_NUM_SPUS || !spu_info[num].spu) { 4331 - printf("*** Error: invalid spu number\n"); 4332 - return 0; 4333 - } 4334 - 4335 - switch (cmd) { 4336 - case 'f': 4337 - dump_spu_fields(spu_info[num].spu); 4338 - break; 4339 - default: 4340 - dump_spu_ls(num, subcmd); 4341 - break; 4342 - } 4343 - 4344 - break; 4345 - default: 4346 - return -1; 4347 - } 4348 - 4349 - return 0; 4350 - } 4351 - #else /* ! CONFIG_SPU_BASE */ 4352 - static int do_spu_cmd(void) 4353 - { 4354 - return -1; 4355 - } 4356 - #endif