@@ -175,6 +175,7 @@ bool Mips_getInstruction(csh handle, const uint8_t *code, size_t code_len,
175
175
uint64_t size64 ;
176
176
Mips_init_cs_detail (instr );
177
177
instr -> MRI = (MCRegisterInfo * )info ;
178
+ map_set_fill_detail_ops (instr , true);
178
179
179
180
bool result = Mips_LLVM_getInstruction (instr , & size64 , code ,
180
181
code_len , address , info )
@@ -250,33 +251,49 @@ static void Mips_set_detail_op_imm(MCInst *MI, unsigned OpNum, int64_t Imm)
250
251
Mips_inc_op_count (MI );
251
252
}
252
253
253
- static void Mips_set_detail_op_reg (MCInst * MI , unsigned OpNum , mips_reg Reg )
254
+ static void Mips_set_detail_op_uimm (MCInst * MI , unsigned OpNum , uint64_t Imm )
254
255
{
255
256
if (!detail_is_set (MI ))
256
257
return ;
257
258
258
259
if (doing_mem (MI )) {
259
- Mips_set_detail_op_mem_reg (MI , OpNum , Reg );
260
+ Mips_set_detail_op_mem_disp (MI , OpNum , Imm );
260
261
return ;
261
262
}
262
263
263
- assert ((map_get_op_type (MI , OpNum ) & ~CS_OP_MEM ) == CS_OP_REG );
264
+ Mips_get_detail_op (MI , 0 )-> type = MIPS_OP_IMM ;
265
+ Mips_get_detail_op (MI , 0 )-> imm = (int64_t )Imm ;
266
+ Mips_get_detail_op (MI , 0 )-> is_unsigned = true;
267
+ Mips_get_detail_op (MI , 0 )-> access = map_get_op_access (MI , OpNum );
268
+ Mips_inc_op_count (MI );
269
+ }
264
270
271
+ static void Mips_set_detail_op_reg (MCInst * MI , unsigned OpNum , mips_reg Reg , bool is_reglist )
272
+ {
273
+ if (!detail_is_set (MI ))
274
+ return ;
275
+
276
+ if (doing_mem (MI )) {
277
+ Mips_set_detail_op_mem_reg (MI , OpNum , Reg );
278
+ return ;
279
+ }
280
+
281
+ CS_ASSERT ((map_get_op_type (MI , OpNum ) & ~CS_OP_MEM ) == CS_OP_REG );
265
282
Mips_get_detail_op (MI , 0 )-> type = MIPS_OP_REG ;
266
283
Mips_get_detail_op (MI , 0 )-> reg = Reg ;
284
+ Mips_get_detail_op (MI , 0 )-> is_reglist = is_reglist ;
267
285
Mips_get_detail_op (MI , 0 )-> access = map_get_op_access (MI , OpNum );
268
286
Mips_inc_op_count (MI );
269
287
}
270
288
271
289
static void Mips_set_detail_op_operand (MCInst * MI , unsigned OpNum )
272
290
{
273
291
cs_op_type op_type = map_get_op_type (MI , OpNum ) & ~CS_OP_MEM ;
292
+ int64_t value = MCInst_getOpVal (MI , OpNum );
274
293
if (op_type == CS_OP_IMM ) {
275
- Mips_set_detail_op_imm (MI , OpNum ,
276
- MCInst_getOpVal (MI , OpNum ));
294
+ Mips_set_detail_op_imm (MI , OpNum , value );
277
295
} else if (op_type == CS_OP_REG ) {
278
- Mips_set_detail_op_reg (MI , OpNum ,
279
- MCInst_getOpVal (MI , OpNum ));
296
+ Mips_set_detail_op_reg (MI , OpNum , value , false);
280
297
} else
281
298
printf ("Operand type %d not handled!\n" , op_type );
282
299
}
@@ -286,34 +303,33 @@ static void Mips_set_detail_op_branch(MCInst *MI, unsigned OpNum)
286
303
cs_op_type op_type = map_get_op_type (MI , OpNum ) & ~CS_OP_MEM ;
287
304
if (op_type == CS_OP_IMM ) {
288
305
uint64_t Target = (uint64_t )MCInst_getOpVal (MI , OpNum );
289
- Mips_set_detail_op_imm (MI , OpNum , Target + MI -> address );
306
+ Mips_set_detail_op_uimm (MI , OpNum , Target + MI -> address );
290
307
} else if (op_type == CS_OP_REG ) {
291
308
Mips_set_detail_op_reg (MI , OpNum ,
292
- MCInst_getOpVal (MI , OpNum ));
309
+ MCInst_getOpVal (MI , OpNum ), false );
293
310
} else
294
311
printf ("Operand type %d not handled!\n" , op_type );
295
312
}
296
313
297
- static void Mips_set_detail_op_uimm (MCInst * MI , unsigned OpNum )
314
+ static void Mips_set_detail_op_unsigned (MCInst * MI , unsigned OpNum )
298
315
{
299
- Mips_set_detail_op_imm (MI , OpNum ,
316
+ Mips_set_detail_op_uimm (MI , OpNum ,
300
317
MCInst_getOpVal (MI , OpNum ));
301
318
}
302
319
303
- static void Mips_set_detail_op_uimm_offset (MCInst * MI , unsigned OpNum ,
320
+ static void Mips_set_detail_op_unsigned_offset (MCInst * MI , unsigned OpNum ,
304
321
unsigned Bits , uint64_t Offset )
305
322
{
306
323
uint64_t Imm = MCInst_getOpVal (MI , OpNum );
307
324
Imm -= Offset ;
308
325
Imm &= (1 << Bits ) - 1 ;
309
326
Imm += Offset ;
310
- Mips_set_detail_op_imm (MI , OpNum , Imm );
327
+ Mips_set_detail_op_uimm (MI , OpNum , Imm );
311
328
}
312
329
313
330
static void Mips_set_detail_op_mem_nanomips (MCInst * MI , unsigned OpNum )
314
331
{
315
- if (!detail_is_set (MI ) || !doing_mem (MI ))
316
- return ;
332
+ CS_ASSERT (doing_mem (MI ))
317
333
318
334
MCOperand * Op = MCInst_getOperand (MI , OpNum );
319
335
Mips_get_detail_op (MI , 0 )-> type = MIPS_OP_MEM ;
@@ -324,31 +340,28 @@ static void Mips_set_detail_op_mem_nanomips(MCInst *MI, unsigned OpNum)
324
340
325
341
static void Mips_set_detail_op_reglist (MCInst * MI , unsigned OpNum , bool isNanoMips )
326
342
{
327
- if (!detail_is_set (MI ))
328
- return ;
329
-
330
343
if (isNanoMips ) {
331
344
for (unsigned i = OpNum ; i < MCInst_getNumOperands (MI ); i ++ ) {
332
- Mips_set_detail_op_reg (MI , i , MCInst_getOpVal (MI , i ));
345
+ Mips_set_detail_op_reg (MI , i , MCInst_getOpVal (MI , i ), true );
333
346
}
334
347
return ;
335
348
}
336
349
// -2 because register List is always first operand of instruction
337
350
// and it is always followed by memory operand (base + offset).
338
351
for (unsigned i = OpNum , e = MCInst_getNumOperands (MI ) - 2 ; i != e ; ++ i ) {
339
- Mips_set_detail_op_reg (MI , i , MCInst_getOpVal (MI , i ));
352
+ Mips_set_detail_op_reg (MI , i , MCInst_getOpVal (MI , i ), true );
340
353
}
341
354
}
342
355
343
- static void Mips_set_detail_op_uimm_address (MCInst * MI , unsigned OpNum )
356
+ static void Mips_set_detail_op_unsigned_address (MCInst * MI , unsigned OpNum )
344
357
{
345
358
uint64_t Target = MI -> address + (uint64_t )MCInst_getOpVal (MI , OpNum );
346
359
Mips_set_detail_op_imm (MI , OpNum , Target );
347
360
}
348
361
349
362
void Mips_add_cs_detail (MCInst * MI , mips_op_group op_group , va_list args )
350
363
{
351
- if (!detail_is_set (MI ))
364
+ if (!detail_is_set (MI ) || ! map_fill_detail_ops ( MI ) )
352
365
return ;
353
366
354
367
unsigned OpNum = va_arg (args , unsigned );
@@ -367,57 +380,57 @@ void Mips_add_cs_detail(MCInst *MI, mips_op_group op_group, va_list args)
367
380
case Mips_OP_GROUP_Operand :
368
381
return Mips_set_detail_op_operand (MI , OpNum );
369
382
case Mips_OP_GROUP_UImm_1_0 :
370
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 1 , 0 );
383
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 1 , 0 );
371
384
case Mips_OP_GROUP_UImm_2_0 :
372
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 2 , 0 );
385
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 2 , 0 );
373
386
case Mips_OP_GROUP_UImm_3_0 :
374
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 3 , 0 );
387
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 3 , 0 );
375
388
case Mips_OP_GROUP_UImm_32_0 :
376
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 32 , 0 );
389
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 32 , 0 );
377
390
case Mips_OP_GROUP_UImm_16_0 :
378
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 16 , 0 );
391
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 16 , 0 );
379
392
case Mips_OP_GROUP_UImm_8_0 :
380
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 8 , 0 );
393
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 8 , 0 );
381
394
case Mips_OP_GROUP_UImm_5_0 :
382
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 5 , 0 );
395
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 5 , 0 );
383
396
case Mips_OP_GROUP_UImm_6_0 :
384
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 6 , 0 );
397
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 6 , 0 );
385
398
case Mips_OP_GROUP_UImm_4_0 :
386
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 4 , 0 );
399
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 4 , 0 );
387
400
case Mips_OP_GROUP_UImm_7_0 :
388
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 7 , 0 );
401
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 7 , 0 );
389
402
case Mips_OP_GROUP_UImm_10_0 :
390
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 10 , 0 );
403
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 10 , 0 );
391
404
case Mips_OP_GROUP_UImm_6_1 :
392
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 6 , 1 );
405
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 6 , 1 );
393
406
case Mips_OP_GROUP_UImm_5_1 :
394
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 5 , 1 );
407
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 5 , 1 );
395
408
case Mips_OP_GROUP_UImm_5_33 :
396
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 5 , 33 );
409
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 5 , 33 );
397
410
case Mips_OP_GROUP_UImm_5_32 :
398
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 5 , 32 );
411
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 5 , 32 );
399
412
case Mips_OP_GROUP_UImm_6_2 :
400
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 6 , 2 );
413
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 6 , 2 );
401
414
case Mips_OP_GROUP_UImm_2_1 :
402
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 2 , 1 );
415
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 2 , 1 );
403
416
case Mips_OP_GROUP_UImm_0_0 :
404
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 0 , 0 );
417
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 0 , 0 );
405
418
case Mips_OP_GROUP_UImm_26_0 :
406
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 26 , 0 );
419
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 26 , 0 );
407
420
case Mips_OP_GROUP_UImm_12_0 :
408
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 12 , 0 );
421
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 12 , 0 );
409
422
case Mips_OP_GROUP_UImm_20_0 :
410
- return Mips_set_detail_op_uimm_offset (MI , OpNum , 20 , 0 );
423
+ return Mips_set_detail_op_unsigned_offset (MI , OpNum , 20 , 0 );
411
424
case Mips_OP_GROUP_RegisterList :
412
425
return Mips_set_detail_op_reglist (MI , OpNum , false);
413
426
case Mips_OP_GROUP_NanoMipsRegisterList :
414
427
return Mips_set_detail_op_reglist (MI , OpNum , true);
415
428
case Mips_OP_GROUP_PCRel :
416
429
/* fall-thru */
417
430
case Mips_OP_GROUP_Hi20PCRel :
418
- return Mips_set_detail_op_uimm_address (MI , OpNum );
431
+ return Mips_set_detail_op_unsigned_address (MI , OpNum );
419
432
case Mips_OP_GROUP_Hi20 :
420
- return Mips_set_detail_op_uimm (MI , OpNum );
433
+ return Mips_set_detail_op_unsigned (MI , OpNum );
421
434
}
422
435
}
423
436
0 commit comments