OLD | NEW |
1 /* xgate-dis.c -- Freescale XGATE disassembly | 1 /* xgate-dis.c -- Freescale XGATE disassembly |
2 Copyright 2009, 2010, 2011, 2012 | 2 Copyright 2009, 2010, 2011, 2012 |
3 Free Software Foundation, Inc. | 3 Free Software Foundation, Inc. |
4 Written by Sean Keys (skeys@ipdatasys.com) | 4 Written by Sean Keys (skeys@ipdatasys.com) |
5 | 5 |
6 This file is part of the GNU opcodes library. | 6 This file is part of the GNU opcodes library. |
7 | 7 |
8 This library is free software; you can redistribute it and/or modify | 8 This library is free software; you can redistribute it and/or modify |
9 it under the terms of the GNU General Public License as published by | 9 it under the terms of the GNU General Public License as published by |
10 the Free Software Foundation; either version 3, or (at your option) | 10 the Free Software Foundation; either version 3, or (at your option) |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 raw_code <<= 8; | 117 raw_code <<= 8; |
118 raw_code += buffer[1]; | 118 raw_code += buffer[1]; |
119 | 119 |
120 decodePTR = find_match (raw_code); | 120 decodePTR = find_match (raw_code); |
121 if (decodePTR) | 121 if (decodePTR) |
122 { | 122 { |
123 operMaskReg = decodePTR->operMasksRegisterBits; | 123 operMaskReg = decodePTR->operMasksRegisterBits; |
124 (*info->fprintf_func)(info->stream, "%s", decodePTR->opcodePTR->name); | 124 (*info->fprintf_func)(info->stream, "%s", decodePTR->opcodePTR->name); |
125 | 125 |
126 /* First we compare the shorthand format of the constraints. If we | 126 /* First we compare the shorthand format of the constraints. If we |
127 » still are unable to pinpoint the operands | 127 » still are unable to pinpoint the operands |
128 » we analyze the opcodes constraint string. */ | 128 » we analyze the opcodes constraint string. */ |
129 switch (decodePTR->opcodePTR->sh_format) | 129 if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_R_C)) |
130 { | 130 » { |
131 case XG_R_C: | 131 » (*info->fprintf_func)(info->stream, " R%x, CCR", |
132 (*info->fprintf_func)(info->stream, " R%x, CCR", | 132 » » (raw_code >> 8) & 0x7); |
133 (raw_code >> 8) & 0x7); | 133 » } |
134 break; | 134 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_C_R)
) |
135 case XG_C_R: | 135 { |
136 (*info->fprintf_func)(info->stream, " CCR, R%x", | 136 » (*info->fprintf_func)(info->stream, " CCR, R%x", |
137 (raw_code >> 8) & 0x7); | 137 » (raw_code >> 8) & 0x7); |
138 break; | 138 } |
139 case XG_R_P: | 139 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON_R_P)
) |
140 (*info->fprintf_func)(info->stream, " R%x, PC", | 140 { |
141 (raw_code >> 8) & 0x7); | 141 » (*info->fprintf_func)(info->stream, " R%x, PC", |
142 break; | 142 » (raw_code >> 8) & 0x7); |
143 case XG_INH: | 143 } |
144 break; | 144 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_TRI)) |
145 case XG_R_R_R: | 145 { |
146 if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_TRI)) | 146 (*info->fprintf_func)(info->stream, " R%x, R%x, R%x", |
147 { | 147 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, |
148 (*info->fprintf_func)(info->stream, " R%x, R%x, R%x", | 148 (raw_code >> 2) & 0x7); |
149 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, | 149 } |
150 (raw_code >> 2) & 0x7); | 150 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IDR)) |
151 } | 151 { |
152 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IDR)) | 152 if (raw_code & 0x01) |
153 { | 153 { |
154 if (raw_code & 0x01) | 154 (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x+)", |
155 { | 155 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, |
156 (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x+)", | 156 (raw_code >> 2) & 0x7); |
157 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, | 157 } |
158 (raw_code >> 2) & 0x7); | 158 else if (raw_code & 0x02) |
159 } | 159 { |
160 else if (raw_code & 0x02) | 160 (*info->fprintf_func)(info->stream, " R%x, (R%x, -R%
x)", |
161 { | 161 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, |
162 (*info->fprintf_func)(info->stream, " R%x, (R%x, -R%x)", | 162 (raw_code >> 2) & 0x7); |
163 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, | 163 } |
164 (raw_code >> 2) & 0x7); | 164 else |
165 } | 165 { |
166 else | 166 (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x)", |
167 { | 167 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, |
168 (*info->fprintf_func)(info->stream, " R%x, (R%x, R%x)", | 168 (raw_code >> 2) & 0x7); |
169 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, | 169 } |
170 (raw_code >> 2) & 0x7); | 170 } |
171 } | 171 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_DYA)) |
172 } | 172 { |
173 else | 173 » operandOne = ripBits (&operMaskReg, 3, opcodePTR, raw_code); |
174 { | 174 » operandTwo = ripBits (&operMaskReg, 3, opcodePTR, raw_code); |
175 (*info->fprintf_func)(info->stream, " unhandled mode %s", | 175 » ( *info->fprintf_func)(info->stream, " R%x, R%x", operandOne, |
176 decodePTR->opcodePTR->constraints); | 176 » operandTwo); |
177 } | 177 } |
178 break; | 178 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IDO5)) |
179 case XG_R_R: | 179 { |
180 if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_DYA)) | 180 » (*info->fprintf_func)(info->stream, " R%x, (R%x, #0x%x)", |
181 { | 181 » (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, raw_code & 0
x1f); |
182 operandOne = ripBits (&operMaskReg, 3, opcodePTR, raw_code); | 182 } |
183 operandTwo = ripBits (&operMaskReg, 3, opcodePTR, raw_code); | 183 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_MON)) |
184 (*info->fprintf_func)(info->stream, " R%x, R%x", operandOne, | 184 { |
185 operandTwo); | 185 » operandOne = ripBits (&operMaskReg, 3, decodePTR->opcodePTR, |
186 } | 186 » raw_code); |
187 else | 187 » (*info->fprintf_func)(info->stream, " R%x", operandOne); |
188 { | 188 } |
189 (*info->fprintf_func)(info->stream, " unhandled mode %s", | 189 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL9)) |
190 opcodePTR->constraints); | |
191 } | |
192 break; | |
193 case XG_R_R_I: | |
194 (*info->fprintf_func)(info->stream, " R%x, (R%x, #0x%x)", | |
195 (raw_code >> 8) & 0x7, (raw_code >> 5) & 0x7, raw_code & 0x1f); | |
196 break; | |
197 case XG_R: | |
198 operandOne = ripBits (&operMaskReg, 3, decodePTR->opcodePTR, | |
199 raw_code); | |
200 (*info->fprintf_func)(info->stream, " R%x", operandOne); | |
201 break; | |
202 case XG_I | XG_PCREL: | |
203 if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL9)) | |
204 { | 190 { |
205 /* If address is negative handle it accordingly. */ | 191 /* If address is negative handle it accordingly. */ |
206 if (raw_code & XGATE_NINE_SIGNBIT) | 192 if (raw_code & XGATE_NINE_SIGNBIT) |
207 { | 193 { |
208 relAddr = XGATE_NINE_BITS >> 1; /* Clip sign bit. */ | 194 relAddr = XGATE_NINE_BITS >> 1; /* Clip sign bit. */ |
209 relAddr = ~relAddr; /* Make signed. */ | 195 relAddr = ~relAddr; /* Make signed. */ |
210 relAddr |= (raw_code & 0xFF) + 1; /* Apply our value. */ | 196 relAddr |= (raw_code & 0xFF) + 1; /* Apply our value. */ |
211 relAddr <<= 1; /* Multiply by two as per processor docs. */ | 197 relAddr <<= 1; /* Multiply by two as per processor docs. */ |
212 } | 198 } |
213 else | 199 else |
214 { | 200 { |
215 relAddr = raw_code & 0xff; | 201 relAddr = raw_code & 0xff; |
216 relAddr = (relAddr << 1) + 2; | 202 relAddr = (relAddr << 1) + 2; |
217 } | 203 } |
218 (*info->fprintf_func)(info->stream, " *%d", relAddr); | 204 (*info->fprintf_func)(info->stream, " *%d", relAddr); |
219 (*info->fprintf_func)(info->stream, " Abs* 0x"); | 205 (*info->fprintf_func)(info->stream, " Abs* 0x"); |
220 (*info->print_address_func)(memaddr + relAddr, info); | 206 (*info->print_address_func)(memaddr + relAddr, info); |
221 } | 207 } |
222 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL10)) | 208 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_REL10)) |
223 { | 209 { |
224 /* If address is negative handle it accordingly. */ | 210 /* If address is negative handle it accordingly. */ |
225 if (raw_code & XGATE_TEN_SIGNBIT) | 211 if (raw_code & XGATE_TEN_SIGNBIT) |
226 { | 212 { |
227 relAddr = XGATE_TEN_BITS >> 1; /* Clip sign bit. */ | 213 relAddr = XGATE_TEN_BITS >> 1; /* Clip sign bit. */ |
228 relAddr = ~relAddr; /* Make signed. */ | 214 relAddr = ~relAddr; /* Make signed. */ |
229 relAddr |= (raw_code & 0x1FF) + 1; /* Apply our value. */ | 215 relAddr |= (raw_code & 0x1FF) + 1; /* Apply our value. */ |
230 relAddr <<= 1; /* Multiply by two as per processor docs. */ | 216 relAddr <<= 1; /* Multiply by two as per processor docs. */ |
231 } | 217 } |
232 else | 218 else |
233 { | 219 { |
234 relAddr = raw_code & 0x1FF; | 220 relAddr = raw_code & 0x1FF; |
235 relAddr = (relAddr << 1) + 2; | 221 relAddr = (relAddr << 1) + 2; |
236 } | 222 } |
237 (*info->fprintf_func)(info->stream, " *%d", relAddr); | 223 (*info->fprintf_func)(info->stream, " *%d", relAddr); |
238 (*info->fprintf_func)(info->stream, " Abs* 0x"); | 224 (*info->fprintf_func)(info->stream, " Abs* 0x"); |
239 (*info->print_address_func)(memaddr + relAddr, info); | 225 (*info->print_address_func)(memaddr + relAddr, info); |
240 } | 226 } |
| 227 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM4)) |
| 228 { |
| 229 (*info->fprintf_func)(info->stream, " R%x, #0x%02x", |
| 230 (raw_code >> 8) & 0x7, (raw_code >> 4) & 0xF); |
| 231 } |
| 232 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM8)) |
| 233 { |
| 234 if (macro_search (decodePTR->opcodePTR->name, previousOpName) && |
| 235 previousOpName[0]) |
| 236 { |
| 237 absAddress = (0xFF & raw_code) << 8; |
| 238 absAddress |= perviousBin & 0xFF; |
| 239 (*info->fprintf_func)(info->stream, " R%x, #0x%02x Abs* 0x", |
| 240 (raw_code >> 8) & 0x7, raw_code & 0xff); |
| 241 (*info->print_address_func)(absAddress, info); |
| 242 previousOpName[0] = 0; |
| 243 } |
| 244 else |
| 245 { |
| 246 strcpy (previousOpName, decodePTR->opcodePTR->name); |
| 247 (*info->fprintf_func)(info->stream, " R%x, #0x%02x", |
| 248 (raw_code >> 8) & 0x7, raw_code & 0xff); |
| 249 } |
| 250 } |
| 251 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM3)) |
| 252 { |
| 253 (*info->fprintf_func)(info->stream, " #0x%x", |
| 254 (raw_code >> 8) & 0x7); |
| 255 } |
| 256 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_INH)) |
| 257 { |
| 258 // |
| 259 } |
241 else | 260 else |
242 { | 261 { |
243 (*info->fprintf_func)(info->stream, | 262 (*info->fprintf_func)(info->stream, " unhandled mode %s", |
244 " Can't disassemble for mode) %s", | 263 opcodePTR->constraints); |
245 decodePTR->opcodePTR->constraints); | |
246 } | 264 } |
247 break; | |
248 case XG_R_I: | |
249 if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM4)) | |
250 { | |
251 (*info->fprintf_func)(info->stream, " R%x, #0x%02x", | |
252 (raw_code >> 8) & 0x7, (raw_code >> 4) & 0xF); | |
253 } | |
254 else if (!strcmp (decodePTR->opcodePTR->constraints, XGATE_OP_IMM8)) | |
255 { | |
256 if (macro_search (decodePTR->opcodePTR->name, previousOpName) && | |
257 previousOpName[0]) | |
258 { | |
259 absAddress = (0xFF & raw_code) << 8; | |
260 absAddress |= perviousBin & 0xFF; | |
261 (*info->fprintf_func)(info->stream, " R%x, #0x%02x Abs* 0x", | |
262 (raw_code >> 8) & 0x7, raw_code & 0xff); | |
263 (*info->print_address_func)(absAddress, info); | |
264 previousOpName[0] = 0; | |
265 } | |
266 else | |
267 { | |
268 strcpy (previousOpName, decodePTR->opcodePTR->name); | |
269 (*info->fprintf_func)(info->stream, " R%x, #0x%02x", | |
270 (raw_code >> 8) & 0x7, raw_code & 0xff); | |
271 } | |
272 } | |
273 else | |
274 { | |
275 (*info->fprintf_func)(info->stream, | |
276 " Can't disassemble for mode %s", | |
277 decodePTR->opcodePTR->constraints); | |
278 } | |
279 break; | |
280 case XG_I: | |
281 (*info->fprintf_func)(info->stream, " #0x%x", | |
282 (raw_code >> 8) & 0x7); | |
283 break; | |
284 default: | |
285 (*info->fprintf_func)(info->stream, "address mode not found\t %x", | |
286 opcodePTR->bin_opcode); | |
287 break; | |
288 } | |
289 perviousBin = raw_code; | 265 perviousBin = raw_code; |
290 } | 266 } |
291 else | 267 else |
292 { | 268 { |
293 (*info->fprintf_func)(info->stream, | 269 (*info->fprintf_func)(info->stream, |
294 " unable to find opcode match #0%x", raw_code); | 270 " unable to find opcode match #0%x", raw_code); |
295 } | 271 } |
296 } | 272 } |
297 return bytesRead; | 273 return bytesRead; |
298 } | 274 } |
(...skipping 88 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
387 { | 363 { |
388 return decodeTablePTR; | 364 return decodeTablePTR; |
389 break; | 365 break; |
390 } | 366 } |
391 else | 367 else |
392 continue; | 368 continue; |
393 } | 369 } |
394 } | 370 } |
395 return 0; | 371 return 0; |
396 } | 372 } |
OLD | NEW |